#include <wchar.h>
#endif
+static void usage(char *);
+static void dumpwidth(void);
+
int
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
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 */
+}