Merge pull request #20 from melloc/nf-self-assign
Fix issues with NF self-assignment and setting NF to negative values
This commit is contained in:
commit
bf2585c9fd
@ -51,3 +51,4 @@ array passed as the second argument, then split() would previously read
|
|||||||
from the freed memory and possibly produce incorrect results (depending
|
from the freed memory and possibly produce incorrect results (depending
|
||||||
on the system's malloc()/free() behaviour.)
|
on the system's malloc()/free() behaviour.)
|
||||||
|
|
||||||
|
|
||||||
|
1
bugs-fixed/negative-nf.awk
Normal file
1
bugs-fixed/negative-nf.awk
Normal file
@ -0,0 +1 @@
|
|||||||
|
BEGIN { NF = -5; }
|
2
bugs-fixed/negative-nf.ok
Normal file
2
bugs-fixed/negative-nf.ok
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
./a.out: cannot set NF to a negative value
|
||||||
|
source line number 1
|
6
bugs-fixed/nf-self-assign.awk
Normal file
6
bugs-fixed/nf-self-assign.awk
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
BEGIN {
|
||||||
|
$0="a b c";
|
||||||
|
OFS=",";
|
||||||
|
NF = NF;
|
||||||
|
print;
|
||||||
|
}
|
1
bugs-fixed/nf-self-assign.bad
Normal file
1
bugs-fixed/nf-self-assign.bad
Normal file
@ -0,0 +1 @@
|
|||||||
|
a b c
|
1
bugs-fixed/nf-self-assign.ok
Normal file
1
bugs-fixed/nf-self-assign.ok
Normal file
@ -0,0 +1 @@
|
|||||||
|
a,b,c
|
2
lib.c
2
lib.c
@ -393,6 +393,8 @@ void newfld(int n) /* add field n after end of existing lastfld */
|
|||||||
|
|
||||||
void setlastfld(int n) /* set lastfld cleaning fldtab cells if necessary */
|
void setlastfld(int n) /* set lastfld cleaning fldtab cells if necessary */
|
||||||
{
|
{
|
||||||
|
if (n < 0)
|
||||||
|
FATAL("cannot set NF to a negative value");
|
||||||
if (n > nfields)
|
if (n > nfields)
|
||||||
growfldtab(n);
|
growfldtab(n);
|
||||||
|
|
||||||
|
4
run.c
4
run.c
@ -1123,8 +1123,8 @@ Cell *assign(Node **a, int n) /* a[0] = a[1], a[0] += a[1], etc. */
|
|||||||
y = execute(a[1]);
|
y = execute(a[1]);
|
||||||
x = execute(a[0]);
|
x = execute(a[0]);
|
||||||
if (n == ASSIGN) { /* ordinary assignment */
|
if (n == ASSIGN) { /* ordinary assignment */
|
||||||
if (x == y && !(x->tval & (FLD|REC))) /* self-assignment: */
|
if (x == y && !(x->tval & (FLD|REC)) && x != nfloc)
|
||||||
; /* leave alone unless it's a field */
|
; /* self-assignment: leave alone unless it's a field or NF */
|
||||||
else if ((y->tval & (STR|NUM)) == (STR|NUM)) {
|
else if ((y->tval & (STR|NUM)) == (STR|NUM)) {
|
||||||
setsval(x, getsval(y));
|
setsval(x, getsval(y));
|
||||||
x->fval = getfval(y);
|
x->fval = getfval(y);
|
||||||
|
Loading…
Reference in New Issue
Block a user