X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Funicode.c;h=c5ffb8267bc89ad736dcc724abfc2554e875a723;hb=99dbc539d5ce9a0b119e7b59ed943c129f617ec0;hp=e4a33af8495f216bcbade228c55ce271a8f0f23c;hpb=b09f6b2c8551baf93ea0576eab4f00e721338369;p=libucw.git diff --git a/lib/unicode.c b/lib/unicode.c index e4a33af8..c5ffb826 100644 --- a/lib/unicode.c +++ b/lib/unicode.c @@ -37,55 +37,107 @@ utf8_strnlen(const byte *str, uns n) } #ifdef TEST + #include #include + 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