The attached four patches, tested with git am, bring toybox awk.c and awk.test up to date with my current github repo. Apply in order, 0001* ... 0004*.
The last batch I sent in October had 7 patches, of which Rob applied the first 5. He objected to the patches to shut up clang (" " + 2 changed to &(" "[2])). That's fine with me. Please disregard and do not apply the last two of those. This set supersedes those two, and includes the fix to one of the three clang warnings and does not change " " + 2.
From f0c7f61334a4c8ee1781e9c0f096ffadfbbeaf25 Mon Sep 17 00:00:00 2001 From: Ray Gardner <raygard@gmail.com> Date: Sun, 1 Dec 2024 15:56:27 -0700 Subject: [PATCH 1/1] Remove getline() / getdelim() declarations getdelim() is no longer used; getline() declaration not needed in toybox. Make adjustments. --- toys/pending/awk.c | 3 --- diff --git a/toys/pending/awk.c b/toys/pending/awk.c index 33202a5..cfead8c 100644 --- a/toys/pending/awk.c +++ b/toys/pending/awk.c @@ -302,9 +302,6 @@ struct zmap { #define NO_EXIT_STATUS (9999987) // value unlikely to appear in exit stmt -ssize_t getline(char **lineptr, size_t *n, FILE *stream); -ssize_t getdelim(char ** restrict lineptr, size_t * restrict n, int delimiter, FILE *stream); - //////////////////// -- 2.43.0
From 7339081a68a192f6a4d469eab9e58f0feac1a83c Mon Sep 17 00:00:00 2001 From: Ray Gardner <raygard@gmail.com> Date: Thu, 14 Nov 2024 20:38:43 -0700 Subject: [PATCH 1/3] Fix clang warning; remove incorrect comment --- toys/pending/awk.c | 4 +--- diff --git a/toys/pending/awk.c b/toys/pending/awk.c index a2a26cc..88d78ca 100644 --- a/toys/pending/awk.c +++ b/toys/pending/awk.c @@ -752,8 +752,6 @@ static int get_char(void) if (TT.scs->line == nl) return EOF; if (!TT.scs->fp) { progfile_open(); - // The " " + 1 is to set p to null string but allow ref to prev char for - // "lastchar" test below. } // Save last char to allow faking final newline. int lastchar = (TT.scs->p)[-2]; @@ -991,7 +989,7 @@ static void ascan_opt_div(int div_op_allowed_here) TT.scs->toktype = BUILTIN; TT.scs->tok = tkbuiltin; TT.scs->tokbuiltin = n; - } else if ((TT.scs->ch == '(')) { + } else if (TT.scs->ch == '(') { TT.scs->toktype = USERFUNC; TT.scs->tok = tkfunc; } else { -- 2.43.0
From c3066d1eb34301d52697c3be3a8e1aa4e1cf9134 Mon Sep 17 00:00:00 2001 From: Ray Gardner <raygard@gmail.com> Date: Sat, 16 Nov 2024 09:30:59 -0700 Subject: [PATCH 3/3] Add test for setting NF=0 --- tests/awk.test | 3 +++ diff --git a/tests/awk.test b/tests/awk.test index d94b81e..94f096c 100644 --- a/tests/awk.test +++ b/tests/awk.test @@ -420,6 +420,9 @@ testcmd "awk -v myvar=val -f file1 file" "-v myvar=$2 -f test.awk testfile1.txt # 2024: New tests -- not in Divya Kothari's original ... +# Assigning NF=0 caused trouble +testcmd "assign NF=0" "'BEGIN { \$0 = \"a b\"; print NF, \"x\" \$0 \"y\"; NF = 0; print NF, \"x\" \$0 \"y\" }'" "2 xa by\n0 xy\n" "" "" + # The following has never had a problem but is a good test anyway testcmd "split on empty string" "'BEGIN { n = split(\"abc\", a, \"\");print n, length(a)}'" "3 3\n" "" "" # The following must be run with ASAN=1 to cause failure with older versions -- 2.43.0
From 5a593d234845389b862f227691586bcd605b23e5 Mon Sep 17 00:00:00 2001 From: Ray Gardner <raygard@gmail.com> Date: Thu, 14 Nov 2024 20:44:37 -0700 Subject: [PATCH 2/3] 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 ++++++- diff --git a/toys/pending/awk.c b/toys/pending/awk.c index 88d78ca..33202a5 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.43.0
_______________________________________________ Toybox mailing list Toybox@lists.landley.net http://lists.landley.net/listinfo.cgi/toybox-landley.net