No subject
utzoo!decvax!ucbvax!unix-wizards
utzoo!decvax!ucbvax!unix-wizards
Tue Nov 3 00:03:04 AEST 1981
>From sdcsvax!sdcattb:madden at NPRDC Mon Nov 2 23:49:51 1981
The following simple awk program exhibits an apparant bug in awk's
field handling:
{
$1 = "newfield1"
v = $0
print v # This will erroneously generate the original
# contents of field 1, not "newfield1".
length # This implicit reference to $0 causes the following
v = $0 # assignment to proceed properly so that
print v # this statement prints the expected result
}
When pointed at an input record, such as
abc
this program will produce printoutwhich looks like
abc
newfield1
rather than the expected
newfield1
newfield1
Since it is remotely possible that some program might take advantage
of the update failure, perhaps this is not a bug although the
inconsistency involved makes this unlikely.
In any case, the following changes to awk sources run.c and lib.c
correct the problem. The commented lines are the changes.
Jim Madden
UCSD Computer Center
------- run.c -------
obj nodetoobj(a) node *a;
{
obj x;
x.optr = (cell *) a->nobj;
x.otype = OCELL;
x.osub = a->subtype;
if (x.optr->sval == record && donerec == 0) /* Added to force recbld */
recbld(); /* on $1="ab"; x=$0 */
if (isfld(x)) fldbld();
return(x);
}
------- lib.c -------
recbld()
{
int i;
register char *r, *p;
if (donefld == 0 || donerec == 1)
return;
donerec = 1; /* Added to avoid repeated calls on recbld */
r = record;
for (i = 1; i <= *NF; i++) {
p = getsval(&fldtab[i]);
while (*r++ = *p++)
;
*(r-1) = **OFS;
}
*(r-1) = '\0';
dprintf("in recbld FS=%o, recloc=%o\n", **FS, recloc, NULL);
recloc->tval = STR | FLD;
dprintf("in recbld FS=%o, recloc=%o\n", **FS, recloc, NULL);
if (r > record+RECSIZE)
error(FATAL, "built giant record `%.20s...'", record);
dprintf("recbld = |%s|\n", record, NULL, NULL);
}
More information about the Comp.unix.wizards
mailing list