summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOri Bernstein <ori@eigenstate.org>2019-10-09 17:36:02 -0700
committerOri Bernstein <ori@eigenstate.org>2019-10-09 17:36:02 -0700
commite3a43c4f2b3751da67d24e40a77d8bcac3957520 (patch)
treec64b26c0054ac53c45aa996d23b61ad40c1719af
parentdb911d4fef8d2bcfc6c314fcd3c06f35f5b4249c (diff)
awk: make empty FS unicodely-correct.
-rw-r--r--sys/src/cmd/awk/lib.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/sys/src/cmd/awk/lib.c b/sys/src/cmd/awk/lib.c
index 6ea282bae..2c5a60465 100644
--- a/sys/src/cmd/awk/lib.c
+++ b/sys/src/cmd/awk/lib.c
@@ -249,7 +249,7 @@ void fldbld(void) /* create fields from current record */
/* the fields are all stored in this one array with \0's */
char *r, *fr, sep;
Cell *p;
- int i, j, n;
+ int i, j, n, w;
if (donefld)
return;
@@ -287,15 +287,18 @@ void fldbld(void) /* create fields from current record */
}
*fr = 0;
} else if ((sep = *inputFS) == 0) { /* new: FS="" => 1 char/field */
- for (i = 0; *r != 0; r++) {
- char buf[2];
+ for (i = 0; *r != 0; r += w) {
+ char buf[UTFmax + 1];
+ Rune chr;
+
i++;
if (i > nfields)
growfldtab(i);
if (freeable(fldtab[i]))
xfree(fldtab[i]->sval);
- buf[0] = *r;
- buf[1] = 0;
+ w = chartorune(&chr, r);
+ n = runetochar(buf, &chr);
+ buf[n] = 0;
fldtab[i]->sval = tostring(buf);
fldtab[i]->tval = FLD | STR;
}