awk: correct incoherent cell in assignment (thanks smj, mpinjr)

In run.c::assign(), assigning to $0 from $F, a field,
where F >= 2, produces an incoherent cell.

The assignment occurs in two steps, first the string value
and then the float. When the string value is assigned to $0,
setsval invalidates the fields. If FS hasn't changed, after
getfval rebuilds the fields, NF = 1 and F >= 2, therefore $F
is definitely uninitialized. The result is a float val of
0.0, producing a boolean false in the pattern expression.

Coercing a string comparison gives the expected result
because the incoherent cell has the correct string
value, which is not empty and evaluates to true.
This commit is contained in:
Ori Bernstein 2022-06-25 20:03:41 +00:00
parent 5579176f4a
commit 10afa189d5

View file

@ -1127,8 +1127,9 @@ Cell *assign(Node **a, int n) /* a[0] = a[1], a[0] += a[1], etc. */
if (x == y && !(x->tval & (FLD|REC))) /* self-assignment: */
goto Free; /* leave alone unless it's a field */
if ((y->tval & (STR|NUM)) == (STR|NUM)) {
yf = getfval(y);
setsval(x, getsval(y));
x->fval = getfval(y);
x->fval = yf;
x->tval |= NUM;
}
else if (isstr(y))