xref: /aosp_15_r20/external/libcups/ppdc/ppdpo.cxx (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker //
2*5e7646d2SAndroid Build Coastguard Worker // PPD file message catalog program for the CUPS PPD Compiler.
3*5e7646d2SAndroid Build Coastguard Worker //
4*5e7646d2SAndroid Build Coastguard Worker // Copyright 2007-2015 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker // Copyright 2002-2005 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 "ppdc-private.h"
15*5e7646d2SAndroid Build Coastguard Worker #include <sys/stat.h>
16*5e7646d2SAndroid Build Coastguard Worker #include <sys/types.h>
17*5e7646d2SAndroid Build Coastguard Worker 
18*5e7646d2SAndroid Build Coastguard Worker 
19*5e7646d2SAndroid Build Coastguard Worker //
20*5e7646d2SAndroid Build Coastguard Worker // Local functions...
21*5e7646d2SAndroid Build Coastguard Worker //
22*5e7646d2SAndroid Build Coastguard Worker 
23*5e7646d2SAndroid Build Coastguard Worker static void	add_ui_strings(ppdcDriver *d, ppdcCatalog *catalog);
24*5e7646d2SAndroid Build Coastguard Worker static void	usage(void) _CUPS_NORETURN;
25*5e7646d2SAndroid Build Coastguard Worker 
26*5e7646d2SAndroid Build Coastguard Worker 
27*5e7646d2SAndroid Build Coastguard Worker //
28*5e7646d2SAndroid Build Coastguard Worker // 'main()' - Main entry for the PPD compiler.
29*5e7646d2SAndroid Build Coastguard Worker //
30*5e7646d2SAndroid Build Coastguard Worker 
31*5e7646d2SAndroid Build Coastguard Worker int					// O - Exit status
main(int argc,char * argv[])32*5e7646d2SAndroid Build Coastguard Worker main(int  argc,				// I - Number of command-line arguments
33*5e7646d2SAndroid Build Coastguard Worker      char *argv[])			// I - Command-line arguments
34*5e7646d2SAndroid Build Coastguard Worker {
35*5e7646d2SAndroid Build Coastguard Worker   int		i;			// Looping var
36*5e7646d2SAndroid Build Coastguard Worker   ppdcCatalog	*catalog;		// Message catalog
37*5e7646d2SAndroid Build Coastguard Worker   ppdcSource	*src;			// PPD source file data
38*5e7646d2SAndroid Build Coastguard Worker   ppdcDriver	*d;			// Current driver
39*5e7646d2SAndroid Build Coastguard Worker   char		*opt;			// Current option
40*5e7646d2SAndroid Build Coastguard Worker   int		verbose;		// Verbosity
41*5e7646d2SAndroid Build Coastguard Worker   const char	*outfile;		// Output file
42*5e7646d2SAndroid Build Coastguard Worker   char		*value;			// Value in option
43*5e7646d2SAndroid Build Coastguard Worker 
44*5e7646d2SAndroid Build Coastguard Worker 
45*5e7646d2SAndroid Build Coastguard Worker   _cupsSetLocale(argv);
46*5e7646d2SAndroid Build Coastguard Worker 
47*5e7646d2SAndroid Build Coastguard Worker   // Scan the command-line...
48*5e7646d2SAndroid Build Coastguard Worker   catalog = new ppdcCatalog("en");
49*5e7646d2SAndroid Build Coastguard Worker   src     = new ppdcSource();
50*5e7646d2SAndroid Build Coastguard Worker   verbose = 0;
51*5e7646d2SAndroid Build Coastguard Worker   outfile = 0;
52*5e7646d2SAndroid Build Coastguard Worker 
53*5e7646d2SAndroid Build Coastguard Worker   for (i = 1; i < argc; i ++)
54*5e7646d2SAndroid Build Coastguard Worker     if (argv[i][0] == '-')
55*5e7646d2SAndroid Build Coastguard Worker     {
56*5e7646d2SAndroid Build Coastguard Worker       for (opt = argv[i] + 1; *opt; opt ++)
57*5e7646d2SAndroid Build Coastguard Worker         switch (*opt)
58*5e7646d2SAndroid Build Coastguard Worker 	{
59*5e7646d2SAndroid Build Coastguard Worker           case 'D' :			// Define variable
60*5e7646d2SAndroid Build Coastguard Worker 	      i ++;
61*5e7646d2SAndroid Build Coastguard Worker 	      if (i >= argc)
62*5e7646d2SAndroid Build Coastguard Worker 	        usage();
63*5e7646d2SAndroid Build Coastguard Worker 
64*5e7646d2SAndroid Build Coastguard Worker               if ((value = strchr(argv[i], '=')) != NULL)
65*5e7646d2SAndroid Build Coastguard Worker 	      {
66*5e7646d2SAndroid Build Coastguard Worker 	        *value++ = '\0';
67*5e7646d2SAndroid Build Coastguard Worker 
68*5e7646d2SAndroid Build Coastguard Worker 	        src->set_variable(argv[i], value);
69*5e7646d2SAndroid Build Coastguard Worker 	      }
70*5e7646d2SAndroid Build Coastguard Worker 	      else
71*5e7646d2SAndroid Build Coastguard Worker 	        src->set_variable(argv[i], "1");
72*5e7646d2SAndroid Build Coastguard Worker               break;
73*5e7646d2SAndroid Build Coastguard Worker 
74*5e7646d2SAndroid Build Coastguard Worker           case 'I' :			// Include directory...
75*5e7646d2SAndroid Build Coastguard Worker 	      i ++;
76*5e7646d2SAndroid Build Coastguard Worker 	      if (i >= argc)
77*5e7646d2SAndroid Build Coastguard Worker         	usage();
78*5e7646d2SAndroid Build Coastguard Worker 
79*5e7646d2SAndroid Build Coastguard Worker               if (verbose > 1)
80*5e7646d2SAndroid Build Coastguard Worker 	        _cupsLangPrintf(stdout,
81*5e7646d2SAndroid Build Coastguard Worker 		                _("ppdc: Adding include directory \"%s\"."),
82*5e7646d2SAndroid Build Coastguard Worker 				argv[i]);
83*5e7646d2SAndroid Build Coastguard Worker 
84*5e7646d2SAndroid Build Coastguard Worker 	      ppdcSource::add_include(argv[i]);
85*5e7646d2SAndroid Build Coastguard Worker 	      break;
86*5e7646d2SAndroid Build Coastguard Worker 
87*5e7646d2SAndroid Build Coastguard Worker           case 'o' :			// Output file...
88*5e7646d2SAndroid Build Coastguard Worker 	      i ++;
89*5e7646d2SAndroid Build Coastguard Worker 	      if (i >= argc || outfile)
90*5e7646d2SAndroid Build Coastguard Worker         	usage();
91*5e7646d2SAndroid Build Coastguard Worker 
92*5e7646d2SAndroid Build Coastguard Worker               outfile = argv[i];
93*5e7646d2SAndroid Build Coastguard Worker 
94*5e7646d2SAndroid Build Coastguard Worker 	      catalog->load_messages(outfile);
95*5e7646d2SAndroid Build Coastguard Worker 	      break;
96*5e7646d2SAndroid Build Coastguard Worker 
97*5e7646d2SAndroid Build Coastguard Worker           case 'v' :			// Be verbose...
98*5e7646d2SAndroid Build Coastguard Worker 	      verbose ++;
99*5e7646d2SAndroid Build Coastguard Worker 	      break;
100*5e7646d2SAndroid Build Coastguard Worker 
101*5e7646d2SAndroid Build Coastguard Worker 	  default :			// Unknown
102*5e7646d2SAndroid Build Coastguard Worker 	      usage();
103*5e7646d2SAndroid Build Coastguard Worker 	      break;
104*5e7646d2SAndroid Build Coastguard Worker 	}
105*5e7646d2SAndroid Build Coastguard Worker     }
106*5e7646d2SAndroid Build Coastguard Worker     else
107*5e7646d2SAndroid Build Coastguard Worker     {
108*5e7646d2SAndroid Build Coastguard Worker       // Open and load the driver info file...
109*5e7646d2SAndroid Build Coastguard Worker       if (verbose > 1)
110*5e7646d2SAndroid Build Coastguard Worker         _cupsLangPrintf(stdout,
111*5e7646d2SAndroid Build Coastguard Worker 	                _("ppdc: Loading driver information file \"%s\"."),
112*5e7646d2SAndroid Build Coastguard Worker 			argv[i]);
113*5e7646d2SAndroid Build Coastguard Worker 
114*5e7646d2SAndroid Build Coastguard Worker       src->read_file(argv[i]);
115*5e7646d2SAndroid Build Coastguard Worker     }
116*5e7646d2SAndroid Build Coastguard Worker 
117*5e7646d2SAndroid Build Coastguard Worker   // If no drivers have been loaded, display the program usage message.
118*5e7646d2SAndroid Build Coastguard Worker   if ((d = (ppdcDriver *)src->drivers->first()) != NULL)
119*5e7646d2SAndroid Build Coastguard Worker   {
120*5e7646d2SAndroid Build Coastguard Worker     // Add UI strings...
121*5e7646d2SAndroid Build Coastguard Worker     while (d != NULL)
122*5e7646d2SAndroid Build Coastguard Worker     {
123*5e7646d2SAndroid Build Coastguard Worker       if (verbose)
124*5e7646d2SAndroid Build Coastguard Worker 	_cupsLangPrintf(stderr, _("ppdc: Adding/updating UI text from %s."), argv[i]);
125*5e7646d2SAndroid Build Coastguard Worker 
126*5e7646d2SAndroid Build Coastguard Worker       add_ui_strings(d, catalog);
127*5e7646d2SAndroid Build Coastguard Worker 
128*5e7646d2SAndroid Build Coastguard Worker       d = (ppdcDriver *)src->drivers->next();
129*5e7646d2SAndroid Build Coastguard Worker     }
130*5e7646d2SAndroid Build Coastguard Worker   }
131*5e7646d2SAndroid Build Coastguard Worker   else
132*5e7646d2SAndroid Build Coastguard Worker     usage();
133*5e7646d2SAndroid Build Coastguard Worker 
134*5e7646d2SAndroid Build Coastguard Worker   // Delete the printer driver information...
135*5e7646d2SAndroid Build Coastguard Worker   src->release();
136*5e7646d2SAndroid Build Coastguard Worker 
137*5e7646d2SAndroid Build Coastguard Worker   // Write the message catalog...
138*5e7646d2SAndroid Build Coastguard Worker   if (!outfile)
139*5e7646d2SAndroid Build Coastguard Worker     usage();
140*5e7646d2SAndroid Build Coastguard Worker   else
141*5e7646d2SAndroid Build Coastguard Worker     catalog->save_messages(outfile);
142*5e7646d2SAndroid Build Coastguard Worker 
143*5e7646d2SAndroid Build Coastguard Worker   catalog->release();
144*5e7646d2SAndroid Build Coastguard Worker 
145*5e7646d2SAndroid Build Coastguard Worker   // Return with no errors.
146*5e7646d2SAndroid Build Coastguard Worker   return (0);
147*5e7646d2SAndroid Build Coastguard Worker }
148*5e7646d2SAndroid Build Coastguard Worker 
149*5e7646d2SAndroid Build Coastguard Worker 
150*5e7646d2SAndroid Build Coastguard Worker //
151*5e7646d2SAndroid Build Coastguard Worker // 'add_ui_strings()' - Add all UI strings from the driver.
152*5e7646d2SAndroid Build Coastguard Worker //
153*5e7646d2SAndroid Build Coastguard Worker 
154*5e7646d2SAndroid Build Coastguard Worker static void
add_ui_strings(ppdcDriver * d,ppdcCatalog * catalog)155*5e7646d2SAndroid Build Coastguard Worker add_ui_strings(ppdcDriver  *d,		// I - Driver data
156*5e7646d2SAndroid Build Coastguard Worker                ppdcCatalog *catalog)	// I - Message catalog
157*5e7646d2SAndroid Build Coastguard Worker {
158*5e7646d2SAndroid Build Coastguard Worker   // Add the make/model/language strings...
159*5e7646d2SAndroid Build Coastguard Worker   catalog->add_message(d->manufacturer->value);
160*5e7646d2SAndroid Build Coastguard Worker   catalog->add_message(d->model_name->value);
161*5e7646d2SAndroid Build Coastguard Worker 
162*5e7646d2SAndroid Build Coastguard Worker   // Add the media size strings...
163*5e7646d2SAndroid Build Coastguard Worker   ppdcMediaSize	*m;			// Current media size
164*5e7646d2SAndroid Build Coastguard Worker 
165*5e7646d2SAndroid Build Coastguard Worker   for (m = (ppdcMediaSize *)d->sizes->first();
166*5e7646d2SAndroid Build Coastguard Worker        m;
167*5e7646d2SAndroid Build Coastguard Worker        m = (ppdcMediaSize *)d->sizes->next())
168*5e7646d2SAndroid Build Coastguard Worker     catalog->add_message(m->text->value);
169*5e7646d2SAndroid Build Coastguard Worker 
170*5e7646d2SAndroid Build Coastguard Worker   // Add the group/option/choice strings...
171*5e7646d2SAndroid Build Coastguard Worker   ppdcGroup	*g;			// Current group
172*5e7646d2SAndroid Build Coastguard Worker   ppdcOption	*o;			// Current option
173*5e7646d2SAndroid Build Coastguard Worker   ppdcChoice	*c;			// Current choice
174*5e7646d2SAndroid Build Coastguard Worker 
175*5e7646d2SAndroid Build Coastguard Worker   for (g = (ppdcGroup *)d->groups->first();
176*5e7646d2SAndroid Build Coastguard Worker        g;
177*5e7646d2SAndroid Build Coastguard Worker        g = (ppdcGroup *)d->groups->next())
178*5e7646d2SAndroid Build Coastguard Worker   {
179*5e7646d2SAndroid Build Coastguard Worker     if (!g->options->count)
180*5e7646d2SAndroid Build Coastguard Worker       continue;
181*5e7646d2SAndroid Build Coastguard Worker 
182*5e7646d2SAndroid Build Coastguard Worker     if (_cups_strcasecmp(g->name->value, "General"))
183*5e7646d2SAndroid Build Coastguard Worker       catalog->add_message(g->text->value);
184*5e7646d2SAndroid Build Coastguard Worker 
185*5e7646d2SAndroid Build Coastguard Worker     for (o = (ppdcOption *)g->options->first();
186*5e7646d2SAndroid Build Coastguard Worker          o;
187*5e7646d2SAndroid Build Coastguard Worker 	 o = (ppdcOption *)g->options->next())
188*5e7646d2SAndroid Build Coastguard Worker     {
189*5e7646d2SAndroid Build Coastguard Worker       if (!o->choices->count)
190*5e7646d2SAndroid Build Coastguard Worker         continue;
191*5e7646d2SAndroid Build Coastguard Worker 
192*5e7646d2SAndroid Build Coastguard Worker       if (o->text->value)
193*5e7646d2SAndroid Build Coastguard Worker         catalog->add_message(o->text->value);
194*5e7646d2SAndroid Build Coastguard Worker       else
195*5e7646d2SAndroid Build Coastguard Worker         catalog->add_message(o->name->value);
196*5e7646d2SAndroid Build Coastguard Worker 
197*5e7646d2SAndroid Build Coastguard Worker       for (c = (ppdcChoice *)o->choices->first();
198*5e7646d2SAndroid Build Coastguard Worker            c;
199*5e7646d2SAndroid Build Coastguard Worker 	   c = (ppdcChoice *)o->choices->next())
200*5e7646d2SAndroid Build Coastguard Worker 	if (c->text->value)
201*5e7646d2SAndroid Build Coastguard Worker           catalog->add_message(c->text->value);
202*5e7646d2SAndroid Build Coastguard Worker         else
203*5e7646d2SAndroid Build Coastguard Worker           catalog->add_message(c->name->value);
204*5e7646d2SAndroid Build Coastguard Worker     }
205*5e7646d2SAndroid Build Coastguard Worker   }
206*5e7646d2SAndroid Build Coastguard Worker 
207*5e7646d2SAndroid Build Coastguard Worker   // Add profile and preset strings...
208*5e7646d2SAndroid Build Coastguard Worker   ppdcAttr *a;				// Current attribute
209*5e7646d2SAndroid Build Coastguard Worker   for (a = (ppdcAttr *)d->attrs->first();
210*5e7646d2SAndroid Build Coastguard Worker        a;
211*5e7646d2SAndroid Build Coastguard Worker        a = (ppdcAttr *)d->attrs->next())
212*5e7646d2SAndroid Build Coastguard Worker     if (a->text->value && a->text->value[0] &&
213*5e7646d2SAndroid Build Coastguard Worker         (a->localizable ||
214*5e7646d2SAndroid Build Coastguard Worker 	 !strncmp(a->name->value, "Custom", 6) ||
215*5e7646d2SAndroid Build Coastguard Worker          !strncmp(a->name->value, "ParamCustom", 11) ||
216*5e7646d2SAndroid Build Coastguard Worker          !strcmp(a->name->value, "APCustomColorMatchingName") ||
217*5e7646d2SAndroid Build Coastguard Worker          !strcmp(a->name->value, "APPrinterPreset") ||
218*5e7646d2SAndroid Build Coastguard Worker          !strcmp(a->name->value, "cupsICCProfile") ||
219*5e7646d2SAndroid Build Coastguard Worker          !strcmp(a->name->value, "cupsIPPReason") ||
220*5e7646d2SAndroid Build Coastguard Worker          !strcmp(a->name->value, "cupsMarkerName")))
221*5e7646d2SAndroid Build Coastguard Worker     {
222*5e7646d2SAndroid Build Coastguard Worker       catalog->add_message(a->text->value);
223*5e7646d2SAndroid Build Coastguard Worker 
224*5e7646d2SAndroid Build Coastguard Worker       if ((a->localizable && a->value->value[0]) ||
225*5e7646d2SAndroid Build Coastguard Worker           !strcmp(a->name->value, "cupsIPPReason"))
226*5e7646d2SAndroid Build Coastguard Worker         catalog->add_message(a->value->value);
227*5e7646d2SAndroid Build Coastguard Worker     }
228*5e7646d2SAndroid Build Coastguard Worker     else if (!strncmp(a->name->value, "Custom", 6) ||
229*5e7646d2SAndroid Build Coastguard Worker              !strncmp(a->name->value, "ParamCustom", 11))
230*5e7646d2SAndroid Build Coastguard Worker       catalog->add_message(a->name->value);
231*5e7646d2SAndroid Build Coastguard Worker }
232*5e7646d2SAndroid Build Coastguard Worker 
233*5e7646d2SAndroid Build Coastguard Worker 
234*5e7646d2SAndroid Build Coastguard Worker //
235*5e7646d2SAndroid Build Coastguard Worker // 'usage()' - Show usage and exit.
236*5e7646d2SAndroid Build Coastguard Worker //
237*5e7646d2SAndroid Build Coastguard Worker 
238*5e7646d2SAndroid Build Coastguard Worker static void
usage(void)239*5e7646d2SAndroid Build Coastguard Worker usage(void)
240*5e7646d2SAndroid Build Coastguard Worker {
241*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("Usage: ppdpo [options] -o filename.po filename.drv "
242*5e7646d2SAndroid Build Coastguard Worker                           "[ ... filenameN.drv ]"));
243*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("Options:"));
244*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("  -D name=value           Set named variable to "
245*5e7646d2SAndroid Build Coastguard Worker                           "value."));
246*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("  -I include-dir          Add include directory to "
247*5e7646d2SAndroid Build Coastguard Worker                           "search path."));
248*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("  -v                      Be verbose."));
249*5e7646d2SAndroid Build Coastguard Worker 
250*5e7646d2SAndroid Build Coastguard Worker   exit(1);
251*5e7646d2SAndroid Build Coastguard Worker }
252