]> mj.ucw.cz Git - libucw.git/blobdiff - lib/unicode.c
Merge with git+ssh://git.ucw.cz/projects/sherlock/GIT/sherlock.git
[libucw.git] / lib / unicode.c
index e4a33af8495f216bcbade228c55ce271a8f0f23c..c5ffb8267bc89ad736dcc724abfc2554e875a723 100644 (file)
@@ -37,55 +37,107 @@ utf8_strnlen(const byte *str, uns n)
 }
 
 #ifdef TEST
+
 #include <string.h>
 #include <stdio.h>
+
 int main(int argc, char **argv)
 {
   byte buf[256];
-  if (argc > 1 && !strncmp(argv[1], "get", 3))
+
+#define FUNCS \
+  F(UTF8_GET) F(UTF8_32_GET) F(UTF16_BE_GET) F(UTF16_LE_GET) \
+  F(UTF8_PUT) F(UTF8_32_PUT) F(UTF16_BE_PUT) F(UTF16_LE_PUT)
+
+  enum {
+#define F(x) FUNC_##x,
+    FUNCS
+#undef F
+  };
+  char *names[] = {
+#define F(x) [FUNC_##x] = #x,
+    FUNCS
+#undef F
+  };
+
+  uns func = ~0U;
+  if (argc > 1)
+    for (uns i = 0; i < ARRAY_SIZE(names); i++)
+      if (!strcasecmp(names[i], argv[1]))
+       func = i;
+  if (!~func)
+    {
+      fprintf(stderr, "Invalid usage!\n");
+      return 1;
+    }
+
+  if (func < FUNC_UTF8_PUT)
     {
-      int f32 = !strcmp(argv[1], "get32");
-      byte *p = buf;
+      byte *p = buf, *q = buf, *last;
       uns u;
+      bzero(buf, sizeof(buf));
       while (scanf("%x", &u) == 1)
-       *p++ = u;
-      *p = 0;
-      p = buf;
-      while (*p)
+       *q++ = u;
+      while (p < q)
        {
+         last = p;
          if (p != buf)
            putchar(' ');
-         if (f32)
-           GET_UTF8_32(p, u);
-         else
-           GET_UTF8(p, u);
+         switch (func)
+           {
+             case FUNC_UTF8_GET:
+               p = utf8_get(p, &u);
+               break;
+             case FUNC_UTF8_32_GET:
+               p = utf8_32_get(p, &u);
+               break;
+             case FUNC_UTF16_BE_GET:
+               p = utf16_be_get(p, &u);
+               break;
+             case FUNC_UTF16_LE_GET:
+               p = utf16_le_get(p, &u);
+               break;
+             default:
+               ASSERT(0);
+           }
          printf("%04x", u);
+         ASSERT(last < p && p <= q);
        }
       putchar('\n');
     }
-  else if (argc > 1 && !strncmp(argv[1], "put", 3))
+  else
     {
       uns u, i=0;
-      int f32 = !strcmp(argv[1], "put32");
       while (scanf("%x", &u) == 1)
        {
-         byte *p = buf;
-         if (f32)
-           PUT_UTF8_32(p, u);
-         else
-           PUT_UTF8(p, u);
-         *p = 0;
-         for (p=buf; *p; p++)
+         byte *p = buf, *q = buf;
+         switch (func)
+           {
+             case FUNC_UTF8_PUT:
+               p = utf8_put(p, u);
+               break;
+             case FUNC_UTF8_32_PUT:
+               p = utf8_32_put(p, u);
+               break;
+             case FUNC_UTF16_BE_PUT:
+               p = utf16_be_put(p, u);
+               break;
+             case FUNC_UTF16_LE_PUT:
+               p = utf16_le_put(p, u);
+               break;
+             default:
+               ASSERT(0);
+           }
+         while (q < p)
            {
              if (i++)
                putchar(' ');
-             printf("%02x", *p);
+             printf("%02x", *q++);
            }
        }
       putchar('\n');
     }
-  else
-    puts("?");
   return 0;
 }
+
 #endif