Back to index

courier  0.68.2
unicodetest.c
Go to the documentation of this file.
00001 /*
00002 ** Copyright 2011 Double Precision, Inc.
00003 ** See COPYING for distribution information.
00004 **
00005 */
00006 
00007 #include      "unicode_config.h"
00008 #include      "unicode.h"
00009 #include      <string.h>
00010 #include      <stdlib.h>
00011 #include      <stdio.h>
00012 #include      <errno.h>
00013 
00014 struct collect_buf {
00015        char *ptr;
00016        size_t cnt;
00017        size_t size;
00018 };
00019 
00020 static int save_output(const char *p, size_t n, void *ptr)
00021 {
00022        struct collect_buf *cb=(struct collect_buf *)ptr;
00023 
00024        while (n)
00025        {
00026               if (cb->cnt < cb->size)
00027                      cb->ptr[cb->cnt++]=*p;
00028               ++p;
00029               --n;
00030        }
00031        return 0;
00032 }
00033 
00034 static void test1()
00035 {
00036        static const char teststr[]= {
00037               0x00, 0x00, 0x00, 0x41,
00038               0x00, 0x00, 0x04, 0x14,
00039               0x00, 0x00, 0x04, 0x30,
00040               0x00, 0x00, 0x00, 0x42};
00041        char outputbuf[12];
00042        struct collect_buf cb;
00043        libmail_u_convert_handle_t h;
00044        int checkflag;
00045 
00046        cb.ptr=outputbuf;
00047        cb.cnt=0;
00048        cb.size=sizeof(outputbuf);
00049 
00050        if ((h=libmail_u_convert_init("UCS-4BE", "ISO-8859-1",
00051                                   save_output, &cb)) == NULL)
00052        {
00053               perror("libmail_u_convert_init");
00054               exit(1);
00055        }
00056 
00057        libmail_u_convert(h, teststr, sizeof(teststr));
00058 
00059        if (libmail_u_convert_deinit(h, &checkflag))
00060        {
00061               perror("libmail_u_convert_deinit");
00062               exit(1);
00063        }
00064        if (cb.cnt != 2 || memcmp(cb.ptr, "AB", 2) || !checkflag)
00065        {
00066               fprintf(stderr, "Unexpected result from convert()\n");
00067               exit(1);
00068        }
00069 }
00070 
00071 static void test2()
00072 {
00073        unicode_char *ucptr;
00074        size_t ucsize;
00075        libmail_u_convert_handle_t h=
00076               libmail_u_convert_tou_init("utf-8", &ucptr, &ucsize, 1);
00077        char *cptr;
00078        size_t csize;
00079 
00080        if (h)
00081        {
00082               size_t i;
00083 
00084               for (i=0; i<1024/32; ++i)
00085                      libmail_u_convert(h, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
00086                                      32);
00087 
00088               if (libmail_u_convert_deinit(h, NULL) == 0 &&
00089                   ucsize == 1024+1)
00090               {
00091                      for (i=0; i<1024; i++)
00092                             if (ucptr[i] != 'A')
00093                                    break;
00094 
00095                      if (i == 1024)
00096                      {
00097                             h=libmail_u_convert_fromu_init("utf-8",
00098                                                         &cptr, &csize,
00099                                                         1);
00100 
00101                             if (h)
00102                             {
00103                                    libmail_u_convert_uc(h, ucptr, 1024);
00104                                    if (libmail_u_convert_deinit(h, NULL)
00105                                        == 0 && csize == 1024+1)
00106                                    {
00107                                           for (i=0; i<1024; i++)
00108                                                  if (cptr[i] != 'A')
00109                                                         break;
00110 
00111                                           free(ucptr);
00112                                           free(cptr);
00113                                           if (i == 1024)
00114                                                  return;
00115                                    }
00116                             }
00117                      }
00118               }
00119               fprintf(stderr, "test2: failed");
00120               errno=EINVAL;
00121        }
00122        perror("test2");
00123        exit(1);
00124 }
00125 
00126 int main(int argc, char **argv)
00127 {
00128        const char *chset=unicode_x_imap_modutf7;
00129        int argn=1;
00130 
00131        if (argn < argc && strcmp(argv[argn], "--smap") == 0)
00132        {
00133               chset=unicode_x_imap_modutf7 " ./~:";
00134               ++argn;
00135        }
00136 
00137        if (argn < argc && strcmp(argv[argn], "--totitle") == 0)
00138        {
00139               ++argn;
00140 
00141               if (argn < argc)
00142               {
00143                      char *p=libmail_u_convert_tocase(argv[argn],
00144                                                   "utf-8",
00145                                                   unicode_tc,
00146                                                   unicode_lc);
00147 
00148                      if (p)
00149                      {
00150                             printf("%s\n", p);
00151                             free(p);
00152                             exit(0);
00153                      }
00154               }
00155               exit(1);
00156        }
00157 
00158        if (argn < argc)
00159        {
00160               int errflag;
00161               char *p=libmail_u_convert_tobuf(argv[argn],
00162                                           "utf-8",
00163                                           chset,
00164                                           &errflag);
00165               char *q;
00166 
00167               if (!p)
00168               {
00169                      perror("libmail_u_convert");
00170                      exit(1);
00171               }
00172 
00173               if (errflag)
00174               {
00175                      fprintf(stderr, "Conversion error?\n");
00176                      exit(1);
00177               }
00178 
00179               q=libmail_u_convert_tobuf(p, chset, "utf-8", &errflag);
00180               if (!q)
00181               {
00182                      perror("libmail_u_convert");
00183                      exit(1);
00184               }
00185 
00186               if (errflag)
00187               {
00188                      fprintf(stderr, "Conversion error?\n");
00189                      exit(1);
00190               }
00191               if (strcmp(q, argv[argn]))
00192               {
00193                      fprintf(stderr, "Round trip error\n");
00194                      exit(1);
00195               }
00196               printf("%s\n", p);
00197               free(p);
00198               free(q);
00199        }
00200        else
00201        {
00202               test1();
00203               test2();
00204        }
00205        return 0;
00206 }