xref: /aosp_15_r20/external/libcups/cups/testlang.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker  * Localization test program for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker  *
4*5e7646d2SAndroid Build Coastguard Worker  * Usage:
5*5e7646d2SAndroid Build Coastguard Worker  *
6*5e7646d2SAndroid Build Coastguard Worker  *   ./testlang [-l locale] [-p ppd] ["String to localize"]
7*5e7646d2SAndroid Build Coastguard Worker  *
8*5e7646d2SAndroid Build Coastguard Worker  * Copyright 2007-2017 by Apple Inc.
9*5e7646d2SAndroid Build Coastguard Worker  * Copyright 1997-2006 by Easy Software Products.
10*5e7646d2SAndroid Build Coastguard Worker  *
11*5e7646d2SAndroid Build Coastguard Worker  * Licensed under Apache License v2.0.  See the file "LICENSE" for more information.
12*5e7646d2SAndroid Build Coastguard Worker  */
13*5e7646d2SAndroid Build Coastguard Worker 
14*5e7646d2SAndroid Build Coastguard Worker /*
15*5e7646d2SAndroid Build Coastguard Worker  * Include necessary headers...
16*5e7646d2SAndroid Build Coastguard Worker  */
17*5e7646d2SAndroid Build Coastguard Worker 
18*5e7646d2SAndroid Build Coastguard Worker #include "cups-private.h"
19*5e7646d2SAndroid Build Coastguard Worker #include "ppd-private.h"
20*5e7646d2SAndroid Build Coastguard Worker #ifdef __APPLE__
21*5e7646d2SAndroid Build Coastguard Worker #  include <CoreFoundation/CoreFoundation.h>
22*5e7646d2SAndroid Build Coastguard Worker #endif /* __APPLE__ */
23*5e7646d2SAndroid Build Coastguard Worker 
24*5e7646d2SAndroid Build Coastguard Worker 
25*5e7646d2SAndroid Build Coastguard Worker /*
26*5e7646d2SAndroid Build Coastguard Worker  * Local functions...
27*5e7646d2SAndroid Build Coastguard Worker  */
28*5e7646d2SAndroid Build Coastguard Worker 
29*5e7646d2SAndroid Build Coastguard Worker static int	show_ppd(const char *filename);
30*5e7646d2SAndroid Build Coastguard Worker static int	test_string(cups_lang_t *language, const char *msgid);
31*5e7646d2SAndroid Build Coastguard Worker static void	usage(void);
32*5e7646d2SAndroid Build Coastguard Worker 
33*5e7646d2SAndroid Build Coastguard Worker 
34*5e7646d2SAndroid Build Coastguard Worker /*
35*5e7646d2SAndroid Build Coastguard Worker  * 'main()' - Load the specified language and show the strings for yes and no.
36*5e7646d2SAndroid Build Coastguard Worker  */
37*5e7646d2SAndroid Build Coastguard Worker 
38*5e7646d2SAndroid Build Coastguard Worker int					/* O - Exit status */
main(int argc,char * argv[])39*5e7646d2SAndroid Build Coastguard Worker main(int  argc,				/* I - Number of command-line arguments */
40*5e7646d2SAndroid Build Coastguard Worker      char *argv[])			/* I - Command-line arguments */
41*5e7646d2SAndroid Build Coastguard Worker {
42*5e7646d2SAndroid Build Coastguard Worker   int			i;		/* Looping var */
43*5e7646d2SAndroid Build Coastguard Worker   const char		*opt;		/* Current option */
44*5e7646d2SAndroid Build Coastguard Worker   int			errors = 0;	/* Number of errors */
45*5e7646d2SAndroid Build Coastguard Worker   int			dotests = 1;	/* Do standard tests? */
46*5e7646d2SAndroid Build Coastguard Worker   cups_lang_t		*language = NULL;/* Message catalog */
47*5e7646d2SAndroid Build Coastguard Worker   cups_lang_t		*language2 = NULL;
48*5e7646d2SAndroid Build Coastguard Worker 					/* Message catalog (second time) */
49*5e7646d2SAndroid Build Coastguard Worker   struct lconv		*loc;		/* Locale data */
50*5e7646d2SAndroid Build Coastguard Worker   char			buffer[1024];	/* String buffer */
51*5e7646d2SAndroid Build Coastguard Worker   double		number;		/* Number */
52*5e7646d2SAndroid Build Coastguard Worker   static const char * const tests[] =	/* Test strings */
53*5e7646d2SAndroid Build Coastguard Worker   {
54*5e7646d2SAndroid Build Coastguard Worker     "1",
55*5e7646d2SAndroid Build Coastguard Worker     "-1",
56*5e7646d2SAndroid Build Coastguard Worker     "3",
57*5e7646d2SAndroid Build Coastguard Worker     "5.125"
58*5e7646d2SAndroid Build Coastguard Worker   };
59*5e7646d2SAndroid Build Coastguard Worker 
60*5e7646d2SAndroid Build Coastguard Worker 
61*5e7646d2SAndroid Build Coastguard Worker  /*
62*5e7646d2SAndroid Build Coastguard Worker   * Parse command-line...
63*5e7646d2SAndroid Build Coastguard Worker   */
64*5e7646d2SAndroid Build Coastguard Worker 
65*5e7646d2SAndroid Build Coastguard Worker   _cupsSetLocale(argv);
66*5e7646d2SAndroid Build Coastguard Worker 
67*5e7646d2SAndroid Build Coastguard Worker   for (i = 1; i < argc; i ++)
68*5e7646d2SAndroid Build Coastguard Worker   {
69*5e7646d2SAndroid Build Coastguard Worker     if (argv[i][0] == '-')
70*5e7646d2SAndroid Build Coastguard Worker     {
71*5e7646d2SAndroid Build Coastguard Worker       if (!strcmp(argv[i], "--help"))
72*5e7646d2SAndroid Build Coastguard Worker       {
73*5e7646d2SAndroid Build Coastguard Worker         usage();
74*5e7646d2SAndroid Build Coastguard Worker       }
75*5e7646d2SAndroid Build Coastguard Worker       else
76*5e7646d2SAndroid Build Coastguard Worker       {
77*5e7646d2SAndroid Build Coastguard Worker         for (opt = argv[i] + 1; *opt; opt ++)
78*5e7646d2SAndroid Build Coastguard Worker         {
79*5e7646d2SAndroid Build Coastguard Worker           switch (*opt)
80*5e7646d2SAndroid Build Coastguard Worker           {
81*5e7646d2SAndroid Build Coastguard Worker             case 'l' :
82*5e7646d2SAndroid Build Coastguard Worker                 i ++;
83*5e7646d2SAndroid Build Coastguard Worker                 if (i >= argc)
84*5e7646d2SAndroid Build Coastguard Worker                 {
85*5e7646d2SAndroid Build Coastguard Worker                   usage();
86*5e7646d2SAndroid Build Coastguard Worker                   return (1);
87*5e7646d2SAndroid Build Coastguard Worker                 }
88*5e7646d2SAndroid Build Coastguard Worker 
89*5e7646d2SAndroid Build Coastguard Worker 		language  = cupsLangGet(argv[i]);
90*5e7646d2SAndroid Build Coastguard Worker 		language2 = cupsLangGet(argv[i]);
91*5e7646d2SAndroid Build Coastguard Worker 
92*5e7646d2SAndroid Build Coastguard Worker 		setenv("LANG", argv[i], 1);
93*5e7646d2SAndroid Build Coastguard Worker 		setenv("SOFTWARE", "CUPS/" CUPS_SVERSION, 1);
94*5e7646d2SAndroid Build Coastguard Worker 		break;
95*5e7646d2SAndroid Build Coastguard Worker 
96*5e7646d2SAndroid Build Coastguard Worker 	    case 'p' :
97*5e7646d2SAndroid Build Coastguard Worker                 i ++;
98*5e7646d2SAndroid Build Coastguard Worker                 if (i >= argc)
99*5e7646d2SAndroid Build Coastguard Worker                 {
100*5e7646d2SAndroid Build Coastguard Worker                   usage();
101*5e7646d2SAndroid Build Coastguard Worker                   return (1);
102*5e7646d2SAndroid Build Coastguard Worker                 }
103*5e7646d2SAndroid Build Coastguard Worker 
104*5e7646d2SAndroid Build Coastguard Worker                 if (!language)
105*5e7646d2SAndroid Build Coastguard Worker                 {
106*5e7646d2SAndroid Build Coastguard Worker 		  language  = cupsLangDefault();
107*5e7646d2SAndroid Build Coastguard Worker 		  language2 = cupsLangDefault();
108*5e7646d2SAndroid Build Coastguard Worker 		}
109*5e7646d2SAndroid Build Coastguard Worker 
110*5e7646d2SAndroid Build Coastguard Worker 		dotests = 0;
111*5e7646d2SAndroid Build Coastguard Worker 		errors += show_ppd(argv[i]);
112*5e7646d2SAndroid Build Coastguard Worker                 break;
113*5e7646d2SAndroid Build Coastguard Worker 
114*5e7646d2SAndroid Build Coastguard Worker             default :
115*5e7646d2SAndroid Build Coastguard Worker                 usage();
116*5e7646d2SAndroid Build Coastguard Worker                 return (1);
117*5e7646d2SAndroid Build Coastguard Worker 	  }
118*5e7646d2SAndroid Build Coastguard Worker         }
119*5e7646d2SAndroid Build Coastguard Worker       }
120*5e7646d2SAndroid Build Coastguard Worker     }
121*5e7646d2SAndroid Build Coastguard Worker     else
122*5e7646d2SAndroid Build Coastguard Worker     {
123*5e7646d2SAndroid Build Coastguard Worker       if (!language)
124*5e7646d2SAndroid Build Coastguard Worker       {
125*5e7646d2SAndroid Build Coastguard Worker 	language  = cupsLangDefault();
126*5e7646d2SAndroid Build Coastguard Worker 	language2 = cupsLangDefault();
127*5e7646d2SAndroid Build Coastguard Worker       }
128*5e7646d2SAndroid Build Coastguard Worker 
129*5e7646d2SAndroid Build Coastguard Worker       dotests = 0;
130*5e7646d2SAndroid Build Coastguard Worker       errors += test_string(language, argv[i]);
131*5e7646d2SAndroid Build Coastguard Worker     }
132*5e7646d2SAndroid Build Coastguard Worker   }
133*5e7646d2SAndroid Build Coastguard Worker 
134*5e7646d2SAndroid Build Coastguard Worker   if (!language)
135*5e7646d2SAndroid Build Coastguard Worker   {
136*5e7646d2SAndroid Build Coastguard Worker     language  = cupsLangDefault();
137*5e7646d2SAndroid Build Coastguard Worker     language2 = cupsLangDefault();
138*5e7646d2SAndroid Build Coastguard Worker   }
139*5e7646d2SAndroid Build Coastguard Worker 
140*5e7646d2SAndroid Build Coastguard Worker   if (language != language2)
141*5e7646d2SAndroid Build Coastguard Worker   {
142*5e7646d2SAndroid Build Coastguard Worker     errors ++;
143*5e7646d2SAndroid Build Coastguard Worker 
144*5e7646d2SAndroid Build Coastguard Worker     puts("**** ERROR: Language cache did not work! ****");
145*5e7646d2SAndroid Build Coastguard Worker     puts("First result from cupsLangGet:");
146*5e7646d2SAndroid Build Coastguard Worker   }
147*5e7646d2SAndroid Build Coastguard Worker 
148*5e7646d2SAndroid Build Coastguard Worker   printf("Language = \"%s\"\n", language->language);
149*5e7646d2SAndroid Build Coastguard Worker   printf("Encoding = \"%s\"\n", _cupsEncodingName(language->encoding));
150*5e7646d2SAndroid Build Coastguard Worker 
151*5e7646d2SAndroid Build Coastguard Worker   if (dotests)
152*5e7646d2SAndroid Build Coastguard Worker   {
153*5e7646d2SAndroid Build Coastguard Worker     errors += test_string(language, "No");
154*5e7646d2SAndroid Build Coastguard Worker     errors += test_string(language, "Yes");
155*5e7646d2SAndroid Build Coastguard Worker 
156*5e7646d2SAndroid Build Coastguard Worker     if (language != language2)
157*5e7646d2SAndroid Build Coastguard Worker     {
158*5e7646d2SAndroid Build Coastguard Worker       puts("Second result from cupsLangGet:");
159*5e7646d2SAndroid Build Coastguard Worker 
160*5e7646d2SAndroid Build Coastguard Worker       printf("Language = \"%s\"\n", language2->language);
161*5e7646d2SAndroid Build Coastguard Worker       printf("Encoding = \"%s\"\n", _cupsEncodingName(language2->encoding));
162*5e7646d2SAndroid Build Coastguard Worker       printf("No       = \"%s\"\n", _cupsLangString(language2, "No"));
163*5e7646d2SAndroid Build Coastguard Worker       printf("Yes      = \"%s\"\n", _cupsLangString(language2, "Yes"));
164*5e7646d2SAndroid Build Coastguard Worker     }
165*5e7646d2SAndroid Build Coastguard Worker 
166*5e7646d2SAndroid Build Coastguard Worker     loc = localeconv();
167*5e7646d2SAndroid Build Coastguard Worker 
168*5e7646d2SAndroid Build Coastguard Worker     for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i ++)
169*5e7646d2SAndroid Build Coastguard Worker     {
170*5e7646d2SAndroid Build Coastguard Worker       number = _cupsStrScand(tests[i], NULL, loc);
171*5e7646d2SAndroid Build Coastguard Worker 
172*5e7646d2SAndroid Build Coastguard Worker       printf("_cupsStrScand(\"%s\") number=%f\n", tests[i], number);
173*5e7646d2SAndroid Build Coastguard Worker 
174*5e7646d2SAndroid Build Coastguard Worker       _cupsStrFormatd(buffer, buffer + sizeof(buffer), number, loc);
175*5e7646d2SAndroid Build Coastguard Worker 
176*5e7646d2SAndroid Build Coastguard Worker       printf("_cupsStrFormatd(%f) buffer=\"%s\"\n", number, buffer);
177*5e7646d2SAndroid Build Coastguard Worker 
178*5e7646d2SAndroid Build Coastguard Worker       if (strcmp(buffer, tests[i]))
179*5e7646d2SAndroid Build Coastguard Worker       {
180*5e7646d2SAndroid Build Coastguard Worker 	errors ++;
181*5e7646d2SAndroid Build Coastguard Worker 	puts("**** ERROR: Bad formatted number! ****");
182*5e7646d2SAndroid Build Coastguard Worker       }
183*5e7646d2SAndroid Build Coastguard Worker     }
184*5e7646d2SAndroid Build Coastguard Worker 
185*5e7646d2SAndroid Build Coastguard Worker #ifdef __APPLE__
186*5e7646d2SAndroid Build Coastguard Worker    /*
187*5e7646d2SAndroid Build Coastguard Worker     * Test all possible language IDs for compatibility with _cupsAppleLocale...
188*5e7646d2SAndroid Build Coastguard Worker     */
189*5e7646d2SAndroid Build Coastguard Worker 
190*5e7646d2SAndroid Build Coastguard Worker     CFIndex     j,                      /* Looping var */
191*5e7646d2SAndroid Build Coastguard Worker                 num_locales;            /* Number of locales */
192*5e7646d2SAndroid Build Coastguard Worker     CFArrayRef  locales;                /* Locales */
193*5e7646d2SAndroid Build Coastguard Worker     CFStringRef locale_id,              /* Current locale ID */
194*5e7646d2SAndroid Build Coastguard Worker                 language_id;            /* Current language ID */
195*5e7646d2SAndroid Build Coastguard Worker     char        locale_str[256],        /* Locale ID C string */
196*5e7646d2SAndroid Build Coastguard Worker                 language_str[256],      /* Language ID C string */
197*5e7646d2SAndroid Build Coastguard Worker                 *bufptr;                /* Pointer to ".UTF-8" in POSIX locale */
198*5e7646d2SAndroid Build Coastguard Worker     size_t      buflen;                 /* Length of POSIX locale */
199*5e7646d2SAndroid Build Coastguard Worker #  if TEST_COUNTRY_CODES
200*5e7646d2SAndroid Build Coastguard Worker     CFIndex     k,                      /* Looping var */
201*5e7646d2SAndroid Build Coastguard Worker                 num_country_codes;      /* Number of country codes */
202*5e7646d2SAndroid Build Coastguard Worker     CFArrayRef  country_codes;          /* Country codes */
203*5e7646d2SAndroid Build Coastguard Worker     CFStringRef country_code,           /* Current country code */
204*5e7646d2SAndroid Build Coastguard Worker                 temp_id;                /* Temporary language ID */
205*5e7646d2SAndroid Build Coastguard Worker     char        country_str[256];       /* Country code C string */
206*5e7646d2SAndroid Build Coastguard Worker #  endif /* TEST_COUNTRY_CODES */
207*5e7646d2SAndroid Build Coastguard Worker 
208*5e7646d2SAndroid Build Coastguard Worker     locales     = CFLocaleCopyAvailableLocaleIdentifiers();
209*5e7646d2SAndroid Build Coastguard Worker     num_locales = CFArrayGetCount(locales);
210*5e7646d2SAndroid Build Coastguard Worker 
211*5e7646d2SAndroid Build Coastguard Worker #  if TEST_COUNTRY_CODES
212*5e7646d2SAndroid Build Coastguard Worker     country_codes     = CFLocaleCopyISOCountryCodes();
213*5e7646d2SAndroid Build Coastguard Worker     num_country_codes = CFArrayGetCount(country_codes);
214*5e7646d2SAndroid Build Coastguard Worker #  endif /* TEST_COUNTRY_CODES */
215*5e7646d2SAndroid Build Coastguard Worker 
216*5e7646d2SAndroid Build Coastguard Worker     printf("%d locales are available:\n", (int)num_locales);
217*5e7646d2SAndroid Build Coastguard Worker 
218*5e7646d2SAndroid Build Coastguard Worker     for (j = 0; j < num_locales; j ++)
219*5e7646d2SAndroid Build Coastguard Worker     {
220*5e7646d2SAndroid Build Coastguard Worker       locale_id   = CFArrayGetValueAtIndex(locales, j);
221*5e7646d2SAndroid Build Coastguard Worker       language_id = CFLocaleCreateCanonicalLanguageIdentifierFromString(kCFAllocatorDefault, locale_id);
222*5e7646d2SAndroid Build Coastguard Worker 
223*5e7646d2SAndroid Build Coastguard Worker       if (!locale_id || !CFStringGetCString(locale_id, locale_str, (CFIndex)sizeof(locale_str), kCFStringEncodingASCII))
224*5e7646d2SAndroid Build Coastguard Worker       {
225*5e7646d2SAndroid Build Coastguard Worker         printf("%d: FAIL (unable to get locale ID string)\n", (int)j + 1);
226*5e7646d2SAndroid Build Coastguard Worker         errors ++;
227*5e7646d2SAndroid Build Coastguard Worker         continue;
228*5e7646d2SAndroid Build Coastguard Worker       }
229*5e7646d2SAndroid Build Coastguard Worker 
230*5e7646d2SAndroid Build Coastguard Worker       if (!language_id || !CFStringGetCString(language_id, language_str, (CFIndex)sizeof(language_str), kCFStringEncodingASCII))
231*5e7646d2SAndroid Build Coastguard Worker       {
232*5e7646d2SAndroid Build Coastguard Worker         printf("%d %s: FAIL (unable to get language ID string)\n", (int)j + 1, locale_str);
233*5e7646d2SAndroid Build Coastguard Worker         errors ++;
234*5e7646d2SAndroid Build Coastguard Worker         continue;
235*5e7646d2SAndroid Build Coastguard Worker       }
236*5e7646d2SAndroid Build Coastguard Worker 
237*5e7646d2SAndroid Build Coastguard Worker       if (!_cupsAppleLocale(language_id, buffer, sizeof(buffer)))
238*5e7646d2SAndroid Build Coastguard Worker       {
239*5e7646d2SAndroid Build Coastguard Worker         printf("%d %s(%s): FAIL (unable to convert language ID string to POSIX locale)\n", (int)j + 1, locale_str, language_str);
240*5e7646d2SAndroid Build Coastguard Worker         errors ++;
241*5e7646d2SAndroid Build Coastguard Worker         continue;
242*5e7646d2SAndroid Build Coastguard Worker       }
243*5e7646d2SAndroid Build Coastguard Worker 
244*5e7646d2SAndroid Build Coastguard Worker       if ((bufptr = strstr(buffer, ".UTF-8")) != NULL)
245*5e7646d2SAndroid Build Coastguard Worker         buflen = (size_t)(bufptr - buffer);
246*5e7646d2SAndroid Build Coastguard Worker       else
247*5e7646d2SAndroid Build Coastguard Worker         buflen = strlen(buffer);
248*5e7646d2SAndroid Build Coastguard Worker 
249*5e7646d2SAndroid Build Coastguard Worker       if ((language = cupsLangGet(buffer)) == NULL)
250*5e7646d2SAndroid Build Coastguard Worker       {
251*5e7646d2SAndroid Build Coastguard Worker         printf("%d %s(%s): FAIL (unable to load POSIX locale \"%s\")\n", (int)j + 1, locale_str, language_str, buffer);
252*5e7646d2SAndroid Build Coastguard Worker         errors ++;
253*5e7646d2SAndroid Build Coastguard Worker         continue;
254*5e7646d2SAndroid Build Coastguard Worker       }
255*5e7646d2SAndroid Build Coastguard Worker 
256*5e7646d2SAndroid Build Coastguard Worker       if (strncasecmp(language->language, buffer, buflen))
257*5e7646d2SAndroid Build Coastguard Worker       {
258*5e7646d2SAndroid Build Coastguard Worker         printf("%d %s(%s): FAIL (unable to load POSIX locale \"%s\", got \"%s\")\n", (int)j + 1, locale_str, language_str, buffer, language->language);
259*5e7646d2SAndroid Build Coastguard Worker         errors ++;
260*5e7646d2SAndroid Build Coastguard Worker         continue;
261*5e7646d2SAndroid Build Coastguard Worker       }
262*5e7646d2SAndroid Build Coastguard Worker 
263*5e7646d2SAndroid Build Coastguard Worker       printf("%d %s(%s): PASS (POSIX locale is \"%s\")\n", (int)j + 1, locale_str, language_str, buffer);
264*5e7646d2SAndroid Build Coastguard Worker     }
265*5e7646d2SAndroid Build Coastguard Worker 
266*5e7646d2SAndroid Build Coastguard Worker     CFRelease(locales);
267*5e7646d2SAndroid Build Coastguard Worker 
268*5e7646d2SAndroid Build Coastguard Worker #  if TEST_COUNTRY_CODES
269*5e7646d2SAndroid Build Coastguard Worker     CFRelease(country_codes);
270*5e7646d2SAndroid Build Coastguard Worker #  endif /* TEST_COUNTRY_CODES */
271*5e7646d2SAndroid Build Coastguard Worker #endif /* __APPLE__ */
272*5e7646d2SAndroid Build Coastguard Worker   }
273*5e7646d2SAndroid Build Coastguard Worker 
274*5e7646d2SAndroid Build Coastguard Worker   if (errors == 0 && dotests)
275*5e7646d2SAndroid Build Coastguard Worker     puts("ALL TESTS PASSED");
276*5e7646d2SAndroid Build Coastguard Worker 
277*5e7646d2SAndroid Build Coastguard Worker   return (errors > 0);
278*5e7646d2SAndroid Build Coastguard Worker }
279*5e7646d2SAndroid Build Coastguard Worker 
280*5e7646d2SAndroid Build Coastguard Worker 
281*5e7646d2SAndroid Build Coastguard Worker /*
282*5e7646d2SAndroid Build Coastguard Worker  * 'show_ppd()' - Show localized strings in a PPD file.
283*5e7646d2SAndroid Build Coastguard Worker  */
284*5e7646d2SAndroid Build Coastguard Worker 
285*5e7646d2SAndroid Build Coastguard Worker static int				/* O - Number of errors */
show_ppd(const char * filename)286*5e7646d2SAndroid Build Coastguard Worker show_ppd(const char *filename)		/* I - Filename */
287*5e7646d2SAndroid Build Coastguard Worker {
288*5e7646d2SAndroid Build Coastguard Worker   ppd_file_t	*ppd;			/* PPD file */
289*5e7646d2SAndroid Build Coastguard Worker   ppd_option_t	*option;		/* PageSize option */
290*5e7646d2SAndroid Build Coastguard Worker   ppd_choice_t	*choice;		/* PageSize/Letter choice */
291*5e7646d2SAndroid Build Coastguard Worker   char		buffer[1024];		/* String buffer */
292*5e7646d2SAndroid Build Coastguard Worker 
293*5e7646d2SAndroid Build Coastguard Worker 
294*5e7646d2SAndroid Build Coastguard Worker   if ((ppd = ppdOpenFile(filename)) == NULL)
295*5e7646d2SAndroid Build Coastguard Worker   {
296*5e7646d2SAndroid Build Coastguard Worker     printf("Unable to open PPD file \"%s\".\n", filename);
297*5e7646d2SAndroid Build Coastguard Worker     return (1);
298*5e7646d2SAndroid Build Coastguard Worker   }
299*5e7646d2SAndroid Build Coastguard Worker 
300*5e7646d2SAndroid Build Coastguard Worker   ppdLocalize(ppd);
301*5e7646d2SAndroid Build Coastguard Worker 
302*5e7646d2SAndroid Build Coastguard Worker   if ((option = ppdFindOption(ppd, "PageSize")) == NULL)
303*5e7646d2SAndroid Build Coastguard Worker   {
304*5e7646d2SAndroid Build Coastguard Worker     puts("No PageSize option.");
305*5e7646d2SAndroid Build Coastguard Worker     return (1);
306*5e7646d2SAndroid Build Coastguard Worker   }
307*5e7646d2SAndroid Build Coastguard Worker   else
308*5e7646d2SAndroid Build Coastguard Worker   {
309*5e7646d2SAndroid Build Coastguard Worker     printf("PageSize: %s\n", option->text);
310*5e7646d2SAndroid Build Coastguard Worker 
311*5e7646d2SAndroid Build Coastguard Worker     if ((choice = ppdFindChoice(option, "Letter")) == NULL)
312*5e7646d2SAndroid Build Coastguard Worker     {
313*5e7646d2SAndroid Build Coastguard Worker       puts("No Letter PageSize choice.");
314*5e7646d2SAndroid Build Coastguard Worker       return (1);
315*5e7646d2SAndroid Build Coastguard Worker     }
316*5e7646d2SAndroid Build Coastguard Worker     else
317*5e7646d2SAndroid Build Coastguard Worker     {
318*5e7646d2SAndroid Build Coastguard Worker       printf("Letter: %s\n", choice->text);
319*5e7646d2SAndroid Build Coastguard Worker     }
320*5e7646d2SAndroid Build Coastguard Worker   }
321*5e7646d2SAndroid Build Coastguard Worker 
322*5e7646d2SAndroid Build Coastguard Worker   printf("media-empty: %s\n", ppdLocalizeIPPReason(ppd, "media-empty", NULL, buffer, sizeof(buffer)));
323*5e7646d2SAndroid Build Coastguard Worker 
324*5e7646d2SAndroid Build Coastguard Worker   ppdClose(ppd);
325*5e7646d2SAndroid Build Coastguard Worker 
326*5e7646d2SAndroid Build Coastguard Worker   return (0);
327*5e7646d2SAndroid Build Coastguard Worker }
328*5e7646d2SAndroid Build Coastguard Worker 
329*5e7646d2SAndroid Build Coastguard Worker 
330*5e7646d2SAndroid Build Coastguard Worker /*
331*5e7646d2SAndroid Build Coastguard Worker  * 'test_string()' - Test the localization of a string.
332*5e7646d2SAndroid Build Coastguard Worker  */
333*5e7646d2SAndroid Build Coastguard Worker 
334*5e7646d2SAndroid Build Coastguard Worker static int                            /* O - 1 on failure, 0 on success */
test_string(cups_lang_t * language,const char * msgid)335*5e7646d2SAndroid Build Coastguard Worker test_string(cups_lang_t *language,    /* I - Language */
336*5e7646d2SAndroid Build Coastguard Worker             const char  *msgid)       /* I - Message */
337*5e7646d2SAndroid Build Coastguard Worker {
338*5e7646d2SAndroid Build Coastguard Worker   const char  *msgstr;                /* Localized string */
339*5e7646d2SAndroid Build Coastguard Worker 
340*5e7646d2SAndroid Build Coastguard Worker 
341*5e7646d2SAndroid Build Coastguard Worker  /*
342*5e7646d2SAndroid Build Coastguard Worker   * Get the localized string and then see if we got what we expected.
343*5e7646d2SAndroid Build Coastguard Worker   *
344*5e7646d2SAndroid Build Coastguard Worker   * For the POSIX locale, the string pointers should be the same.
345*5e7646d2SAndroid Build Coastguard Worker   * For any other locale, the string pointers should be different.
346*5e7646d2SAndroid Build Coastguard Worker   */
347*5e7646d2SAndroid Build Coastguard Worker 
348*5e7646d2SAndroid Build Coastguard Worker   msgstr = _cupsLangString(language, msgid);
349*5e7646d2SAndroid Build Coastguard Worker   if (strcmp(language->language, "C") && msgid == msgstr)
350*5e7646d2SAndroid Build Coastguard Worker   {
351*5e7646d2SAndroid Build Coastguard Worker     printf("%-8s = \"%s\" (FAIL - no message catalog loaded)\n", msgid, msgstr);
352*5e7646d2SAndroid Build Coastguard Worker     return (1);
353*5e7646d2SAndroid Build Coastguard Worker   }
354*5e7646d2SAndroid Build Coastguard Worker   else if (!strcmp(language->language, "C") && msgid != msgstr)
355*5e7646d2SAndroid Build Coastguard Worker   {
356*5e7646d2SAndroid Build Coastguard Worker     printf("%-8s = \"%s\" (FAIL - POSIX locale is localized)\n", msgid, msgstr);
357*5e7646d2SAndroid Build Coastguard Worker     return (1);
358*5e7646d2SAndroid Build Coastguard Worker   }
359*5e7646d2SAndroid Build Coastguard Worker 
360*5e7646d2SAndroid Build Coastguard Worker   printf("%-8s = \"%s\" (PASS)\n", msgid, msgstr);
361*5e7646d2SAndroid Build Coastguard Worker 
362*5e7646d2SAndroid Build Coastguard Worker   return (0);
363*5e7646d2SAndroid Build Coastguard Worker }
364*5e7646d2SAndroid Build Coastguard Worker 
365*5e7646d2SAndroid Build Coastguard Worker 
366*5e7646d2SAndroid Build Coastguard Worker /*
367*5e7646d2SAndroid Build Coastguard Worker  * 'usage()' - Show program usage.
368*5e7646d2SAndroid Build Coastguard Worker  */
369*5e7646d2SAndroid Build Coastguard Worker 
370*5e7646d2SAndroid Build Coastguard Worker static void
usage(void)371*5e7646d2SAndroid Build Coastguard Worker usage(void)
372*5e7646d2SAndroid Build Coastguard Worker {
373*5e7646d2SAndroid Build Coastguard Worker   puts("./testlang [-l locale] [-p ppd] [\"String to localize\"]");
374*5e7646d2SAndroid Build Coastguard Worker }
375