diff options
Diffstat (limited to 'unicode/unicodetest.c')
| -rw-r--r-- | unicode/unicodetest.c | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/unicode/unicodetest.c b/unicode/unicodetest.c new file mode 100644 index 0000000..0356624 --- /dev/null +++ b/unicode/unicodetest.c @@ -0,0 +1,206 @@ +/* +** Copyright 2011 Double Precision, Inc. +** See COPYING for distribution information. +** +*/ + +#include "unicode_config.h" +#include "unicode.h" +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include <errno.h> + +struct collect_buf { + char *ptr; + size_t cnt; + size_t size; +}; + +static int save_output(const char *p, size_t n, void *ptr) +{ + struct collect_buf *cb=(struct collect_buf *)ptr; + + while (n) + { + if (cb->cnt < cb->size) + cb->ptr[cb->cnt++]=*p; + ++p; + --n; + } + return 0; +} + +static void test1() +{ + static const char teststr[]= { + 0x00, 0x00, 0x00, 0x41, + 0x00, 0x00, 0x04, 0x14, + 0x00, 0x00, 0x04, 0x30, + 0x00, 0x00, 0x00, 0x42}; + char outputbuf[12]; + struct collect_buf cb; + libmail_u_convert_handle_t h; + int checkflag; + + cb.ptr=outputbuf; + cb.cnt=0; + cb.size=sizeof(outputbuf); + + if ((h=libmail_u_convert_init("UCS-4BE", "ISO-8859-1", + save_output, &cb)) == NULL) + { + perror("libmail_u_convert_init"); + exit(1); + } + + libmail_u_convert(h, teststr, sizeof(teststr)); + + if (libmail_u_convert_deinit(h, &checkflag)) + { + perror("libmail_u_convert_deinit"); + exit(1); + } + if (cb.cnt != 2 || memcmp(cb.ptr, "AB", 2) || !checkflag) + { + fprintf(stderr, "Unexpected result from convert()\n"); + exit(1); + } +} + +static void test2() +{ + unicode_char *ucptr; + size_t ucsize; + libmail_u_convert_handle_t h= + libmail_u_convert_tou_init("utf-8", &ucptr, &ucsize, 1); + char *cptr; + size_t csize; + + if (h) + { + size_t i; + + for (i=0; i<1024/32; ++i) + libmail_u_convert(h, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + 32); + + if (libmail_u_convert_deinit(h, NULL) == 0 && + ucsize == 1024+1) + { + for (i=0; i<1024; i++) + if (ucptr[i] != 'A') + break; + + if (i == 1024) + { + h=libmail_u_convert_fromu_init("utf-8", + &cptr, &csize, + 1); + + if (h) + { + libmail_u_convert_uc(h, ucptr, 1024); + if (libmail_u_convert_deinit(h, NULL) + == 0 && csize == 1024+1) + { + for (i=0; i<1024; i++) + if (cptr[i] != 'A') + break; + + free(ucptr); + free(cptr); + if (i == 1024) + return; + } + } + } + } + fprintf(stderr, "test2: failed"); + errno=EINVAL; + } + perror("test2"); + exit(1); +} + +int main(int argc, char **argv) +{ + const char *chset=unicode_x_imap_modutf7; + int argn=1; + + if (argn < argc && strcmp(argv[argn], "--smap") == 0) + { + chset=unicode_x_imap_modutf7 " ./~:"; + ++argn; + } + + if (argn < argc && strcmp(argv[argn], "--totitle") == 0) + { + ++argn; + + if (argn < argc) + { + char *p=libmail_u_convert_tocase(argv[argn], + "utf-8", + unicode_tc, + unicode_lc); + + if (p) + { + printf("%s\n", p); + free(p); + exit(0); + } + } + exit(1); + } + + if (argn < argc) + { + int errflag; + char *p=libmail_u_convert_tobuf(argv[argn], + "utf-8", + chset, + &errflag); + char *q; + + if (!p) + { + perror("libmail_u_convert"); + exit(1); + } + + if (errflag) + { + fprintf(stderr, "Conversion error?\n"); + exit(1); + } + + q=libmail_u_convert_tobuf(p, chset, "utf-8", &errflag); + if (!q) + { + perror("libmail_u_convert"); + exit(1); + } + + if (errflag) + { + fprintf(stderr, "Conversion error?\n"); + exit(1); + } + if (strcmp(q, argv[argn])) + { + fprintf(stderr, "Round trip error\n"); + exit(1); + } + printf("%s\n", p); + free(p); + free(q); + } + else + { + test1(); + test2(); + } + return 0; +} |
