xref: /aosp_15_r20/external/libcups/ppdc/ppdhtml.cxx (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker //
2*5e7646d2SAndroid Build Coastguard Worker // PPD to HTML utility 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	usage(void) _CUPS_NORETURN;
24*5e7646d2SAndroid Build Coastguard Worker 
25*5e7646d2SAndroid Build Coastguard Worker 
26*5e7646d2SAndroid Build Coastguard Worker //
27*5e7646d2SAndroid Build Coastguard Worker // 'main()' - Main entry for the PPD compiler.
28*5e7646d2SAndroid Build Coastguard Worker //
29*5e7646d2SAndroid Build Coastguard Worker 
30*5e7646d2SAndroid Build Coastguard Worker int					// O - Exit status
main(int argc,char * argv[])31*5e7646d2SAndroid Build Coastguard Worker main(int  argc,				// I - Number of command-line arguments
32*5e7646d2SAndroid Build Coastguard Worker      char *argv[])			// I - Command-line arguments
33*5e7646d2SAndroid Build Coastguard Worker {
34*5e7646d2SAndroid Build Coastguard Worker   int		i;			// Looping var
35*5e7646d2SAndroid Build Coastguard Worker   ppdcSource	*src;			// PPD source file data
36*5e7646d2SAndroid Build Coastguard Worker   ppdcDriver	*d;			// Current driver
37*5e7646d2SAndroid Build Coastguard Worker   ppdcGroup	*g,			// Current group
38*5e7646d2SAndroid Build Coastguard Worker 		*composite;		// Composite of all drivers
39*5e7646d2SAndroid Build Coastguard Worker   ppdcOption	*o,			// Current option
40*5e7646d2SAndroid Build Coastguard Worker 		*compo;			// Composite option
41*5e7646d2SAndroid Build Coastguard Worker   ppdcChoice	*c;			// Current choice
42*5e7646d2SAndroid Build Coastguard Worker   char		*opt;			// Current option char
43*5e7646d2SAndroid Build Coastguard Worker   ppdcMediaSize	*size;			// Current media size
44*5e7646d2SAndroid Build Coastguard Worker   char		*value;			// Value in option
45*5e7646d2SAndroid Build Coastguard Worker 
46*5e7646d2SAndroid Build Coastguard Worker 
47*5e7646d2SAndroid Build Coastguard Worker   _cupsSetLocale(argv);
48*5e7646d2SAndroid Build Coastguard Worker 
49*5e7646d2SAndroid Build Coastguard Worker   // Scan the command-line...
50*5e7646d2SAndroid Build Coastguard Worker   src = new ppdcSource();
51*5e7646d2SAndroid Build Coastguard Worker 
52*5e7646d2SAndroid Build Coastguard Worker   for (i = 1; i < argc; i ++)
53*5e7646d2SAndroid Build Coastguard Worker     if (argv[i][0] == '-')
54*5e7646d2SAndroid Build Coastguard Worker     {
55*5e7646d2SAndroid Build Coastguard Worker       for (opt = argv[i] + 1; *opt; opt ++)
56*5e7646d2SAndroid Build Coastguard Worker         switch (*opt)
57*5e7646d2SAndroid Build Coastguard Worker 	{
58*5e7646d2SAndroid Build Coastguard Worker           case 'D' :			// Define variable
59*5e7646d2SAndroid Build Coastguard Worker 	      i ++;
60*5e7646d2SAndroid Build Coastguard Worker 	      if (i >= argc)
61*5e7646d2SAndroid Build Coastguard Worker 	        usage();
62*5e7646d2SAndroid Build Coastguard Worker 
63*5e7646d2SAndroid Build Coastguard Worker               if ((value = strchr(argv[i], '=')) != NULL)
64*5e7646d2SAndroid Build Coastguard Worker 	      {
65*5e7646d2SAndroid Build Coastguard Worker 	        *value++ = '\0';
66*5e7646d2SAndroid Build Coastguard Worker 
67*5e7646d2SAndroid Build Coastguard Worker 	        src->set_variable(argv[i], value);
68*5e7646d2SAndroid Build Coastguard Worker 	      }
69*5e7646d2SAndroid Build Coastguard Worker 	      else
70*5e7646d2SAndroid Build Coastguard Worker 	        src->set_variable(argv[i], "1");
71*5e7646d2SAndroid Build Coastguard Worker               break;
72*5e7646d2SAndroid Build Coastguard Worker 
73*5e7646d2SAndroid Build Coastguard Worker           case 'I' :			// Include directory...
74*5e7646d2SAndroid Build Coastguard Worker 	      i ++;
75*5e7646d2SAndroid Build Coastguard Worker 	      if (i >= argc)
76*5e7646d2SAndroid Build Coastguard Worker         	usage();
77*5e7646d2SAndroid Build Coastguard Worker 
78*5e7646d2SAndroid Build Coastguard Worker 	      ppdcSource::add_include(argv[i]);
79*5e7646d2SAndroid Build Coastguard Worker 	      break;
80*5e7646d2SAndroid Build Coastguard Worker 
81*5e7646d2SAndroid Build Coastguard Worker 	  default :			// Unknown
82*5e7646d2SAndroid Build Coastguard Worker 	      usage();
83*5e7646d2SAndroid Build Coastguard Worker 	      break;
84*5e7646d2SAndroid Build Coastguard Worker 	}
85*5e7646d2SAndroid Build Coastguard Worker     }
86*5e7646d2SAndroid Build Coastguard Worker     else
87*5e7646d2SAndroid Build Coastguard Worker     {
88*5e7646d2SAndroid Build Coastguard Worker       // Open and load the driver info file...
89*5e7646d2SAndroid Build Coastguard Worker       src->read_file(argv[i]);
90*5e7646d2SAndroid Build Coastguard Worker     }
91*5e7646d2SAndroid Build Coastguard Worker 
92*5e7646d2SAndroid Build Coastguard Worker   if ((d = (ppdcDriver *)src->drivers->first()) != NULL)
93*5e7646d2SAndroid Build Coastguard Worker   {
94*5e7646d2SAndroid Build Coastguard Worker     // Create a composite group with all of the features from the
95*5e7646d2SAndroid Build Coastguard Worker     // drivers in the info file...
96*5e7646d2SAndroid Build Coastguard Worker     composite = new ppdcGroup("", "");
97*5e7646d2SAndroid Build Coastguard Worker 
98*5e7646d2SAndroid Build Coastguard Worker     while (d != NULL)
99*5e7646d2SAndroid Build Coastguard Worker     {
100*5e7646d2SAndroid Build Coastguard Worker       for (g = (ppdcGroup *)d->groups->first(); g; g = (ppdcGroup *)d->groups->next())
101*5e7646d2SAndroid Build Coastguard Worker 	for (o = (ppdcOption *)g->options->first(); o; o = (ppdcOption *)g->options->next())
102*5e7646d2SAndroid Build Coastguard Worker 	{
103*5e7646d2SAndroid Build Coastguard Worker 	  if ((compo = composite->find_option(o->name->value)) == NULL)
104*5e7646d2SAndroid Build Coastguard Worker 	    composite->add_option(new ppdcOption(o));
105*5e7646d2SAndroid Build Coastguard Worker 	}
106*5e7646d2SAndroid Build Coastguard Worker 
107*5e7646d2SAndroid Build Coastguard Worker       d = (ppdcDriver *)src->drivers->next();
108*5e7646d2SAndroid Build Coastguard Worker     }
109*5e7646d2SAndroid Build Coastguard Worker 
110*5e7646d2SAndroid Build Coastguard Worker     puts("<html>");
111*5e7646d2SAndroid Build Coastguard Worker     printf("<head><title>Driver Summary for %s</title></head>\n", argv[i]);
112*5e7646d2SAndroid Build Coastguard Worker     printf("<body><h1>Driver Summary for %s</h1>\n", argv[i]);
113*5e7646d2SAndroid Build Coastguard Worker     printf("<p><table border='1'><thead><tr><th>Printer</th><th>Media Size</th>");
114*5e7646d2SAndroid Build Coastguard Worker     for (compo = (ppdcOption *)composite->options->first(); compo; compo = (ppdcOption *)composite->options->next())
115*5e7646d2SAndroid Build Coastguard Worker       printf("<th>%s</th>", compo->text->value);
116*5e7646d2SAndroid Build Coastguard Worker     puts("</tr></thead><tbody>");
117*5e7646d2SAndroid Build Coastguard Worker 
118*5e7646d2SAndroid Build Coastguard Worker     // Write HTML summary...
119*5e7646d2SAndroid Build Coastguard Worker     for (d = (ppdcDriver *)src->drivers->first(); d; d = (ppdcDriver *)src->drivers->next())
120*5e7646d2SAndroid Build Coastguard Worker     {
121*5e7646d2SAndroid Build Coastguard Worker       // Write the summary for this driver...
122*5e7646d2SAndroid Build Coastguard Worker       printf("<tr valign='top'><td nowrap>%s</td><td nowrap>", d->model_name->value);
123*5e7646d2SAndroid Build Coastguard Worker       for (size = (ppdcMediaSize *)d->sizes->first(); size;
124*5e7646d2SAndroid Build Coastguard Worker 	   size = (ppdcMediaSize *)d->sizes->next())
125*5e7646d2SAndroid Build Coastguard Worker 	printf("%s<br>", size->text->value);
126*5e7646d2SAndroid Build Coastguard Worker       printf("</td>");
127*5e7646d2SAndroid Build Coastguard Worker 
128*5e7646d2SAndroid Build Coastguard Worker       for (compo = (ppdcOption *)composite->options->first(); compo;
129*5e7646d2SAndroid Build Coastguard Worker 	   compo = (ppdcOption *)composite->options->next())
130*5e7646d2SAndroid Build Coastguard Worker 	if ((o = d->find_option(compo->name->value)) != NULL)
131*5e7646d2SAndroid Build Coastguard Worker 	{
132*5e7646d2SAndroid Build Coastguard Worker 	  printf("<td nowrap>");
133*5e7646d2SAndroid Build Coastguard Worker 	  for (c = (ppdcChoice *)o->choices->first(); c;
134*5e7646d2SAndroid Build Coastguard Worker 	       c = (ppdcChoice *)o->choices->next())
135*5e7646d2SAndroid Build Coastguard Worker 	    printf("%s<br>", c->text->value);
136*5e7646d2SAndroid Build Coastguard Worker 	  printf("</td>");
137*5e7646d2SAndroid Build Coastguard Worker 	}
138*5e7646d2SAndroid Build Coastguard Worker 	else
139*5e7646d2SAndroid Build Coastguard Worker 	  printf("<td>N/A</td>");
140*5e7646d2SAndroid Build Coastguard Worker 
141*5e7646d2SAndroid Build Coastguard Worker       puts("</tr>");
142*5e7646d2SAndroid Build Coastguard Worker     }
143*5e7646d2SAndroid Build Coastguard Worker 
144*5e7646d2SAndroid Build Coastguard Worker     puts("</tbody></table></p>");
145*5e7646d2SAndroid Build Coastguard Worker     puts("</body>");
146*5e7646d2SAndroid Build Coastguard Worker     puts("</html>");
147*5e7646d2SAndroid Build Coastguard Worker 
148*5e7646d2SAndroid Build Coastguard Worker     // Delete the printer driver information...
149*5e7646d2SAndroid Build Coastguard Worker     composite->release();
150*5e7646d2SAndroid Build Coastguard Worker   }
151*5e7646d2SAndroid Build Coastguard Worker   else
152*5e7646d2SAndroid Build Coastguard Worker   {
153*5e7646d2SAndroid Build Coastguard Worker     // If no drivers have been loaded, display the program usage message.
154*5e7646d2SAndroid Build Coastguard Worker     usage();
155*5e7646d2SAndroid Build Coastguard Worker   }
156*5e7646d2SAndroid Build Coastguard Worker 
157*5e7646d2SAndroid Build Coastguard Worker   src->release();
158*5e7646d2SAndroid Build Coastguard Worker 
159*5e7646d2SAndroid Build Coastguard Worker   // Return with no errors.
160*5e7646d2SAndroid Build Coastguard Worker   return (0);
161*5e7646d2SAndroid Build Coastguard Worker }
162*5e7646d2SAndroid Build Coastguard Worker 
163*5e7646d2SAndroid Build Coastguard Worker 
164*5e7646d2SAndroid Build Coastguard Worker //
165*5e7646d2SAndroid Build Coastguard Worker // 'usage()' - Show usage and exit.
166*5e7646d2SAndroid Build Coastguard Worker //
167*5e7646d2SAndroid Build Coastguard Worker 
168*5e7646d2SAndroid Build Coastguard Worker static void
usage(void)169*5e7646d2SAndroid Build Coastguard Worker usage(void)
170*5e7646d2SAndroid Build Coastguard Worker {
171*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("Usage: ppdhtml [options] filename.drv "
172*5e7646d2SAndroid Build Coastguard Worker                           ">filename.html"));
173*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("Options:"));
174*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("  -D name=value           Set named variable to "
175*5e7646d2SAndroid Build Coastguard Worker                           "value."));
176*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("  -I include-dir          Add include directory "
177*5e7646d2SAndroid Build Coastguard Worker                           "to search path."));
178*5e7646d2SAndroid Build Coastguard Worker 
179*5e7646d2SAndroid Build Coastguard Worker   exit(1);
180*5e7646d2SAndroid Build Coastguard Worker }
181