xref: /aosp_15_r20/external/libcups/ppdc/genstrings.cxx (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker //
2*5e7646d2SAndroid Build Coastguard Worker // GNU gettext message generator for the CUPS PPD Compiler.
3*5e7646d2SAndroid Build Coastguard Worker //
4*5e7646d2SAndroid Build Coastguard Worker // This program is used to generate a dummy source file containing all of
5*5e7646d2SAndroid Build Coastguard Worker // the standard media and sample driver strings.  The results are picked up
6*5e7646d2SAndroid Build Coastguard Worker // by GNU gettext and placed in the CUPS message catalog.
7*5e7646d2SAndroid Build Coastguard Worker //
8*5e7646d2SAndroid Build Coastguard Worker // Copyright 2008-2014 by Apple Inc.
9*5e7646d2SAndroid Build Coastguard Worker //
10*5e7646d2SAndroid Build Coastguard Worker // Licensed under Apache License v2.0.  See the file "LICENSE" for more information.
11*5e7646d2SAndroid Build Coastguard Worker //
12*5e7646d2SAndroid Build Coastguard Worker // Usage:
13*5e7646d2SAndroid Build Coastguard Worker //
14*5e7646d2SAndroid Build Coastguard Worker //   ./genstrings >sample.c
15*5e7646d2SAndroid Build Coastguard Worker //
16*5e7646d2SAndroid Build Coastguard Worker 
17*5e7646d2SAndroid Build Coastguard Worker //
18*5e7646d2SAndroid Build Coastguard Worker // Include necessary headers...
19*5e7646d2SAndroid Build Coastguard Worker //
20*5e7646d2SAndroid Build Coastguard Worker 
21*5e7646d2SAndroid Build Coastguard Worker #include "ppdc-private.h"
22*5e7646d2SAndroid Build Coastguard Worker #include <unistd.h>
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 void	add_ui_strings(ppdcDriver *d, ppdcCatalog *catalog);
30*5e7646d2SAndroid Build Coastguard Worker static void	write_cstring(const char *s);
31*5e7646d2SAndroid Build Coastguard Worker 
32*5e7646d2SAndroid Build Coastguard Worker 
33*5e7646d2SAndroid Build Coastguard Worker //
34*5e7646d2SAndroid Build Coastguard Worker // 'main()' - Main entry for the PPD compiler.
35*5e7646d2SAndroid Build Coastguard Worker //
36*5e7646d2SAndroid Build Coastguard Worker 
37*5e7646d2SAndroid Build Coastguard Worker int					// O - Exit status
main(void)38*5e7646d2SAndroid Build Coastguard Worker main(void)
39*5e7646d2SAndroid Build Coastguard Worker {
40*5e7646d2SAndroid Build Coastguard Worker   ppdcSource	*src;			// PPD source file data
41*5e7646d2SAndroid Build Coastguard Worker   ppdcCatalog	*catalog;		// Catalog to hold all of the UI strings
42*5e7646d2SAndroid Build Coastguard Worker 
43*5e7646d2SAndroid Build Coastguard Worker 
44*5e7646d2SAndroid Build Coastguard Worker   // Make sure we are in the right place...
45*5e7646d2SAndroid Build Coastguard Worker   if (access("../data", 0) || access("sample.drv", 0))
46*5e7646d2SAndroid Build Coastguard Worker   {
47*5e7646d2SAndroid Build Coastguard Worker     puts("You must run genstrings from the ppdc directory.");
48*5e7646d2SAndroid Build Coastguard Worker     return (1);
49*5e7646d2SAndroid Build Coastguard Worker   }
50*5e7646d2SAndroid Build Coastguard Worker 
51*5e7646d2SAndroid Build Coastguard Worker   // Load the sample drivers...
52*5e7646d2SAndroid Build Coastguard Worker   ppdcSource::add_include("../data");
53*5e7646d2SAndroid Build Coastguard Worker 
54*5e7646d2SAndroid Build Coastguard Worker   src     = new ppdcSource("sample.drv");
55*5e7646d2SAndroid Build Coastguard Worker   catalog = new ppdcCatalog(NULL);
56*5e7646d2SAndroid Build Coastguard Worker 
57*5e7646d2SAndroid Build Coastguard Worker   catalog->add_message("ISOLatin1");
58*5e7646d2SAndroid Build Coastguard Worker   catalog->add_message("English");
59*5e7646d2SAndroid Build Coastguard Worker 
60*5e7646d2SAndroid Build Coastguard Worker   // Add the media size strings...
61*5e7646d2SAndroid Build Coastguard Worker   ppdcMediaSize	*size;			// Current media size
62*5e7646d2SAndroid Build Coastguard Worker 
63*5e7646d2SAndroid Build Coastguard Worker   for (size = (ppdcMediaSize *)src->sizes->first();
64*5e7646d2SAndroid Build Coastguard Worker        size;
65*5e7646d2SAndroid Build Coastguard Worker        size = (ppdcMediaSize *)src->sizes->next())
66*5e7646d2SAndroid Build Coastguard Worker     catalog->add_message(size->text->value);
67*5e7646d2SAndroid Build Coastguard Worker 
68*5e7646d2SAndroid Build Coastguard Worker   // Then collect all of the UI strings from the sample drivers...
69*5e7646d2SAndroid Build Coastguard Worker   ppdcDriver	*d;			// Current driver
70*5e7646d2SAndroid Build Coastguard Worker 
71*5e7646d2SAndroid Build Coastguard Worker   for (d = (ppdcDriver *)src->drivers->first();
72*5e7646d2SAndroid Build Coastguard Worker        d;
73*5e7646d2SAndroid Build Coastguard Worker        d = (ppdcDriver *)src->drivers->next())
74*5e7646d2SAndroid Build Coastguard Worker     add_ui_strings(d, catalog);
75*5e7646d2SAndroid Build Coastguard Worker 
76*5e7646d2SAndroid Build Coastguard Worker   // Finally, write all of the strings...
77*5e7646d2SAndroid Build Coastguard Worker   ppdcMessage *message;
78*5e7646d2SAndroid Build Coastguard Worker 
79*5e7646d2SAndroid Build Coastguard Worker   for (message = (ppdcMessage *)catalog->messages->first();
80*5e7646d2SAndroid Build Coastguard Worker        message;
81*5e7646d2SAndroid Build Coastguard Worker        message = (ppdcMessage *)catalog->messages->next())
82*5e7646d2SAndroid Build Coastguard Worker     write_cstring(message->id->value);
83*5e7646d2SAndroid Build Coastguard Worker 
84*5e7646d2SAndroid Build Coastguard Worker   src->release();
85*5e7646d2SAndroid Build Coastguard Worker   catalog->release();
86*5e7646d2SAndroid Build Coastguard Worker 
87*5e7646d2SAndroid Build Coastguard Worker   // Return with no errors.
88*5e7646d2SAndroid Build Coastguard Worker   return (0);
89*5e7646d2SAndroid Build Coastguard Worker }
90*5e7646d2SAndroid Build Coastguard Worker 
91*5e7646d2SAndroid Build Coastguard Worker 
92*5e7646d2SAndroid Build Coastguard Worker //
93*5e7646d2SAndroid Build Coastguard Worker // 'add_ui_strings()' - Add all UI strings from the driver.
94*5e7646d2SAndroid Build Coastguard Worker //
95*5e7646d2SAndroid Build Coastguard Worker 
96*5e7646d2SAndroid Build Coastguard Worker static void
add_ui_strings(ppdcDriver * d,ppdcCatalog * catalog)97*5e7646d2SAndroid Build Coastguard Worker add_ui_strings(ppdcDriver  *d,		// I - Driver data
98*5e7646d2SAndroid Build Coastguard Worker                ppdcCatalog *catalog)	// I - Message catalog
99*5e7646d2SAndroid Build Coastguard Worker {
100*5e7646d2SAndroid Build Coastguard Worker   // Add the make/model/language strings...
101*5e7646d2SAndroid Build Coastguard Worker   catalog->add_message(d->manufacturer->value);
102*5e7646d2SAndroid Build Coastguard Worker   catalog->add_message(d->model_name->value);
103*5e7646d2SAndroid Build Coastguard Worker 
104*5e7646d2SAndroid Build Coastguard Worker   // Add the group/option/choice strings...
105*5e7646d2SAndroid Build Coastguard Worker   ppdcGroup	*g;			// Current group
106*5e7646d2SAndroid Build Coastguard Worker   ppdcOption	*o;			// Current option
107*5e7646d2SAndroid Build Coastguard Worker   ppdcChoice	*c;			// Current choice
108*5e7646d2SAndroid Build Coastguard Worker 
109*5e7646d2SAndroid Build Coastguard Worker   for (g = (ppdcGroup *)d->groups->first();
110*5e7646d2SAndroid Build Coastguard Worker        g;
111*5e7646d2SAndroid Build Coastguard Worker        g = (ppdcGroup *)d->groups->next())
112*5e7646d2SAndroid Build Coastguard Worker   {
113*5e7646d2SAndroid Build Coastguard Worker     if (!g->options->count)
114*5e7646d2SAndroid Build Coastguard Worker       continue;
115*5e7646d2SAndroid Build Coastguard Worker 
116*5e7646d2SAndroid Build Coastguard Worker     if (_cups_strcasecmp(g->name->value, "General"))
117*5e7646d2SAndroid Build Coastguard Worker       catalog->add_message(g->text->value);
118*5e7646d2SAndroid Build Coastguard Worker 
119*5e7646d2SAndroid Build Coastguard Worker     for (o = (ppdcOption *)g->options->first();
120*5e7646d2SAndroid Build Coastguard Worker          o;
121*5e7646d2SAndroid Build Coastguard Worker 	 o = (ppdcOption *)g->options->next())
122*5e7646d2SAndroid Build Coastguard Worker     {
123*5e7646d2SAndroid Build Coastguard Worker       if (!o->choices->count)
124*5e7646d2SAndroid Build Coastguard Worker         continue;
125*5e7646d2SAndroid Build Coastguard Worker 
126*5e7646d2SAndroid Build Coastguard Worker       if (o->text->value && strcmp(o->name->value, o->text->value))
127*5e7646d2SAndroid Build Coastguard Worker         catalog->add_message(o->text->value);
128*5e7646d2SAndroid Build Coastguard Worker       else
129*5e7646d2SAndroid Build Coastguard Worker         catalog->add_message(o->name->value);
130*5e7646d2SAndroid Build Coastguard Worker 
131*5e7646d2SAndroid Build Coastguard Worker       for (c = (ppdcChoice *)o->choices->first();
132*5e7646d2SAndroid Build Coastguard Worker            c;
133*5e7646d2SAndroid Build Coastguard Worker 	   c = (ppdcChoice *)o->choices->next())
134*5e7646d2SAndroid Build Coastguard Worker 	if (c->text->value && strcmp(c->name->value, c->text->value))
135*5e7646d2SAndroid Build Coastguard Worker           catalog->add_message(c->text->value);
136*5e7646d2SAndroid Build Coastguard Worker         else
137*5e7646d2SAndroid Build Coastguard Worker           catalog->add_message(c->name->value);
138*5e7646d2SAndroid Build Coastguard Worker     }
139*5e7646d2SAndroid Build Coastguard Worker   }
140*5e7646d2SAndroid Build Coastguard Worker 
141*5e7646d2SAndroid Build Coastguard Worker   // Add profile and preset strings...
142*5e7646d2SAndroid Build Coastguard Worker   ppdcAttr *a;				// Current attribute
143*5e7646d2SAndroid Build Coastguard Worker   for (a = (ppdcAttr *)d->attrs->first();
144*5e7646d2SAndroid Build Coastguard Worker        a;
145*5e7646d2SAndroid Build Coastguard Worker        a = (ppdcAttr *)d->attrs->next())
146*5e7646d2SAndroid Build Coastguard Worker   {
147*5e7646d2SAndroid Build Coastguard Worker     if (a->text->value && a->text->value[0] &&
148*5e7646d2SAndroid Build Coastguard Worker         (a->localizable ||
149*5e7646d2SAndroid Build Coastguard Worker 	 !strncmp(a->name->value, "Custom", 6) ||
150*5e7646d2SAndroid Build Coastguard Worker          !strncmp(a->name->value, "ParamCustom", 11) ||
151*5e7646d2SAndroid Build Coastguard Worker          !strcmp(a->name->value, "APCustomColorMatchingName") ||
152*5e7646d2SAndroid Build Coastguard Worker          !strcmp(a->name->value, "APPrinterPreset") ||
153*5e7646d2SAndroid Build Coastguard Worker          !strcmp(a->name->value, "cupsICCProfile") ||
154*5e7646d2SAndroid Build Coastguard Worker          !strcmp(a->name->value, "cupsIPPReason") ||
155*5e7646d2SAndroid Build Coastguard Worker          !strcmp(a->name->value, "cupsMarkerName")))
156*5e7646d2SAndroid Build Coastguard Worker     {
157*5e7646d2SAndroid Build Coastguard Worker       catalog->add_message(a->text->value);
158*5e7646d2SAndroid Build Coastguard Worker 
159*5e7646d2SAndroid Build Coastguard Worker       if ((a->localizable && a->value->value[0]) ||
160*5e7646d2SAndroid Build Coastguard Worker           !strcmp(a->name->value, "cupsIPPReason"))
161*5e7646d2SAndroid Build Coastguard Worker         catalog->add_message(a->value->value);
162*5e7646d2SAndroid Build Coastguard Worker     }
163*5e7646d2SAndroid Build Coastguard Worker     else if (!strncmp(a->name->value, "Custom", 6) ||
164*5e7646d2SAndroid Build Coastguard Worker              !strncmp(a->name->value, "ParamCustom", 11))
165*5e7646d2SAndroid Build Coastguard Worker       catalog->add_message(a->name->value);
166*5e7646d2SAndroid Build Coastguard Worker   }
167*5e7646d2SAndroid Build Coastguard Worker }
168*5e7646d2SAndroid Build Coastguard Worker 
169*5e7646d2SAndroid Build Coastguard Worker 
170*5e7646d2SAndroid Build Coastguard Worker //
171*5e7646d2SAndroid Build Coastguard Worker // 'write_cstring()' - Write a translation string as a valid C string to stdout.
172*5e7646d2SAndroid Build Coastguard Worker //
173*5e7646d2SAndroid Build Coastguard Worker 
174*5e7646d2SAndroid Build Coastguard Worker static void
write_cstring(const char * s)175*5e7646d2SAndroid Build Coastguard Worker write_cstring(const char *s)		/* I - String to write */
176*5e7646d2SAndroid Build Coastguard Worker {
177*5e7646d2SAndroid Build Coastguard Worker   fputs("_(\"", stdout);
178*5e7646d2SAndroid Build Coastguard Worker   if (s)
179*5e7646d2SAndroid Build Coastguard Worker   {
180*5e7646d2SAndroid Build Coastguard Worker     while (*s)
181*5e7646d2SAndroid Build Coastguard Worker     {
182*5e7646d2SAndroid Build Coastguard Worker       if (*s == '\\')
183*5e7646d2SAndroid Build Coastguard Worker         fputs("\\\\", stdout);
184*5e7646d2SAndroid Build Coastguard Worker       else if (*s == '\"')
185*5e7646d2SAndroid Build Coastguard Worker         fputs("\\\"", stdout);
186*5e7646d2SAndroid Build Coastguard Worker       else if (*s == '\t')
187*5e7646d2SAndroid Build Coastguard Worker         fputs("\\t", stdout);
188*5e7646d2SAndroid Build Coastguard Worker       else if (*s == '\n')
189*5e7646d2SAndroid Build Coastguard Worker         fputs("\\n", stdout);
190*5e7646d2SAndroid Build Coastguard Worker       else
191*5e7646d2SAndroid Build Coastguard Worker         putchar(*s);
192*5e7646d2SAndroid Build Coastguard Worker 
193*5e7646d2SAndroid Build Coastguard Worker       s ++;
194*5e7646d2SAndroid Build Coastguard Worker     }
195*5e7646d2SAndroid Build Coastguard Worker   }
196*5e7646d2SAndroid Build Coastguard Worker   puts("\");");
197*5e7646d2SAndroid Build Coastguard Worker }
198