| #include <locale.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| #include "third_party/glibc_locales/common/localeinfo.h" |
| #include "third_party/glibc_locales/glibc_locales.h" |
| #include "third_party/glibc_locales/locale_archive.h" |
| |
| static int validate(const char* input, const char* expected_output) { |
| const char* archive_data = locale_archive_create()->data; |
| char* output = google_add_codeset_to_locale_name(archive_data, input); |
| |
| // Check that we got the expected result. |
| if (strcmp(output, expected_output) != 0) { |
| printf("FAIL: For '%s', expected '%s', got '%s'\n", input, expected_output, |
| output); |
| free(output); |
| return 1; |
| } |
| |
| // Check that the modified name is usable, if it's not a composite name.. |
| if (!strchr(input, ';')) { |
| google_locale_t locale; |
| locale = google_newlocale(LC_ALL_MASK, output, NULL, 0); |
| int failed_locale = (locale == NULL); |
| google_freelocale(locale); |
| |
| if (failed_locale) { |
| printf("FAIL: Can't make locale for '%s' (from '%s')\n", output, input); |
| free(output); |
| return 1; |
| } |
| } |
| |
| free(output); |
| return 0; |
| } |
| |
| static int do_test() { |
| int res = 0; |
| |
| // Validate that we just pass through things with codesets and composite |
| // names. |
| res += validate("C.utf8", "C.utf8"); |
| res += validate("C.UTF-8", "C.UTF-8"); |
| res += validate("LC_CTYPE=foo;LC_COLLATE=bar", "LC_CTYPE=foo;LC_COLLATE=bar"); |
| |
| // Validate some expected results, including names that we know changed |
| // between GRTE v4 and GRTE v5. |
| res += validate("C", "C"); |
| res += validate("POSIX", "POSIX"); |
| res += validate("ca_ES@valencia", "ca_ES.ISO-8859-15@valencia"); |
| res += validate("en_US", "en_US.ISO-8859-1"); |
| res += validate("eo", "eo.ISO-8859-3"); |
| |
| return res; |
| } |
| |
| int main() { return do_test(); } |