}
#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