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);
}