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

Diff for /src/usr.bin/awk/lib.c between version 1.4 and 1.5

version 1.4, 1997/08/25 16:17:11 version 1.5, 1999/04/18 17:06:30
Line 40 
Line 40 
 int     fieldssize = RECSIZE;  int     fieldssize = RECSIZE;
   
 Cell    **fldtab;       /* pointers to Cells */  Cell    **fldtab;       /* pointers to Cells */
 char    inputFS[100];  char    inputFS[100] = " ";
   
 #define MAXFLD  200  #define MAXFLD  200
 int     nfields = MAXFLD;       /* last allocated slot for $i */  int     nfields = MAXFLD;       /* last allocated slot for $i */
Line 114 
Line 114 
         }          }
            dprintf( ("RS=<%s>, FS=<%s>, ARGC=%g, FILENAME=%s\n",             dprintf( ("RS=<%s>, FS=<%s>, ARGC=%g, FILENAME=%s\n",
                 *RS, *FS, *ARGC, *FILENAME) );                  *RS, *FS, *ARGC, *FILENAME) );
         donefld = 0;          if (isrecord) {
         donerec = 1;                  donefld = 0;
                   donerec = 1;
           }
         buf[0] = 0;          buf[0] = 0;
         while (argno < *ARGC || infile == stdin) {          while (argno < *ARGC || infile == stdin) {
                    dprintf( ("argno=%d, file=|%s|\n", argno, file) );                     dprintf( ("argno=%d, file=|%s|\n", argno, file) );
Line 145 
Line 147 
                                         xfree(fldtab[0]->sval);                                          xfree(fldtab[0]->sval);
                                 fldtab[0]->sval = buf;  /* buf == record */                                  fldtab[0]->sval = buf;  /* buf == record */
                                 fldtab[0]->tval = REC | STR | DONTFREE;                                  fldtab[0]->tval = REC | STR | DONTFREE;
                                 if (isnumber(fldtab[0]->sval)) {                                  if (is_number(fldtab[0]->sval)) {
                                         fldtab[0]->fval = atof(fldtab[0]->sval);                                          fldtab[0]->fval = atof(fldtab[0]->sval);
                                         fldtab[0]->tval |= NUM;                                          fldtab[0]->tval |= NUM;
                                 }                                  }
Line 240 
Line 242 
         p = qstring(p, '\0');          p = qstring(p, '\0');
         q = setsymtab(s, p, 0.0, STR, symtab);          q = setsymtab(s, p, 0.0, STR, symtab);
         setsval(q, p);          setsval(q, p);
         if (isnumber(q->sval)) {          if (is_number(q->sval)) {
                 q->fval = atof(q->sval);                  q->fval = atof(q->sval);
                 q->tval |= NUM;                  q->tval |= NUM;
         }          }
Line 329 
Line 331 
         donefld = 1;          donefld = 1;
         for (j = 1; j <= lastfld; j++) {          for (j = 1; j <= lastfld; j++) {
                 p = fldtab[j];                  p = fldtab[j];
                 if(isnumber(p->sval)) {                  if(is_number(p->sval)) {
                         p->fval = atof(p->sval);                          p->fval = atof(p->sval);
                         p->tval |= NUM;                          p->tval |= NUM;
                 }                  }
Line 439 
Line 441 
 {  {
         int i;          int i;
         char *r, *p;          char *r, *p;
         char *buf = record;  
         int bufsize = recsize;  
   
         if (donerec == 1)          if (donerec == 1)
                 return;                  return;
         r = buf;          r = record;
         for (i = 1; i <= *NF; i++) {          for (i = 1; i <= *NF; i++) {
                 p = getsval(fldtab[i]);                  p = getsval(fldtab[i]);
                 if (!adjbuf(&buf, &bufsize, 1+strlen(p)+r-buf, recsize, &r, "recbld 1"))                  if (!adjbuf(&record, &recsize, 1+strlen(p)+r-record, recsize, &r, "recbld 1"))
                         ERROR "created $0 `%.30s...' too long", buf FATAL;                          ERROR "created $0 `%.30s...' too long", record FATAL;
                 while ((*r = *p++) != 0)                  while ((*r = *p++) != 0)
                         r++;                          r++;
                 if (i < *NF) {                  if (i < *NF) {
                         if (!adjbuf(&buf, &bufsize, 2+strlen(*OFS)+r-buf, recsize, &r, "recbld 2"))                          if (!adjbuf(&record, &recsize, 2+strlen(*OFS)+r-record, recsize, &r, "recbld 2"))
                                 ERROR "created $0 `%.30s...' too long", buf FATAL;                                  ERROR "created $0 `%.30s...' too long", record FATAL;
                         for (p = *OFS; (*r = *p++) != 0; )                          for (p = *OFS; (*r = *p++) != 0; )
                                 r++;                                  r++;
                 }                  }
         }          }
         if (!adjbuf(&buf, &bufsize, 2+r-buf, recsize, &r, "recbld 3"))          if (!adjbuf(&record, &recsize, 2+r-record, recsize, &r, "recbld 3"))
                 ERROR "built giant record `%.30s...'", buf FATAL;                  ERROR "built giant record `%.30s...'", record FATAL;
         *r = '\0';          *r = '\0';
            dprintf( ("in recbld inputFS=%s, fldtab[0]=%p\n", inputFS, fldtab[0]) );             dprintf( ("in recbld inputFS=%s, fldtab[0]=%p\n", inputFS, fldtab[0]) );
   
         if (buf != record) {    /* increased size of record */  
                 record = buf;   /* BUG?  memory leak? */  
                 recsize = bufsize;  
         }  
         if (freeable(fldtab[0]))          if (freeable(fldtab[0]))
                 xfree(fldtab[0]->sval);                  xfree(fldtab[0]->sval);
         fldtab[0]->tval = REC | STR | DONTFREE;          fldtab[0]->tval = REC | STR | DONTFREE;
Line 635 
Line 631 
 /* strtod is supposed to be a proper test of what's a valid number */  /* strtod is supposed to be a proper test of what's a valid number */
   
 #include <math.h>  #include <math.h>
 int isnumber(char *s)  int is_number(char *s)
 {  {
         double r;          double r;
         char *ep;          char *ep;

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.5