diff options
Diffstat (limited to 'test/nls/test-codeset.c')
-rw-r--r-- | test/nls/test-codeset.c | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/test/nls/test-codeset.c b/test/nls/test-codeset.c new file mode 100644 index 0000000..fa47f79 --- /dev/null +++ b/test/nls/test-codeset.c @@ -0,0 +1,209 @@ +#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: + */ |