aboutsummaryrefslogtreecommitdiff
path: root/lib/linestack.c
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2017-09-02 20:40:24 -0500
committerRob Landley <rob@landley.net>2017-09-02 20:40:24 -0500
commit6e766936396e2da7fb3820cadb3a9ae823caa9a8 (patch)
tree2f451efca683de7858d201fb8de7b3719f7429df /lib/linestack.c
parent67ddade3373d0fefeff25b48430e5f08c3a7711b (diff)
downloadtoybox-6e766936396e2da7fb3820cadb3a9ae823caa9a8.tar.gz
utf8towc() has to be in lib.c if strlower() is going to use it, because
scripts/*.c builds against lib.c but not linestack.c.
Diffstat (limited to 'lib/linestack.c')
-rw-r--r--lib/linestack.c33
1 files changed, 1 insertions, 32 deletions
diff --git a/lib/linestack.c b/lib/linestack.c
index 44667106..91dec564 100644
--- a/lib/linestack.c
+++ b/lib/linestack.c
@@ -80,37 +80,6 @@ struct linestack *linestack_load(char *name)
return ls;
}
-// Convert utf8 sequence to a unicode wide character
-int utf8towc(wchar_t *wc, char *str, unsigned len)
-{
- unsigned result, mask, first;
- char *s, c;
-
- // fast path ASCII
- if (len && *str<128) return !!(*wc = *str);
-
- result = first = *(s = str++);
- for (mask = 6; (first&0xc0)==0xc0; mask += 5, first <<= 1) {
- if (!--len) return -2;
- c = *(str++);
- if ((c&0xc0) != 0x80) return -1;
- result = (result<<6)|(c&0x3f);
- }
- result &= (1<<mask)-1;
- c = str-s;
- if (mask==6 || mask>21) return -1;
-
- // Avoid overlong encodings
- if (mask==6 || mask>21 || result<(unsigned []){0x80,0x800,0x10000}[c-2])
- return -1;
-
- // Limit unicode so it can't encode anything UTF-16 can't.
- if (result>0x10ffff || (result>=0xd800 && result<=0xdfff)) return -1;
- *wc = result;
-
- return str-s;
-}
-
// Show width many columns, negative means from right edge, out=0 just measure
// if escout, send it unprintable chars, otherwise pass through raw data.
// Returns width in columns, moves *str to end of data consumed.
@@ -123,7 +92,7 @@ int crunch_str(char **str, int width, FILE *out, char *escmore,
for (end = start = *str; *end; columns += col, end += bytes) {
wchar_t wc;
- if ((bytes = mbrtowc(&wc, end, MB_CUR_MAX, 0))>0 && (col = wcwidth(wc))>=0)
+ if ((bytes = utf8towc(&wc, end, 4))>0 && (col = wcwidth(wc))>=0)
{
if (!escmore || wc>255 || !strchr(escmore, wc)) {
if (width-columns<col) break;