shithub: trueawk

Download patch

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))}
+すべての善人のために	す べ
+の今がその時だ	の 今
+Сейчас	С е
+现在是时候了	现 在
+😀🖕	😀 🖕
 
 !!!!
--