2 * Internationalization test for CUPS.
4 * Copyright 2007-2014 by Apple Inc.
5 * Copyright 1997-2006 by Easy Software Products.
7 * Licensed under Apache License v2.0. See the file "LICENSE" for more information.
11 * Include necessary headers...
14 #include "string-private.h"
15 #include "language-private.h"
25 static const char * const lang_encodings[] =
26 { /* Encoding strings */
27 "us-ascii", "iso-8859-1",
28 "iso-8859-2", "iso-8859-3",
29 "iso-8859-4", "iso-8859-5",
30 "iso-8859-6", "iso-8859-7",
31 "iso-8859-8", "iso-8859-9",
32 "iso-8859-10", "utf-8",
33 "iso-8859-13", "iso-8859-14",
34 "iso-8859-15", "windows-874",
35 "windows-1250", "windows-1251",
36 "windows-1252", "windows-1253",
37 "windows-1254", "windows-1255",
38 "windows-1256", "windows-1257",
39 "windows-1258", "koi8-r",
40 "koi8-u", "iso-8859-11",
41 "iso-8859-16", "mac-roman",
59 "windows-932", "windows-936",
60 "windows-949", "windows-950",
61 "windows-1361", "unknown",
101 static void print_utf8(const char *msg, const cups_utf8_t *src);
105 * 'main()' - Main entry for internationalization test module.
108 int /* O - Exit code */
109 main(int argc, /* I - Argument Count */
110 char *argv[]) /* I - Arguments */
112 FILE *fp; /* File pointer */
113 int count; /* File line counter */
114 int status, /* Status of current test */
115 errors; /* Error count */
116 char line[1024]; /* File line source string */
117 int len; /* Length (count) of string */
118 char legsrc[1024], /* Legacy source string */
119 legdest[1024], /* Legacy destination string */
120 *legptr; /* Pointer into legacy string */
121 cups_utf8_t utf8latin[] = /* UTF-8 Latin-1 source */
122 { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xC3, 0x84, 0x2E, 0x00 };
123 /* "A != <A WITH DIAERESIS>." - use ISO 8859-1 */
124 cups_utf8_t utf8repla[] = /* UTF-8 Latin-1 replacement */
125 { 0x41, 0x20, 0xE2, 0x89, 0xA2, 0x20, 0xC3, 0x84, 0x2E, 0x00 };
126 /* "A <NOT IDENTICAL TO> <A WITH DIAERESIS>." */
127 cups_utf8_t utf8greek[] = /* UTF-8 Greek source string */
128 { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xCE, 0x91, 0x2E, 0x00 };
129 /* "A != <ALPHA>." - use ISO 8859-7 */
130 cups_utf8_t utf8japan[] = /* UTF-8 Japanese source */
131 { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xEE, 0x9C, 0x80, 0x2E, 0x00 };
132 /* "A != <PRIVATE U+E700>." - use Windows 932 or EUC-JP */
133 cups_utf8_t utf8taiwan[] = /* UTF-8 Chinese source */
134 { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xE4, 0xB9, 0x82, 0x2E, 0x00 };
135 /* "A != <CJK U+4E42>." - use Windows 950 (Big5) or EUC-TW */
136 cups_utf8_t utf8dest[1024]; /* UTF-8 destination string */
137 cups_utf32_t utf32dest[1024]; /* UTF-32 destination string */
142 int i; /* Looping var */
143 cups_encoding_t encoding; /* Source encoding */
148 puts("Usage: ./testi18n [filename charset]");
152 if ((fp = fopen(argv[1], "rb")) == NULL)
158 for (i = 0, encoding = CUPS_AUTO_ENCODING;
159 i < (int)(sizeof(lang_encodings) / sizeof(lang_encodings[0]));
161 if (!_cups_strcasecmp(lang_encodings[i], argv[2]))
163 encoding = (cups_encoding_t)i;
167 if (encoding == CUPS_AUTO_ENCODING)
169 fprintf(stderr, "%s: Unknown character set!\n", argv[2]);
173 while (fgets(line, sizeof(line), fp))
175 if (cupsCharsetToUTF8(utf8dest, line, sizeof(utf8dest), encoding) < 0)
177 fprintf(stderr, "%s: Unable to convert line: %s", argv[1], line);
181 fputs((char *)utf8dest, stdout);
189 * Start with some conversion tests from a UTF-8 test file.
194 if ((fp = fopen("utf8demo.txt", "rb")) == NULL)
196 perror("utf8demo.txt");
204 fputs("cupsUTF8ToUTF32 of utfdemo.txt: ", stdout);
206 for (count = 0, status = 0; fgets(line, sizeof(line), fp);)
210 if (cupsUTF8ToUTF32(utf32dest, (cups_utf8_t *)line, 1024) < 0)
212 printf("FAIL (UTF-8 to UTF-32 on line %d)\n", count);
223 * cupsUTF8ToCharset(CUPS_EUC_JP)
226 fputs("cupsUTF8ToCharset(CUPS_EUC_JP) of utfdemo.txt: ", stdout);
230 for (count = 0, status = 0; fgets(line, sizeof(line), fp);)
234 len = cupsUTF8ToCharset(legdest, (cups_utf8_t *)line, 1024, CUPS_EUC_JP);
237 printf("FAIL (UTF-8 to EUC-JP on line %d)\n", count);
250 * Test UTF-8 to legacy charset (ISO 8859-1)...
253 fputs("cupsUTF8ToCharset(CUPS_ISO8859_1): ", stdout);
257 len = cupsUTF8ToCharset(legdest, utf8latin, 1024, CUPS_ISO8859_1);
260 printf("FAIL (len=%d)\n", len);
270 fputs("cupsCharsetToUTF8(CUPS_ISO8859_1): ", stdout);
272 strlcpy(legsrc, legdest, sizeof(legsrc));
274 len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_ISO8859_1);
275 if ((size_t)len != strlen((char *)utf8latin))
277 printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8latin));
278 print_utf8(" utf8latin", utf8latin);
279 print_utf8(" utf8dest", utf8dest);
282 else if (memcmp(utf8latin, utf8dest, (size_t)len))
284 puts("FAIL (results do not match)");
285 print_utf8(" utf8latin", utf8latin);
286 print_utf8(" utf8dest", utf8dest);
289 else if (cupsUTF8ToCharset(legdest, utf8repla, 1024, CUPS_ISO8859_1) < 0)
291 puts("FAIL (replacement characters do not work!)");
298 * Test UTF-8 to/from legacy charset (ISO 8859-7)...
301 fputs("cupsUTF8ToCharset(CUPS_ISO8859_7): ", stdout);
303 if (cupsUTF8ToCharset(legdest, utf8greek, 1024, CUPS_ISO8859_7) < 0)
310 for (legptr = legdest; *legptr && *legptr != '?'; legptr ++);
314 puts("FAIL (unknown character)");
321 fputs("cupsCharsetToUTF8(CUPS_ISO8859_7): ", stdout);
323 strlcpy(legsrc, legdest, sizeof(legsrc));
325 len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_ISO8859_7);
326 if ((size_t)len != strlen((char *)utf8greek))
328 printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8greek));
329 print_utf8(" utf8greek", utf8greek);
330 print_utf8(" utf8dest", utf8dest);
333 else if (memcmp(utf8greek, utf8dest, (size_t)len))
335 puts("FAIL (results do not match)");
336 print_utf8(" utf8greek", utf8greek);
337 print_utf8(" utf8dest", utf8dest);
344 * Test UTF-8 to/from legacy charset (Windows 932)...
347 fputs("cupsUTF8ToCharset(CUPS_WINDOWS_932): ", stdout);
349 if (cupsUTF8ToCharset(legdest, utf8japan, 1024, CUPS_WINDOWS_932) < 0)
356 for (legptr = legdest; *legptr && *legptr != '?'; legptr ++);
360 puts("FAIL (unknown character)");
367 fputs("cupsCharsetToUTF8(CUPS_WINDOWS_932): ", stdout);
369 strlcpy(legsrc, legdest, sizeof(legsrc));
371 len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_WINDOWS_932);
372 if ((size_t)len != strlen((char *)utf8japan))
374 printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8japan));
375 print_utf8(" utf8japan", utf8japan);
376 print_utf8(" utf8dest", utf8dest);
379 else if (memcmp(utf8japan, utf8dest, (size_t)len))
381 puts("FAIL (results do not match)");
382 print_utf8(" utf8japan", utf8japan);
383 print_utf8(" utf8dest", utf8dest);
390 * Test UTF-8 to/from legacy charset (EUC-JP)...
393 fputs("cupsUTF8ToCharset(CUPS_EUC_JP): ", stdout);
395 if (cupsUTF8ToCharset(legdest, utf8japan, 1024, CUPS_EUC_JP) < 0)
402 for (legptr = legdest; *legptr && *legptr != '?'; legptr ++);
406 puts("FAIL (unknown character)");
414 fputs("cupsCharsetToUTF8(CUPS_EUC_JP): ", stdout);
416 strlcpy(legsrc, legdest, sizeof(legsrc));
418 len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_EUC_JP);
419 if ((size_t)len != strlen((char *)utf8japan))
421 printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8japan));
422 print_utf8(" utf8japan", utf8japan);
423 print_utf8(" utf8dest", utf8dest);
426 else if (memcmp(utf8japan, utf8dest, (size_t)len))
428 puts("FAIL (results do not match)");
429 print_utf8(" utf8japan", utf8japan);
430 print_utf8(" utf8dest", utf8dest);
435 #endif /* !__linux */
438 * Test UTF-8 to/from legacy charset (Windows 950)...
441 fputs("cupsUTF8ToCharset(CUPS_WINDOWS_950): ", stdout);
443 if (cupsUTF8ToCharset(legdest, utf8taiwan, 1024, CUPS_WINDOWS_950) < 0)
450 for (legptr = legdest; *legptr && *legptr != '?'; legptr ++);
454 puts("FAIL (unknown character)");
461 fputs("cupsCharsetToUTF8(CUPS_WINDOWS_950): ", stdout);
463 strlcpy(legsrc, legdest, sizeof(legsrc));
465 len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_WINDOWS_950);
466 if ((size_t)len != strlen((char *)utf8taiwan))
468 printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8taiwan));
469 print_utf8(" utf8taiwan", utf8taiwan);
470 print_utf8(" utf8dest", utf8dest);
473 else if (memcmp(utf8taiwan, utf8dest, (size_t)len))
475 puts("FAIL (results do not match)");
476 print_utf8(" utf8taiwan", utf8taiwan);
477 print_utf8(" utf8dest", utf8dest);
484 * Test UTF-8 to/from legacy charset (EUC-TW)...
487 fputs("cupsUTF8ToCharset(CUPS_EUC_TW): ", stdout);
489 if (cupsUTF8ToCharset(legdest, utf8taiwan, 1024, CUPS_EUC_TW) < 0)
496 for (legptr = legdest; *legptr && *legptr != '?'; legptr ++);
500 puts("FAIL (unknown character)");
507 fputs("cupsCharsetToUTF8(CUPS_EUC_TW): ", stdout);
509 strlcpy(legsrc, legdest, sizeof(legsrc));
511 len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_EUC_TW);
512 if ((size_t)len != strlen((char *)utf8taiwan))
514 printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8taiwan));
515 print_utf8(" utf8taiwan", utf8taiwan);
516 print_utf8(" utf8dest", utf8dest);
519 else if (memcmp(utf8taiwan, utf8dest, (size_t)len))
521 puts("FAIL (results do not match)");
522 print_utf8(" utf8taiwan", utf8taiwan);
523 print_utf8(" utf8dest", utf8dest);
531 * Test UTF-8 (16-bit) to UTF-32 (w/ BOM)...
534 printf("\ntesti18n: Testing UTF-8 to UTF-32 (w/ BOM)...\n");
535 len = cupsUTF8ToUTF32(utf32dest, utf8good, 1024);
540 print_utf8(" utf8good ", utf8good);
541 print_utf32(" utf32dest", utf32dest);
543 memcpy(utf32src, utf32dest, (len + 1) * sizeof(cups_utf32_t));
544 len = cupsUTF32ToUTF8(utf8dest, utf32src, 1024);
547 if (len != strlen ((char *) utf8good))
549 if (memcmp(utf8good, utf8dest, len) != 0)
553 * Test invalid UTF-8 (16-bit) to UTF-32 (w/ BOM)...
556 printf("\ntesti18n: Testing UTF-8 bad 16-bit source string...\n");
557 len = cupsUTF8ToUTF32(utf32dest, utf8bad, 1024);
561 print_utf8(" utf8bad ", utf8bad);
564 * Test _cupsCharmapFlush()...
567 printf("\ntesti18n: Testing _cupsCharmapFlush()...\n");
577 * 'print_utf8()' - Print UTF-8 string with (optional) message.
581 print_utf8(const char *msg, /* I - Message String */
582 const cups_utf8_t *src) /* I - UTF-8 Source String */
584 const char *prefix; /* Prefix string */
590 for (prefix = " "; *src; src ++)
592 printf("%s%02x", prefix, *src);
594 if ((src[0] & 0x80) && (src[1] & 0x80))