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

Reply via email to