Silly of me to overlook it: another obvious way you might like to
[sgt/charset] / cstable.c
index 29deceb..f08607e 100644 (file)
--- a/cstable.c
+++ b/cstable.c
@@ -7,6 +7,9 @@
  * libcharset _package_, using libcharset internals.
  */
 
+#include <stdio.h>
+#include <string.h>
+
 #include "charset.h"
 #include "internal.h"
 #include "sbcsdat.h"
@@ -19,57 +22,91 @@ static charset_spec const *const cs_table[] = {
 #include "enum.c"
 #undef ENUM_CHARSET
 };
+static const char *const cs_names[] = {
+#define ENUM_CHARSET(x) #x,
+#include "enum.c"
+#undef ENUM_CHARSET
+};
 
-int main(void)
+int main(int argc, char **argv)
 {
     long int c;
+    int internal_names = FALSE;
+    int verbose = FALSE;
+
+    while (--argc) {
+        char *p = *++argv;
+        if (!strcmp(p, "-i"))
+            internal_names = TRUE;
+        else if (!strcmp(p, "-v"))
+            verbose = TRUE;
+    }
 
     for (c = 0; c < 0x30000; c++) {
-       int i, plane, row, col;
+       int i, plane, row, col, chr;
        char const *sep = "";
 
-       printf("U+%04x:", c);
+       printf("U+%04x:", (unsigned)c);
 
        /*
         * Look up in SBCSes.
         */
        for (i = 0; i < lenof(cs_table); i++)
            if (cs_table[i]->read == read_sbcs &&
-               sbcs_from_unicode(cs_table[i]->data, c) != ERROR) {
+               (chr = sbcs_from_unicode(cs_table[i]->data, c)) != ERROR) {
                printf("%s %s", sep,
-                      charset_to_localenc(cs_table[i]->charset));
+                      (internal_names ? cs_names[i] :
+                       charset_to_localenc(cs_table[i]->charset)));
+               if (verbose)
+                   printf("[%d]", chr);
                sep = ";";
            }
 
        /*
-        * Look up individually in MBCS base charsets.
+        * Look up individually in MBCS base charsets. The
+        * `internal_names' flag does not affect these, because
+        * MBCS base charsets aren't directly encoded by CS_*
+        * constants.
         */
        if (unicode_to_big5(c, &row, &col)) {
            printf("%s Big5", sep);
+           if (verbose)
+               printf("[%d,%d]", row, col);
            sep = ";";
        }
+
        if (unicode_to_gb2312(c, &row, &col)) {
            printf("%s GB2312", sep);
+           if (verbose)
+               printf("[%d,%d]", row, col);
            sep = ";";
        }
 
        if (unicode_to_jisx0208(c, &row, &col)) {
            printf("%s JIS X 0208", sep);
+           if (verbose)
+               printf("[%d,%d]", row, col);
            sep = ";";
        }
 
        if (unicode_to_ksx1001(c, &row, &col)) {
            printf("%s KS X 1001", sep);
+           if (verbose)
+               printf("[%d,%d]", row, col);
            sep = ";";
        }
 
        if (unicode_to_cp949(c, &row, &col)) {
            printf("%s CP949", sep);
+           if (verbose)
+               printf("[%d,%d]", row, col);
            sep = ";";
        }
 
        if (unicode_to_cns11643(c, &plane, &row, &col)) {
            printf("%s CNS11643", sep);
+           if (verbose)
+               printf("[%d,%d,%d]", plane, row, col);
            sep = ";";
        }