You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
210 lines
4.4 KiB
210 lines
4.4 KiB
#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:
|
|
*/
|