X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/de0cc2acd75970d5908922ea9d44deef595786a5..be3d905a16b46a38b4cb09b5e5af2dcbb51c944c:/test/getcwidth.c?ds=sidebyside diff --git a/test/getcwidth.c b/test/getcwidth.c index 2df307c9..f2a2ac69 100644 --- a/test/getcwidth.c +++ b/test/getcwidth.c @@ -20,6 +20,9 @@ #include #endif +static void usage(char *); +static void dumpwidth(void); + int main(int argc, char *argv[]) { @@ -35,17 +38,22 @@ main(int argc, char *argv[]) setlocale(LC_ALL, ""); - if (argc != 1) { - fprintf(stderr, "Usage: %s\n", argv[0]); - fprintf(stderr, "Returns the column width of a UTF-8 " - "multibyte character\n"); - exit(1); + if (argc > 2) + usage(argv[0]); + + if (argc == 2) { + if (strcmp(argv[1], "--dump") == 0) { + dumpwidth(); + exit(0); + } else { + usage(argv[0]); + } } #ifndef MULTIBYTE_SUPPORT fprintf(stderr, "Nmh was not configured with multibyte support\n"); exit(1); -#else +#else /* MULTIBYTE_SUPPORT */ /* * It's not clear to me that we can just call mbtowc() with a * combining character; just to be safe, feed it in a base @@ -54,7 +62,7 @@ main(int argc, char *argv[]) mbtowc(NULL, NULL, 0); - charlen = mbtowc(&c, string, strlen(string)); + charlen = mbtowc(&c, (char *) string, strlen((char *) string)); if (charlen != 1) { fprintf(stderr, "We expected a beginning character length " @@ -62,7 +70,7 @@ main(int argc, char *argv[]) exit(1); } - p = string + charlen; + p = (char *) (string + charlen); charlen = mbtowc(&c, p, strlen(p)); @@ -78,3 +86,39 @@ main(int argc, char *argv[]) exit(0); #endif /* MULTIBYTE_SUPPORT */ } + +static void +usage(char *argv0) +{ + fprintf(stderr, "Usage: %s [--dump]\n", argv0); + fprintf(stderr, "Returns the column width of a UTF-8 combining " + "multibyte character\n"); + fprintf(stderr, "\t--dump\tDump complete width table\n"); + + exit(1); +} + +static void +dumpwidth(void) +{ +#ifndef MULTIBYTE_SUPPORT + fprintf(stderr, "Nmh was not configured with multibyte support\n"); + exit(1); +#else /* MULTIBYTE_SUPPORT */ + wchar_t wc, low; + int width, lastwidth; + + for (wc = low = 1, lastwidth = wcwidth(wc); wc <= 0xffff; wc++) { + width = wcwidth(wc); + if (width != lastwidth) { + printf("%04X - %04X = %d\n", low, wc - 1, lastwidth); + low = wc; + } + lastwidth = width; + } + + width = wcwidth(wc - 1); + if (width == lastwidth) + printf("%04X - %04X = %d\n", low, wc - 1, width); +#endif /* MULTIBYTE_SUPPORT */ +}