Restore code to handle wcwidth failure so that unknown codepoints still

do the most likely right thing. GitHub issue 3427, patch based on an
diff from Jesse Luehrs in GitHub issue 3003.
This commit is contained in:
Nicholas Marriott 2023-01-08 22:15:38 +00:00
parent 093fb53773
commit 2a32565e0c

12
utf8.c
View File

@ -229,13 +229,21 @@ utf8_width(struct utf8_data *ud, int *width)
case 0:
return (UTF8_ERROR);
}
log_debug("UTF-8 %.*s is %08X", (int)ud->size, ud->data, (u_int)wc);
#ifdef HAVE_UTF8PROC
*width = utf8proc_wcwidth(wc);
log_debug("utf8proc_wcwidth(%08X) returned %d", (u_int)wc, *width);
#else
*width = wcwidth(wc);
log_debug("wcwidth(%08X) returned %d", (u_int)wc, *width);
if (*width < 0) {
/*
* C1 control characters are nonprintable, so they are always
* zero width.
*/
*width = (wc >= 0x80 && wc <= 0x9f) ? 0 : 1;
}
#endif
log_debug("UTF-8 %.*s %#x, wcwidth() %d", (int)ud->size, ud->data,
(u_int)wc, *width);
if (*width >= 0 && *width <= 0xff)
return (UTF8_DONE);
return (UTF8_ERROR);