ref: c1126ba66854b4b7a47deda563faafac60704d08
parent: e6a25d8b345084f2ca0a0ef3dae6ef846ade7a52
author: Brian Kernighan <fakeuser@fake.com>
date: Sun Oct 2 10:52:04 EDT 2022
"fixed" %c conversion for utf8 inputs
--- a/run.c
+++ b/run.c
@@ -1161,8 +1161,6 @@
if (prec > u8_strlen(t))
prec = u8_strlen(t);
pad = wid>prec ? wid - prec : 0; // has to be >= 0
-//printf("f %s ljust %d wid %d prec %d pad %d t [%s]\n", f, ljust, wid, prec, pad, t);-//printf("{");int i, k, n;
if (ljust) { // print prec chars from t, then pad blanks@@ -1186,7 +1184,6 @@
*p++ = t[k];
}
}
-//printf("}\n");*p = 0;
break;
}
@@ -1199,11 +1196,18 @@
*p++ = '\0'; /* explicit null byte */
*p = '\0'; /* next output will start here */
}
- } else if (u8_nextlen((getsval(x))) > 1) { /* utf-8? */- snprintf(p, BUFSZ(p), "%s", getsval(x)); /* BUG: ignore %[something]c */
- } else {+ break;
+ }
+ t = getsval(x);
+ n = u8_nextlen(t);
+ if (n < 2) { /* not utf8 */snprintf(p, BUFSZ(p), fmt, getsval(x)[0]);
+ break;
}
+ // utf8 character
+ for (int i = 0; i < n; i++)
+ *p++ = t[i];
+ *p = 0;
break;
default:
FATAL("can't happen: bad conversion %c in format()", flag);--- a/testdir/T.utf
+++ b/testdir/T.utf
@@ -154,14 +154,6 @@
😀 1
🖕 finger 8
-# printf(%c) for utf
-try printfc {printf("%c %c\n", substr($1,1,1), substr($1,2,1))}-すべての善人のために す べ
-の今がその時だ の 今
-Сейчас С е
-现在是时候了 现 在
-😀🖕 😀 🖕
-
# printf(%N.Ns) for utf8 strings
try printfs1 {printf("[%5.2s][%-5.2s]\n"), $1, $1}abcd [ ab][ab ]
@@ -190,5 +182,13 @@
现ωabc [现ω][现ω]
ω [ω][ω]
😀 [😀][😀]
+
+# printf(%c) for utf
+try printfc {printf("%c %c\n", $1, substr($1,2,1))}+すべての善人のために す べ
+の今がその時だ の 今
+Сейчас С е
+现在是时候了 现 在
+😀🖕 😀 🖕
!!!!
--
⑨