#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <time.h>
#include <unistd.h>
#include "i18n.h"
#include "string.h"
static void print_utf8(const char *msg, const cups_utf8_t *src);
int
main(int argc,
char *argv[])
{
FILE *fp;
int count;
int status,
errors;
char line[1024];
int len;
char legsrc[1024],
legdest[1024],
*legptr;
cups_utf8_t utf8latin[] =
{ 0x41, 0x20, 0x21, 0x3D, 0x20, 0xC3, 0x84, 0x2E, 0x00 };
cups_utf8_t utf8repla[] =
{ 0x41, 0x20, 0xE2, 0x89, 0xA2, 0x20, 0xC3, 0x84, 0x2E, 0x00 };
cups_utf8_t utf8greek[] =
{ 0x41, 0x20, 0x21, 0x3D, 0x20, 0xCE, 0x91, 0x2E, 0x00 };
cups_utf8_t utf8japan[] =
{ 0x41, 0x20, 0x21, 0x3D, 0x20, 0xEE, 0x9C, 0x80, 0x2E, 0x00 };
cups_utf8_t utf8taiwan[] =
{ 0x41, 0x20, 0x21, 0x3D, 0x20, 0xE4, 0xB9, 0x82, 0x2E, 0x00 };
cups_utf8_t utf8dest[1024];
cups_utf32_t utf32dest[1024];
if (access("charmaps", 0))
symlink("../data", "charmaps");
putenv("CUPS_DATADIR=.");
errors = 0;
if ((fp = fopen("utf8demo.txt", "r")) == NULL)
{
perror("utf8demo.txt");
return (1);
}
fputs("cupsUTF8ToUTF32 of utfdemo.txt: ", stdout);
for (count = 0, status = 0; fgets(line, sizeof(line), fp);)
{
count ++;
if (cupsUTF8ToUTF32(utf32dest, (cups_utf8_t *)line, 1024) < 0)
{
printf("FAIL (UTF-8 to UTF-32 on line %d)\n", count);
errors ++;
status = 1;
break;
}
}
if (!status)
puts("PASS");
fputs("cupsUTF8ToCharset(CUPS_EUC_JP) of utfdemo.txt: ", stdout);
rewind(fp);
for (count = 0, status = 0; fgets(line, sizeof(line), fp);)
{
count ++;
len = cupsUTF8ToCharset(legdest, (cups_utf8_t *)line, 1024, CUPS_EUC_JP);
if (len < 0)
{
printf("FAIL (UTF-8 to EUC-JP on line %d)\n", count);
errors ++;
status = 1;
break;
}
}
if (!status)
puts("PASS");
fclose(fp);
fputs("_cupsCharmapGet(CUPS_ISO8859_1): ", stdout);
if (!_cupsCharmapGet(CUPS_ISO8859_1))
{
errors ++;
puts("FAIL");
}
else
puts("PASS");
fputs("_cupsCharmapGet(CUPS_WINDOWS_932): ", stdout);
if (!_cupsCharmapGet(CUPS_WINDOWS_932))
{
errors ++;
puts("FAIL");
}
else
puts("PASS");
fputs("_cupsCharmapGet(CUPS_EUC_JP): ", stdout);
if (!_cupsCharmapGet(CUPS_EUC_JP))
{
errors ++;
puts("FAIL");
}
else
puts("PASS");
fputs("_cupsCharmapGet(CUPS_EUC_TW): ", stdout);
if (!_cupsCharmapGet(CUPS_EUC_TW))
{
errors ++;
puts("FAIL");
}
else
puts("PASS");
fputs("cupsUTF8ToCharset(CUPS_ISO8859_1): ", stdout);
legdest[0] = 0;
len = cupsUTF8ToCharset(legdest, utf8latin, 1024, CUPS_ISO8859_1);
if (len < 0)
{
printf("FAIL (len=%d)\n", len);
errors ++;
}
else
puts("PASS");
fputs("cupsCharsetToUTF8(CUPS_ISO8859_1): ", stdout);
strcpy(legsrc, legdest);
len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_ISO8859_1);
if (len != strlen((char *)utf8latin))
{
printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8latin));
print_utf8(" utf8latin", utf8latin);
print_utf8(" utf8dest", utf8dest);
errors ++;
}
else if (memcmp(utf8latin, utf8dest, len))
{
puts("FAIL (results do not match)");
print_utf8(" utf8latin", utf8latin);
print_utf8(" utf8dest", utf8dest);
errors ++;
}
else if (cupsUTF8ToCharset(legdest, utf8repla, 1024, CUPS_ISO8859_1) < 0)
{
puts("FAIL (replacement characters do not work!)");
errors ++;
}
else
puts("PASS");
fputs("cupsUTF8ToCharset(CUPS_ISO8859_7): ", stdout);
if (cupsUTF8ToCharset(legdest, utf8greek, 1024, CUPS_ISO8859_7) < 0)
{
puts("FAIL");
errors ++;
}
else
{
for (legptr = legdest; *legptr && *legptr != '?'; legptr ++);
if (*legptr)
{
puts("FAIL (unknown character)");
errors ++;
}
else
puts("PASS");
}
fputs("cupsCharsetToUTF8(CUPS_ISO8859_7): ", stdout);
strcpy(legsrc, legdest);
len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_ISO8859_7);
if (len != strlen((char *)utf8greek))
{
printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8greek));
print_utf8(" utf8greek", utf8greek);
print_utf8(" utf8dest", utf8dest);
errors ++;
}
else if (memcmp(utf8greek, utf8dest, len))
{
puts("FAIL (results do not match)");
print_utf8(" utf8greek", utf8greek);
print_utf8(" utf8dest", utf8dest);
errors ++;
}
else
puts("PASS");
fputs("cupsUTF8ToCharset(CUPS_WINDOWS_932): ", stdout);
if (cupsUTF8ToCharset(legdest, utf8japan, 1024, CUPS_WINDOWS_932) < 0)
{
puts("FAIL");
errors ++;
}
else
{
for (legptr = legdest; *legptr && *legptr != '?'; legptr ++);
if (*legptr)
{
puts("FAIL (unknown character)");
errors ++;
}
else
puts("PASS");
}
fputs("cupsCharsetToUTF8(CUPS_WINDOWS_932): ", stdout);
strcpy(legsrc, legdest);
len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_WINDOWS_932);
if (len != strlen((char *)utf8japan))
{
printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8japan));
print_utf8(" utf8japan", utf8japan);
print_utf8(" utf8dest", utf8dest);
errors ++;
}
else if (memcmp(utf8japan, utf8dest, len))
{
puts("FAIL (results do not match)");
print_utf8(" utf8japan", utf8japan);
print_utf8(" utf8dest", utf8dest);
errors ++;
}
else
puts("PASS");
fputs("cupsUTF8ToCharset(CUPS_EUC_JP): ", stdout);
if (cupsUTF8ToCharset(legdest, utf8japan, 1024, CUPS_EUC_JP) < 0)
{
puts("FAIL");
errors ++;
}
else
{
for (legptr = legdest; *legptr && *legptr != '?'; legptr ++);
if (*legptr)
{
puts("FAIL (unknown character)");
errors ++;
}
else
puts("PASS");
}
fputs("cupsCharsetToUTF8(CUPS_EUC_JP): ", stdout);
strcpy(legsrc, legdest);
len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_EUC_JP);
if (len != strlen((char *)utf8japan))
{
printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8japan));
print_utf8(" utf8japan", utf8japan);
print_utf8(" utf8dest", utf8dest);
errors ++;
}
else if (memcmp(utf8japan, utf8dest, len))
{
puts("FAIL (results do not match)");
print_utf8(" utf8japan", utf8japan);
print_utf8(" utf8dest", utf8dest);
errors ++;
}
else
puts("PASS");
fputs("cupsUTF8ToCharset(CUPS_WINDOWS_950): ", stdout);
if (cupsUTF8ToCharset(legdest, utf8taiwan, 1024, CUPS_WINDOWS_950) < 0)
{
puts("FAIL");
errors ++;
}
else
{
for (legptr = legdest; *legptr && *legptr != '?'; legptr ++);
if (*legptr)
{
puts("FAIL (unknown character)");
errors ++;
}
else
puts("PASS");
}
fputs("cupsCharsetToUTF8(CUPS_WINDOWS_950): ", stdout);
strcpy(legsrc, legdest);
len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_WINDOWS_950);
if (len != strlen((char *)utf8taiwan))
{
printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8taiwan));
print_utf8(" utf8taiwan", utf8taiwan);
print_utf8(" utf8dest", utf8dest);
errors ++;
}
else if (memcmp(utf8taiwan, utf8dest, len))
{
puts("FAIL (results do not match)");
print_utf8(" utf8taiwan", utf8taiwan);
print_utf8(" utf8dest", utf8dest);
errors ++;
}
else
puts("PASS");
fputs("cupsUTF8ToCharset(CUPS_EUC_TW): ", stdout);
if (cupsUTF8ToCharset(legdest, utf8taiwan, 1024, CUPS_EUC_TW) < 0)
{
puts("FAIL");
errors ++;
}
else
{
for (legptr = legdest; *legptr && *legptr != '?'; legptr ++);
if (*legptr)
{
puts("FAIL (unknown character)");
errors ++;
}
else
puts("PASS");
}
fputs("cupsCharsetToUTF8(CUPS_EUC_TW): ", stdout);
strcpy(legsrc, legdest);
len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_EUC_TW);
if (len != strlen((char *)utf8taiwan))
{
printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8taiwan));
print_utf8(" utf8taiwan", utf8taiwan);
print_utf8(" utf8dest", utf8dest);
errors ++;
}
else if (memcmp(utf8taiwan, utf8dest, len))
{
puts("FAIL (results do not match)");
print_utf8(" utf8taiwan", utf8taiwan);
print_utf8(" utf8dest", utf8dest);
errors ++;
}
else
puts("PASS");
#if 0
if (verbose)
printf("\ntesti18n: Testing UTF-8 to UTF-32 (w/ BOM)...\n");
len = cupsUTF8ToUTF32(utf32dest, utf8good, 1024);
if (len < 0)
return (1);
if (verbose)
{
print_utf8(" utf8good ", utf8good);
print_utf32(" utf32dest", utf32dest);
}
memcpy (utf32src, utf32dest, (len + 1) * sizeof(cups_utf32_t));
len = cupsUTF32ToUTF8(utf8dest, utf32src, 1024);
if (len < 0)
return (1);
if (len != strlen ((char *) utf8good))
return (1);
if (memcmp(utf8good, utf8dest, len) != 0)
return (1);
if (verbose)
printf("\ntesti18n: Testing UTF-8 bad 16-bit source string...\n");
len = cupsUTF8ToUTF32(utf32dest, utf8bad, 1024);
if (len >= 0)
return (1);
if (verbose)
print_utf8(" utf8bad ", utf8bad);
if (verbose)
printf("\ntesti18n: Testing _cupsCharmapFlush()...\n");
_cupsCharmapFlush();
return (0);
#endif
return (errors > 0);
}
static void
print_utf8(const char *msg,
const cups_utf8_t *src)
{
if (msg)
printf("%s:", msg);
for (; *src; src ++)
printf(" %02x", *src);
putchar('\n');
}