[BACK]Return to run.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / awk

Diff for /src/usr.bin/awk/run.c between version 1.6 and 1.7

version 1.6, 1997/01/24 23:11:32 version 1.7, 1997/01/24 23:43:10
Line 1 
Line 1 
   /*      $OpenBSD$       */
 /****************************************************************  /****************************************************************
 Copyright (C) AT&T and Lucent Technologies 1996  Copyright (C) AT&T and Lucent Technologies 1996
 All Rights Reserved  All Rights Reserved
Line 718 
Line 719 
         return(z);          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 fmt[RECSIZE];
         char *p, *t, *os;          char *p, *t, *os;
         Cell *x;          Cell *x;
         int flag = 0, n;          int flag = 0, len = 0, n;
   
         os = s;          os = s;
         p = buf;          p = buf;
Line 731 
Line 736 
                 if (p - buf >= bufsize)                  if (p - buf >= bufsize)
                         return -1;                          return -1;
                 if (*s != '%') {                  if (*s != '%') {
                           len++;
                         *p++ = *s++;                          *p++ = *s++;
                         continue;                          continue;
                 }                  }
                 if (*(s+1) == '%') {                  if (*(s+1) == '%') {
                           len++;
                         *p++ = '%';                          *p++ = '%';
                         s += 2;                          s += 2;
                         continue;                          continue;
Line 784 
Line 791 
                 a = a->nnext;                  a = a->nnext;
                 switch (flag) {                  switch (flag) {
                 case 0: sprintf((char *)p, "%s", fmt);  /* unknown, so dump it too */                  case 0: sprintf((char *)p, "%s", fmt);  /* unknown, so dump it too */
                           len += strlen(p);
                         p += strlen(p);                          p += strlen(p);
                         sprintf((char *)p, "%s", getsval(x));                          sprintf((char *)p, "%s", getsval(x));
                         break;                          break;
Line 799 
Line 807 
                         sprintf((char *)p, (char *)fmt, t);                          sprintf((char *)p, (char *)fmt, t);
                         break;                          break;
                 case 5:                  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]);                                   : sprintf((char *)p, (char *)fmt, getsval(x)[0]);
                         break;                          break;
                 }                  }
                 tempfree(x);                  tempfree(x);
                   len += strlen(p);
                 p += strlen(p);                  p += strlen(p);
                 s++;                  s++;
         }          }
         *p = '\0';          *p = '\0';
         for ( ; a; a = a->nnext)                /* evaluate any remaining args */          for ( ; a; a = a->nnext)                /* evaluate any remaining args */
                 execute(a);                  execute(a);
         return 0;          return (len);
 }  }
   
 Cell *awksprintf(Node **a, int n)               /* sprintf(a[0]) */  Cell *awksprintf(Node **a, int n)               /* sprintf(a[0]) */
Line 837 
Line 849 
         Cell *x;          Cell *x;
         Node *y;          Node *y;
         char buf[3*RECSIZE];          char buf[3*RECSIZE];
           int len;
   
         y = a[0]->nnext;          y = a[0]->nnext;
         x = execute(a[0]);          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;                  ERROR "printf string %.30s... too long", buf FATAL;
         tempfree(x);          tempfree(x);
         if (a[1] == NULL) {          if (a[1] == NULL) {
                 fputs((char *)buf, stdout);                  if (write(1, buf, len) != len)
                 if (ferror(stdout))  
                         ERROR "write error on stdout" FATAL;                          ERROR "write error on stdout" FATAL;
         } else {          } else {
                 fp = redirect((int)a[1], a[2]);                  fp = redirect((int)a[1], a[2]);
                 fputs((char *)buf, fp);                  ferror(fp);     /* XXX paranoia */
                 fflush(fp);                  if (write(fileno(fp), buf, len) != len)
                 if (ferror(fp))  
                         ERROR "write error on %s", filename(fp) FATAL;                          ERROR "write error on %s", filename(fp) FATAL;
         }          }
         return(true);          return(true);

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.7