This source file includes following definitions.
- new_offsets
 
- main
 
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 #include <config.h>
  20 
  21 #include "uniconv.h"
  22 
  23 #include <errno.h>
  24 #include <stdlib.h>
  25 #include <string.h>
  26 
  27 #include "macros.h"
  28 
  29 
  30 #define MAGIC 0x1983EFF1
  31 
  32 static size_t *
  33 new_offsets (size_t n)
     
  34 {
  35   size_t *offsets = (size_t *) malloc ((n + 1) * sizeof (size_t));
  36   offsets[n] = MAGIC;
  37   return offsets;
  38 }
  39 
  40 int
  41 main ()
     
  42 {
  43 #if HAVE_ICONV
  44   static enum iconv_ilseq_handler handlers[] =
  45     { iconveh_error, iconveh_question_mark, iconveh_escape_sequence };
  46   size_t h;
  47   size_t o;
  48   size_t i;
  49 
  50   
  51 
  52 
  53   
  54   for (h = 0; h < SIZEOF (handlers); h++)
  55     {
  56       enum iconv_ilseq_handler handler = handlers[h];
  57       static const uint32_t input[] = 
  58         {
  59           0xC4, 'r', 'g', 'e', 'r', ' ', 'm', 'i', 't', ' ', 'b', 0xF6, 's',
  60           'e', 'n', ' ', 'B', 0xFC, 'b', 'c', 'h', 'e', 'n', ' ', 'o', 'h',
  61           'n', 'e', ' ', 'A', 'u', 'g', 'e', 'n', 'm', 'a', 0xDF
  62         };
  63       static const char expected[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
  64       for (o = 0; o < 2; o++)
  65         {
  66           size_t *offsets = (o ? new_offsets (SIZEOF (input)) : NULL);
  67           size_t length;
  68           char *result = u32_conv_to_encoding ("ISO-8859-1", handler,
  69                                                input, SIZEOF (input),
  70                                                offsets,
  71                                                NULL, &length);
  72           ASSERT (result != NULL);
  73           ASSERT (length == strlen (expected));
  74           ASSERT (memcmp (result, expected, length) == 0);
  75           if (o)
  76             {
  77               for (i = 0; i < 37; i++)
  78                 ASSERT (offsets[i] == i);
  79               ASSERT (offsets[37] == MAGIC);
  80               free (offsets);
  81             }
  82           free (result);
  83         }
  84     }
  85 
  86   
  87   for (h = 0; h < SIZEOF (handlers); h++)
  88     {
  89       enum iconv_ilseq_handler handler = handlers[h];
  90       static const uint32_t input[] = 
  91         {
  92           'R', 'a', 'f', 'a', 0x0142, ' ', 'M', 'a', 's', 'z', 'k', 'o', 'w',
  93           's', 'k', 'i'
  94         };
  95       for (o = 0; o < 2; o++)
  96         {
  97           size_t *offsets = (o ? new_offsets (SIZEOF (input)) : NULL);
  98           size_t length = 0xdead;
  99           char *result = u32_conv_to_encoding ("ISO-8859-1", handler,
 100                                                input, SIZEOF (input),
 101                                                offsets,
 102                                                NULL, &length);
 103           switch (handler)
 104             {
 105             case iconveh_error:
 106               ASSERT (result == NULL);
 107               ASSERT (errno == EILSEQ);
 108               ASSERT (length == 0xdead);
 109               if (o)
 110                 free (offsets);
 111               break;
 112             case iconveh_question_mark:
 113               {
 114                 static const char expected[] = "Rafa? Maszkowski";
 115                 static const char expected_translit[] = "Rafal Maszkowski";
 116                 ASSERT (result != NULL);
 117                 ASSERT (length == strlen (expected));
 118                 ASSERT (memcmp (result, expected, length) == 0
 119                         || memcmp (result, expected_translit, length) == 0);
 120                 if (o)
 121                   {
 122                     for (i = 0; i < 16; i++)
 123                       ASSERT (offsets[i] == i);
 124                     ASSERT (offsets[16] == MAGIC);
 125                     free (offsets);
 126                   }
 127                 free (result);
 128               }
 129               break;
 130             case iconveh_escape_sequence:
 131               {
 132                 static const char expected[] = "Rafa\\u0142 Maszkowski";
 133                 ASSERT (result != NULL);
 134                 ASSERT (length == strlen (expected));
 135                 ASSERT (memcmp (result, expected, length) == 0);
 136                 if (o)
 137                   {
 138                     for (i = 0; i < 16; i++)
 139                       ASSERT (offsets[i] == (i < 5 ? i : i + 5));
 140                     ASSERT (offsets[16] == MAGIC);
 141                     free (offsets);
 142                   }
 143                 free (result);
 144               }
 145               break;
 146             }
 147         }
 148     }
 149 
 150 #endif
 151 
 152   return 0;
 153 }