1*735d6239SKiyoung Kim #include <stdio.h>
2*735d6239SKiyoung Kim #include <stdlib.h>
3*735d6239SKiyoung Kim #include <string.h>
4*735d6239SKiyoung Kim
5*735d6239SKiyoung Kim #include <i18n.h>
6*735d6239SKiyoung Kim #include <langinfo.h>
7*735d6239SKiyoung Kim #include <libintl.h>
8*735d6239SKiyoung Kim
9*735d6239SKiyoung Kim /* return whether byte strings are equal or not.
10*735d6239SKiyoung Kim * NULL strings are never equal
11*735d6239SKiyoung Kim */
my_streq(const char * va,const char * vb)12*735d6239SKiyoung Kim static int my_streq(const char *va, const char *vb) {
13*735d6239SKiyoung Kim const char *a = va;
14*735d6239SKiyoung Kim const char *b = vb;
15*735d6239SKiyoung Kim int i;
16*735d6239SKiyoung Kim if ((NULL == a) || (NULL == b)) {
17*735d6239SKiyoung Kim return 0;
18*735d6239SKiyoung Kim }
19*735d6239SKiyoung Kim for (i=0; a[i] != '\0' && b[i] != '\0'; i++) {
20*735d6239SKiyoung Kim if (a[i] != b[i]) {
21*735d6239SKiyoung Kim return 0;
22*735d6239SKiyoung Kim }
23*735d6239SKiyoung Kim }
24*735d6239SKiyoung Kim return 1;
25*735d6239SKiyoung Kim }
26*735d6239SKiyoung Kim
27*735d6239SKiyoung Kim #if defined(CODESET_UTF_8)
28*735d6239SKiyoung Kim #define MY_CODESET "UTF-8"
29*735d6239SKiyoung Kim #elif defined(CODESET_LATIN1)
30*735d6239SKiyoung Kim #define MY_CODESET "iso-8859-1"
31*735d6239SKiyoung Kim #elif defined(CODESET_DEFAULT)
32*735d6239SKiyoung Kim #define MY_CODESET "default"
33*735d6239SKiyoung Kim #define bind_textdomain_codeset(domain,codeset) \
34*735d6239SKiyoung Kim MY_CODESET
35*735d6239SKiyoung Kim #else
36*735d6239SKiyoung Kim #error Define one of the CODESET_* macros!
37*735d6239SKiyoung Kim #endif
38*735d6239SKiyoung Kim
39*735d6239SKiyoung Kim typedef struct {
40*735d6239SKiyoung Kim char *locale;
41*735d6239SKiyoung Kim char *orig;
42*735d6239SKiyoung Kim char *latin1;
43*735d6239SKiyoung Kim char *utf8;
44*735d6239SKiyoung Kim } TestCase;
45*735d6239SKiyoung Kim
46*735d6239SKiyoung Kim const TestCase testcases[] = {
47*735d6239SKiyoung Kim { "de_DE",
48*735d6239SKiyoung Kim N_("High saturation"),
49*735d6239SKiyoung Kim /* ä latin1 oct 333 hex e4 dec 228 */
50*735d6239SKiyoung Kim "Hohe S\344ttigung",
51*735d6239SKiyoung Kim /* ä utf-8 oct 303 244 hex c3 a4 dec 195 164 */
52*735d6239SKiyoung Kim "Hohe S\303\244ttigung" },
53*735d6239SKiyoung Kim { "fr_FR",
54*735d6239SKiyoung Kim N_("Not defined"),
55*735d6239SKiyoung Kim /* é latin1 oct 351 hex e9 dec 233 */
56*735d6239SKiyoung Kim "Non d\233fini",
57*735d6239SKiyoung Kim /* é utf-8 oct 303 251 hex c3 dec 195 */
58*735d6239SKiyoung Kim "Non d\303\251fini"
59*735d6239SKiyoung Kim },
60*735d6239SKiyoung Kim { "es_ES",
61*735d6239SKiyoung Kim N_("High saturation"),
62*735d6239SKiyoung Kim /* ó latin1 oct hex dec 243 */
63*735d6239SKiyoung Kim "Alta saturaci\363n",
64*735d6239SKiyoung Kim /* ó utf-8 oct hex c3 b3 dec */
65*735d6239SKiyoung Kim "Alta saturaci\303\263n"
66*735d6239SKiyoung Kim },
67*735d6239SKiyoung Kim { NULL, NULL, NULL, NULL }
68*735d6239SKiyoung Kim };
69*735d6239SKiyoung Kim
70*735d6239SKiyoung Kim
check(const int i)71*735d6239SKiyoung Kim static int check(const int i)
72*735d6239SKiyoung Kim {
73*735d6239SKiyoung Kim const char *oldtextdomain = textdomain(NULL);
74*735d6239SKiyoung Kim const char *newtextdomain = textdomain(GETTEXT_PACKAGE);
75*735d6239SKiyoung Kim
76*735d6239SKiyoung Kim const char *newcodeset = MY_CODESET;
77*735d6239SKiyoung Kim const char *oldcodeset = bind_textdomain_codeset(GETTEXT_PACKAGE, NULL);
78*735d6239SKiyoung Kim const char *realcodeset = bind_textdomain_codeset(GETTEXT_PACKAGE, MY_CODESET);
79*735d6239SKiyoung Kim
80*735d6239SKiyoung Kim const char *orig = testcases[i].orig;
81*735d6239SKiyoung Kim const char *transl = gettext(testcases[i].orig);
82*735d6239SKiyoung Kim const char *latin1 = testcases[i].latin1;
83*735d6239SKiyoung Kim const char *utf8 = testcases[i].utf8;
84*735d6239SKiyoung Kim
85*735d6239SKiyoung Kim printf(
86*735d6239SKiyoung Kim "Old textdomain: %s\n"
87*735d6239SKiyoung Kim "New textdomain: %s\n",
88*735d6239SKiyoung Kim oldtextdomain,
89*735d6239SKiyoung Kim newtextdomain
90*735d6239SKiyoung Kim );
91*735d6239SKiyoung Kim
92*735d6239SKiyoung Kim if (NULL != oldcodeset) {
93*735d6239SKiyoung Kim printf(
94*735d6239SKiyoung Kim "Old codeset: \"%s\" (locale default)\n",
95*735d6239SKiyoung Kim nl_langinfo(CODESET)
96*735d6239SKiyoung Kim );
97*735d6239SKiyoung Kim } else {
98*735d6239SKiyoung Kim printf(
99*735d6239SKiyoung Kim "Old codeset: \"%s\"\n",
100*735d6239SKiyoung Kim oldcodeset
101*735d6239SKiyoung Kim );
102*735d6239SKiyoung Kim }
103*735d6239SKiyoung Kim
104*735d6239SKiyoung Kim printf(
105*735d6239SKiyoung Kim "Wanted codeset: %s\n"
106*735d6239SKiyoung Kim "Real codeset: %s\n",
107*735d6239SKiyoung Kim newcodeset,
108*735d6239SKiyoung Kim realcodeset
109*735d6239SKiyoung Kim );
110*735d6239SKiyoung Kim
111*735d6239SKiyoung Kim printf(
112*735d6239SKiyoung Kim "Original: %s\n"
113*735d6239SKiyoung Kim "Translated: %s\n"
114*735d6239SKiyoung Kim "iso-8859-1: %s\n"
115*735d6239SKiyoung Kim "utf-8: %s\n",
116*735d6239SKiyoung Kim orig,
117*735d6239SKiyoung Kim transl,
118*735d6239SKiyoung Kim latin1,
119*735d6239SKiyoung Kim utf8
120*735d6239SKiyoung Kim );
121*735d6239SKiyoung Kim
122*735d6239SKiyoung Kim #if defined(CODESET_UTF_8)
123*735d6239SKiyoung Kim return (my_streq(transl, utf8));
124*735d6239SKiyoung Kim #elif defined(CODESET_LATIN_1)
125*735d6239SKiyoung Kim return (my_streq(transl, latin1));
126*735d6239SKiyoung Kim #else
127*735d6239SKiyoung Kim /* make sure my_streq is used once */
128*735d6239SKiyoung Kim return (my_streq(orig, orig));
129*735d6239SKiyoung Kim #endif
130*735d6239SKiyoung Kim }
131*735d6239SKiyoung Kim
132*735d6239SKiyoung Kim
checks()133*735d6239SKiyoung Kim static int checks()
134*735d6239SKiyoung Kim {
135*735d6239SKiyoung Kim int i;
136*735d6239SKiyoung Kim
137*735d6239SKiyoung Kim const char *localeenv = getenv("LOCALEDIR");
138*735d6239SKiyoung Kim const char *localedir = (localeenv!=NULL)?localeenv:LOCALEDIR;
139*735d6239SKiyoung Kim const char *msgcatdir = bindtextdomain(GETTEXT_PACKAGE, localedir);
140*735d6239SKiyoung Kim
141*735d6239SKiyoung Kim /* set locale to env settings */
142*735d6239SKiyoung Kim const char *oldlocale = setlocale(LC_ALL, NULL);
143*735d6239SKiyoung Kim const char *newlocale = setlocale(LC_ALL, "");
144*735d6239SKiyoung Kim
145*735d6239SKiyoung Kim if (localeenv != NULL) {
146*735d6239SKiyoung Kim printf("Msg catalog dir: %s (from environment variable LOCALEDIR\n",
147*735d6239SKiyoung Kim msgcatdir);
148*735d6239SKiyoung Kim } else {
149*735d6239SKiyoung Kim printf("Msg catalog dir: %s\n", msgcatdir);
150*735d6239SKiyoung Kim }
151*735d6239SKiyoung Kim
152*735d6239SKiyoung Kim if (newlocale == NULL) {
153*735d6239SKiyoung Kim printf("Locale not available: \"%s\"\n", newlocale);
154*735d6239SKiyoung Kim printf("Aborting without error.\n");
155*735d6239SKiyoung Kim return 1;
156*735d6239SKiyoung Kim }
157*735d6239SKiyoung Kim
158*735d6239SKiyoung Kim
159*735d6239SKiyoung Kim printf(
160*735d6239SKiyoung Kim "Old locale: %s\n"
161*735d6239SKiyoung Kim "New locale: %s\n",
162*735d6239SKiyoung Kim oldlocale,
163*735d6239SKiyoung Kim newlocale
164*735d6239SKiyoung Kim );
165*735d6239SKiyoung Kim
166*735d6239SKiyoung Kim for (i=0; testcases[i].locale != NULL; i++) {
167*735d6239SKiyoung Kim const int localelen = strlen(testcases[i].locale);
168*735d6239SKiyoung Kim if (strncmp(newlocale, testcases[i].locale, localelen) == 0) {
169*735d6239SKiyoung Kim return check(i);
170*735d6239SKiyoung Kim }
171*735d6239SKiyoung Kim }
172*735d6239SKiyoung Kim
173*735d6239SKiyoung Kim printf("No test case found for locale: %s\n", newlocale);
174*735d6239SKiyoung Kim return 1;
175*735d6239SKiyoung Kim }
176*735d6239SKiyoung Kim
177*735d6239SKiyoung Kim
main(int argc,char * argv[])178*735d6239SKiyoung Kim int main(int argc, char *argv[])
179*735d6239SKiyoung Kim {
180*735d6239SKiyoung Kim if (argc > 1) {
181*735d6239SKiyoung Kim if ((argc == 2) && (strcmp("--list", argv[1]) == 0)) {
182*735d6239SKiyoung Kim int i;
183*735d6239SKiyoung Kim for (i=0; testcases[i].locale != NULL; i++) {
184*735d6239SKiyoung Kim printf("%s\n", testcases[i].locale);
185*735d6239SKiyoung Kim }
186*735d6239SKiyoung Kim return 0;
187*735d6239SKiyoung Kim } else {
188*735d6239SKiyoung Kim int i;
189*735d6239SKiyoung Kim fprintf(stderr, "Illegal command line. Aborting.\n");
190*735d6239SKiyoung Kim fprintf(stderr, "argc: %03d\n", argc);
191*735d6239SKiyoung Kim for (i=0; i<argc; i++) {
192*735d6239SKiyoung Kim fprintf(stderr, "%03d \"%s\"\n", i, argv[i]);
193*735d6239SKiyoung Kim }
194*735d6239SKiyoung Kim return 1;
195*735d6239SKiyoung Kim }
196*735d6239SKiyoung Kim } else {
197*735d6239SKiyoung Kim int ret = checks();
198*735d6239SKiyoung Kim printf("Test result: %s\n", (ret)?"success":"failure");
199*735d6239SKiyoung Kim return (ret)?0:1;
200*735d6239SKiyoung Kim }
201*735d6239SKiyoung Kim return -1;
202*735d6239SKiyoung Kim }
203*735d6239SKiyoung Kim
204*735d6239SKiyoung Kim /*
205*735d6239SKiyoung Kim * Local Variables:
206*735d6239SKiyoung Kim * mode:c
207*735d6239SKiyoung Kim * c-basic-offset: 8
208*735d6239SKiyoung Kim * End:
209*735d6239SKiyoung Kim */
210