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