From 538b7620f514ff7b1ffa26a7f149596f7ec04190 Mon Sep 17 00:00:00 2001 From: Ray Gardner Date: Thu, 14 Nov 2024 20:44:37 -0700 Subject: [PATCH] Fix bugs setting NF=0 or negative Setting NF=0 didn't work and setting it negative failed to abort. Setting NF=0 now sets $0 to an empty string. Also fixed call to wrong err msg func in run.c --- toys/pending/awk.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/toys/pending/awk.c b/toys/pending/awk.c index 88d78ca7..33202a58 100644 --- a/toys/pending/awk.c +++ b/toys/pending/awk.c @@ -2714,6 +2714,7 @@ static void set_zvalue_str(struct zvalue *v, char *s, size_t size) // All changes to NF go through here! static void set_nf(int nf) { + if (nf < 0) FATAL("NF set negative"); STACK[NF].num = TT.nf_internal = nf; STACK[NF].flags = ZF_NUM; } @@ -2755,7 +2756,7 @@ static int splitter(void (*setter)(struct zmap *, int, char *, size_t), struct z char cbuf[8]; unsigned wc; int nc = utf8towc(&wc, s, strlen(s)); - if (nc < 2) FATAL("bad string for split: \"%s\"\n", s0); + if (nc < 2) FFATAL("bad string for split: \"%s\"\n", s0); s += nc; nc = wctoutf8(cbuf, wc); setter(m, ++nf, cbuf, nc); @@ -2801,6 +2802,10 @@ static void rebuild_field0(void) { struct zstring *s = FIELD[0].vst; int nf = TT.nf_internal; + if (!nf) { + zvalue_copy(&FIELD[0], &uninit_string_zvalue); + return; + } // uninit value needed for eventual reference to .vst in zstring_release() struct zvalue tempv = uninit_zvalue; zvalue_copy(&tempv, to_str(&STACK[OFS])); -- 2.39.5