Back to index

courier  0.68.2
Classes | Functions
unicodetest.c File Reference
#include "unicode_config.h"
#include "unicode.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

Go to the source code of this file.

Classes

struct  collect_buf

Functions

static int save_output (const char *p, size_t n, void *ptr)
static void test1 ()
static void test2 ()
int main (int argc, char **argv)

Class Documentation

struct collect_buf

Definition at line 14 of file unicodetest.c.

Class Members
size_t cnt
char * ptr
size_t size

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 126 of file unicodetest.c.

{
       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;
}

Here is the call graph for this function:

static int save_output ( const char *  p,
size_t  n,
void *  ptr 
) [static]

Definition at line 20 of file unicodetest.c.

{
       struct collect_buf *cb=(struct collect_buf *)ptr;

       while (n)
       {
              if (cb->cnt < cb->size)
                     cb->ptr[cb->cnt++]=*p;
              ++p;
              --n;
       }
       return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void test1 ( ) [static]

Definition at line 34 of file unicodetest.c.

{
       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);
       }
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void test2 ( ) [static]

Definition at line 71 of file unicodetest.c.

{
       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);
}

Here is the call graph for this function:

Here is the caller graph for this function: