Module Name: src Committed By: christos Date: Sun Nov 7 22:55:27 UTC 2010
Modified Files: src/external/historical/nawk/dist: lib.c proto.h tran.c Log Message: PR/44063: Aleksey Cheusov: awk: setting NF doesn't change $i http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html ... References to nonexistent fields (that is, fields after $NF), shall evaluate to the uninitialized value. To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/external/historical/nawk/dist/lib.c \ src/external/historical/nawk/dist/proto.h \ src/external/historical/nawk/dist/tran.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/historical/nawk/dist/lib.c diff -u src/external/historical/nawk/dist/lib.c:1.2 src/external/historical/nawk/dist/lib.c:1.3 --- src/external/historical/nawk/dist/lib.c:1.2 Thu Aug 26 10:55:20 2010 +++ src/external/historical/nawk/dist/lib.c Sun Nov 7 17:55:26 2010 @@ -400,6 +400,7 @@ } } setfval(nfloc, (Awkfloat) lastfld); + donerec = 1; /* restore */ if (dbg) { for (j = 0; j <= lastfld; j++) { p = fldtab[j]; @@ -431,6 +432,19 @@ setfval(nfloc, (Awkfloat) n); } +void setlastfld(int n) /* set lastfld cleaning fldtab cells if necessary */ +{ + if (n > nfields) + growfldtab(n); + + if (lastfld < n) + cleanfld(lastfld+1, n); + else + cleanfld(n+1, lastfld); + + lastfld = n; +} + Cell *fieldadr(int n) /* get nth field */ { if (n < 0) Index: src/external/historical/nawk/dist/proto.h diff -u src/external/historical/nawk/dist/proto.h:1.2 src/external/historical/nawk/dist/proto.h:1.3 --- src/external/historical/nawk/dist/proto.h:1.2 Thu Aug 26 10:55:20 2010 +++ src/external/historical/nawk/dist/proto.h Sun Nov 7 17:55:26 2010 @@ -127,6 +127,7 @@ extern void fldbld(void); extern void cleanfld(int, int); extern void newfld(int); +extern void setlastfld(int); extern int refldbld(const char *, const char *); extern void recbld(void); extern Cell *fieldadr(int); Index: src/external/historical/nawk/dist/tran.c diff -u src/external/historical/nawk/dist/tran.c:1.2 src/external/historical/nawk/dist/tran.c:1.3 --- src/external/historical/nawk/dist/tran.c:1.2 Thu Aug 26 10:55:20 2010 +++ src/external/historical/nawk/dist/tran.c Sun Nov 7 17:55:26 2010 @@ -298,6 +298,10 @@ if (fldno > *NF) newfld(fldno); dprintf( ("setting field %d to %g\n", fldno, f) ); + } else if (&vp->fval == NF) { + donerec = 0; /* mark $0 invalid */ + setlastfld(f); + dprintf( ("setting NF to %g\n", f) ); } else if (isrec(vp)) { donefld = 0; /* mark $1... invalid */ donerec = 1; @@ -324,6 +328,7 @@ { char *t; int fldno; + Awkfloat f; dprintf( ("starting setsval %p: %s = \"%s\", t=%o, r,f=%d,%d\n", vp, NN(vp->nval), s, vp->tval, donerec, donefld) ); @@ -347,6 +352,14 @@ vp->tval &= ~DONTFREE; dprintf( ("setsval %p: %s = \"%s (%p) \", t=%o r,f=%d,%d\n", vp, NN(vp->nval), t,t, vp->tval, donerec, donefld) ); + + if (&vp->fval == NF) { + donerec = 0; /* mark $0 invalid */ + f = getfval(vp); + setlastfld(f); + dprintf( ("setting NF to %g\n", f) ); + } + return(vp->sval = t); }