Expanded tabs in all source files. Added vim/emacs local variables
[yaz-moved-to-github.git] / test / tsticonv.c
1 /*
2  * Copyright (C) 1995-2005, Index Data ApS
3  * See the file LICENSE for details.
4  *
5  * $Id: tsticonv.c,v 1.10 2005-06-25 15:46:07 adam Exp $
6  */
7
8 #if HAVE_CONFIG_H
9 #include <config.h>
10 #endif
11
12 #include <stdlib.h>
13 #include <errno.h>
14 #include <string.h>
15 #include <ctype.h>
16
17 #include <yaz/yaz-util.h>
18
19 static int compare_buffers(char *msg, int no,
20                            int expect_len, const unsigned char *expect_buf,
21                            int got_len, const unsigned char *got_buf)
22 {
23     int i;
24     if (expect_len == got_len
25         && !memcmp(expect_buf, got_buf, expect_len))
26         return 1;
27     printf("tsticonv test=%s i=%d failed\n", msg, no);
28     printf("off got exp\n");
29     for (i = 0; i<got_len || i<expect_len; i++)
30     {
31         char got_char[10];
32         char expect_char[10];
33
34         if (i < got_len)
35             sprintf(got_char, "%02X", got_buf[i]);
36         else
37             sprintf(got_char, "?  ");
38
39         if (i < expect_len)
40             sprintf(expect_char, "%02X", expect_buf[i]);
41         else
42             sprintf(expect_char, "?  ");
43         
44         printf("%02d  %s  %s %c\n",
45                i, got_char, expect_char, got_buf[i] == expect_buf[i] ?
46                ' ' : '*');
47
48     }
49     exit(1);
50 }
51
52 /* some test strings in ISO-8859-1 format */
53 static const char *iso_8859_1_a[] = {
54     "ax" ,
55     "\xd8",
56     "eneb\346r",
57     "\xe5" "\xd8",
58     "\xe5" "\xd8" "b",
59     "\xe5" "\xe5",
60     0 };
61
62 /* same test strings in MARC-8 format */
63 static const char *marc8_a[] = {
64     "ax",   
65     "\xa2",          /* latin capital letter o with stroke */
66     "eneb\xb5r",     /* latin small letter ae */
67     "\xea" "a\xa2",
68     "\xea" "a\xa2" "b",
69     "\xea" "a"  "\xea" "a",
70     0
71 };
72
73 static void tst_marc8_to_iso_8859_1()
74 {
75     int i;
76     yaz_iconv_t cd;
77
78     cd = yaz_iconv_open("ISO-8859-1", "MARC8");
79     if (!cd)
80     {
81         printf("tsticonv 10 yaz_iconv_open failed\n");
82         exit(10);
83     }
84     for (i = 0; iso_8859_1_a[i]; i++)
85     {
86         size_t r;
87         char *inbuf= (char*) marc8_a[i];
88         size_t inbytesleft = strlen(inbuf);
89         char outbuf0[32];
90         char *outbuf = outbuf0;
91         size_t outbytesleft = sizeof(outbuf0);
92
93         r = yaz_iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
94         if (r == (size_t) (-1))
95         {
96             int e = yaz_iconv_error(cd);
97
98             printf ("tsticonv 11 i=%d e=%d\n", i, e);
99             exit(11);
100         }
101         compare_buffers("tsticonv 11", i,
102                         strlen(iso_8859_1_a[i]), iso_8859_1_a[i],
103                         outbuf - outbuf0, outbuf0);
104     }
105     yaz_iconv_close(cd);
106 }
107
108 static void tst_marc8_to_ucs4b()
109 {
110     static struct {
111         const unsigned char *marc8_b;
112         int len;
113         const unsigned char *ucs4_b;
114     } ar[] = {
115     { 
116         "\033$1" "\x21\x2B\x3B" /* FF1F */ "\033(B" "o",
117         8, "\x00\x00\xFF\x1F" "\x00\x00\x00o"
118     }, {
119         "\033$1" "\x6F\x77\x29" /* AE0E */ "\x6F\x52\x7C" /* c0F4 */ "\033(B",
120         8, "\x00\x00\xAE\x0E" "\x00\x00\xC0\xF4",
121     }, {
122         "\033$1"
123         "\x21\x50\x6E"  /* UCS 7CFB */
124         "\x21\x51\x31"  /* UCS 7D71 */
125         "\x21\x3A\x67"  /* UCS 5B89 */
126         "\x21\x33\x22"  /* UCS 5168 */
127         "\x21\x33\x53"  /* UCS 5206 */
128         "\x21\x44\x2B"  /* UCS 6790 */
129         "\033(B",
130         24, "\x00\x00\x7C\xFB"
131         "\x00\x00\x7D\x71"
132         "\x00\x00\x5B\x89"
133         "\x00\x00\x51\x68"
134         "\x00\x00\x52\x06"
135         "\x00\x00\x67\x90"
136     }, {
137         "\xB0\xB2",     /* AYN and oSLASH */
138         8, "\x00\x00\x02\xBB"  "\x00\x00\x00\xF8"
139     }, {
140         "\xF6\x61",     /* a underscore */
141         8, "\x00\x00\x00\x61"  "\x00\x00\x03\x32"
142     }, {
143         "\x61\xC2",     /* a, phonorecord mark */
144         8, "\x00\x00\x00\x61"  "\x00\x00\x21\x17"
145     },
146     {  /* bug #258 */
147         "el" "\xe8" "am\xe8" "an", /* elaman where a is a" */
148         32,
149         "\x00\x00\x00" "e"
150         "\x00\x00\x00" "l"
151         "\x00\x00\x00" "a"
152         "\x00\x00\x03\x08"
153         "\x00\x00\x00" "m"
154         "\x00\x00\x00" "a"
155         "\x00\x00\x03\x08"
156         "\x00\x00\x00" "n"
157     }, 
158     { /* bug #260 */
159         "\xe5\xe8\x41",
160         12, "\x00\x00\x00\x41" "\x00\x00\x03\x04" "\x00\x00\x03\x08"
161     }, 
162     {
163         0, 0, 0
164     }
165     };
166     int i;
167     yaz_iconv_t cd;
168
169     cd = yaz_iconv_open("UCS4", "MARC8");
170     if (!cd)
171     {
172         printf ("tsticonv 20 yaz_iconv_open failed\n");
173         exit(20);
174     }
175     for (i = 0; ar[i].len; i++)
176     {
177         size_t r;
178         size_t expect_len = ar[i].len;
179         char *inbuf= (char*) ar[i].marc8_b;
180         size_t inbytesleft = strlen(inbuf);
181         char outbuf0[64];
182         char *outbuf = outbuf0;
183
184         while (inbytesleft)
185         {
186             size_t outbytesleft = outbuf0 + sizeof(outbuf0) - outbuf;
187             if (outbytesleft > 12)
188                 outbytesleft = 12;
189             r = yaz_iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
190             if (r == (size_t) (-1))
191             {
192                 int e = yaz_iconv_error(cd);
193                 if (e != YAZ_ICONV_E2BIG)
194                 {
195                     printf ("tsticonv 21 i=%d e=%d\n", i, e);
196                     exit(21);
197                 }
198             }
199             else
200                 break;
201         }
202         compare_buffers("tsticonv 22", i,
203                         expect_len, ar[i].ucs4_b,
204                         outbuf - outbuf0, outbuf0);
205     }
206     yaz_iconv_close(cd);
207 }
208
209 static void tst_ucs4b_to_utf8()
210 {
211     static const char *ucs4_c[] = {
212         "\x00\x00\xFF\x1F\x00\x00\x00o",
213         "\x00\x00\xAE\x0E\x00\x00\xC0\xF4",
214         0
215     };
216     static const char *utf8_c[] = {
217         "\xEF\xBC\x9F\x6F",
218         "\xEA\xB8\x8E\xEC\x83\xB4",
219         0
220     };
221     
222     int i;
223     yaz_iconv_t cd;
224
225     cd = yaz_iconv_open("UTF8", "UCS4");
226     if (!cd)
227     {
228         printf ("tsticonv 30 yaz_iconv_open failed\n");
229         exit(30);
230     }
231     for (i = 0; ucs4_c[i]; i++)
232     {
233         size_t r;
234         char *inbuf= (char*) ucs4_c[i];
235         size_t inbytesleft = 8;
236         char outbuf0[24];
237         char *outbuf = outbuf0;
238         size_t outbytesleft = sizeof(outbuf0);
239
240         r = yaz_iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
241         if (r == (size_t) (-1))
242         {
243             int e = yaz_iconv_error(cd);
244
245             printf ("tsticonv 31 i=%d e=%d\n", i, e);
246             exit(31);
247         }
248         compare_buffers("tsticonv 32", i,
249                         strlen(utf8_c[i]), utf8_c[i],
250                         outbuf - outbuf0, outbuf0);
251     }
252     yaz_iconv_close(cd);
253 }
254
255 static void dconvert(int mandatory, const char *tmpcode)
256 {
257     int i;
258     yaz_iconv_t cd;
259     for (i = 0; iso_8859_1_a[i]; i++)
260     {
261         size_t r;
262         char *inbuf = (char*) iso_8859_1_a[i];
263         size_t inbytesleft = strlen(inbuf);
264         char outbuf0[24];
265         char outbuf1[10];
266         char *outbuf = outbuf0;
267         size_t outbytesleft = sizeof(outbuf0);
268
269         cd = yaz_iconv_open(tmpcode, "ISO-8859-1");
270         if (!cd)
271         {
272             if (!mandatory)
273                 return;
274             printf ("tsticonv code=%s i=%d 1\n", tmpcode, i);
275             exit(1);
276         }
277         r = yaz_iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
278         if (r == (size_t)(-1))
279         {
280             int e = yaz_iconv_error(cd);
281
282             printf ("tsticonv code=%s i=%d 2 e=%d\n", tmpcode, i, e);
283             exit(2);
284         }
285         yaz_iconv_close(cd);
286         
287         cd = yaz_iconv_open("ISO-8859-1", tmpcode);
288         if (!cd)
289         {
290             if (!mandatory)
291                 return;
292             printf ("tsticonv code=%s i=%d 3\n", tmpcode, i);
293             exit(3);
294         }
295         inbuf = outbuf0;
296         inbytesleft = sizeof(outbuf0) - outbytesleft;
297
298         outbuf = outbuf1;
299         outbytesleft = sizeof(outbuf1);
300         r = yaz_iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
301         if (r == (size_t)(-1)) {
302             int e = yaz_iconv_error(cd);
303
304             printf ("tsticonv code=%s i=%d 4 e=%d\n", tmpcode, i, e);
305             exit(4);
306         }
307         compare_buffers("dconvert", i,
308                         strlen(iso_8859_1_a[i]), iso_8859_1_a[i],
309                         sizeof(outbuf1) - outbytesleft, outbuf1);
310         yaz_iconv_close(cd);
311     }
312 }
313         
314 int main (int argc, char **argv)
315 {
316     dconvert(1, "UTF-8");
317     dconvert(1, "ISO-8859-1");
318     dconvert(1, "UCS4");
319     dconvert(1, "UCS4LE");
320     dconvert(0, "CP865");
321     tst_marc8_to_iso_8859_1();
322     tst_marc8_to_ucs4b();
323     tst_ucs4b_to_utf8();
324     exit(0);
325 }
326 /*
327  * Local variables:
328  * c-basic-offset: 4
329  * indent-tabs-mode: nil
330  * End:
331  * vim: shiftwidth=4 tabstop=8 expandtab
332  */
333