]> git.ipfire.org Git - thirdparty/cups.git/blame - cups/testi18n.c
Merge changes from CUPS 1.5svn-r9407.
[thirdparty/cups.git] / cups / testi18n.c
CommitLineData
ef416fc2 1/*
75bd9771 2 * "$Id: testi18n.c 7560 2008-05-13 06:34:04Z mike $"
ef416fc2 3 *
71e16022 4 * Internationalization test for CUPS.
ef416fc2 5 *
71e16022 6 * Copyright 2007-2010 by Apple Inc.
e1d6a774 7 * Copyright 1997-2006 by Easy Software Products.
ef416fc2 8 *
bc44d920 9 * These coded instructions, statements, and computer programs are the
10 * property of Apple Inc. and are protected by Federal copyright
11 * law. Distribution and use rights are outlined in the file "LICENSE.txt"
12 * which should have been included with this file. If this file is
13 * file is missing or damaged, see the license at "http://www.cups.org/".
ef416fc2 14 *
bc44d920 15 * This file is subject to the Apple OS-Developed Software exception.
ef416fc2 16 *
17 * Contents:
18 *
89d46774 19 * main() - Main entry for internationalization test module.
20 * print_utf8() - Print UTF-8 string with (optional) message.
ef416fc2 21 */
22
23/*
24 * Include necessary headers...
25 */
26
71e16022
MS
27#include "string-private.h"
28#include "language-private.h"
ef416fc2 29#include <stdlib.h>
ef416fc2 30#include <time.h>
89d46774 31#include <unistd.h>
ef416fc2 32
ef416fc2 33
bf3816c7
MS
34/*
35 * Local globals...
36 */
37
38static const char * const lang_encodings[] =
39 { /* Encoding strings */
40 "us-ascii", "iso-8859-1",
41 "iso-8859-2", "iso-8859-3",
42 "iso-8859-4", "iso-8859-5",
43 "iso-8859-6", "iso-8859-7",
44 "iso-8859-8", "iso-8859-9",
45 "iso-8859-10", "utf-8",
46 "iso-8859-13", "iso-8859-14",
47 "iso-8859-15", "windows-874",
48 "windows-1250", "windows-1251",
49 "windows-1252", "windows-1253",
50 "windows-1254", "windows-1255",
51 "windows-1256", "windows-1257",
52 "windows-1258", "koi8-r",
53 "koi8-u", "iso-8859-11",
54 "iso-8859-16", "mac-roman",
55 "unknown", "unknown",
56 "unknown", "unknown",
57 "unknown", "unknown",
58 "unknown", "unknown",
59 "unknown", "unknown",
60 "unknown", "unknown",
61 "unknown", "unknown",
62 "unknown", "unknown",
63 "unknown", "unknown",
64 "unknown", "unknown",
65 "unknown", "unknown",
66 "unknown", "unknown",
67 "unknown", "unknown",
68 "unknown", "unknown",
69 "unknown", "unknown",
70 "unknown", "unknown",
71 "unknown", "unknown",
72 "windows-932", "windows-936",
73 "windows-949", "windows-950",
74 "windows-1361", "unknown",
75 "unknown", "unknown",
76 "unknown", "unknown",
77 "unknown", "unknown",
78 "unknown", "unknown",
79 "unknown", "unknown",
80 "unknown", "unknown",
81 "unknown", "unknown",
82 "unknown", "unknown",
83 "unknown", "unknown",
84 "unknown", "unknown",
85 "unknown", "unknown",
86 "unknown", "unknown",
87 "unknown", "unknown",
88 "unknown", "unknown",
89 "unknown", "unknown",
90 "unknown", "unknown",
91 "unknown", "unknown",
92 "unknown", "unknown",
93 "unknown", "unknown",
94 "unknown", "unknown",
95 "unknown", "unknown",
96 "unknown", "unknown",
97 "unknown", "unknown",
98 "unknown", "unknown",
99 "unknown", "unknown",
100 "unknown", "unknown",
101 "unknown", "unknown",
102 "unknown", "unknown",
103 "unknown", "unknown",
104 "euc-cn", "euc-jp",
105 "euc-kr", "euc-tw",
106 "jis-x0213"
107 };
108
109
ef416fc2 110/*
111 * Local functions...
112 */
113
ef416fc2 114static void print_utf8(const char *msg, const cups_utf8_t *src);
ef416fc2 115
116
117/*
118 * 'main()' - Main entry for internationalization test module.
119 */
120
121int /* O - Exit code */
122main(int argc, /* I - Argument Count */
123 char *argv[]) /* I - Arguments */
ef416fc2 124{
125 FILE *fp; /* File pointer */
126 int count; /* File line counter */
e1d6a774 127 int status, /* Status of current test */
128 errors; /* Error count */
ef416fc2 129 char line[1024]; /* File line source string */
130 int len; /* Length (count) of string */
e1d6a774 131 char legsrc[1024], /* Legacy source string */
132 legdest[1024], /* Legacy destination string */
133 *legptr; /* Pointer into legacy string */
ef416fc2 134 cups_utf8_t utf8latin[] = /* UTF-8 Latin-1 source */
135 { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xC3, 0x84, 0x2E, 0x00 };
136 /* "A != <A WITH DIAERESIS>." - use ISO 8859-1 */
137 cups_utf8_t utf8repla[] = /* UTF-8 Latin-1 replacement */
138 { 0x41, 0x20, 0xE2, 0x89, 0xA2, 0x20, 0xC3, 0x84, 0x2E, 0x00 };
139 /* "A <NOT IDENTICAL TO> <A WITH DIAERESIS>." */
140 cups_utf8_t utf8greek[] = /* UTF-8 Greek source string */
141 { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xCE, 0x91, 0x2E, 0x00 };
e1d6a774 142 /* "A != <ALPHA>." - use ISO 8859-7 */
ef416fc2 143 cups_utf8_t utf8japan[] = /* UTF-8 Japanese source */
144 { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xEE, 0x9C, 0x80, 0x2E, 0x00 };
145 /* "A != <PRIVATE U+E700>." - use Windows 932 or EUC-JP */
146 cups_utf8_t utf8taiwan[] = /* UTF-8 Chinese source */
147 { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xE4, 0xB9, 0x82, 0x2E, 0x00 };
148 /* "A != <CJK U+4E42>." - use Windows 950 (Big5) or EUC-TW */
ef416fc2 149 cups_utf8_t utf8dest[1024]; /* UTF-8 destination string */
ef416fc2 150 cups_utf32_t utf32dest[1024]; /* UTF-32 destination string */
ef416fc2 151
152
bf3816c7
MS
153 if (argc > 1)
154 {
155 int i; /* Looping var */
156 cups_encoding_t encoding; /* Source encoding */
157
158
159 if (argc != 3)
160 {
161 puts("Usage: ./testi18n [filename charset]");
162 return (1);
163 }
164
165 if ((fp = fopen(argv[1], "rb")) == NULL)
166 {
167 perror(argv[1]);
168 return (1);
169 }
170
171 for (i = 0, encoding = CUPS_AUTO_ENCODING;
172 i < (int)(sizeof(lang_encodings) / sizeof(lang_encodings[0]));
173 i ++)
174 if (!strcasecmp(lang_encodings[i], argv[2]))
175 {
176 encoding = (cups_encoding_t)i;
177 break;
178 }
179
180 if (encoding == CUPS_AUTO_ENCODING)
181 {
182 fprintf(stderr, "%s: Unknown character set!\n", argv[2]);
183 return (1);
184 }
185
186 while (fgets(line, sizeof(line), fp))
187 {
188 if (cupsCharsetToUTF8(utf8dest, line, sizeof(utf8dest), encoding) < 0)
189 {
190 fprintf(stderr, "%s: Unable to convert line: %s", argv[1], line);
191 return (1);
192 }
193
194 fputs((char *)utf8dest, stdout);
195 }
196
197 fclose(fp);
198 return (0);
199 }
200
ef416fc2 201 /*
e1d6a774 202 * Start with some conversion tests from a UTF-8 test file.
ef416fc2 203 */
204
e1d6a774 205 errors = 0;
206
bf3816c7 207 if ((fp = fopen("utf8demo.txt", "rb")) == NULL)
ef416fc2 208 {
e1d6a774 209 perror("utf8demo.txt");
210 return (1);
ef416fc2 211 }
212
213 /*
e1d6a774 214 * cupsUTF8ToUTF32
ef416fc2 215 */
216
e1d6a774 217 fputs("cupsUTF8ToUTF32 of utfdemo.txt: ", stdout);
218
219 for (count = 0, status = 0; fgets(line, sizeof(line), fp);)
ef416fc2 220 {
e1d6a774 221 count ++;
222
223 if (cupsUTF8ToUTF32(utf32dest, (cups_utf8_t *)line, 1024) < 0)
224 {
225 printf("FAIL (UTF-8 to UTF-32 on line %d)\n", count);
226 errors ++;
227 status = 1;
228 break;
229 }
ef416fc2 230 }
231
e1d6a774 232 if (!status)
233 puts("PASS");
ef416fc2 234
e1d6a774 235 /*
236 * cupsUTF8ToCharset(CUPS_EUC_JP)
237 */
ef416fc2 238
e1d6a774 239 fputs("cupsUTF8ToCharset(CUPS_EUC_JP) of utfdemo.txt: ", stdout);
ef416fc2 240
e1d6a774 241 rewind(fp);
242
243 for (count = 0, status = 0; fgets(line, sizeof(line), fp);)
244 {
245 count ++;
ef416fc2 246
247 len = cupsUTF8ToCharset(legdest, (cups_utf8_t *)line, 1024, CUPS_EUC_JP);
248 if (len < 0)
e1d6a774 249 {
250 printf("FAIL (UTF-8 to EUC-JP on line %d)\n", count);
251 errors ++;
252 status = 1;
253 break;
254 }
ef416fc2 255 }
256
e1d6a774 257 if (!status)
258 puts("PASS");
259
ef416fc2 260 fclose(fp);
261
ef416fc2 262 /*
263 * Test UTF-8 to legacy charset (ISO 8859-1)...
264 */
265
e1d6a774 266 fputs("cupsUTF8ToCharset(CUPS_ISO8859_1): ", stdout);
ef416fc2 267
268 legdest[0] = 0;
269
270 len = cupsUTF8ToCharset(legdest, utf8latin, 1024, CUPS_ISO8859_1);
271 if (len < 0)
ef416fc2 272 {
e1d6a774 273 printf("FAIL (len=%d)\n", len);
274 errors ++;
ef416fc2 275 }
e1d6a774 276 else
277 puts("PASS");
ef416fc2 278
e1d6a774 279 /*
280 * cupsCharsetToUTF8
281 */
ef416fc2 282
e1d6a774 283 fputs("cupsCharsetToUTF8(CUPS_ISO8859_1): ", stdout);
ef416fc2 284
e1d6a774 285 strcpy(legsrc, legdest);
ef416fc2 286
e1d6a774 287 len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_ISO8859_1);
288 if (len != strlen((char *)utf8latin))
289 {
89d46774 290 printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8latin));
e1d6a774 291 print_utf8(" utf8latin", utf8latin);
292 print_utf8(" utf8dest", utf8dest);
293 errors ++;
294 }
295 else if (memcmp(utf8latin, utf8dest, len))
ef416fc2 296 {
e1d6a774 297 puts("FAIL (results do not match)");
298 print_utf8(" utf8latin", utf8latin);
299 print_utf8(" utf8dest", utf8dest);
300 errors ++;
ef416fc2 301 }
e1d6a774 302 else if (cupsUTF8ToCharset(legdest, utf8repla, 1024, CUPS_ISO8859_1) < 0)
303 {
304 puts("FAIL (replacement characters do not work!)");
305 errors ++;
306 }
307 else
308 puts("PASS");
ef416fc2 309
310 /*
e1d6a774 311 * Test UTF-8 to/from legacy charset (ISO 8859-7)...
ef416fc2 312 */
e1d6a774 313
314 fputs("cupsUTF8ToCharset(CUPS_ISO8859_7): ", stdout);
315
316 if (cupsUTF8ToCharset(legdest, utf8greek, 1024, CUPS_ISO8859_7) < 0)
ef416fc2 317 {
e1d6a774 318 puts("FAIL");
319 errors ++;
ef416fc2 320 }
e1d6a774 321 else
322 {
323 for (legptr = legdest; *legptr && *legptr != '?'; legptr ++);
324
325 if (*legptr)
326 {
327 puts("FAIL (unknown character)");
328 errors ++;
329 }
330 else
331 puts("PASS");
332 }
333
334 fputs("cupsCharsetToUTF8(CUPS_ISO8859_7): ", stdout);
335
ef416fc2 336 strcpy(legsrc, legdest);
e1d6a774 337
ef416fc2 338 len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_ISO8859_7);
e1d6a774 339 if (len != strlen((char *)utf8greek))
340 {
89d46774 341 printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8greek));
e1d6a774 342 print_utf8(" utf8greek", utf8greek);
343 print_utf8(" utf8dest", utf8dest);
344 errors ++;
345 }
346 else if (memcmp(utf8greek, utf8dest, len))
347 {
348 puts("FAIL (results do not match)");
349 print_utf8(" utf8greek", utf8greek);
350 print_utf8(" utf8dest", utf8dest);
351 errors ++;
352 }
353 else
354 puts("PASS");
ef416fc2 355
356 /*
e1d6a774 357 * Test UTF-8 to/from legacy charset (Windows 932)...
ef416fc2 358 */
e1d6a774 359
360 fputs("cupsUTF8ToCharset(CUPS_WINDOWS_932): ", stdout);
361
362 if (cupsUTF8ToCharset(legdest, utf8japan, 1024, CUPS_WINDOWS_932) < 0)
ef416fc2 363 {
e1d6a774 364 puts("FAIL");
365 errors ++;
ef416fc2 366 }
e1d6a774 367 else
368 {
369 for (legptr = legdest; *legptr && *legptr != '?'; legptr ++);
370
371 if (*legptr)
372 {
373 puts("FAIL (unknown character)");
374 errors ++;
375 }
376 else
377 puts("PASS");
378 }
379
380 fputs("cupsCharsetToUTF8(CUPS_WINDOWS_932): ", stdout);
381
ef416fc2 382 strcpy(legsrc, legdest);
e1d6a774 383
ef416fc2 384 len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_WINDOWS_932);
e1d6a774 385 if (len != strlen((char *)utf8japan))
386 {
89d46774 387 printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8japan));
e1d6a774 388 print_utf8(" utf8japan", utf8japan);
389 print_utf8(" utf8dest", utf8dest);
390 errors ++;
391 }
392 else if (memcmp(utf8japan, utf8dest, len))
393 {
394 puts("FAIL (results do not match)");
395 print_utf8(" utf8japan", utf8japan);
396 print_utf8(" utf8dest", utf8dest);
397 errors ++;
398 }
399 else
400 puts("PASS");
ef416fc2 401
402 /*
e1d6a774 403 * Test UTF-8 to/from legacy charset (EUC-JP)...
ef416fc2 404 */
e1d6a774 405
406 fputs("cupsUTF8ToCharset(CUPS_EUC_JP): ", stdout);
407
408 if (cupsUTF8ToCharset(legdest, utf8japan, 1024, CUPS_EUC_JP) < 0)
ef416fc2 409 {
e1d6a774 410 puts("FAIL");
411 errors ++;
ef416fc2 412 }
e1d6a774 413 else
414 {
415 for (legptr = legdest; *legptr && *legptr != '?'; legptr ++);
416
417 if (*legptr)
418 {
419 puts("FAIL (unknown character)");
420 errors ++;
421 }
422 else
423 puts("PASS");
424 }
425
426 fputs("cupsCharsetToUTF8(CUPS_EUC_JP): ", stdout);
427
ef416fc2 428 strcpy(legsrc, legdest);
e1d6a774 429
ef416fc2 430 len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_EUC_JP);
e1d6a774 431 if (len != strlen((char *)utf8japan))
432 {
89d46774 433 printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8japan));
e1d6a774 434 print_utf8(" utf8japan", utf8japan);
435 print_utf8(" utf8dest", utf8dest);
436 errors ++;
437 }
438 else if (memcmp(utf8japan, utf8dest, len))
439 {
440 puts("FAIL (results do not match)");
441 print_utf8(" utf8japan", utf8japan);
442 print_utf8(" utf8dest", utf8dest);
443 errors ++;
444 }
445 else
446 puts("PASS");
ef416fc2 447
448 /*
e1d6a774 449 * Test UTF-8 to/from legacy charset (Windows 950)...
ef416fc2 450 */
e1d6a774 451
452 fputs("cupsUTF8ToCharset(CUPS_WINDOWS_950): ", stdout);
453
454 if (cupsUTF8ToCharset(legdest, utf8taiwan, 1024, CUPS_WINDOWS_950) < 0)
455 {
456 puts("FAIL");
457 errors ++;
458 }
459 else
ef416fc2 460 {
e1d6a774 461 for (legptr = legdest; *legptr && *legptr != '?'; legptr ++);
462
463 if (*legptr)
464 {
465 puts("FAIL (unknown character)");
466 errors ++;
467 }
468 else
469 puts("PASS");
ef416fc2 470 }
e1d6a774 471
472 fputs("cupsCharsetToUTF8(CUPS_WINDOWS_950): ", stdout);
473
ef416fc2 474 strcpy(legsrc, legdest);
e1d6a774 475
ef416fc2 476 len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_WINDOWS_950);
e1d6a774 477 if (len != strlen((char *)utf8taiwan))
478 {
89d46774 479 printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8taiwan));
e1d6a774 480 print_utf8(" utf8taiwan", utf8taiwan);
481 print_utf8(" utf8dest", utf8dest);
482 errors ++;
483 }
484 else if (memcmp(utf8taiwan, utf8dest, len))
485 {
486 puts("FAIL (results do not match)");
487 print_utf8(" utf8taiwan", utf8taiwan);
488 print_utf8(" utf8dest", utf8dest);
489 errors ++;
490 }
491 else
492 puts("PASS");
ef416fc2 493
494 /*
e1d6a774 495 * Test UTF-8 to/from legacy charset (EUC-TW)...
ef416fc2 496 */
e1d6a774 497
498 fputs("cupsUTF8ToCharset(CUPS_EUC_TW): ", stdout);
499
500 if (cupsUTF8ToCharset(legdest, utf8taiwan, 1024, CUPS_EUC_TW) < 0)
501 {
502 puts("FAIL");
503 errors ++;
504 }
505 else
ef416fc2 506 {
e1d6a774 507 for (legptr = legdest; *legptr && *legptr != '?'; legptr ++);
508
509 if (*legptr)
510 {
511 puts("FAIL (unknown character)");
512 errors ++;
513 }
514 else
515 puts("PASS");
ef416fc2 516 }
e1d6a774 517
518 fputs("cupsCharsetToUTF8(CUPS_EUC_TW): ", stdout);
519
ef416fc2 520 strcpy(legsrc, legdest);
e1d6a774 521
ef416fc2 522 len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_EUC_TW);
e1d6a774 523 if (len != strlen((char *)utf8taiwan))
524 {
89d46774 525 printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8taiwan));
e1d6a774 526 print_utf8(" utf8taiwan", utf8taiwan);
527 print_utf8(" utf8dest", utf8dest);
528 errors ++;
529 }
530 else if (memcmp(utf8taiwan, utf8dest, len))
531 {
532 puts("FAIL (results do not match)");
533 print_utf8(" utf8taiwan", utf8taiwan);
534 print_utf8(" utf8dest", utf8dest);
535 errors ++;
536 }
537 else
538 puts("PASS");
ef416fc2 539
e1d6a774 540#if 0
ef416fc2 541 /*
542 * Test UTF-8 (16-bit) to UTF-32 (w/ BOM)...
543 */
544 if (verbose)
545 printf("\ntesti18n: Testing UTF-8 to UTF-32 (w/ BOM)...\n");
546 len = cupsUTF8ToUTF32(utf32dest, utf8good, 1024);
547 if (len < 0)
548 return (1);
549 if (verbose)
550 {
551 print_utf8(" utf8good ", utf8good);
552 print_utf32(" utf32dest", utf32dest);
553 }
554 memcpy (utf32src, utf32dest, (len + 1) * sizeof(cups_utf32_t));
555 len = cupsUTF32ToUTF8(utf8dest, utf32src, 1024);
556 if (len < 0)
557 return (1);
558 if (len != strlen ((char *) utf8good))
559 return (1);
560 if (memcmp(utf8good, utf8dest, len) != 0)
561 return (1);
562
563 /*
564 * Test invalid UTF-8 (16-bit) to UTF-32 (w/ BOM)...
565 */
566 if (verbose)
567 printf("\ntesti18n: Testing UTF-8 bad 16-bit source string...\n");
568 len = cupsUTF8ToUTF32(utf32dest, utf8bad, 1024);
569 if (len >= 0)
570 return (1);
571 if (verbose)
572 print_utf8(" utf8bad ", utf8bad);
573
574 /*
e1d6a774 575 * Test _cupsCharmapFlush()...
ef416fc2 576 */
577 if (verbose)
e1d6a774 578 printf("\ntesti18n: Testing _cupsCharmapFlush()...\n");
579 _cupsCharmapFlush();
ef416fc2 580 return (0);
e1d6a774 581#endif /* 0 */
582
583 return (errors > 0);
ef416fc2 584}
585
586
587/*
e1d6a774 588 * 'print_utf8()' - Print UTF-8 string with (optional) message.
ef416fc2 589 */
590
e1d6a774 591static void
592print_utf8(const char *msg, /* I - Message String */
593 const cups_utf8_t *src) /* I - UTF-8 Source String */
ef416fc2 594{
58dc1933
MS
595 const char *prefix; /* Prefix string */
596
597
e1d6a774 598 if (msg)
599 printf("%s:", msg);
ef416fc2 600
58dc1933
MS
601 for (prefix = " "; *src; src ++)
602 {
603 printf("%s%02x", prefix, *src);
604
605 if ((src[0] & 0x80) && (src[1] & 0x80))
606 prefix = "";
607 else
608 prefix = " ";
609 }
ef416fc2 610
e1d6a774 611 putchar('\n');
612}
ef416fc2 613
ef416fc2 614
e1d6a774 615/*
75bd9771 616 * End of "$Id: testi18n.c 7560 2008-05-13 06:34:04Z mike $"
ef416fc2 617 */