reapplied 1.2 -> 1.3 changes to run.c that got squashed
authorkstailey <kstailey@openbsd.org>
Fri, 24 Jan 1997 23:43:09 +0000 (23:43 +0000)
committerkstailey <kstailey@openbsd.org>
Fri, 24 Jan 1997 23:43:09 +0000 (23:43 +0000)
usr.bin/awk/FIXES
usr.bin/awk/run.c

index 4becf1e..8e8cc60 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: FIXES,v 1.4 1997/01/24 23:11:28 millert Exp $ */
+/*     $OpenBSD: FIXES,v 1.5 1997/01/24 23:43:09 kstailey Exp $        */
 /****************************************************************
 Copyright (C) AT&T and Lucent Technologies 1996
 All Rights Reserved
@@ -475,3 +475,6 @@ Jun 28, 1996:
 Jun 29, 1996:
        fixed awful bug in new field splitting; didn't get all the places
        where input was done.
+
+Jan 21, 1997
+       Fixed %c:  works if the value is 0 -- now prints \0.
index fa540f6..41ba52e 100644 (file)
@@ -1,3 +1,4 @@
+/*     $OpenBSD: run.c,v 1.7 1997/01/24 23:43:10 kstailey Exp $        */
 /****************************************************************
 Copyright (C) AT&T and Lucent Technologies 1996
 All Rights Reserved
@@ -718,12 +719,16 @@ Cell *sindex(Node **a, int nnn)           /* index(a[0], a[1]) */
        return(z);
 }
 
-int format(char *buf, int bufsize, char *s, Node *a)   /* printf-like conversions */
+/*
+ * printf-like conversions
+ *   returns len of buf or -1 on error
+ */
+int format(char *buf, int bufsize, char *s, Node *a)
 {
        char fmt[RECSIZE];
        char *p, *t, *os;
        Cell *x;
-       int flag = 0, n;
+       int flag = 0, len = 0, n;
 
        os = s;
        p = buf;
@@ -731,10 +736,12 @@ int format(char *buf, int bufsize, char *s, Node *a)      /* printf-like conversions
                if (p - buf >= bufsize)
                        return -1;
                if (*s != '%') {
+                       len++;
                        *p++ = *s++;
                        continue;
                }
                if (*(s+1) == '%') {
+                       len++;
                        *p++ = '%';
                        s += 2;
                        continue;
@@ -784,6 +791,7 @@ int format(char *buf, int bufsize, char *s, Node *a)        /* printf-like conversions
                a = a->nnext;
                switch (flag) {
                case 0: sprintf((char *)p, "%s", fmt);  /* unknown, so dump it too */
+                       len += strlen(p);
                        p += strlen(p);
                        sprintf((char *)p, "%s", getsval(x));
                        break;
@@ -799,18 +807,22 @@ int format(char *buf, int bufsize, char *s, Node *a)      /* printf-like conversions
                        sprintf((char *)p, (char *)fmt, t);
                        break;
                case 5:
-                       isnum(x) ? sprintf((char *)p, (char *)fmt, (int) getfval(x))
+                       isnum(x) ?
+                         (getfval(x) ?
+                           sprintf((char *)p, (char *)fmt, (int) getfval(x))
+                                      : len++)
                                 : sprintf((char *)p, (char *)fmt, getsval(x)[0]);
                        break;
                }
                tempfree(x);
+               len += strlen(p);
                p += strlen(p);
                s++;
        }
        *p = '\0';
        for ( ; a; a = a->nnext)                /* evaluate any remaining args */
                execute(a);
-       return 0;
+       return (len);
 }
 
 Cell *awksprintf(Node **a, int n)              /* sprintf(a[0]) */
@@ -837,21 +849,20 @@ Cell *awkprintf(Node **a, int n)          /* printf */
        Cell *x;
        Node *y;
        char buf[3*RECSIZE];
+       int len;
 
        y = a[0]->nnext;
        x = execute(a[0]);
-       if (format(buf, sizeof buf, getsval(x), y) == -1)
+       if ((len = format(buf, sizeof buf, getsval(x), y)) == -1)
                ERROR "printf string %.30s... too long", buf FATAL;
        tempfree(x);
        if (a[1] == NULL) {
-               fputs((char *)buf, stdout);
-               if (ferror(stdout))
+               if (write(1, buf, len) != len)
                        ERROR "write error on stdout" FATAL;
        } else {
                fp = redirect((int)a[1], a[2]);
-               fputs((char *)buf, fp);
-               fflush(fp);
-               if (ferror(fp))
+               ferror(fp);     /* XXX paranoia */
+               if (write(fileno(fp), buf, len) != len)
                        ERROR "write error on %s", filename(fp) FATAL;
        }
        return(true);