char * /* O - Buffer */ _cupsStrDate(char *buf, /* I - Buffer */ size_t bufsize, /* I - Size of buffer */ time_t timeval) /* I - Time value */ { struct tm *dateval; /* Local date/time */ char temp[1024]; /* Temporary buffer */ _cups_globals_t *cg = _cupsGlobals(); /* Per-thread globals */ if (!cg->lang_default) cg->lang_default = cupsLangDefault(); dateval = localtime(&timeval); if (cg->lang_default->encoding != CUPS_UTF8) { strftime(temp, sizeof(temp), "%c", dateval); cupsCharsetToUTF8((cups_utf8_t *)buf, temp, (int)bufsize, cg->lang_default->encoding); } else strftime(buf, bufsize, "%c", dateval); return (buf); }
static void backend_walk_cb(cups_snmp_t *packet, /* I - SNMP packet */ void *data) /* I - User data (unused) */ { int i, j, k; /* Looping vars */ static const char * const colors[][2] = { /* Standard color names */ { "black", "#000000" }, { "blue", "#0000FF" }, { "brown", "#A52A2A" }, { "cyan", "#00FFFF" }, { "dark-gray", "#404040" }, { "dark gray", "#404040" }, { "dark-yellow", "#FFCC00" }, { "dark yellow", "#FFCC00" }, { "gold", "#FFD700" }, { "gray", "#808080" }, { "green", "#00FF00" }, { "light-black", "#606060" }, { "light black", "#606060" }, { "light-cyan", "#E0FFFF" }, { "light cyan", "#E0FFFF" }, { "light-gray", "#D3D3D3" }, { "light gray", "#D3D3D3" }, { "light-magenta", "#FF77FF" }, { "light magenta", "#FF77FF" }, { "magenta", "#FF00FF" }, { "orange", "#FFA500" }, { "red", "#FF0000" }, { "silver", "#C0C0C0" }, { "white", "#FFFFFF" }, { "yellow", "#FFFF00" } }; (void)data; if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerColorantValue) && packet->object_type == CUPS_ASN1_OCTET_STRING) { /* * Get colorant... */ i = packet->object_name[prtMarkerColorantValueOffset]; fprintf(stderr, "DEBUG2: prtMarkerColorantValue.1.%d = \"%s\"\n", i, (char *)packet->object_value.string.bytes); for (j = 0; j < num_supplies; j ++) if (supplies[j].colorant == i) { for (k = 0; k < (int)(sizeof(colors) / sizeof(colors[0])); k ++) if (!_cups_strcasecmp(colors[k][0], (char *)packet->object_value.string.bytes)) { strlcpy(supplies[j].color, colors[k][1], sizeof(supplies[j].color)); break; } } } else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesColorantIndex)) { /* * Get colorant index... */ i = packet->object_name[prtMarkerSuppliesColorantIndexOffset]; if (i < 1 || i > CUPS_MAX_SUPPLIES || packet->object_type != CUPS_ASN1_INTEGER) return; fprintf(stderr, "DEBUG2: prtMarkerSuppliesColorantIndex.1.%d = %d\n", i, packet->object_value.integer); if (i > num_supplies) num_supplies = i; supplies[i - 1].colorant = packet->object_value.integer; } else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesDescription)) { /* * Get supply name/description... */ i = packet->object_name[prtMarkerSuppliesDescriptionOffset]; if (i < 1 || i > CUPS_MAX_SUPPLIES || packet->object_type != CUPS_ASN1_OCTET_STRING) return; if (i > num_supplies) num_supplies = i; switch (charset) { case CUPS_TC_csASCII : case CUPS_TC_csUTF8 : case CUPS_TC_csUnicodeASCII : strlcpy(supplies[i - 1].name, (char *)packet->object_value.string.bytes, sizeof(supplies[0].name)); break; case CUPS_TC_csISOLatin1 : case CUPS_TC_csUnicodeLatin1 : cupsCharsetToUTF8((cups_utf8_t *)supplies[i - 1].name, (char *)packet->object_value.string.bytes, sizeof(supplies[0].name), CUPS_ISO8859_1); break; case CUPS_TC_csShiftJIS : case CUPS_TC_csWindows31J : /* Close enough for our purposes */ cupsCharsetToUTF8((cups_utf8_t *)supplies[i - 1].name, (char *)packet->object_value.string.bytes, sizeof(supplies[0].name), CUPS_JIS_X0213); break; case CUPS_TC_csUCS4 : case CUPS_TC_csUTF32 : case CUPS_TC_csUTF32BE : case CUPS_TC_csUTF32LE : cupsUTF32ToUTF8((cups_utf8_t *)supplies[i - 1].name, (cups_utf32_t *)packet->object_value.string.bytes, sizeof(supplies[0].name)); break; case CUPS_TC_csUnicode : case CUPS_TC_csUTF16BE : case CUPS_TC_csUTF16LE : utf16_to_utf8((cups_utf8_t *)supplies[i - 1].name, packet->object_value.string.bytes, packet->object_value.string.num_bytes, sizeof(supplies[0].name), charset == CUPS_TC_csUTF16LE); break; default : /* * If we get here, the printer is using an unknown character set and * we just want to copy characters that look like ASCII... */ { char *src, *dst; /* Pointers into strings */ /* * Loop safe because both the object_value and supplies char arrays * are CUPS_SNMP_MAX_STRING elements long. */ for (src = (char *)packet->object_value.string.bytes, dst = supplies[i - 1].name; *src; src ++) { if ((*src & 0x80) || *src < ' ' || *src == 0x7f) *dst++ = '?'; else *dst++ = *src; } *dst = '\0'; } break; } fprintf(stderr, "DEBUG2: prtMarkerSuppliesDescription.1.%d = \"%s\"\n", i, supplies[i - 1].name); } else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesLevel)) { /* * Get level... */ i = packet->object_name[prtMarkerSuppliesLevelOffset]; if (i < 1 || i > CUPS_MAX_SUPPLIES || packet->object_type != CUPS_ASN1_INTEGER) return; fprintf(stderr, "DEBUG2: prtMarkerSuppliesLevel.1.%d = %d\n", i, packet->object_value.integer); if (i > num_supplies) num_supplies = i; supplies[i - 1].level = packet->object_value.integer; } else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesMaxCapacity) && !(quirks & CUPS_SNMP_CAPACITY)) { /* * Get max capacity... */ i = packet->object_name[prtMarkerSuppliesMaxCapacityOffset]; if (i < 1 || i > CUPS_MAX_SUPPLIES || packet->object_type != CUPS_ASN1_INTEGER) return; fprintf(stderr, "DEBUG2: prtMarkerSuppliesMaxCapacity.1.%d = %d\n", i, packet->object_value.integer); if (i > num_supplies) num_supplies = i; if (supplies[i - 1].max_capacity == 0 && packet->object_value.integer > 0) supplies[i - 1].max_capacity = packet->object_value.integer; } else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesClass)) { /* * Get marker class... */ i = packet->object_name[prtMarkerSuppliesClassOffset]; if (i < 1 || i > CUPS_MAX_SUPPLIES || packet->object_type != CUPS_ASN1_INTEGER) return; fprintf(stderr, "DEBUG2: prtMarkerSuppliesClass.1.%d = %d\n", i, packet->object_value.integer); if (i > num_supplies) num_supplies = i; supplies[i - 1].sclass = packet->object_value.integer; } else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesType)) { /* * Get marker type... */ i = packet->object_name[prtMarkerSuppliesTypeOffset]; if (i < 1 || i > CUPS_MAX_SUPPLIES || packet->object_type != CUPS_ASN1_INTEGER) return; fprintf(stderr, "DEBUG2: prtMarkerSuppliesType.1.%d = %d\n", i, packet->object_value.integer); if (i > num_supplies) num_supplies = i; supplies[i - 1].type = packet->object_value.integer; } else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesSupplyUnit)) { /* * Get units for capacity... */ i = packet->object_name[prtMarkerSuppliesSupplyUnitOffset]; if (i < 1 || i > CUPS_MAX_SUPPLIES || packet->object_type != CUPS_ASN1_INTEGER) return; fprintf(stderr, "DEBUG2: prtMarkerSuppliesSupplyUnit.1.%d = %d\n", i, packet->object_value.integer); if (i > num_supplies) num_supplies = i; if (packet->object_value.integer == CUPS_TC_percent) supplies[i - 1].max_capacity = 100; } }
void _cupsSetLocale(char *argv[]) /* IO - Command-line arguments */ { int i; /* Looping var */ char buffer[8192]; /* Command-line argument buffer */ _cups_globals_t *cg; /* Global data */ #ifdef LC_TIME const char *lc_time; /* Current LC_TIME value */ char new_lc_time[255], /* New LC_TIME value */ *charset; /* Pointer to character set */ #endif /* LC_TIME */ /* * Set the locale so that times, etc. are displayed properly. * * Unfortunately, while we need the localized time value, we *don't* * want to use the localized charset for the time value, so we need * to set LC_TIME to the locale name with .UTF-8 on the end (if * the locale includes a character set specifier...) */ setlocale(LC_ALL, ""); #ifdef LC_TIME if ((lc_time = setlocale(LC_TIME, NULL)) == NULL) lc_time = setlocale(LC_ALL, NULL); if (lc_time) { strlcpy(new_lc_time, lc_time, sizeof(new_lc_time)); if ((charset = strchr(new_lc_time, '.')) == NULL) charset = new_lc_time + strlen(new_lc_time); strlcpy(charset, ".UTF-8", sizeof(new_lc_time) - (size_t)(charset - new_lc_time)); } else strlcpy(new_lc_time, "C", sizeof(new_lc_time)); setlocale(LC_TIME, new_lc_time); #endif /* LC_TIME */ /* * Initialize the default language info... */ cg = _cupsGlobals(); if (!cg->lang_default) cg->lang_default = cupsLangDefault(); /* * Transcode the command-line arguments from the locale charset to * UTF-8... */ if (cg->lang_default->encoding != CUPS_US_ASCII && cg->lang_default->encoding != CUPS_UTF8) { for (i = 1; argv[i]; i ++) { /* * Try converting from the locale charset to UTF-8... */ if (cupsCharsetToUTF8((cups_utf8_t *)buffer, argv[i], sizeof(buffer), cg->lang_default->encoding) < 0) continue; /* * Save the new string if it differs from the original... */ if (strcmp(buffer, argv[i])) argv[i] = strdup(buffer); } } }
int /* O - Exit code */ main(int argc, /* I - Argument Count */ char *argv[]) /* I - Arguments */ { FILE *fp; /* File pointer */ int count; /* File line counter */ int status, /* Status of current test */ errors; /* Error count */ char line[1024]; /* File line source string */ int len; /* Length (count) of string */ char legsrc[1024], /* Legacy source string */ legdest[1024], /* Legacy destination string */ *legptr; /* Pointer into legacy string */ cups_utf8_t utf8latin[] = /* UTF-8 Latin-1 source */ { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xC3, 0x84, 0x2E, 0x00 }; /* "A != <A WITH DIAERESIS>." - use ISO 8859-1 */ cups_utf8_t utf8repla[] = /* UTF-8 Latin-1 replacement */ { 0x41, 0x20, 0xE2, 0x89, 0xA2, 0x20, 0xC3, 0x84, 0x2E, 0x00 }; /* "A <NOT IDENTICAL TO> <A WITH DIAERESIS>." */ cups_utf8_t utf8greek[] = /* UTF-8 Greek source string */ { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xCE, 0x91, 0x2E, 0x00 }; /* "A != <ALPHA>." - use ISO 8859-7 */ cups_utf8_t utf8japan[] = /* UTF-8 Japanese source */ { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xEE, 0x9C, 0x80, 0x2E, 0x00 }; /* "A != <PRIVATE U+E700>." - use Windows 932 or EUC-JP */ cups_utf8_t utf8taiwan[] = /* UTF-8 Chinese source */ { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xE4, 0xB9, 0x82, 0x2E, 0x00 }; /* "A != <CJK U+4E42>." - use Windows 950 (Big5) or EUC-TW */ cups_utf8_t utf8dest[1024]; /* UTF-8 destination string */ cups_utf32_t utf32dest[1024]; /* UTF-32 destination string */ if (argc > 1) { int i; /* Looping var */ cups_encoding_t encoding; /* Source encoding */ if (argc != 3) { puts("Usage: ./testi18n [filename charset]"); return (1); } if ((fp = fopen(argv[1], "rb")) == NULL) { perror(argv[1]); return (1); } for (i = 0, encoding = CUPS_AUTO_ENCODING; i < (int)(sizeof(lang_encodings) / sizeof(lang_encodings[0])); i ++) if (!_cups_strcasecmp(lang_encodings[i], argv[2])) { encoding = (cups_encoding_t)i; break; } if (encoding == CUPS_AUTO_ENCODING) { fprintf(stderr, "%s: Unknown character set!\n", argv[2]); return (1); } while (fgets(line, sizeof(line), fp)) { if (cupsCharsetToUTF8(utf8dest, line, sizeof(utf8dest), encoding) < 0) { fprintf(stderr, "%s: Unable to convert line: %s", argv[1], line); return (1); } fputs((char *)utf8dest, stdout); } fclose(fp); return (0); } /* * Start with some conversion tests from a UTF-8 test file. */ errors = 0; if ((fp = fopen("utf8demo.txt", "rb")) == NULL) { perror("utf8demo.txt"); return (1); } /* * cupsUTF8ToUTF32 */ 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"); /* * cupsUTF8ToCharset(CUPS_EUC_JP) */ 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); /* * Test UTF-8 to legacy charset (ISO 8859-1)... */ 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"); /* * cupsCharsetToUTF8 */ fputs("cupsCharsetToUTF8(CUPS_ISO8859_1): ", stdout); strlcpy(legsrc, legdest, sizeof(legsrc)); len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_ISO8859_1); if ((size_t)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, (size_t)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"); /* * Test UTF-8 to/from legacy charset (ISO 8859-7)... */ 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); strlcpy(legsrc, legdest, sizeof(legsrc)); len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_ISO8859_7); if ((size_t)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, (size_t)len)) { puts("FAIL (results do not match)"); print_utf8(" utf8greek", utf8greek); print_utf8(" utf8dest", utf8dest); errors ++; } else puts("PASS"); /* * Test UTF-8 to/from legacy charset (Windows 932)... */ 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); strlcpy(legsrc, legdest, sizeof(legsrc)); len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_WINDOWS_932); if ((size_t)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, (size_t)len)) { puts("FAIL (results do not match)"); print_utf8(" utf8japan", utf8japan); print_utf8(" utf8dest", utf8dest); errors ++; } else puts("PASS"); /* * Test UTF-8 to/from legacy charset (EUC-JP)... */ 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"); } #ifndef __linux fputs("cupsCharsetToUTF8(CUPS_EUC_JP): ", stdout); strlcpy(legsrc, legdest, sizeof(legsrc)); len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_EUC_JP); if ((size_t)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, (size_t)len)) { puts("FAIL (results do not match)"); print_utf8(" utf8japan", utf8japan); print_utf8(" utf8dest", utf8dest); errors ++; } else puts("PASS"); #endif /* !__linux */ /* * Test UTF-8 to/from legacy charset (Windows 950)... */ 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); strlcpy(legsrc, legdest, sizeof(legsrc)); len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_WINDOWS_950); if ((size_t)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, (size_t)len)) { puts("FAIL (results do not match)"); print_utf8(" utf8taiwan", utf8taiwan); print_utf8(" utf8dest", utf8dest); errors ++; } else puts("PASS"); /* * Test UTF-8 to/from legacy charset (EUC-TW)... */ 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); strlcpy(legsrc, legdest, sizeof(legsrc)); len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_EUC_TW); if ((size_t)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, (size_t)len)) { puts("FAIL (results do not match)"); print_utf8(" utf8taiwan", utf8taiwan); print_utf8(" utf8dest", utf8dest); errors ++; } else puts("PASS"); #if 0 /* * Test UTF-8 (16-bit) to UTF-32 (w/ BOM)... */ 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); /* * Test invalid UTF-8 (16-bit) to UTF-32 (w/ BOM)... */ 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); /* * Test _cupsCharmapFlush()... */ if (verbose) printf("\ntesti18n: Testing _cupsCharmapFlush()...\n"); _cupsCharmapFlush(); return (0); #endif /* 0 */ return (errors > 0); }