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 }