xref: /aosp_15_r20/external/libexif/test/nls/test-codeset.c (revision 735d6239c16e246968a03ef6e2db00d67bad6cdc)
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 	  /* &auml; latin1   oct 333     hex e4    dec 228     */
50*735d6239SKiyoung Kim 	  "Hohe S\344ttigung",
51*735d6239SKiyoung Kim 	  /* &auml; 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 	  /* &eacute; latin1 oct 351     hex e9    dec 233     */
56*735d6239SKiyoung Kim 	  "Non d\233fini",
57*735d6239SKiyoung Kim 	  /* &eacute; 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 	  /* &oacute; latin1 oct hex       dec 243 */
63*735d6239SKiyoung Kim 	  "Alta saturaci\363n",
64*735d6239SKiyoung Kim 	  /* &oacute; 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