1 /*
2 * Copyright (c) 2003, Artem B. Bityuckiy, SoftMine Corporation.
3 * Rights transferred to Franklin Electronic Publishers.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <iconv.h>
29 #include <errno.h>
30 #include <newlib.h>
31 #include "check.h"
32
33 #if defined(_ICONV_FROM_ENCODING_UTF_8) || \
34 defined(_ICONV_FROM_ENCODING_ISO_8859_5) || \
35 defined(_ICONV_FROM_ENCODING_KOI8_R)
36
37 #ifdef _ICONV_FROM_ENCODING_ISO_8859_5
38 static const char iso_8859_5[] =
39 {
40 0xbe,0xdf,0xd5,0xe0,0xd0,0xe2,0xde,0xe0,0xeb,0x20,
41 0xd2,0x20,0xde,0xd4,0xdd,0xde,0xd9,0x20,0xe1,0xe2,
42 0xe0,0xde,0xda,0xd5,0x20,0xd8,0xdc,0xd5,0xee,0xe2,
43 0x20,0xde,0xd4,0xd8,0xdd,0xd0,0xda,0xde,0xd2,0xeb,
44 0xd9,0x20,0xdf,0xe0,0xd8,0xde,0xe0,0xd8,0xe2,0xd5,
45 0xe2,0x0a,0xc1,0xe2,0xe0,0xde,0xda,0xd8,0x20,0xe3,
46 0xdf,0xde,0xe0,0xef,0xd4,0xde,0xe7,0xd5,0xdd,0xeb,
47 0x20,0xdf,0xde,0x20,0xe3,0xd1,0xeb,0xd2,0xd0,0xdd,
48 0xd8,0xee,0x20,0xdf,0xe0,0xd8,0xde,0xe0,0xd8,0xe2,
49 0xd5,0xe2,0xde,0xd2,0x2e,0x0a,0x0a,0x2d,0x2d,0x2d,
50 0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,
51 0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,
52 0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,
53 0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,
54 0x2d,0x2d,0x2d,0x2d,0x20,0xb2,0xeb,0xdf,0xde,0xdb,
55 0xdd,0xd5,0xdd,0xd8,0xd5,0x20,0x2d,0x2d,0x2d,0x2d,
56 0x2d,0x2d,0x2d,0x2d,0x2d,0x0a,0x28,0x29,0x20,0x20,
57 0x5b,0x5d,0x20,0x20,0x2d,0x3e,0x20,0x20,0x2e,0x20,
58 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
59 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
60 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
61 0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,0x3e,0x0a,0x21,
62 0x20,0x20,0x20,0x7e,0x20,0x20,0x20,0x2b,0x2b,0x20,
63 0x20,0x2d,0x2d,0x20,0x20,0x2b,0x20,0x20,0x2d,0x20,
64 0x20,0x2a,0x20,0x20,0x26,0x20,0x20,0x28,0x74,0x79,
65 0x70,0x65,0x29,0x20,0x20,0x73,0x69,0x7a,0x65,0x6f,
66 0x66,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,
67 0x3e,0x0a,0x2a,0x20,0x20,0x2f,0x20,0x20,0x25,0x20,
68 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
69 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
70 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
71 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
72 0x2d,0x2d,0x2d,0x3e,0x0a,0x2b,0x20,0x20,0x2d,0x20,
73 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
74 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
75 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
76 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
77 0x20,0x20,0x20,0x2d,0x2d,0x2d,0x3e,0x0a,0x3c,0x3c,
78 0x20,0x20,0x3e,0x3e,0x20,0x20,0x20,0x20,0x20,0x20,
79 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
80 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
81 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
82 0x20,0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,0x3e,
83 0x0a,0x3c,0x20,0x20,0x3c,0x3d,0x20,0x20,0x3e,0x20,
84 0x20,0x3e,0x3d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
85 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
86 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
87 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,
88 0x2d,0x2d,0x3e,0x0a,0x3d,0x3d,0x20,0x20,0x21,0x3d,
89 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
90 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
91 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
92 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
93 0x20,0x20,0x2d,0x2d,0x2d,0x3e,0x0a,0x26,0x20,0x20,
94 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
95 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
96 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
97 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
98 0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,0x3e,0x0a,
99 0x5e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
100 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
101 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
102 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
103 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,
104 0x2d,0x3e,0x0a,0x7c,0x20,0x20,0x20,0x20,0x20,0x20,
105 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
106 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
107 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
108 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
109 0x20,0x2d,0x2d,0x2d,0x3e,0x0a,0x26,0x26,0x20,0x20,
110 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
111 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
112 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
113 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
114 0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,0x3e,0x0a,0x7c,
115 0x7c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
116 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
117 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
118 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
119 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,
120 0x3e,0x0a,0x3f,0x3a,0x20,0x20,0x20,0x20,0x20,0x20,
121 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
122 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
123 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
124 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
125 0x3c,0x2d,0x2d,0x2d,0x20,0x20,0x20,0x0a,0x3d,0x20,
126 0x20,0x2b,0x3d,0x20,0x20,0x2d,0x3d,0x20,0x20,0x2f,
127 0x3d,0x20,0x20,0x25,0x3d,0x20,0x20,0x26,0x3d,0x20,
128 0x20,0x5e,0x3d,0x20,0x20,0x7c,0x3d,0x20,0x20,0x3c,
129 0x3c,0x3d,0x20,0x20,0x3e,0x3e,0x3d,0x20,0x20,0x20,
130 0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2d,0x2d,0x2d,
131 0x0a,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
132 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
133 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
134 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
135 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,
136 0x2d,0x2d,0x3e,0x0a
137 };
138 #endif /* #ifdef _ICONV_FROM_ENCODING_ISO_8859_5 */
139
140 #ifdef _ICONV_FROM_ENCODING_KOI8_R
141 static const char koi8_r[] =
142 {
143 0xef,0xd0,0xc5,0xd2,0xc1,0xd4,0xcf,0xd2,0xd9,0x20,
144 0xd7,0x20,0xcf,0xc4,0xce,0xcf,0xca,0x20,0xd3,0xd4,
145 0xd2,0xcf,0xcb,0xc5,0x20,0xc9,0xcd,0xc5,0xc0,0xd4,
146 0x20,0xcf,0xc4,0xc9,0xce,0xc1,0xcb,0xcf,0xd7,0xd9,
147 0xca,0x20,0xd0,0xd2,0xc9,0xcf,0xd2,0xc9,0xd4,0xc5,
148 0xd4,0x0a,0xf3,0xd4,0xd2,0xcf,0xcb,0xc9,0x20,0xd5,
149 0xd0,0xcf,0xd2,0xd1,0xc4,0xcf,0xde,0xc5,0xce,0xd9,
150 0x20,0xd0,0xcf,0x20,0xd5,0xc2,0xd9,0xd7,0xc1,0xce,
151 0xc9,0xc0,0x20,0xd0,0xd2,0xc9,0xcf,0xd2,0xc9,0xd4,
152 0xc5,0xd4,0xcf,0xd7,0x2e,0x0a,0x0a,0x2d,0x2d,0x2d,
153 0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,
154 0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,
155 0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,
156 0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,
157 0x2d,0x2d,0x2d,0x2d,0x20,0xf7,0xd9,0xd0,0xcf,0xcc,
158 0xce,0xc5,0xce,0xc9,0xc5,0x20,0x2d,0x2d,0x2d,0x2d,
159 0x2d,0x2d,0x2d,0x2d,0x2d,0x0a,0x28,0x29,0x20,0x20,
160 0x5b,0x5d,0x20,0x20,0x2d,0x3e,0x20,0x20,0x2e,0x20,
161 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
162 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
163 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
164 0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,0x3e,0x0a,0x21,
165 0x20,0x20,0x20,0x7e,0x20,0x20,0x20,0x2b,0x2b,0x20,
166 0x20,0x2d,0x2d,0x20,0x20,0x2b,0x20,0x20,0x2d,0x20,
167 0x20,0x2a,0x20,0x20,0x26,0x20,0x20,0x28,0x74,0x79,
168 0x70,0x65,0x29,0x20,0x20,0x73,0x69,0x7a,0x65,0x6f,
169 0x66,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,
170 0x3e,0x0a,0x2a,0x20,0x20,0x2f,0x20,0x20,0x25,0x20,
171 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
172 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
173 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
174 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
175 0x2d,0x2d,0x2d,0x3e,0x0a,0x2b,0x20,0x20,0x2d,0x20,
176 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
177 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
178 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
179 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
180 0x20,0x20,0x20,0x2d,0x2d,0x2d,0x3e,0x0a,0x3c,0x3c,
181 0x20,0x20,0x3e,0x3e,0x20,0x20,0x20,0x20,0x20,0x20,
182 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
183 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
184 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
185 0x20,0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,0x3e,
186 0x0a,0x3c,0x20,0x20,0x3c,0x3d,0x20,0x20,0x3e,0x20,
187 0x20,0x3e,0x3d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
188 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
189 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
190 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,
191 0x2d,0x2d,0x3e,0x0a,0x3d,0x3d,0x20,0x20,0x21,0x3d,
192 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
193 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
194 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
195 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
196 0x20,0x20,0x2d,0x2d,0x2d,0x3e,0x0a,0x26,0x20,0x20,
197 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
198 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
199 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
200 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
201 0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,0x3e,0x0a,
202 0x5e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
203 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
204 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
205 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
206 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,
207 0x2d,0x3e,0x0a,0x7c,0x20,0x20,0x20,0x20,0x20,0x20,
208 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
209 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
210 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
211 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
212 0x20,0x2d,0x2d,0x2d,0x3e,0x0a,0x26,0x26,0x20,0x20,
213 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
214 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
215 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
216 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
217 0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,0x3e,0x0a,0x7c,
218 0x7c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
219 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
220 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
221 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
222 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,
223 0x3e,0x0a,0x3f,0x3a,0x20,0x20,0x20,0x20,0x20,0x20,
224 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
225 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
226 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
227 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
228 0x3c,0x2d,0x2d,0x2d,0x20,0x20,0x20,0x0a,0x3d,0x20,
229 0x20,0x2b,0x3d,0x20,0x20,0x2d,0x3d,0x20,0x20,0x2f,
230 0x3d,0x20,0x20,0x25,0x3d,0x20,0x20,0x26,0x3d,0x20,
231 0x20,0x5e,0x3d,0x20,0x20,0x7c,0x3d,0x20,0x20,0x3c,
232 0x3c,0x3d,0x20,0x20,0x3e,0x3e,0x3d,0x20,0x20,0x20,
233 0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2d,0x2d,0x2d,
234 0x0a,0x2c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
235 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
236 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
237 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
238 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,
239 0x2d,0x2d,0x3e,0x0a
240 };
241 #endif /* #ifdef _ICONV_FROM_ENCODING_KOI8_R */
242
243 #ifdef _ICONV_FROM_ENCODING_UTF_8
244 static const char utf8[] =
245 {
246 0xd0,0x9e,0xd0,0xbf,0xd0,0xb5,0xd1,0x80,0xd0,0xb0,
247 0xd1,0x82,0xd0,0xbe,0xd1,0x80,0xd1,0x8b,0x20,0xd0,
248 0xb2,0x20,0xd0,0xbe,0xd0,0xb4,0xd0,0xbd,0xd0,0xbe,
249 0xd0,0xb9,0x20,0xd1,0x81,0xd1,0x82,0xd1,0x80,0xd0,
250 0xbe,0xd0,0xba,0xd0,0xb5,0x20,0xd0,0xb8,0xd0,0xbc,
251 0xd0,0xb5,0xd1,0x8e,0xd1,0x82,0x20,0xd0,0xbe,0xd0,
252 0xb4,0xd0,0xb8,0xd0,0xbd,0xd0,0xb0,0xd0,0xba,0xd0,
253 0xbe,0xd0,0xb2,0xd1,0x8b,0xd0,0xb9,0x20,0xd0,0xbf,
254 0xd1,0x80,0xd0,0xb8,0xd0,0xbe,0xd1,0x80,0xd0,0xb8,
255 0xd1,0x82,0xd0,0xb5,0xd1,0x82,0x0a,0xd0,0xa1,0xd1,
256 0x82,0xd1,0x80,0xd0,0xbe,0xd0,0xba,0xd0,0xb8,0x20,
257 0xd1,0x83,0xd0,0xbf,0xd0,0xbe,0xd1,0x80,0xd1,0x8f,
258 0xd0,0xb4,0xd0,0xbe,0xd1,0x87,0xd0,0xb5,0xd0,0xbd,
259 0xd1,0x8b,0x20,0xd0,0xbf,0xd0,0xbe,0x20,0xd1,0x83,
260 0xd0,0xb1,0xd1,0x8b,0xd0,0xb2,0xd0,0xb0,0xd0,0xbd,
261 0xd0,0xb8,0xd1,0x8e,0x20,0xd0,0xbf,0xd1,0x80,0xd0,
262 0xb8,0xd0,0xbe,0xd1,0x80,0xd0,0xb8,0xd1,0x82,0xd0,
263 0xb5,0xd1,0x82,0xd0,0xbe,0xd0,0xb2,0x2e,0x0a,0x0a,
264 0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,
265 0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,
266 0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,
267 0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,
268 0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x20,0xd0,0x92,
269 0xd1,0x8b,0xd0,0xbf,0xd0,0xbe,0xd0,0xbb,0xd0,0xbd,
270 0xd0,0xb5,0xd0,0xbd,0xd0,0xb8,0xd0,0xb5,0x20,0x2d,
271 0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x0a,0x28,
272 0x29,0x20,0x20,0x5b,0x5d,0x20,0x20,0x2d,0x3e,0x20,
273 0x20,0x2e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
274 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
275 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
276 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,
277 0x3e,0x0a,0x21,0x20,0x20,0x20,0x7e,0x20,0x20,0x20,
278 0x2b,0x2b,0x20,0x20,0x2d,0x2d,0x20,0x20,0x2b,0x20,
279 0x20,0x2d,0x20,0x20,0x2a,0x20,0x20,0x26,0x20,0x20,
280 0x28,0x74,0x79,0x70,0x65,0x29,0x20,0x20,0x73,0x69,
281 0x7a,0x65,0x6f,0x66,0x20,0x20,0x20,0x20,0x20,0x20,
282 0x2d,0x2d,0x2d,0x3e,0x0a,0x2a,0x20,0x20,0x2f,0x20,
283 0x20,0x25,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
284 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
285 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
286 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
287 0x20,0x20,0x20,0x2d,0x2d,0x2d,0x3e,0x0a,0x2b,0x20,
288 0x20,0x2d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
289 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
290 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
291 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
292 0x20,0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,0x3e,
293 0x0a,0x3c,0x3c,0x20,0x20,0x3e,0x3e,0x20,0x20,0x20,
294 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
295 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
296 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
297 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,
298 0x2d,0x2d,0x3e,0x0a,0x3c,0x20,0x20,0x3c,0x3d,0x20,
299 0x20,0x3e,0x20,0x20,0x3e,0x3d,0x20,0x20,0x20,0x20,
300 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
301 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
302 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
303 0x20,0x20,0x2d,0x2d,0x2d,0x3e,0x0a,0x3d,0x3d,0x20,
304 0x20,0x21,0x3d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
305 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
306 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
307 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
308 0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,0x3e,0x0a,
309 0x26,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
310 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
311 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
312 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
313 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,
314 0x2d,0x3e,0x0a,0x5e,0x20,0x20,0x20,0x20,0x20,0x20,
315 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
316 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
317 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
318 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
319 0x20,0x2d,0x2d,0x2d,0x3e,0x0a,0x7c,0x20,0x20,0x20,
320 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
321 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
322 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
323 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
324 0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,0x3e,0x0a,0x26,
325 0x26,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
326 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
327 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
328 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
329 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,
330 0x3e,0x0a,0x7c,0x7c,0x20,0x20,0x20,0x20,0x20,0x20,
331 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
332 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
333 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
334 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
335 0x2d,0x2d,0x2d,0x3e,0x0a,0x3f,0x3a,0x20,0x20,0x20,
336 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
337 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
338 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
339 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
340 0x20,0x20,0x20,0x3c,0x2d,0x2d,0x2d,0x20,0x20,0x20,
341 0x0a,0x3d,0x20,0x20,0x2b,0x3d,0x20,0x20,0x2d,0x3d,
342 0x20,0x20,0x2f,0x3d,0x20,0x20,0x25,0x3d,0x20,0x20,
343 0x26,0x3d,0x20,0x20,0x5e,0x3d,0x20,0x20,0x7c,0x3d,
344 0x20,0x20,0x3c,0x3c,0x3d,0x20,0x20,0x3e,0x3e,0x3d,
345 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,
346 0x2d,0x2d,0x2d,0x0a,0x2c,0x20,0x20,0x20,0x20,0x20,
347 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
348 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
349 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
350 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
351 0x20,0x20,0x2d,0x2d,0x2d,0x3e,0x0a
352 };
353 #endif
354
355 struct iconv_data
356 {
357 size_t len;
358 char *name;
359 char *data;
360 };
361
362 #define CONVERSIONS 3
363
364 static const struct iconv_data data[] =
365 {
366 #ifdef _ICONV_FROM_ENCODING_ISO_8859_5
367 {sizeof(iso_8859_5), "ISO-8859-5", (char *)iso_8859_5},
368 #endif
369 #ifdef _ICONV_FROM_ENCODING_KOI8_R
370 {sizeof(koi8_r), "KOI8-R", (char *)koi8_r},
371 #endif
372 #ifdef _ICONV_FROM_ENCODING_UTF_8
373 {sizeof(utf8), "UTF-8", (char *)utf8},
374 #endif
375 {0, NULL, NULL}
376 };
377
378 #define OUTBUF_LEN 1500
379 char ob[OUTBUF_LEN];
380
381 iconv_t descs[CONVERSIONS*CONVERSIONS];
382
383 #define ERROR 0
384
385 #ifndef TEST_NLSPATH
386 #define TEST_NLSPATH "./"
387 #endif
388
main(void)389 int main(void)
390 {
391 int i, j, d = 0;
392 unsigned k;
393 size_t n;
394 char *outbuf, *inbuf;
395 int conversions = sizeof(data)/sizeof(struct iconv_data) - 1;
396
397 CHECK(setenv("NLSPATH", TEST_NLSPATH, 0) != -1);
398
399 puts("RU iconv test");
400
401 for (i = 0; i < conversions; i++)
402 {
403 for (j = 0; j < conversions; j++)
404 {
405 descs[d] = iconv_open(data[j].name, data[i].name);
406 if (descs[d++] == (iconv_t)-1)
407 {
408 printf("iconv_open(%s, %s)\n", data[i].name, data[j].name);
409 perror("");
410 CHECK(ERROR);
411 }
412 }
413 }
414
415 d = 0;
416 for (i = 0; i < conversions; i++)
417 {
418 for (j = 0; j < conversions; j++)
419 {
420 size_t inbytes = data[i].len;
421 size_t outbytes = OUTBUF_LEN;
422 inbuf = data[i].data;
423 outbuf = (char *)ob;
424
425 if (iconv(descs[d], NULL, NULL, (char **)&outbuf, &outbytes) == (size_t)-1)
426 {
427 perror("Can't reset shift state");
428 CHECK(ERROR);
429 }
430
431 n = iconv(descs[d++], (const char **)&(inbuf), &inbytes,
432 (char **)&outbuf, &outbytes);
433 if (n == (size_t)-1)
434 {
435 printf("Conversion from %s to %s FAILED - iconv() "
436 "returned -1\n", data[i].name, data[j].name);
437 perror("");
438 CHECK(ERROR);
439 }
440
441 if (data[j].len != OUTBUF_LEN - outbytes)
442 {
443 printf("Conversion from %s to %s FAILED",
444 data[i].name, data[j].name);
445 printf(" - bad output buffer length (%ld instead of %lu)\n",
446 OUTBUF_LEN - (long) outbytes, (unsigned long) data[j].len);
447 CHECK(ERROR);
448 }
449
450 for (k = 0; k < data[j].len; k++)
451 {
452 if (ob[k] != data[j].data[k])
453 {
454 printf("Conversion from %s to %s FAILED",
455 data[i].name, data[j].name);
456 printf("Error: byte %d is wrong\n", k);
457 printf("outbuf value: %#x, inbuf value %#x, "
458 "right value: %#x\n",
459 (int)ob[k], (int)(data[i].data[k]),
460 (int)(data[j].data[k]));
461 CHECK(ERROR);
462 }
463 }
464
465 printf("iconv from %s to %s was successfully done\n",
466 data[i].name, data[j].name);
467
468 }
469 }
470
471 d = 0;
472 for (i = 0; i < conversions; i++)
473 for (j = 0; j < conversions; j++)
474 CHECK(iconv_close(descs[d++]) != -1);
475
476 exit(0);
477 }
478
479 #else /* #if defined(_ICONV_FROM_ENCODING_UTF_8) || ... */
main(void)480 int main(void)
481 {
482 puts("None of ISO-8859-5, KOI8-R and UTF-8 converters linked, SKIP test");
483 exit(0);
484 }
485 #endif /* #if defined(_ICONV_FROM_ENCODING_UTF_8) || ... */
486