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 /* ä latin1 oct 333 hex e4 dec 228 */ 50b8bc0d8aSopenharmony_ci "Hohe S\344ttigung", 51b8bc0d8aSopenharmony_ci /* ä 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 /* é latin1 oct 351 hex e9 dec 233 */ 56b8bc0d8aSopenharmony_ci "Non d\233fini", 57b8bc0d8aSopenharmony_ci /* é 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 /* ó latin1 oct hex dec 243 */ 63b8bc0d8aSopenharmony_ci "Alta saturaci\363n", 64b8bc0d8aSopenharmony_ci /* ó 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