Merge branch 'debian'
[hcoop/debian/courier-authlib.git] / libs / unicode / unicodetest.c
diff --git a/libs/unicode/unicodetest.c b/libs/unicode/unicodetest.c
new file mode 100644 (file)
index 0000000..0356624
--- /dev/null
@@ -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;
+}