xref: /aosp_15_r20/external/libcups/cups/langprintf.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker  * Localized printf/puts functions for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker  *
4*5e7646d2SAndroid Build Coastguard Worker  * Copyright 2007-2014 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker  * Copyright 2002-2007 by Easy Software Products.
6*5e7646d2SAndroid Build Coastguard Worker  *
7*5e7646d2SAndroid Build Coastguard Worker  * Licensed under Apache License v2.0.  See the file "LICENSE" for more information.
8*5e7646d2SAndroid Build Coastguard Worker  */
9*5e7646d2SAndroid Build Coastguard Worker 
10*5e7646d2SAndroid Build Coastguard Worker /*
11*5e7646d2SAndroid Build Coastguard Worker  * Include necessary headers...
12*5e7646d2SAndroid Build Coastguard Worker  */
13*5e7646d2SAndroid Build Coastguard Worker 
14*5e7646d2SAndroid Build Coastguard Worker #include "cups-private.h"
15*5e7646d2SAndroid Build Coastguard Worker #include "debug-internal.h"
16*5e7646d2SAndroid Build Coastguard Worker 
17*5e7646d2SAndroid Build Coastguard Worker 
18*5e7646d2SAndroid Build Coastguard Worker /*
19*5e7646d2SAndroid Build Coastguard Worker  * '_cupsLangPrintError()' - Print a message followed by a standard error.
20*5e7646d2SAndroid Build Coastguard Worker  */
21*5e7646d2SAndroid Build Coastguard Worker 
22*5e7646d2SAndroid Build Coastguard Worker void
_cupsLangPrintError(const char * prefix,const char * message)23*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintError(const char *prefix,	/* I - Non-localized message prefix */
24*5e7646d2SAndroid Build Coastguard Worker                     const char *message)/* I - Message */
25*5e7646d2SAndroid Build Coastguard Worker {
26*5e7646d2SAndroid Build Coastguard Worker   ssize_t	bytes;			/* Number of bytes formatted */
27*5e7646d2SAndroid Build Coastguard Worker   int		last_errno;		/* Last error */
28*5e7646d2SAndroid Build Coastguard Worker   char		buffer[2048],		/* Message buffer */
29*5e7646d2SAndroid Build Coastguard Worker 		*bufptr,		/* Pointer into buffer */
30*5e7646d2SAndroid Build Coastguard Worker 		output[8192];		/* Output buffer */
31*5e7646d2SAndroid Build Coastguard Worker   _cups_globals_t *cg;			/* Global data */
32*5e7646d2SAndroid Build Coastguard Worker 
33*5e7646d2SAndroid Build Coastguard Worker 
34*5e7646d2SAndroid Build Coastguard Worker  /*
35*5e7646d2SAndroid Build Coastguard Worker   * Range check...
36*5e7646d2SAndroid Build Coastguard Worker   */
37*5e7646d2SAndroid Build Coastguard Worker 
38*5e7646d2SAndroid Build Coastguard Worker   if (!message)
39*5e7646d2SAndroid Build Coastguard Worker     return;
40*5e7646d2SAndroid Build Coastguard Worker 
41*5e7646d2SAndroid Build Coastguard Worker  /*
42*5e7646d2SAndroid Build Coastguard Worker   * Save the errno value...
43*5e7646d2SAndroid Build Coastguard Worker   */
44*5e7646d2SAndroid Build Coastguard Worker 
45*5e7646d2SAndroid Build Coastguard Worker   last_errno = errno;
46*5e7646d2SAndroid Build Coastguard Worker 
47*5e7646d2SAndroid Build Coastguard Worker  /*
48*5e7646d2SAndroid Build Coastguard Worker   * Get the message catalog...
49*5e7646d2SAndroid Build Coastguard Worker   */
50*5e7646d2SAndroid Build Coastguard Worker 
51*5e7646d2SAndroid Build Coastguard Worker   cg = _cupsGlobals();
52*5e7646d2SAndroid Build Coastguard Worker 
53*5e7646d2SAndroid Build Coastguard Worker   if (!cg->lang_default)
54*5e7646d2SAndroid Build Coastguard Worker     cg->lang_default = cupsLangDefault();
55*5e7646d2SAndroid Build Coastguard Worker 
56*5e7646d2SAndroid Build Coastguard Worker  /*
57*5e7646d2SAndroid Build Coastguard Worker   * Format the message...
58*5e7646d2SAndroid Build Coastguard Worker   */
59*5e7646d2SAndroid Build Coastguard Worker 
60*5e7646d2SAndroid Build Coastguard Worker   if (prefix)
61*5e7646d2SAndroid Build Coastguard Worker   {
62*5e7646d2SAndroid Build Coastguard Worker     snprintf(buffer, sizeof(buffer), "%s:", prefix);
63*5e7646d2SAndroid Build Coastguard Worker     bufptr = buffer + strlen(buffer);
64*5e7646d2SAndroid Build Coastguard Worker   }
65*5e7646d2SAndroid Build Coastguard Worker   else
66*5e7646d2SAndroid Build Coastguard Worker     bufptr = buffer;
67*5e7646d2SAndroid Build Coastguard Worker 
68*5e7646d2SAndroid Build Coastguard Worker   snprintf(bufptr, sizeof(buffer) - (size_t)(bufptr - buffer),
69*5e7646d2SAndroid Build Coastguard Worker 	   /* TRANSLATORS: Message is "subject: error" */
70*5e7646d2SAndroid Build Coastguard Worker 	   _cupsLangString(cg->lang_default, _("%s: %s")),
71*5e7646d2SAndroid Build Coastguard Worker 	   _cupsLangString(cg->lang_default, message), strerror(last_errno));
72*5e7646d2SAndroid Build Coastguard Worker   strlcat(buffer, "\n", sizeof(buffer));
73*5e7646d2SAndroid Build Coastguard Worker 
74*5e7646d2SAndroid Build Coastguard Worker  /*
75*5e7646d2SAndroid Build Coastguard Worker   * Convert and write to stderr...
76*5e7646d2SAndroid Build Coastguard Worker   */
77*5e7646d2SAndroid Build Coastguard Worker 
78*5e7646d2SAndroid Build Coastguard Worker   bytes = cupsUTF8ToCharset(output, (cups_utf8_t *)buffer, sizeof(output),
79*5e7646d2SAndroid Build Coastguard Worker                             cg->lang_default->encoding);
80*5e7646d2SAndroid Build Coastguard Worker 
81*5e7646d2SAndroid Build Coastguard Worker   if (bytes > 0)
82*5e7646d2SAndroid Build Coastguard Worker     fwrite(output, 1, (size_t)bytes, stderr);
83*5e7646d2SAndroid Build Coastguard Worker }
84*5e7646d2SAndroid Build Coastguard Worker 
85*5e7646d2SAndroid Build Coastguard Worker 
86*5e7646d2SAndroid Build Coastguard Worker /*
87*5e7646d2SAndroid Build Coastguard Worker  * '_cupsLangPrintFilter()' - Print a formatted filter message string to a file.
88*5e7646d2SAndroid Build Coastguard Worker  */
89*5e7646d2SAndroid Build Coastguard Worker 
90*5e7646d2SAndroid Build Coastguard Worker int					/* O - Number of bytes written */
_cupsLangPrintFilter(FILE * fp,const char * prefix,const char * message,...)91*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintFilter(
92*5e7646d2SAndroid Build Coastguard Worker     FILE       *fp,			/* I - File to write to */
93*5e7646d2SAndroid Build Coastguard Worker     const char *prefix,			/* I - Non-localized message prefix */
94*5e7646d2SAndroid Build Coastguard Worker     const char *message,		/* I - Message string to use */
95*5e7646d2SAndroid Build Coastguard Worker     ...)				/* I - Additional arguments as needed */
96*5e7646d2SAndroid Build Coastguard Worker {
97*5e7646d2SAndroid Build Coastguard Worker   ssize_t	bytes;			/* Number of bytes formatted */
98*5e7646d2SAndroid Build Coastguard Worker   char		temp[2048],		/* Temporary format buffer */
99*5e7646d2SAndroid Build Coastguard Worker 		buffer[2048],		/* Message buffer */
100*5e7646d2SAndroid Build Coastguard Worker 		output[8192];		/* Output buffer */
101*5e7646d2SAndroid Build Coastguard Worker   va_list 	ap;			/* Pointer to additional arguments */
102*5e7646d2SAndroid Build Coastguard Worker   _cups_globals_t *cg;			/* Global data */
103*5e7646d2SAndroid Build Coastguard Worker 
104*5e7646d2SAndroid Build Coastguard Worker 
105*5e7646d2SAndroid Build Coastguard Worker  /*
106*5e7646d2SAndroid Build Coastguard Worker   * Range check...
107*5e7646d2SAndroid Build Coastguard Worker   */
108*5e7646d2SAndroid Build Coastguard Worker 
109*5e7646d2SAndroid Build Coastguard Worker   if (!fp || !message)
110*5e7646d2SAndroid Build Coastguard Worker     return (-1);
111*5e7646d2SAndroid Build Coastguard Worker 
112*5e7646d2SAndroid Build Coastguard Worker   cg = _cupsGlobals();
113*5e7646d2SAndroid Build Coastguard Worker 
114*5e7646d2SAndroid Build Coastguard Worker   if (!cg->lang_default)
115*5e7646d2SAndroid Build Coastguard Worker     cg->lang_default = cupsLangDefault();
116*5e7646d2SAndroid Build Coastguard Worker 
117*5e7646d2SAndroid Build Coastguard Worker  /*
118*5e7646d2SAndroid Build Coastguard Worker   * Format the string...
119*5e7646d2SAndroid Build Coastguard Worker   */
120*5e7646d2SAndroid Build Coastguard Worker 
121*5e7646d2SAndroid Build Coastguard Worker   va_start(ap, message);
122*5e7646d2SAndroid Build Coastguard Worker   snprintf(temp, sizeof(temp), "%s: %s\n", prefix,
123*5e7646d2SAndroid Build Coastguard Worker 	   _cupsLangString(cg->lang_default, message));
124*5e7646d2SAndroid Build Coastguard Worker   vsnprintf(buffer, sizeof(buffer), temp, ap);
125*5e7646d2SAndroid Build Coastguard Worker   va_end(ap);
126*5e7646d2SAndroid Build Coastguard Worker 
127*5e7646d2SAndroid Build Coastguard Worker  /*
128*5e7646d2SAndroid Build Coastguard Worker   * Transcode to the destination charset...
129*5e7646d2SAndroid Build Coastguard Worker   */
130*5e7646d2SAndroid Build Coastguard Worker 
131*5e7646d2SAndroid Build Coastguard Worker   bytes = cupsUTF8ToCharset(output, (cups_utf8_t *)buffer, sizeof(output),
132*5e7646d2SAndroid Build Coastguard Worker                             cg->lang_default->encoding);
133*5e7646d2SAndroid Build Coastguard Worker 
134*5e7646d2SAndroid Build Coastguard Worker  /*
135*5e7646d2SAndroid Build Coastguard Worker   * Write the string and return the number of bytes written...
136*5e7646d2SAndroid Build Coastguard Worker   */
137*5e7646d2SAndroid Build Coastguard Worker 
138*5e7646d2SAndroid Build Coastguard Worker   if (bytes > 0)
139*5e7646d2SAndroid Build Coastguard Worker     return ((int)fwrite(output, 1, (size_t)bytes, fp));
140*5e7646d2SAndroid Build Coastguard Worker   else
141*5e7646d2SAndroid Build Coastguard Worker     return ((int)bytes);
142*5e7646d2SAndroid Build Coastguard Worker }
143*5e7646d2SAndroid Build Coastguard Worker 
144*5e7646d2SAndroid Build Coastguard Worker 
145*5e7646d2SAndroid Build Coastguard Worker /*
146*5e7646d2SAndroid Build Coastguard Worker  * '_cupsLangPrintf()' - Print a formatted message string to a file.
147*5e7646d2SAndroid Build Coastguard Worker  */
148*5e7646d2SAndroid Build Coastguard Worker 
149*5e7646d2SAndroid Build Coastguard Worker int					/* O - Number of bytes written */
_cupsLangPrintf(FILE * fp,const char * message,...)150*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(FILE       *fp,		/* I - File to write to */
151*5e7646d2SAndroid Build Coastguard Worker 		const char *message,	/* I - Message string to use */
152*5e7646d2SAndroid Build Coastguard Worker 	        ...)			/* I - Additional arguments as needed */
153*5e7646d2SAndroid Build Coastguard Worker {
154*5e7646d2SAndroid Build Coastguard Worker   ssize_t	bytes;			/* Number of bytes formatted */
155*5e7646d2SAndroid Build Coastguard Worker   char		buffer[2048],		/* Message buffer */
156*5e7646d2SAndroid Build Coastguard Worker 		output[8192];		/* Output buffer */
157*5e7646d2SAndroid Build Coastguard Worker   va_list 	ap;			/* Pointer to additional arguments */
158*5e7646d2SAndroid Build Coastguard Worker   _cups_globals_t *cg;			/* Global data */
159*5e7646d2SAndroid Build Coastguard Worker 
160*5e7646d2SAndroid Build Coastguard Worker 
161*5e7646d2SAndroid Build Coastguard Worker  /*
162*5e7646d2SAndroid Build Coastguard Worker   * Range check...
163*5e7646d2SAndroid Build Coastguard Worker   */
164*5e7646d2SAndroid Build Coastguard Worker 
165*5e7646d2SAndroid Build Coastguard Worker   if (!fp || !message)
166*5e7646d2SAndroid Build Coastguard Worker     return (-1);
167*5e7646d2SAndroid Build Coastguard Worker 
168*5e7646d2SAndroid Build Coastguard Worker   cg = _cupsGlobals();
169*5e7646d2SAndroid Build Coastguard Worker 
170*5e7646d2SAndroid Build Coastguard Worker   if (!cg->lang_default)
171*5e7646d2SAndroid Build Coastguard Worker     cg->lang_default = cupsLangDefault();
172*5e7646d2SAndroid Build Coastguard Worker 
173*5e7646d2SAndroid Build Coastguard Worker  /*
174*5e7646d2SAndroid Build Coastguard Worker   * Format the string...
175*5e7646d2SAndroid Build Coastguard Worker   */
176*5e7646d2SAndroid Build Coastguard Worker 
177*5e7646d2SAndroid Build Coastguard Worker   va_start(ap, message);
178*5e7646d2SAndroid Build Coastguard Worker   vsnprintf(buffer, sizeof(buffer) - 1,
179*5e7646d2SAndroid Build Coastguard Worker 	    _cupsLangString(cg->lang_default, message), ap);
180*5e7646d2SAndroid Build Coastguard Worker   va_end(ap);
181*5e7646d2SAndroid Build Coastguard Worker 
182*5e7646d2SAndroid Build Coastguard Worker   strlcat(buffer, "\n", sizeof(buffer));
183*5e7646d2SAndroid Build Coastguard Worker 
184*5e7646d2SAndroid Build Coastguard Worker  /*
185*5e7646d2SAndroid Build Coastguard Worker   * Transcode to the destination charset...
186*5e7646d2SAndroid Build Coastguard Worker   */
187*5e7646d2SAndroid Build Coastguard Worker 
188*5e7646d2SAndroid Build Coastguard Worker   bytes = cupsUTF8ToCharset(output, (cups_utf8_t *)buffer, sizeof(output),
189*5e7646d2SAndroid Build Coastguard Worker                             cg->lang_default->encoding);
190*5e7646d2SAndroid Build Coastguard Worker 
191*5e7646d2SAndroid Build Coastguard Worker  /*
192*5e7646d2SAndroid Build Coastguard Worker   * Write the string and return the number of bytes written...
193*5e7646d2SAndroid Build Coastguard Worker   */
194*5e7646d2SAndroid Build Coastguard Worker 
195*5e7646d2SAndroid Build Coastguard Worker   if (bytes > 0)
196*5e7646d2SAndroid Build Coastguard Worker     return ((int)fwrite(output, 1, (size_t)bytes, fp));
197*5e7646d2SAndroid Build Coastguard Worker   else
198*5e7646d2SAndroid Build Coastguard Worker     return ((int)bytes);
199*5e7646d2SAndroid Build Coastguard Worker }
200*5e7646d2SAndroid Build Coastguard Worker 
201*5e7646d2SAndroid Build Coastguard Worker 
202*5e7646d2SAndroid Build Coastguard Worker /*
203*5e7646d2SAndroid Build Coastguard Worker  * '_cupsLangPuts()' - Print a static message string to a file.
204*5e7646d2SAndroid Build Coastguard Worker  */
205*5e7646d2SAndroid Build Coastguard Worker 
206*5e7646d2SAndroid Build Coastguard Worker int					/* O - Number of bytes written */
_cupsLangPuts(FILE * fp,const char * message)207*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(FILE       *fp,		/* I - File to write to */
208*5e7646d2SAndroid Build Coastguard Worker               const char *message)	/* I - Message string to use */
209*5e7646d2SAndroid Build Coastguard Worker {
210*5e7646d2SAndroid Build Coastguard Worker   ssize_t	bytes;			/* Number of bytes formatted */
211*5e7646d2SAndroid Build Coastguard Worker   char		output[8192];		/* Message buffer */
212*5e7646d2SAndroid Build Coastguard Worker   _cups_globals_t *cg;			/* Global data */
213*5e7646d2SAndroid Build Coastguard Worker 
214*5e7646d2SAndroid Build Coastguard Worker 
215*5e7646d2SAndroid Build Coastguard Worker  /*
216*5e7646d2SAndroid Build Coastguard Worker   * Range check...
217*5e7646d2SAndroid Build Coastguard Worker   */
218*5e7646d2SAndroid Build Coastguard Worker 
219*5e7646d2SAndroid Build Coastguard Worker   if (!fp || !message)
220*5e7646d2SAndroid Build Coastguard Worker     return (-1);
221*5e7646d2SAndroid Build Coastguard Worker 
222*5e7646d2SAndroid Build Coastguard Worker   cg = _cupsGlobals();
223*5e7646d2SAndroid Build Coastguard Worker 
224*5e7646d2SAndroid Build Coastguard Worker   if (!cg->lang_default)
225*5e7646d2SAndroid Build Coastguard Worker     cg->lang_default = cupsLangDefault();
226*5e7646d2SAndroid Build Coastguard Worker 
227*5e7646d2SAndroid Build Coastguard Worker  /*
228*5e7646d2SAndroid Build Coastguard Worker   * Transcode to the destination charset...
229*5e7646d2SAndroid Build Coastguard Worker   */
230*5e7646d2SAndroid Build Coastguard Worker 
231*5e7646d2SAndroid Build Coastguard Worker   bytes = cupsUTF8ToCharset(output,
232*5e7646d2SAndroid Build Coastguard Worker 			    (cups_utf8_t *)_cupsLangString(cg->lang_default,
233*5e7646d2SAndroid Build Coastguard Worker 							   message),
234*5e7646d2SAndroid Build Coastguard Worker 			    sizeof(output) - 4, cg->lang_default->encoding);
235*5e7646d2SAndroid Build Coastguard Worker   bytes += cupsUTF8ToCharset(output + bytes, (cups_utf8_t *)"\n", (int)(sizeof(output) - (size_t)bytes), cg->lang_default->encoding);
236*5e7646d2SAndroid Build Coastguard Worker 
237*5e7646d2SAndroid Build Coastguard Worker  /*
238*5e7646d2SAndroid Build Coastguard Worker   * Write the string and return the number of bytes written...
239*5e7646d2SAndroid Build Coastguard Worker   */
240*5e7646d2SAndroid Build Coastguard Worker 
241*5e7646d2SAndroid Build Coastguard Worker   if (bytes > 0)
242*5e7646d2SAndroid Build Coastguard Worker     return ((int)fwrite(output, 1, (size_t)bytes, fp));
243*5e7646d2SAndroid Build Coastguard Worker   else
244*5e7646d2SAndroid Build Coastguard Worker     return ((int)bytes);
245*5e7646d2SAndroid Build Coastguard Worker }
246*5e7646d2SAndroid Build Coastguard Worker 
247*5e7646d2SAndroid Build Coastguard Worker 
248*5e7646d2SAndroid Build Coastguard Worker /*
249*5e7646d2SAndroid Build Coastguard Worker  * '_cupsSetLocale()' - Set the current locale and transcode the command-line.
250*5e7646d2SAndroid Build Coastguard Worker  */
251*5e7646d2SAndroid Build Coastguard Worker 
252*5e7646d2SAndroid Build Coastguard Worker void
_cupsSetLocale(char * argv[])253*5e7646d2SAndroid Build Coastguard Worker _cupsSetLocale(char *argv[])		/* IO - Command-line arguments */
254*5e7646d2SAndroid Build Coastguard Worker {
255*5e7646d2SAndroid Build Coastguard Worker   int		i;			/* Looping var */
256*5e7646d2SAndroid Build Coastguard Worker   char		buffer[8192];		/* Command-line argument buffer */
257*5e7646d2SAndroid Build Coastguard Worker   _cups_globals_t *cg;			/* Global data */
258*5e7646d2SAndroid Build Coastguard Worker #ifdef LC_TIME
259*5e7646d2SAndroid Build Coastguard Worker   const char	*lc_time;		/* Current LC_TIME value */
260*5e7646d2SAndroid Build Coastguard Worker   char		new_lc_time[255],	/* New LC_TIME value */
261*5e7646d2SAndroid Build Coastguard Worker 		*charset;		/* Pointer to character set */
262*5e7646d2SAndroid Build Coastguard Worker #endif /* LC_TIME */
263*5e7646d2SAndroid Build Coastguard Worker 
264*5e7646d2SAndroid Build Coastguard Worker 
265*5e7646d2SAndroid Build Coastguard Worker  /*
266*5e7646d2SAndroid Build Coastguard Worker   * Set the locale so that times, etc. are displayed properly.
267*5e7646d2SAndroid Build Coastguard Worker   *
268*5e7646d2SAndroid Build Coastguard Worker   * Unfortunately, while we need the localized time value, we *don't*
269*5e7646d2SAndroid Build Coastguard Worker   * want to use the localized charset for the time value, so we need
270*5e7646d2SAndroid Build Coastguard Worker   * to set LC_TIME to the locale name with .UTF-8 on the end (if
271*5e7646d2SAndroid Build Coastguard Worker   * the locale includes a character set specifier...)
272*5e7646d2SAndroid Build Coastguard Worker   */
273*5e7646d2SAndroid Build Coastguard Worker 
274*5e7646d2SAndroid Build Coastguard Worker   setlocale(LC_ALL, "");
275*5e7646d2SAndroid Build Coastguard Worker 
276*5e7646d2SAndroid Build Coastguard Worker #ifdef LC_TIME
277*5e7646d2SAndroid Build Coastguard Worker   if ((lc_time = setlocale(LC_TIME, NULL)) == NULL)
278*5e7646d2SAndroid Build Coastguard Worker     lc_time = setlocale(LC_ALL, NULL);
279*5e7646d2SAndroid Build Coastguard Worker 
280*5e7646d2SAndroid Build Coastguard Worker   if (lc_time)
281*5e7646d2SAndroid Build Coastguard Worker   {
282*5e7646d2SAndroid Build Coastguard Worker     strlcpy(new_lc_time, lc_time, sizeof(new_lc_time));
283*5e7646d2SAndroid Build Coastguard Worker     if ((charset = strchr(new_lc_time, '.')) == NULL)
284*5e7646d2SAndroid Build Coastguard Worker       charset = new_lc_time + strlen(new_lc_time);
285*5e7646d2SAndroid Build Coastguard Worker 
286*5e7646d2SAndroid Build Coastguard Worker     strlcpy(charset, ".UTF-8", sizeof(new_lc_time) - (size_t)(charset - new_lc_time));
287*5e7646d2SAndroid Build Coastguard Worker   }
288*5e7646d2SAndroid Build Coastguard Worker   else
289*5e7646d2SAndroid Build Coastguard Worker     strlcpy(new_lc_time, "C", sizeof(new_lc_time));
290*5e7646d2SAndroid Build Coastguard Worker 
291*5e7646d2SAndroid Build Coastguard Worker   setlocale(LC_TIME, new_lc_time);
292*5e7646d2SAndroid Build Coastguard Worker #endif /* LC_TIME */
293*5e7646d2SAndroid Build Coastguard Worker 
294*5e7646d2SAndroid Build Coastguard Worker  /*
295*5e7646d2SAndroid Build Coastguard Worker   * Initialize the default language info...
296*5e7646d2SAndroid Build Coastguard Worker   */
297*5e7646d2SAndroid Build Coastguard Worker 
298*5e7646d2SAndroid Build Coastguard Worker   cg = _cupsGlobals();
299*5e7646d2SAndroid Build Coastguard Worker 
300*5e7646d2SAndroid Build Coastguard Worker   if (!cg->lang_default)
301*5e7646d2SAndroid Build Coastguard Worker     cg->lang_default = cupsLangDefault();
302*5e7646d2SAndroid Build Coastguard Worker 
303*5e7646d2SAndroid Build Coastguard Worker  /*
304*5e7646d2SAndroid Build Coastguard Worker   * Transcode the command-line arguments from the locale charset to
305*5e7646d2SAndroid Build Coastguard Worker   * UTF-8...
306*5e7646d2SAndroid Build Coastguard Worker   */
307*5e7646d2SAndroid Build Coastguard Worker 
308*5e7646d2SAndroid Build Coastguard Worker   if (cg->lang_default->encoding != CUPS_US_ASCII &&
309*5e7646d2SAndroid Build Coastguard Worker       cg->lang_default->encoding != CUPS_UTF8)
310*5e7646d2SAndroid Build Coastguard Worker   {
311*5e7646d2SAndroid Build Coastguard Worker     for (i = 1; argv[i]; i ++)
312*5e7646d2SAndroid Build Coastguard Worker     {
313*5e7646d2SAndroid Build Coastguard Worker      /*
314*5e7646d2SAndroid Build Coastguard Worker       * Try converting from the locale charset to UTF-8...
315*5e7646d2SAndroid Build Coastguard Worker       */
316*5e7646d2SAndroid Build Coastguard Worker 
317*5e7646d2SAndroid Build Coastguard Worker       if (cupsCharsetToUTF8((cups_utf8_t *)buffer, argv[i], sizeof(buffer),
318*5e7646d2SAndroid Build Coastguard Worker                             cg->lang_default->encoding) < 0)
319*5e7646d2SAndroid Build Coastguard Worker         continue;
320*5e7646d2SAndroid Build Coastguard Worker 
321*5e7646d2SAndroid Build Coastguard Worker      /*
322*5e7646d2SAndroid Build Coastguard Worker       * Save the new string if it differs from the original...
323*5e7646d2SAndroid Build Coastguard Worker       */
324*5e7646d2SAndroid Build Coastguard Worker 
325*5e7646d2SAndroid Build Coastguard Worker       if (strcmp(buffer, argv[i]))
326*5e7646d2SAndroid Build Coastguard Worker         argv[i] = strdup(buffer);
327*5e7646d2SAndroid Build Coastguard Worker     }
328*5e7646d2SAndroid Build Coastguard Worker   }
329*5e7646d2SAndroid Build Coastguard Worker }
330