| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| #include <i18n.h> |
| #include <langinfo.h> |
| #include <libintl.h> |
| |
| /* return whether byte strings are equal or not. |
| * NULL strings are never equal |
| */ |
| static int my_streq(const char *va, const char *vb) { |
| const char *a = va; |
| const char *b = vb; |
| int i; |
| if ((NULL == a) || (NULL == b)) { |
| return 0; |
| } |
| for (i=0; a[i] != '\0' && b[i] != '\0'; i++) { |
| if (a[i] != b[i]) { |
| return 0; |
| } |
| } |
| return 1; |
| } |
| |
| #if defined(CODESET_UTF_8) |
| #define MY_CODESET "UTF-8" |
| #elif defined(CODESET_LATIN1) |
| #define MY_CODESET "iso-8859-1" |
| #elif defined(CODESET_DEFAULT) |
| #define MY_CODESET "default" |
| #define bind_textdomain_codeset(domain,codeset) \ |
| MY_CODESET |
| #else |
| #error Define one of the CODESET_* macros! |
| #endif |
| |
| typedef struct { |
| char *locale; |
| char *orig; |
| char *latin1; |
| char *utf8; |
| } TestCase; |
| |
| const TestCase testcases[] = { |
| { "de_DE", |
| N_("High saturation"), |
| /* ä latin1 oct 333 hex e4 dec 228 */ |
| "Hohe S\344ttigung", |
| /* ä utf-8 oct 303 244 hex c3 a4 dec 195 164 */ |
| "Hohe S\303\244ttigung" }, |
| { "fr_FR", |
| N_("Not defined"), |
| /* é latin1 oct 351 hex e9 dec 233 */ |
| "Non d\233fini", |
| /* é utf-8 oct 303 251 hex c3 dec 195 */ |
| "Non d\303\251fini" |
| }, |
| { "es_ES", |
| N_("High saturation"), |
| /* ó latin1 oct hex dec 243 */ |
| "Alta saturaci\363n", |
| /* ó utf-8 oct hex c3 b3 dec */ |
| "Alta saturaci\303\263n" |
| }, |
| { NULL, NULL, NULL, NULL } |
| }; |
| |
| |
| static int check(const int i) |
| { |
| const char *oldtextdomain = textdomain(NULL); |
| const char *newtextdomain = textdomain(GETTEXT_PACKAGE); |
| |
| const char *newcodeset = MY_CODESET; |
| const char *oldcodeset = bind_textdomain_codeset(GETTEXT_PACKAGE, NULL); |
| const char *realcodeset = bind_textdomain_codeset(GETTEXT_PACKAGE, MY_CODESET); |
| |
| const char *orig = testcases[i].orig; |
| const char *transl = gettext(testcases[i].orig); |
| const char *latin1 = testcases[i].latin1; |
| const char *utf8 = testcases[i].utf8; |
| |
| printf( |
| "Old textdomain: %s\n" |
| "New textdomain: %s\n", |
| oldtextdomain, |
| newtextdomain |
| ); |
| |
| if (NULL != oldcodeset) { |
| printf( |
| "Old codeset: \"%s\" (locale default)\n", |
| nl_langinfo(CODESET) |
| ); |
| } else { |
| printf( |
| "Old codeset: \"%s\"\n", |
| oldcodeset |
| ); |
| } |
| |
| printf( |
| "Wanted codeset: %s\n" |
| "Real codeset: %s\n", |
| newcodeset, |
| realcodeset |
| ); |
| |
| printf( |
| "Original: %s\n" |
| "Translated: %s\n" |
| "iso-8859-1: %s\n" |
| "utf-8: %s\n", |
| orig, |
| transl, |
| latin1, |
| utf8 |
| ); |
| |
| #if defined(CODESET_UTF_8) |
| return (my_streq(transl, utf8)); |
| #elif defined(CODESET_LATIN_1) |
| return (my_streq(transl, latin1)); |
| #else |
| /* make sure my_streq is used once */ |
| return (my_streq(orig, orig)); |
| #endif |
| } |
| |
| |
| static int checks() |
| { |
| int i; |
| |
| const char *localeenv = getenv("LOCALEDIR"); |
| const char *localedir = (localeenv!=NULL)?localeenv:LOCALEDIR; |
| const char *msgcatdir = bindtextdomain(GETTEXT_PACKAGE, localedir); |
| |
| /* set locale to env settings */ |
| const char *oldlocale = setlocale(LC_ALL, NULL); |
| const char *newlocale = setlocale(LC_ALL, ""); |
| |
| if (localeenv != NULL) { |
| printf("Msg catalog dir: %s (from environment variable LOCALEDIR\n", |
| msgcatdir); |
| } else { |
| printf("Msg catalog dir: %s\n", msgcatdir); |
| } |
| |
| if (newlocale == NULL) { |
| printf("Locale not available: \"%s\"\n", newlocale); |
| printf("Aborting without error.\n"); |
| return 1; |
| } |
| |
| |
| printf( |
| "Old locale: %s\n" |
| "New locale: %s\n", |
| oldlocale, |
| newlocale |
| ); |
| |
| for (i=0; testcases[i].locale != NULL; i++) { |
| const int localelen = strlen(testcases[i].locale); |
| if (strncmp(newlocale, testcases[i].locale, localelen) == 0) { |
| return check(i); |
| } |
| } |
| |
| printf("No test case found for locale: %s\n", newlocale); |
| return 1; |
| } |
| |
| |
| int main(int argc, char *argv[]) |
| { |
| if (argc > 1) { |
| if ((argc == 2) && (strcmp("--list", argv[1]) == 0)) { |
| int i; |
| for (i=0; testcases[i].locale != NULL; i++) { |
| printf("%s\n", testcases[i].locale); |
| } |
| return 0; |
| } else { |
| int i; |
| fprintf(stderr, "Illegal command line. Aborting.\n"); |
| fprintf(stderr, "argc: %03d\n", argc); |
| for (i=0; i<argc; i++) { |
| fprintf(stderr, "%03d \"%s\"\n", i, argv[i]); |
| } |
| return 1; |
| } |
| } else { |
| int ret = checks(); |
| printf("Test result: %s\n", (ret)?"success":"failure"); |
| return (ret)?0:1; |
| } |
| return -1; |
| } |
| |
| /* |
| * Local Variables: |
| * mode:c |
| * c-basic-offset: 8 |
| * End: |
| */ |