From: Ralph Corderoy Date: Sat, 5 Aug 2017 15:23:10 +0000 (+0100) Subject: test/getcwidth: Expand --dump beyond Unicode's BMP. X-Git-Url: https://diplodocus.org/git/nmh/commitdiff_plain/f74f462c6a0bb4e203789da0a181e3fea9ac4a3b?ds=inline;hp=97f756c32bfb86b4949ec26857ea1b1acd74d801 test/getcwidth: Expand --dump beyond Unicode's BMP. --- diff --git a/test/getcwidth.c b/test/getcwidth.c index c1717e17..264d5831 100644 --- a/test/getcwidth.c +++ b/test/getcwidth.c @@ -147,22 +147,43 @@ getwidth(const char *string) static void dumpwidth(void) { - wchar_t wc, low; + static struct { + wchar_t min, max; + } range[] = { + /* https://en.wikipedia.org/wiki/Unicode#Code_point_planes_and_blocks */ + { L'\x0000', L'\xffff' }, + { L'\x10000', L'\x14fff' }, + { L'\x16000', L'\x18fff' }, + { L'\x1b000', L'\x1bfff' }, + { L'\x1d000', L'\x1ffff' }, + { L'\x20000', L'\x2ffff' }, + { L'\xe0000', L'\xe0fff' }, + { L'\0', L'\0' }, /* Terminates list. */ + }, *r; + int first; + wchar_t wc, start; int width, lastwidth; - for (wc = 0, low = 1, lastwidth = wcwidth(1); wc < 0xffff; wc++) { - width = wcwidth(wc+1); - if (width != lastwidth) { - printf("%04lX - %04lX = %d\n", (unsigned long int) low, - (unsigned long int) (wc), lastwidth); - low = wc+1; + for (r = range; r->max; r++) { + first = 1; + for (wc = r->min; wc <= r->max; wc++) { + width = wcwidth(wc); + if (first) { + start = wc; + lastwidth = width; + first = 0; + continue; + } + if (width != lastwidth) { + printf("%04lX - %04lX = %d\n", (unsigned long)start, + (unsigned long int)wc - 1, lastwidth); + start = wc; + lastwidth = width; + } + if (wc == r->max) + printf("%04lX - %04lX = %d\n", (unsigned long)start, + (unsigned long int)wc, lastwidth); } - lastwidth = width; } - - width = wcwidth(wc); - if (width == lastwidth) - printf("%04lX - %04lX = %d\n", (unsigned long int) low, - (unsigned long int) (wc), width); #endif /* MULTIBYTE_SUPPORT */ }