1*5e7646d2SAndroid Build Coastguard Worker //
2*5e7646d2SAndroid Build Coastguard Worker // Source class for the CUPS PPD Compiler.
3*5e7646d2SAndroid Build Coastguard Worker //
4*5e7646d2SAndroid Build Coastguard Worker // Copyright 2007-2020 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
8*5e7646d2SAndroid Build Coastguard Worker // information.
9*5e7646d2SAndroid Build Coastguard Worker //
10*5e7646d2SAndroid Build Coastguard Worker
11*5e7646d2SAndroid Build Coastguard Worker //
12*5e7646d2SAndroid Build Coastguard Worker // Include necessary headers...
13*5e7646d2SAndroid Build Coastguard Worker //
14*5e7646d2SAndroid Build Coastguard Worker
15*5e7646d2SAndroid Build Coastguard Worker #include "ppdc-private.h"
16*5e7646d2SAndroid Build Coastguard Worker #include <limits.h>
17*5e7646d2SAndroid Build Coastguard Worker #include <math.h>
18*5e7646d2SAndroid Build Coastguard Worker #include <unistd.h>
19*5e7646d2SAndroid Build Coastguard Worker #include <cups/raster.h>
20*5e7646d2SAndroid Build Coastguard Worker #include "data/epson.h"
21*5e7646d2SAndroid Build Coastguard Worker #include "data/hp.h"
22*5e7646d2SAndroid Build Coastguard Worker #include "data/label.h"
23*5e7646d2SAndroid Build Coastguard Worker #ifndef _WIN32
24*5e7646d2SAndroid Build Coastguard Worker # include <sys/utsname.h>
25*5e7646d2SAndroid Build Coastguard Worker #endif // !_WIN32
26*5e7646d2SAndroid Build Coastguard Worker
27*5e7646d2SAndroid Build Coastguard Worker
28*5e7646d2SAndroid Build Coastguard Worker //
29*5e7646d2SAndroid Build Coastguard Worker // Class globals...
30*5e7646d2SAndroid Build Coastguard Worker //
31*5e7646d2SAndroid Build Coastguard Worker
32*5e7646d2SAndroid Build Coastguard Worker ppdcArray *ppdcSource::includes = 0;
33*5e7646d2SAndroid Build Coastguard Worker const char *ppdcSource::driver_types[] =
34*5e7646d2SAndroid Build Coastguard Worker {
35*5e7646d2SAndroid Build Coastguard Worker "custom",
36*5e7646d2SAndroid Build Coastguard Worker "ps",
37*5e7646d2SAndroid Build Coastguard Worker "escp",
38*5e7646d2SAndroid Build Coastguard Worker "pcl",
39*5e7646d2SAndroid Build Coastguard Worker "label",
40*5e7646d2SAndroid Build Coastguard Worker "epson",
41*5e7646d2SAndroid Build Coastguard Worker "hp"
42*5e7646d2SAndroid Build Coastguard Worker };
43*5e7646d2SAndroid Build Coastguard Worker
44*5e7646d2SAndroid Build Coastguard Worker
45*5e7646d2SAndroid Build Coastguard Worker //
46*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::ppdcSource()' - Load a driver source file.
47*5e7646d2SAndroid Build Coastguard Worker //
48*5e7646d2SAndroid Build Coastguard Worker
ppdcSource(const char * f,cups_file_t * ffp)49*5e7646d2SAndroid Build Coastguard Worker ppdcSource::ppdcSource(const char *f, // I - File to read
50*5e7646d2SAndroid Build Coastguard Worker cups_file_t *ffp)// I - File pointer to use
51*5e7646d2SAndroid Build Coastguard Worker : ppdcShared()
52*5e7646d2SAndroid Build Coastguard Worker {
53*5e7646d2SAndroid Build Coastguard Worker PPDC_NEW;
54*5e7646d2SAndroid Build Coastguard Worker
55*5e7646d2SAndroid Build Coastguard Worker filename = new ppdcString(f);
56*5e7646d2SAndroid Build Coastguard Worker base_fonts = new ppdcArray();
57*5e7646d2SAndroid Build Coastguard Worker drivers = new ppdcArray();
58*5e7646d2SAndroid Build Coastguard Worker po_files = new ppdcArray();
59*5e7646d2SAndroid Build Coastguard Worker sizes = new ppdcArray();
60*5e7646d2SAndroid Build Coastguard Worker vars = new ppdcArray();
61*5e7646d2SAndroid Build Coastguard Worker cond_state = PPDC_COND_NORMAL;
62*5e7646d2SAndroid Build Coastguard Worker cond_current = cond_stack;
63*5e7646d2SAndroid Build Coastguard Worker cond_stack[0] = PPDC_COND_NORMAL;
64*5e7646d2SAndroid Build Coastguard Worker
65*5e7646d2SAndroid Build Coastguard Worker // Add standard #define variables...
66*5e7646d2SAndroid Build Coastguard Worker #define MAKE_STRING(x) #x
67*5e7646d2SAndroid Build Coastguard Worker
68*5e7646d2SAndroid Build Coastguard Worker vars->add(new ppdcVariable("CUPS_VERSION", MAKE_STRING(CUPS_VERSION)));
69*5e7646d2SAndroid Build Coastguard Worker vars->add(new ppdcVariable("CUPS_VERSION_MAJOR", MAKE_STRING(CUPS_VERSION_MAJOR)));
70*5e7646d2SAndroid Build Coastguard Worker vars->add(new ppdcVariable("CUPS_VERSION_MINOR", MAKE_STRING(CUPS_VERSION_MINOR)));
71*5e7646d2SAndroid Build Coastguard Worker vars->add(new ppdcVariable("CUPS_VERSION_PATCH", MAKE_STRING(CUPS_VERSION_PATCH)));
72*5e7646d2SAndroid Build Coastguard Worker
73*5e7646d2SAndroid Build Coastguard Worker #ifdef _WIN32
74*5e7646d2SAndroid Build Coastguard Worker vars->add(new ppdcVariable("PLATFORM_NAME", "Windows"));
75*5e7646d2SAndroid Build Coastguard Worker vars->add(new ppdcVariable("PLATFORM_ARCH", "X86"));
76*5e7646d2SAndroid Build Coastguard Worker
77*5e7646d2SAndroid Build Coastguard Worker #else
78*5e7646d2SAndroid Build Coastguard Worker struct utsname name; // uname information
79*5e7646d2SAndroid Build Coastguard Worker
80*5e7646d2SAndroid Build Coastguard Worker if (!uname(&name))
81*5e7646d2SAndroid Build Coastguard Worker {
82*5e7646d2SAndroid Build Coastguard Worker vars->add(new ppdcVariable("PLATFORM_NAME", name.sysname));
83*5e7646d2SAndroid Build Coastguard Worker vars->add(new ppdcVariable("PLATFORM_ARCH", name.machine));
84*5e7646d2SAndroid Build Coastguard Worker }
85*5e7646d2SAndroid Build Coastguard Worker else
86*5e7646d2SAndroid Build Coastguard Worker {
87*5e7646d2SAndroid Build Coastguard Worker vars->add(new ppdcVariable("PLATFORM_NAME", "unknown"));
88*5e7646d2SAndroid Build Coastguard Worker vars->add(new ppdcVariable("PLATFORM_ARCH", "unknown"));
89*5e7646d2SAndroid Build Coastguard Worker }
90*5e7646d2SAndroid Build Coastguard Worker #endif // _WIN32
91*5e7646d2SAndroid Build Coastguard Worker
92*5e7646d2SAndroid Build Coastguard Worker if (f)
93*5e7646d2SAndroid Build Coastguard Worker read_file(f, ffp);
94*5e7646d2SAndroid Build Coastguard Worker }
95*5e7646d2SAndroid Build Coastguard Worker
96*5e7646d2SAndroid Build Coastguard Worker
97*5e7646d2SAndroid Build Coastguard Worker //
98*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::~ppdcSource()' - Free a driver source file.
99*5e7646d2SAndroid Build Coastguard Worker //
100*5e7646d2SAndroid Build Coastguard Worker
~ppdcSource()101*5e7646d2SAndroid Build Coastguard Worker ppdcSource::~ppdcSource()
102*5e7646d2SAndroid Build Coastguard Worker {
103*5e7646d2SAndroid Build Coastguard Worker PPDC_DELETE;
104*5e7646d2SAndroid Build Coastguard Worker
105*5e7646d2SAndroid Build Coastguard Worker filename->release();
106*5e7646d2SAndroid Build Coastguard Worker base_fonts->release();
107*5e7646d2SAndroid Build Coastguard Worker drivers->release();
108*5e7646d2SAndroid Build Coastguard Worker po_files->release();
109*5e7646d2SAndroid Build Coastguard Worker sizes->release();
110*5e7646d2SAndroid Build Coastguard Worker vars->release();
111*5e7646d2SAndroid Build Coastguard Worker }
112*5e7646d2SAndroid Build Coastguard Worker
113*5e7646d2SAndroid Build Coastguard Worker
114*5e7646d2SAndroid Build Coastguard Worker //
115*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::add_include()' - Add an include directory.
116*5e7646d2SAndroid Build Coastguard Worker //
117*5e7646d2SAndroid Build Coastguard Worker
118*5e7646d2SAndroid Build Coastguard Worker void
add_include(const char * d)119*5e7646d2SAndroid Build Coastguard Worker ppdcSource::add_include(const char *d) // I - Include directory
120*5e7646d2SAndroid Build Coastguard Worker {
121*5e7646d2SAndroid Build Coastguard Worker if (!d)
122*5e7646d2SAndroid Build Coastguard Worker return;
123*5e7646d2SAndroid Build Coastguard Worker
124*5e7646d2SAndroid Build Coastguard Worker if (!includes)
125*5e7646d2SAndroid Build Coastguard Worker includes = new ppdcArray();
126*5e7646d2SAndroid Build Coastguard Worker
127*5e7646d2SAndroid Build Coastguard Worker includes->add(new ppdcString(d));
128*5e7646d2SAndroid Build Coastguard Worker }
129*5e7646d2SAndroid Build Coastguard Worker
130*5e7646d2SAndroid Build Coastguard Worker
131*5e7646d2SAndroid Build Coastguard Worker //
132*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::find_driver()' - Find a driver.
133*5e7646d2SAndroid Build Coastguard Worker //
134*5e7646d2SAndroid Build Coastguard Worker
135*5e7646d2SAndroid Build Coastguard Worker ppdcDriver * // O - Driver
find_driver(const char * f)136*5e7646d2SAndroid Build Coastguard Worker ppdcSource::find_driver(const char *f) // I - Driver file name
137*5e7646d2SAndroid Build Coastguard Worker {
138*5e7646d2SAndroid Build Coastguard Worker ppdcDriver *d; // Current driver
139*5e7646d2SAndroid Build Coastguard Worker
140*5e7646d2SAndroid Build Coastguard Worker
141*5e7646d2SAndroid Build Coastguard Worker for (d = (ppdcDriver *)drivers->first(); d; d = (ppdcDriver *)drivers->next())
142*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(f, d->pc_file_name->value))
143*5e7646d2SAndroid Build Coastguard Worker return (d);
144*5e7646d2SAndroid Build Coastguard Worker
145*5e7646d2SAndroid Build Coastguard Worker return (NULL);
146*5e7646d2SAndroid Build Coastguard Worker }
147*5e7646d2SAndroid Build Coastguard Worker
148*5e7646d2SAndroid Build Coastguard Worker
149*5e7646d2SAndroid Build Coastguard Worker //
150*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::find_include()' - Find an include file.
151*5e7646d2SAndroid Build Coastguard Worker //
152*5e7646d2SAndroid Build Coastguard Worker
153*5e7646d2SAndroid Build Coastguard Worker char * // O - Found path or NULL
find_include(const char * f,const char * base,char * n,int nlen)154*5e7646d2SAndroid Build Coastguard Worker ppdcSource::find_include(
155*5e7646d2SAndroid Build Coastguard Worker const char *f, // I - Include filename
156*5e7646d2SAndroid Build Coastguard Worker const char *base, // I - Current directory
157*5e7646d2SAndroid Build Coastguard Worker char *n, // I - Path buffer
158*5e7646d2SAndroid Build Coastguard Worker int nlen) // I - Path buffer length
159*5e7646d2SAndroid Build Coastguard Worker {
160*5e7646d2SAndroid Build Coastguard Worker ppdcString *dir; // Include directory
161*5e7646d2SAndroid Build Coastguard Worker char temp[1024], // Temporary path
162*5e7646d2SAndroid Build Coastguard Worker *ptr; // Pointer to end of path
163*5e7646d2SAndroid Build Coastguard Worker
164*5e7646d2SAndroid Build Coastguard Worker
165*5e7646d2SAndroid Build Coastguard Worker // Range check input...
166*5e7646d2SAndroid Build Coastguard Worker if (!f || !*f || !n || nlen < 2)
167*5e7646d2SAndroid Build Coastguard Worker return (0);
168*5e7646d2SAndroid Build Coastguard Worker
169*5e7646d2SAndroid Build Coastguard Worker // Check the first character to see if we have <name> or "name"...
170*5e7646d2SAndroid Build Coastguard Worker if (*f == '<')
171*5e7646d2SAndroid Build Coastguard Worker {
172*5e7646d2SAndroid Build Coastguard Worker // Remove the surrounding <> from the name...
173*5e7646d2SAndroid Build Coastguard Worker strlcpy(temp, f + 1, sizeof(temp));
174*5e7646d2SAndroid Build Coastguard Worker ptr = temp + strlen(temp) - 1;
175*5e7646d2SAndroid Build Coastguard Worker
176*5e7646d2SAndroid Build Coastguard Worker if (*ptr != '>')
177*5e7646d2SAndroid Build Coastguard Worker {
178*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
179*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Invalid #include/#po filename \"%s\"."), n);
180*5e7646d2SAndroid Build Coastguard Worker return (0);
181*5e7646d2SAndroid Build Coastguard Worker }
182*5e7646d2SAndroid Build Coastguard Worker
183*5e7646d2SAndroid Build Coastguard Worker *ptr = '\0';
184*5e7646d2SAndroid Build Coastguard Worker f = temp;
185*5e7646d2SAndroid Build Coastguard Worker }
186*5e7646d2SAndroid Build Coastguard Worker else
187*5e7646d2SAndroid Build Coastguard Worker {
188*5e7646d2SAndroid Build Coastguard Worker // Check for the local file relative to the current directory...
189*5e7646d2SAndroid Build Coastguard Worker if (base && *base && f[0] != '/')
190*5e7646d2SAndroid Build Coastguard Worker snprintf(n, (size_t)nlen, "%s/%s", base, f);
191*5e7646d2SAndroid Build Coastguard Worker else
192*5e7646d2SAndroid Build Coastguard Worker strlcpy(n, f, (size_t)nlen);
193*5e7646d2SAndroid Build Coastguard Worker
194*5e7646d2SAndroid Build Coastguard Worker if (!access(n, 0))
195*5e7646d2SAndroid Build Coastguard Worker return (n);
196*5e7646d2SAndroid Build Coastguard Worker else if (*f == '/')
197*5e7646d2SAndroid Build Coastguard Worker {
198*5e7646d2SAndroid Build Coastguard Worker // Absolute path that doesn't exist...
199*5e7646d2SAndroid Build Coastguard Worker return (0);
200*5e7646d2SAndroid Build Coastguard Worker }
201*5e7646d2SAndroid Build Coastguard Worker }
202*5e7646d2SAndroid Build Coastguard Worker
203*5e7646d2SAndroid Build Coastguard Worker // Search the include directories, if any...
204*5e7646d2SAndroid Build Coastguard Worker if (includes)
205*5e7646d2SAndroid Build Coastguard Worker {
206*5e7646d2SAndroid Build Coastguard Worker for (dir = (ppdcString *)includes->first(); dir; dir = (ppdcString *)includes->next())
207*5e7646d2SAndroid Build Coastguard Worker {
208*5e7646d2SAndroid Build Coastguard Worker snprintf(n, (size_t)nlen, "%s/%s", dir->value, f);
209*5e7646d2SAndroid Build Coastguard Worker if (!access(n, 0))
210*5e7646d2SAndroid Build Coastguard Worker return (n);
211*5e7646d2SAndroid Build Coastguard Worker }
212*5e7646d2SAndroid Build Coastguard Worker }
213*5e7646d2SAndroid Build Coastguard Worker
214*5e7646d2SAndroid Build Coastguard Worker // Search the standard include directories...
215*5e7646d2SAndroid Build Coastguard Worker _cups_globals_t *cg = _cupsGlobals(); // Global data
216*5e7646d2SAndroid Build Coastguard Worker
217*5e7646d2SAndroid Build Coastguard Worker snprintf(n, (size_t)nlen, "%s/ppdc/%s", cg->cups_datadir, f);
218*5e7646d2SAndroid Build Coastguard Worker if (!access(n, 0))
219*5e7646d2SAndroid Build Coastguard Worker return (n);
220*5e7646d2SAndroid Build Coastguard Worker
221*5e7646d2SAndroid Build Coastguard Worker snprintf(n, (size_t)nlen, "%s/po/%s", cg->cups_datadir, f);
222*5e7646d2SAndroid Build Coastguard Worker if (!access(n, 0))
223*5e7646d2SAndroid Build Coastguard Worker return (n);
224*5e7646d2SAndroid Build Coastguard Worker else
225*5e7646d2SAndroid Build Coastguard Worker return (0);
226*5e7646d2SAndroid Build Coastguard Worker }
227*5e7646d2SAndroid Build Coastguard Worker
228*5e7646d2SAndroid Build Coastguard Worker
229*5e7646d2SAndroid Build Coastguard Worker //
230*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::find_po()' - Find a message catalog for the given locale.
231*5e7646d2SAndroid Build Coastguard Worker //
232*5e7646d2SAndroid Build Coastguard Worker
233*5e7646d2SAndroid Build Coastguard Worker ppdcCatalog * // O - Message catalog or NULL
find_po(const char * l)234*5e7646d2SAndroid Build Coastguard Worker ppdcSource::find_po(const char *l) // I - Locale name
235*5e7646d2SAndroid Build Coastguard Worker {
236*5e7646d2SAndroid Build Coastguard Worker ppdcCatalog *cat; // Current message catalog
237*5e7646d2SAndroid Build Coastguard Worker
238*5e7646d2SAndroid Build Coastguard Worker
239*5e7646d2SAndroid Build Coastguard Worker for (cat = (ppdcCatalog *)po_files->first();
240*5e7646d2SAndroid Build Coastguard Worker cat;
241*5e7646d2SAndroid Build Coastguard Worker cat = (ppdcCatalog *)po_files->next())
242*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(l, cat->locale->value))
243*5e7646d2SAndroid Build Coastguard Worker return (cat);
244*5e7646d2SAndroid Build Coastguard Worker
245*5e7646d2SAndroid Build Coastguard Worker return (NULL);
246*5e7646d2SAndroid Build Coastguard Worker }
247*5e7646d2SAndroid Build Coastguard Worker
248*5e7646d2SAndroid Build Coastguard Worker
249*5e7646d2SAndroid Build Coastguard Worker //
250*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::find_size()' - Find a media size.
251*5e7646d2SAndroid Build Coastguard Worker //
252*5e7646d2SAndroid Build Coastguard Worker
253*5e7646d2SAndroid Build Coastguard Worker ppdcMediaSize * // O - Size
find_size(const char * s)254*5e7646d2SAndroid Build Coastguard Worker ppdcSource::find_size(const char *s) // I - Size name
255*5e7646d2SAndroid Build Coastguard Worker {
256*5e7646d2SAndroid Build Coastguard Worker ppdcMediaSize *m; // Current media size
257*5e7646d2SAndroid Build Coastguard Worker
258*5e7646d2SAndroid Build Coastguard Worker
259*5e7646d2SAndroid Build Coastguard Worker for (m = (ppdcMediaSize *)sizes->first(); m; m = (ppdcMediaSize *)sizes->next())
260*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(s, m->name->value))
261*5e7646d2SAndroid Build Coastguard Worker return (m);
262*5e7646d2SAndroid Build Coastguard Worker
263*5e7646d2SAndroid Build Coastguard Worker return (NULL);
264*5e7646d2SAndroid Build Coastguard Worker }
265*5e7646d2SAndroid Build Coastguard Worker
266*5e7646d2SAndroid Build Coastguard Worker
267*5e7646d2SAndroid Build Coastguard Worker //
268*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::find_variable()' - Find a variable.
269*5e7646d2SAndroid Build Coastguard Worker //
270*5e7646d2SAndroid Build Coastguard Worker
271*5e7646d2SAndroid Build Coastguard Worker ppdcVariable * // O - Variable
find_variable(const char * n)272*5e7646d2SAndroid Build Coastguard Worker ppdcSource::find_variable(const char *n)// I - Variable name
273*5e7646d2SAndroid Build Coastguard Worker {
274*5e7646d2SAndroid Build Coastguard Worker ppdcVariable *v; // Current variable
275*5e7646d2SAndroid Build Coastguard Worker
276*5e7646d2SAndroid Build Coastguard Worker
277*5e7646d2SAndroid Build Coastguard Worker for (v = (ppdcVariable *)vars->first(); v; v = (ppdcVariable *)vars->next())
278*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(n, v->name->value))
279*5e7646d2SAndroid Build Coastguard Worker return (v);
280*5e7646d2SAndroid Build Coastguard Worker
281*5e7646d2SAndroid Build Coastguard Worker return (NULL);
282*5e7646d2SAndroid Build Coastguard Worker }
283*5e7646d2SAndroid Build Coastguard Worker
284*5e7646d2SAndroid Build Coastguard Worker
285*5e7646d2SAndroid Build Coastguard Worker //
286*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_attr()' - Get an attribute.
287*5e7646d2SAndroid Build Coastguard Worker //
288*5e7646d2SAndroid Build Coastguard Worker
289*5e7646d2SAndroid Build Coastguard Worker ppdcAttr * // O - Attribute
get_attr(ppdcFile * fp,bool loc)290*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_attr(ppdcFile *fp, // I - File to read
291*5e7646d2SAndroid Build Coastguard Worker bool loc) // I - Localize this attribute?
292*5e7646d2SAndroid Build Coastguard Worker {
293*5e7646d2SAndroid Build Coastguard Worker char name[1024], // Name string
294*5e7646d2SAndroid Build Coastguard Worker selector[1024], // Selector string
295*5e7646d2SAndroid Build Coastguard Worker *text, // Text string
296*5e7646d2SAndroid Build Coastguard Worker value[1024]; // Value string
297*5e7646d2SAndroid Build Coastguard Worker
298*5e7646d2SAndroid Build Coastguard Worker
299*5e7646d2SAndroid Build Coastguard Worker // Get the attribute parameters:
300*5e7646d2SAndroid Build Coastguard Worker //
301*5e7646d2SAndroid Build Coastguard Worker // Attribute name selector value
302*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, name, sizeof(name)))
303*5e7646d2SAndroid Build Coastguard Worker {
304*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
305*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected name after %s on line %d of %s."),
306*5e7646d2SAndroid Build Coastguard Worker loc ? "LocAttribute" : "Attribute", fp->line, fp->filename);
307*5e7646d2SAndroid Build Coastguard Worker return (0);
308*5e7646d2SAndroid Build Coastguard Worker }
309*5e7646d2SAndroid Build Coastguard Worker
310*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, selector, sizeof(selector)))
311*5e7646d2SAndroid Build Coastguard Worker {
312*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
313*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected selector after %s on line %d of %s."),
314*5e7646d2SAndroid Build Coastguard Worker loc ? "LocAttribute" : "Attribute", fp->line, fp->filename);
315*5e7646d2SAndroid Build Coastguard Worker return (0);
316*5e7646d2SAndroid Build Coastguard Worker }
317*5e7646d2SAndroid Build Coastguard Worker
318*5e7646d2SAndroid Build Coastguard Worker if ((text = strchr(selector, '/')) != NULL)
319*5e7646d2SAndroid Build Coastguard Worker *text++ = '\0';
320*5e7646d2SAndroid Build Coastguard Worker
321*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, value, sizeof(value)))
322*5e7646d2SAndroid Build Coastguard Worker {
323*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
324*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected value after %s on line %d of %s."),
325*5e7646d2SAndroid Build Coastguard Worker loc ? "LocAttribute" : "Attribute", fp->line, fp->filename);
326*5e7646d2SAndroid Build Coastguard Worker return (0);
327*5e7646d2SAndroid Build Coastguard Worker }
328*5e7646d2SAndroid Build Coastguard Worker
329*5e7646d2SAndroid Build Coastguard Worker return (new ppdcAttr(name, selector, text, value, loc));
330*5e7646d2SAndroid Build Coastguard Worker }
331*5e7646d2SAndroid Build Coastguard Worker
332*5e7646d2SAndroid Build Coastguard Worker
333*5e7646d2SAndroid Build Coastguard Worker //
334*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_boolean()' - Get a boolean value.
335*5e7646d2SAndroid Build Coastguard Worker //
336*5e7646d2SAndroid Build Coastguard Worker
337*5e7646d2SAndroid Build Coastguard Worker int // O - Boolean value
get_boolean(ppdcFile * fp)338*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_boolean(ppdcFile *fp) // I - File to read
339*5e7646d2SAndroid Build Coastguard Worker {
340*5e7646d2SAndroid Build Coastguard Worker char buffer[256]; // String buffer
341*5e7646d2SAndroid Build Coastguard Worker
342*5e7646d2SAndroid Build Coastguard Worker
343*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, buffer, sizeof(buffer)))
344*5e7646d2SAndroid Build Coastguard Worker {
345*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
346*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected boolean value on line %d of %s."),
347*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
348*5e7646d2SAndroid Build Coastguard Worker return (-1);
349*5e7646d2SAndroid Build Coastguard Worker }
350*5e7646d2SAndroid Build Coastguard Worker
351*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(buffer, "on") ||
352*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(buffer, "yes") ||
353*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(buffer, "true"))
354*5e7646d2SAndroid Build Coastguard Worker return (1);
355*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(buffer, "off") ||
356*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(buffer, "no") ||
357*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(buffer, "false"))
358*5e7646d2SAndroid Build Coastguard Worker return (0);
359*5e7646d2SAndroid Build Coastguard Worker else
360*5e7646d2SAndroid Build Coastguard Worker {
361*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
362*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Bad boolean value (%s) on line %d of %s."),
363*5e7646d2SAndroid Build Coastguard Worker buffer, fp->line, fp->filename);
364*5e7646d2SAndroid Build Coastguard Worker return (-1);
365*5e7646d2SAndroid Build Coastguard Worker }
366*5e7646d2SAndroid Build Coastguard Worker }
367*5e7646d2SAndroid Build Coastguard Worker
368*5e7646d2SAndroid Build Coastguard Worker
369*5e7646d2SAndroid Build Coastguard Worker //
370*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_choice()' - Get a choice.
371*5e7646d2SAndroid Build Coastguard Worker //
372*5e7646d2SAndroid Build Coastguard Worker
373*5e7646d2SAndroid Build Coastguard Worker ppdcChoice * // O - Choice data
get_choice(ppdcFile * fp)374*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_choice(ppdcFile *fp) // I - File to read
375*5e7646d2SAndroid Build Coastguard Worker {
376*5e7646d2SAndroid Build Coastguard Worker char name[1024], // Name
377*5e7646d2SAndroid Build Coastguard Worker *text, // Text
378*5e7646d2SAndroid Build Coastguard Worker code[10240]; // Code
379*5e7646d2SAndroid Build Coastguard Worker
380*5e7646d2SAndroid Build Coastguard Worker
381*5e7646d2SAndroid Build Coastguard Worker // Read a choice from the file:
382*5e7646d2SAndroid Build Coastguard Worker //
383*5e7646d2SAndroid Build Coastguard Worker // Choice name/text code
384*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, name, sizeof(name)))
385*5e7646d2SAndroid Build Coastguard Worker {
386*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
387*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected choice name/text on line %d of %s."),
388*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
389*5e7646d2SAndroid Build Coastguard Worker return (NULL);
390*5e7646d2SAndroid Build Coastguard Worker }
391*5e7646d2SAndroid Build Coastguard Worker
392*5e7646d2SAndroid Build Coastguard Worker if ((text = strchr(name, '/')) != NULL)
393*5e7646d2SAndroid Build Coastguard Worker *text++ = '\0';
394*5e7646d2SAndroid Build Coastguard Worker else
395*5e7646d2SAndroid Build Coastguard Worker text = name;
396*5e7646d2SAndroid Build Coastguard Worker
397*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, code, sizeof(code)))
398*5e7646d2SAndroid Build Coastguard Worker {
399*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("ppdc: Expected choice code on line %d of %s."),
400*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
401*5e7646d2SAndroid Build Coastguard Worker return (NULL);
402*5e7646d2SAndroid Build Coastguard Worker }
403*5e7646d2SAndroid Build Coastguard Worker
404*5e7646d2SAndroid Build Coastguard Worker // Return the new choice
405*5e7646d2SAndroid Build Coastguard Worker return (new ppdcChoice(name, text, code));
406*5e7646d2SAndroid Build Coastguard Worker }
407*5e7646d2SAndroid Build Coastguard Worker
408*5e7646d2SAndroid Build Coastguard Worker
409*5e7646d2SAndroid Build Coastguard Worker //
410*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_color_model()' - Get an old-style color model option.
411*5e7646d2SAndroid Build Coastguard Worker //
412*5e7646d2SAndroid Build Coastguard Worker
413*5e7646d2SAndroid Build Coastguard Worker ppdcChoice * // O - Choice data
get_color_model(ppdcFile * fp)414*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_color_model(ppdcFile *fp)
415*5e7646d2SAndroid Build Coastguard Worker // I - File to read
416*5e7646d2SAndroid Build Coastguard Worker {
417*5e7646d2SAndroid Build Coastguard Worker char name[1024], // Option name
418*5e7646d2SAndroid Build Coastguard Worker *text, // Text option
419*5e7646d2SAndroid Build Coastguard Worker temp[256]; // Temporary string
420*5e7646d2SAndroid Build Coastguard Worker int color_space, // Colorspace
421*5e7646d2SAndroid Build Coastguard Worker color_order, // Color order
422*5e7646d2SAndroid Build Coastguard Worker compression; // Compression mode
423*5e7646d2SAndroid Build Coastguard Worker
424*5e7646d2SAndroid Build Coastguard Worker
425*5e7646d2SAndroid Build Coastguard Worker // Get the ColorModel parameters:
426*5e7646d2SAndroid Build Coastguard Worker //
427*5e7646d2SAndroid Build Coastguard Worker // ColorModel name/text colorspace colororder compression
428*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, name, sizeof(name)))
429*5e7646d2SAndroid Build Coastguard Worker {
430*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
431*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected name/text combination for ColorModel on "
432*5e7646d2SAndroid Build Coastguard Worker "line %d of %s."), fp->line, fp->filename);
433*5e7646d2SAndroid Build Coastguard Worker return (NULL);
434*5e7646d2SAndroid Build Coastguard Worker }
435*5e7646d2SAndroid Build Coastguard Worker
436*5e7646d2SAndroid Build Coastguard Worker if ((text = strchr(name, '/')) != NULL)
437*5e7646d2SAndroid Build Coastguard Worker *text++ = '\0';
438*5e7646d2SAndroid Build Coastguard Worker else
439*5e7646d2SAndroid Build Coastguard Worker text = name;
440*5e7646d2SAndroid Build Coastguard Worker
441*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, temp, sizeof(temp)))
442*5e7646d2SAndroid Build Coastguard Worker {
443*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
444*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected colorspace for ColorModel on line %d of "
445*5e7646d2SAndroid Build Coastguard Worker "%s."), fp->line, fp->filename);
446*5e7646d2SAndroid Build Coastguard Worker return (NULL);
447*5e7646d2SAndroid Build Coastguard Worker }
448*5e7646d2SAndroid Build Coastguard Worker
449*5e7646d2SAndroid Build Coastguard Worker if ((color_space = get_color_space(temp)) < 0)
450*5e7646d2SAndroid Build Coastguard Worker color_space = get_integer(temp);
451*5e7646d2SAndroid Build Coastguard Worker
452*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, temp, sizeof(temp)))
453*5e7646d2SAndroid Build Coastguard Worker {
454*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
455*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected color order for ColorModel on line %d of "
456*5e7646d2SAndroid Build Coastguard Worker "%s."), fp->line, fp->filename);
457*5e7646d2SAndroid Build Coastguard Worker return (NULL);
458*5e7646d2SAndroid Build Coastguard Worker }
459*5e7646d2SAndroid Build Coastguard Worker
460*5e7646d2SAndroid Build Coastguard Worker if ((color_order = get_color_order(temp)) < 0)
461*5e7646d2SAndroid Build Coastguard Worker color_order = get_integer(temp);
462*5e7646d2SAndroid Build Coastguard Worker
463*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, temp, sizeof(temp)))
464*5e7646d2SAndroid Build Coastguard Worker {
465*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
466*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected compression for ColorModel on line %d of "
467*5e7646d2SAndroid Build Coastguard Worker "%s."), fp->line, fp->filename);
468*5e7646d2SAndroid Build Coastguard Worker return (NULL);
469*5e7646d2SAndroid Build Coastguard Worker }
470*5e7646d2SAndroid Build Coastguard Worker
471*5e7646d2SAndroid Build Coastguard Worker compression = get_integer(temp);
472*5e7646d2SAndroid Build Coastguard Worker
473*5e7646d2SAndroid Build Coastguard Worker snprintf(temp, sizeof(temp),
474*5e7646d2SAndroid Build Coastguard Worker "<</cupsColorSpace %d/cupsColorOrder %d/cupsCompression %d>>"
475*5e7646d2SAndroid Build Coastguard Worker "setpagedevice",
476*5e7646d2SAndroid Build Coastguard Worker color_space, color_order, compression);
477*5e7646d2SAndroid Build Coastguard Worker
478*5e7646d2SAndroid Build Coastguard Worker return (new ppdcChoice(name, text, temp));
479*5e7646d2SAndroid Build Coastguard Worker }
480*5e7646d2SAndroid Build Coastguard Worker
481*5e7646d2SAndroid Build Coastguard Worker
482*5e7646d2SAndroid Build Coastguard Worker //
483*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_color_order()' - Get an old-style color order value.
484*5e7646d2SAndroid Build Coastguard Worker //
485*5e7646d2SAndroid Build Coastguard Worker
486*5e7646d2SAndroid Build Coastguard Worker int // O - Color order value
get_color_order(const char * co)487*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_color_order(
488*5e7646d2SAndroid Build Coastguard Worker const char *co) // I - Color order string
489*5e7646d2SAndroid Build Coastguard Worker {
490*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(co, "chunked") ||
491*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(co, "chunky"))
492*5e7646d2SAndroid Build Coastguard Worker return (CUPS_ORDER_CHUNKED);
493*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(co, "banded"))
494*5e7646d2SAndroid Build Coastguard Worker return (CUPS_ORDER_BANDED);
495*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(co, "planar"))
496*5e7646d2SAndroid Build Coastguard Worker return (CUPS_ORDER_PLANAR);
497*5e7646d2SAndroid Build Coastguard Worker else
498*5e7646d2SAndroid Build Coastguard Worker return (-1);
499*5e7646d2SAndroid Build Coastguard Worker }
500*5e7646d2SAndroid Build Coastguard Worker
501*5e7646d2SAndroid Build Coastguard Worker
502*5e7646d2SAndroid Build Coastguard Worker //
503*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_color_profile()' - Get a color profile definition.
504*5e7646d2SAndroid Build Coastguard Worker //
505*5e7646d2SAndroid Build Coastguard Worker
506*5e7646d2SAndroid Build Coastguard Worker ppdcProfile * // O - Color profile
get_color_profile(ppdcFile * fp)507*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_color_profile(
508*5e7646d2SAndroid Build Coastguard Worker ppdcFile *fp) // I - File to read
509*5e7646d2SAndroid Build Coastguard Worker {
510*5e7646d2SAndroid Build Coastguard Worker char resolution[1024], // Resolution/media type
511*5e7646d2SAndroid Build Coastguard Worker *media_type; // Media type
512*5e7646d2SAndroid Build Coastguard Worker int i; // Looping var
513*5e7646d2SAndroid Build Coastguard Worker float g, // Gamma value
514*5e7646d2SAndroid Build Coastguard Worker d, // Density value
515*5e7646d2SAndroid Build Coastguard Worker m[9]; // Transform matrix
516*5e7646d2SAndroid Build Coastguard Worker
517*5e7646d2SAndroid Build Coastguard Worker
518*5e7646d2SAndroid Build Coastguard Worker // Get the ColorProfile parameters:
519*5e7646d2SAndroid Build Coastguard Worker //
520*5e7646d2SAndroid Build Coastguard Worker // ColorProfile resolution/mediatype gamma density m00 m01 m02 ... m22
521*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, resolution, sizeof(resolution)))
522*5e7646d2SAndroid Build Coastguard Worker {
523*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
524*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected resolution/mediatype following "
525*5e7646d2SAndroid Build Coastguard Worker "ColorProfile on line %d of %s."),
526*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
527*5e7646d2SAndroid Build Coastguard Worker return (NULL);
528*5e7646d2SAndroid Build Coastguard Worker }
529*5e7646d2SAndroid Build Coastguard Worker
530*5e7646d2SAndroid Build Coastguard Worker if ((media_type = strchr(resolution, '/')) != NULL)
531*5e7646d2SAndroid Build Coastguard Worker *media_type++ = '\0';
532*5e7646d2SAndroid Build Coastguard Worker else
533*5e7646d2SAndroid Build Coastguard Worker media_type = resolution;
534*5e7646d2SAndroid Build Coastguard Worker
535*5e7646d2SAndroid Build Coastguard Worker g = get_float(fp);
536*5e7646d2SAndroid Build Coastguard Worker d = get_float(fp);
537*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < 9; i ++)
538*5e7646d2SAndroid Build Coastguard Worker m[i] = get_float(fp);
539*5e7646d2SAndroid Build Coastguard Worker
540*5e7646d2SAndroid Build Coastguard Worker return (new ppdcProfile(resolution, media_type, d, g, m));
541*5e7646d2SAndroid Build Coastguard Worker }
542*5e7646d2SAndroid Build Coastguard Worker
543*5e7646d2SAndroid Build Coastguard Worker
544*5e7646d2SAndroid Build Coastguard Worker //
545*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_color_space()' - Get an old-style colorspace value.
546*5e7646d2SAndroid Build Coastguard Worker //
547*5e7646d2SAndroid Build Coastguard Worker
548*5e7646d2SAndroid Build Coastguard Worker int // O - Colorspace value
get_color_space(const char * cs)549*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_color_space(
550*5e7646d2SAndroid Build Coastguard Worker const char *cs) // I - Colorspace string
551*5e7646d2SAndroid Build Coastguard Worker {
552*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(cs, "w"))
553*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_W);
554*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "rgb"))
555*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_RGB);
556*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "rgba"))
557*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_RGBA);
558*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "k"))
559*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_K);
560*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "cmy"))
561*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_CMY);
562*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "ymc"))
563*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_YMC);
564*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "cmyk"))
565*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_CMYK);
566*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "ymck"))
567*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_YMCK);
568*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "kcmy"))
569*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_KCMY);
570*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "kcmycm"))
571*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_KCMYcm);
572*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "gmck"))
573*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_GMCK);
574*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "gmcs"))
575*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_GMCS);
576*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "white"))
577*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_WHITE);
578*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "gold"))
579*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_GOLD);
580*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "silver"))
581*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_SILVER);
582*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "CIEXYZ"))
583*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_CIEXYZ);
584*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "CIELab"))
585*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_CIELab);
586*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "RGBW"))
587*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_RGBW);
588*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "ICC1"))
589*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_ICC1);
590*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "ICC2"))
591*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_ICC2);
592*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "ICC3"))
593*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_ICC3);
594*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "ICC4"))
595*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_ICC4);
596*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "ICC5"))
597*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_ICC5);
598*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "ICC6"))
599*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_ICC6);
600*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "ICC7"))
601*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_ICC7);
602*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "ICC8"))
603*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_ICC8);
604*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "ICC9"))
605*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_ICC9);
606*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "ICCA"))
607*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_ICCA);
608*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "ICCB"))
609*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_ICCB);
610*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "ICCC"))
611*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_ICCC);
612*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "ICCD"))
613*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_ICCD);
614*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "ICCE"))
615*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_ICCE);
616*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(cs, "ICCF"))
617*5e7646d2SAndroid Build Coastguard Worker return (CUPS_CSPACE_ICCF);
618*5e7646d2SAndroid Build Coastguard Worker else
619*5e7646d2SAndroid Build Coastguard Worker return (-1);
620*5e7646d2SAndroid Build Coastguard Worker }
621*5e7646d2SAndroid Build Coastguard Worker
622*5e7646d2SAndroid Build Coastguard Worker
623*5e7646d2SAndroid Build Coastguard Worker //
624*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_constraint()' - Get a constraint.
625*5e7646d2SAndroid Build Coastguard Worker //
626*5e7646d2SAndroid Build Coastguard Worker
627*5e7646d2SAndroid Build Coastguard Worker ppdcConstraint * // O - Constraint
get_constraint(ppdcFile * fp)628*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_constraint(ppdcFile *fp)// I - File to read
629*5e7646d2SAndroid Build Coastguard Worker {
630*5e7646d2SAndroid Build Coastguard Worker char temp[1024], // One string to rule them all
631*5e7646d2SAndroid Build Coastguard Worker *ptr, // Pointer into string
632*5e7646d2SAndroid Build Coastguard Worker *option1, // Constraint option 1
633*5e7646d2SAndroid Build Coastguard Worker *choice1, // Constraint choice 1
634*5e7646d2SAndroid Build Coastguard Worker *option2, // Constraint option 2
635*5e7646d2SAndroid Build Coastguard Worker *choice2; // Constraint choice 2
636*5e7646d2SAndroid Build Coastguard Worker
637*5e7646d2SAndroid Build Coastguard Worker
638*5e7646d2SAndroid Build Coastguard Worker // Read the UIConstaints parameter in one of the following forms:
639*5e7646d2SAndroid Build Coastguard Worker //
640*5e7646d2SAndroid Build Coastguard Worker // UIConstraints "*Option1 *Option2"
641*5e7646d2SAndroid Build Coastguard Worker // UIConstraints "*Option1 Choice1 *Option2"
642*5e7646d2SAndroid Build Coastguard Worker // UIConstraints "*Option1 *Option2 Choice2"
643*5e7646d2SAndroid Build Coastguard Worker // UIConstraints "*Option1 Choice1 *Option2 Choice2"
644*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, temp, sizeof(temp)))
645*5e7646d2SAndroid Build Coastguard Worker {
646*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
647*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected constraints string for UIConstraints on "
648*5e7646d2SAndroid Build Coastguard Worker "line %d of %s."), fp->line, fp->filename);
649*5e7646d2SAndroid Build Coastguard Worker return (NULL);
650*5e7646d2SAndroid Build Coastguard Worker }
651*5e7646d2SAndroid Build Coastguard Worker
652*5e7646d2SAndroid Build Coastguard Worker for (ptr = temp; isspace(*ptr); ptr ++);
653*5e7646d2SAndroid Build Coastguard Worker
654*5e7646d2SAndroid Build Coastguard Worker if (*ptr != '*')
655*5e7646d2SAndroid Build Coastguard Worker {
656*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
657*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Option constraint must *name on line %d of %s."),
658*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
659*5e7646d2SAndroid Build Coastguard Worker return (NULL);
660*5e7646d2SAndroid Build Coastguard Worker }
661*5e7646d2SAndroid Build Coastguard Worker
662*5e7646d2SAndroid Build Coastguard Worker option1 = ptr;
663*5e7646d2SAndroid Build Coastguard Worker
664*5e7646d2SAndroid Build Coastguard Worker for (; *ptr && !isspace(*ptr); ptr ++);
665*5e7646d2SAndroid Build Coastguard Worker for (; isspace(*ptr); *ptr++ = '\0');
666*5e7646d2SAndroid Build Coastguard Worker
667*5e7646d2SAndroid Build Coastguard Worker if (*ptr != '*')
668*5e7646d2SAndroid Build Coastguard Worker {
669*5e7646d2SAndroid Build Coastguard Worker choice1 = ptr;
670*5e7646d2SAndroid Build Coastguard Worker
671*5e7646d2SAndroid Build Coastguard Worker for (; *ptr && !isspace(*ptr); ptr ++);
672*5e7646d2SAndroid Build Coastguard Worker for (; isspace(*ptr); *ptr++ = '\0');
673*5e7646d2SAndroid Build Coastguard Worker }
674*5e7646d2SAndroid Build Coastguard Worker else
675*5e7646d2SAndroid Build Coastguard Worker choice1 = NULL;
676*5e7646d2SAndroid Build Coastguard Worker
677*5e7646d2SAndroid Build Coastguard Worker if (*ptr != '*')
678*5e7646d2SAndroid Build Coastguard Worker {
679*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
680*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected two option names on line %d of %s."),
681*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
682*5e7646d2SAndroid Build Coastguard Worker return (NULL);
683*5e7646d2SAndroid Build Coastguard Worker }
684*5e7646d2SAndroid Build Coastguard Worker
685*5e7646d2SAndroid Build Coastguard Worker option2 = ptr;
686*5e7646d2SAndroid Build Coastguard Worker
687*5e7646d2SAndroid Build Coastguard Worker for (; *ptr && !isspace(*ptr); ptr ++);
688*5e7646d2SAndroid Build Coastguard Worker for (; isspace(*ptr); *ptr++ = '\0');
689*5e7646d2SAndroid Build Coastguard Worker
690*5e7646d2SAndroid Build Coastguard Worker if (*ptr)
691*5e7646d2SAndroid Build Coastguard Worker choice2 = ptr;
692*5e7646d2SAndroid Build Coastguard Worker else
693*5e7646d2SAndroid Build Coastguard Worker choice2 = NULL;
694*5e7646d2SAndroid Build Coastguard Worker
695*5e7646d2SAndroid Build Coastguard Worker return (new ppdcConstraint(option1, choice1, option2, choice2));
696*5e7646d2SAndroid Build Coastguard Worker }
697*5e7646d2SAndroid Build Coastguard Worker
698*5e7646d2SAndroid Build Coastguard Worker
699*5e7646d2SAndroid Build Coastguard Worker //
700*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_custom_size()' - Get a custom media size definition from a file.
701*5e7646d2SAndroid Build Coastguard Worker //
702*5e7646d2SAndroid Build Coastguard Worker
703*5e7646d2SAndroid Build Coastguard Worker ppdcMediaSize * // O - Media size
get_custom_size(ppdcFile * fp)704*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_custom_size(ppdcFile *fp)
705*5e7646d2SAndroid Build Coastguard Worker // I - File to read
706*5e7646d2SAndroid Build Coastguard Worker {
707*5e7646d2SAndroid Build Coastguard Worker char name[1024], // Name
708*5e7646d2SAndroid Build Coastguard Worker *text, // Text
709*5e7646d2SAndroid Build Coastguard Worker size_code[10240], // PageSize code
710*5e7646d2SAndroid Build Coastguard Worker region_code[10240]; // PageRegion
711*5e7646d2SAndroid Build Coastguard Worker float width, // Width
712*5e7646d2SAndroid Build Coastguard Worker length, // Length
713*5e7646d2SAndroid Build Coastguard Worker left, // Left margin
714*5e7646d2SAndroid Build Coastguard Worker bottom, // Bottom margin
715*5e7646d2SAndroid Build Coastguard Worker right, // Right margin
716*5e7646d2SAndroid Build Coastguard Worker top; // Top margin
717*5e7646d2SAndroid Build Coastguard Worker
718*5e7646d2SAndroid Build Coastguard Worker
719*5e7646d2SAndroid Build Coastguard Worker // Get the name, text, width, length, margins, and code:
720*5e7646d2SAndroid Build Coastguard Worker //
721*5e7646d2SAndroid Build Coastguard Worker // CustomMedia name/text width length left bottom right top size-code region-code
722*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, name, sizeof(name)))
723*5e7646d2SAndroid Build Coastguard Worker return (NULL);
724*5e7646d2SAndroid Build Coastguard Worker
725*5e7646d2SAndroid Build Coastguard Worker if ((text = strchr(name, '/')) != NULL)
726*5e7646d2SAndroid Build Coastguard Worker *text++ = '\0';
727*5e7646d2SAndroid Build Coastguard Worker else
728*5e7646d2SAndroid Build Coastguard Worker text = name;
729*5e7646d2SAndroid Build Coastguard Worker
730*5e7646d2SAndroid Build Coastguard Worker if ((width = get_measurement(fp)) < 0.0f)
731*5e7646d2SAndroid Build Coastguard Worker return (NULL);
732*5e7646d2SAndroid Build Coastguard Worker
733*5e7646d2SAndroid Build Coastguard Worker if ((length = get_measurement(fp)) < 0.0f)
734*5e7646d2SAndroid Build Coastguard Worker return (NULL);
735*5e7646d2SAndroid Build Coastguard Worker
736*5e7646d2SAndroid Build Coastguard Worker if ((left = get_measurement(fp)) < 0.0f)
737*5e7646d2SAndroid Build Coastguard Worker return (NULL);
738*5e7646d2SAndroid Build Coastguard Worker
739*5e7646d2SAndroid Build Coastguard Worker if ((bottom = get_measurement(fp)) < 0.0f)
740*5e7646d2SAndroid Build Coastguard Worker return (NULL);
741*5e7646d2SAndroid Build Coastguard Worker
742*5e7646d2SAndroid Build Coastguard Worker if ((right = get_measurement(fp)) < 0.0f)
743*5e7646d2SAndroid Build Coastguard Worker return (NULL);
744*5e7646d2SAndroid Build Coastguard Worker
745*5e7646d2SAndroid Build Coastguard Worker if ((top = get_measurement(fp)) < 0.0f)
746*5e7646d2SAndroid Build Coastguard Worker return (NULL);
747*5e7646d2SAndroid Build Coastguard Worker
748*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, size_code, sizeof(size_code)))
749*5e7646d2SAndroid Build Coastguard Worker return (NULL);
750*5e7646d2SAndroid Build Coastguard Worker
751*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, region_code, sizeof(region_code)))
752*5e7646d2SAndroid Build Coastguard Worker return (NULL);
753*5e7646d2SAndroid Build Coastguard Worker
754*5e7646d2SAndroid Build Coastguard Worker // Return the new media size...
755*5e7646d2SAndroid Build Coastguard Worker return (new ppdcMediaSize(name, text, width, length, left, bottom,
756*5e7646d2SAndroid Build Coastguard Worker right, top, size_code, region_code));
757*5e7646d2SAndroid Build Coastguard Worker }
758*5e7646d2SAndroid Build Coastguard Worker
759*5e7646d2SAndroid Build Coastguard Worker
760*5e7646d2SAndroid Build Coastguard Worker //
761*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_duplex()' - Get a duplex option.
762*5e7646d2SAndroid Build Coastguard Worker //
763*5e7646d2SAndroid Build Coastguard Worker
764*5e7646d2SAndroid Build Coastguard Worker void
get_duplex(ppdcFile * fp,ppdcDriver * d)765*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_duplex(ppdcFile *fp, // I - File to read from
766*5e7646d2SAndroid Build Coastguard Worker ppdcDriver *d) // I - Current driver
767*5e7646d2SAndroid Build Coastguard Worker {
768*5e7646d2SAndroid Build Coastguard Worker char temp[256]; // Duplex keyword
769*5e7646d2SAndroid Build Coastguard Worker ppdcAttr *attr; // cupsFlipDuplex attribute
770*5e7646d2SAndroid Build Coastguard Worker ppdcGroup *g; // Current group
771*5e7646d2SAndroid Build Coastguard Worker ppdcOption *o; // Duplex option
772*5e7646d2SAndroid Build Coastguard Worker
773*5e7646d2SAndroid Build Coastguard Worker
774*5e7646d2SAndroid Build Coastguard Worker // Duplex {boolean|none|normal|flip}
775*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, temp, sizeof(temp)))
776*5e7646d2SAndroid Build Coastguard Worker {
777*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
778*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected duplex type after Duplex on line %d of "
779*5e7646d2SAndroid Build Coastguard Worker "%s."), fp->line, fp->filename);
780*5e7646d2SAndroid Build Coastguard Worker return;
781*5e7646d2SAndroid Build Coastguard Worker }
782*5e7646d2SAndroid Build Coastguard Worker
783*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
784*5e7646d2SAndroid Build Coastguard Worker return;
785*5e7646d2SAndroid Build Coastguard Worker
786*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(temp, "none") || !_cups_strcasecmp(temp, "false") ||
787*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(temp, "no") || !_cups_strcasecmp(temp, "off"))
788*5e7646d2SAndroid Build Coastguard Worker {
789*5e7646d2SAndroid Build Coastguard Worker g = d->find_group("General");
790*5e7646d2SAndroid Build Coastguard Worker if ((o = g->find_option("Duplex")) != NULL)
791*5e7646d2SAndroid Build Coastguard Worker g->options->remove(o);
792*5e7646d2SAndroid Build Coastguard Worker
793*5e7646d2SAndroid Build Coastguard Worker for (attr = (ppdcAttr *)d->attrs->first();
794*5e7646d2SAndroid Build Coastguard Worker attr;
795*5e7646d2SAndroid Build Coastguard Worker attr = (ppdcAttr *)d->attrs->next())
796*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(attr->name->value, "cupsFlipDuplex"))
797*5e7646d2SAndroid Build Coastguard Worker {
798*5e7646d2SAndroid Build Coastguard Worker d->attrs->remove(attr);
799*5e7646d2SAndroid Build Coastguard Worker break;
800*5e7646d2SAndroid Build Coastguard Worker }
801*5e7646d2SAndroid Build Coastguard Worker }
802*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "normal") || !_cups_strcasecmp(temp, "true") ||
803*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(temp, "yes") || !_cups_strcasecmp(temp, "on") ||
804*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(temp, "flip") || !_cups_strcasecmp(temp, "rotated") ||
805*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(temp, "manualtumble"))
806*5e7646d2SAndroid Build Coastguard Worker {
807*5e7646d2SAndroid Build Coastguard Worker g = d->find_group("General");
808*5e7646d2SAndroid Build Coastguard Worker o = g->find_option("Duplex");
809*5e7646d2SAndroid Build Coastguard Worker
810*5e7646d2SAndroid Build Coastguard Worker if (!o)
811*5e7646d2SAndroid Build Coastguard Worker {
812*5e7646d2SAndroid Build Coastguard Worker o = new ppdcOption(PPDC_PICKONE, "Duplex", "2-Sided Printing",
813*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(temp, "flip") ? PPDC_SECTION_PAGE :
814*5e7646d2SAndroid Build Coastguard Worker PPDC_SECTION_ANY, 10.0f);
815*5e7646d2SAndroid Build Coastguard Worker o->add_choice(new ppdcChoice("None", "Off (1-Sided)",
816*5e7646d2SAndroid Build Coastguard Worker "<</Duplex false>>setpagedevice"));
817*5e7646d2SAndroid Build Coastguard Worker o->add_choice(new ppdcChoice("DuplexNoTumble", "Long-Edge (Portrait)",
818*5e7646d2SAndroid Build Coastguard Worker "<</Duplex true/Tumble false>>setpagedevice"));
819*5e7646d2SAndroid Build Coastguard Worker o->add_choice(new ppdcChoice("DuplexTumble", "Short-Edge (Landscape)",
820*5e7646d2SAndroid Build Coastguard Worker "<</Duplex true/Tumble true>>setpagedevice"));
821*5e7646d2SAndroid Build Coastguard Worker
822*5e7646d2SAndroid Build Coastguard Worker g->add_option(o);
823*5e7646d2SAndroid Build Coastguard Worker }
824*5e7646d2SAndroid Build Coastguard Worker
825*5e7646d2SAndroid Build Coastguard Worker for (attr = (ppdcAttr *)d->attrs->first();
826*5e7646d2SAndroid Build Coastguard Worker attr;
827*5e7646d2SAndroid Build Coastguard Worker attr = (ppdcAttr *)d->attrs->next())
828*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(attr->name->value, "cupsFlipDuplex"))
829*5e7646d2SAndroid Build Coastguard Worker {
830*5e7646d2SAndroid Build Coastguard Worker if (_cups_strcasecmp(temp, "flip"))
831*5e7646d2SAndroid Build Coastguard Worker d->attrs->remove(attr);
832*5e7646d2SAndroid Build Coastguard Worker break;
833*5e7646d2SAndroid Build Coastguard Worker }
834*5e7646d2SAndroid Build Coastguard Worker
835*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(temp, "flip") && !attr)
836*5e7646d2SAndroid Build Coastguard Worker d->add_attr(new ppdcAttr("cupsFlipDuplex", NULL, NULL, "true"));
837*5e7646d2SAndroid Build Coastguard Worker
838*5e7646d2SAndroid Build Coastguard Worker for (attr = (ppdcAttr *)d->attrs->first();
839*5e7646d2SAndroid Build Coastguard Worker attr;
840*5e7646d2SAndroid Build Coastguard Worker attr = (ppdcAttr *)d->attrs->next())
841*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(attr->name->value, "cupsBackSide"))
842*5e7646d2SAndroid Build Coastguard Worker {
843*5e7646d2SAndroid Build Coastguard Worker d->attrs->remove(attr);
844*5e7646d2SAndroid Build Coastguard Worker break;
845*5e7646d2SAndroid Build Coastguard Worker }
846*5e7646d2SAndroid Build Coastguard Worker
847*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(temp, "flip"))
848*5e7646d2SAndroid Build Coastguard Worker d->add_attr(new ppdcAttr("cupsBackSide", NULL, NULL, "Flipped"));
849*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "rotated"))
850*5e7646d2SAndroid Build Coastguard Worker d->add_attr(new ppdcAttr("cupsBackSide", NULL, NULL, "Rotated"));
851*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "manualtumble"))
852*5e7646d2SAndroid Build Coastguard Worker d->add_attr(new ppdcAttr("cupsBackSide", NULL, NULL, "ManualTumble"));
853*5e7646d2SAndroid Build Coastguard Worker else
854*5e7646d2SAndroid Build Coastguard Worker d->add_attr(new ppdcAttr("cupsBackSide", NULL, NULL, "Normal"));
855*5e7646d2SAndroid Build Coastguard Worker }
856*5e7646d2SAndroid Build Coastguard Worker else
857*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
858*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Unknown duplex type \"%s\" on line %d of %s."),
859*5e7646d2SAndroid Build Coastguard Worker temp, fp->line, fp->filename);
860*5e7646d2SAndroid Build Coastguard Worker }
861*5e7646d2SAndroid Build Coastguard Worker
862*5e7646d2SAndroid Build Coastguard Worker
863*5e7646d2SAndroid Build Coastguard Worker //
864*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_filter()' - Get a filter.
865*5e7646d2SAndroid Build Coastguard Worker //
866*5e7646d2SAndroid Build Coastguard Worker
867*5e7646d2SAndroid Build Coastguard Worker ppdcFilter * // O - Filter
get_filter(ppdcFile * fp)868*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_filter(ppdcFile *fp) // I - File to read
869*5e7646d2SAndroid Build Coastguard Worker {
870*5e7646d2SAndroid Build Coastguard Worker char type[1024], // MIME type
871*5e7646d2SAndroid Build Coastguard Worker program[1024], // Filter program
872*5e7646d2SAndroid Build Coastguard Worker *ptr; // Pointer into MIME type
873*5e7646d2SAndroid Build Coastguard Worker int cost; // Relative cost
874*5e7646d2SAndroid Build Coastguard Worker
875*5e7646d2SAndroid Build Coastguard Worker
876*5e7646d2SAndroid Build Coastguard Worker // Read filter parameters in one of the following formats:
877*5e7646d2SAndroid Build Coastguard Worker //
878*5e7646d2SAndroid Build Coastguard Worker // Filter "type cost program"
879*5e7646d2SAndroid Build Coastguard Worker // Filter type cost program
880*5e7646d2SAndroid Build Coastguard Worker
881*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, type, sizeof(type)))
882*5e7646d2SAndroid Build Coastguard Worker {
883*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
884*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected a filter definition on line %d of %s."),
885*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
886*5e7646d2SAndroid Build Coastguard Worker return (NULL);
887*5e7646d2SAndroid Build Coastguard Worker }
888*5e7646d2SAndroid Build Coastguard Worker
889*5e7646d2SAndroid Build Coastguard Worker if ((ptr = strchr(type, ' ')) != NULL)
890*5e7646d2SAndroid Build Coastguard Worker {
891*5e7646d2SAndroid Build Coastguard Worker // Old-style filter definition in one string...
892*5e7646d2SAndroid Build Coastguard Worker *ptr++ = '\0';
893*5e7646d2SAndroid Build Coastguard Worker cost = strtol(ptr, &ptr, 10);
894*5e7646d2SAndroid Build Coastguard Worker
895*5e7646d2SAndroid Build Coastguard Worker while (isspace(*ptr))
896*5e7646d2SAndroid Build Coastguard Worker ptr ++;
897*5e7646d2SAndroid Build Coastguard Worker
898*5e7646d2SAndroid Build Coastguard Worker strlcpy(program, ptr, sizeof(program));
899*5e7646d2SAndroid Build Coastguard Worker }
900*5e7646d2SAndroid Build Coastguard Worker else
901*5e7646d2SAndroid Build Coastguard Worker {
902*5e7646d2SAndroid Build Coastguard Worker cost = get_integer(fp);
903*5e7646d2SAndroid Build Coastguard Worker
904*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, program, sizeof(program)))
905*5e7646d2SAndroid Build Coastguard Worker {
906*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
907*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected a program name on line %d of %s."),
908*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
909*5e7646d2SAndroid Build Coastguard Worker return (NULL);
910*5e7646d2SAndroid Build Coastguard Worker }
911*5e7646d2SAndroid Build Coastguard Worker }
912*5e7646d2SAndroid Build Coastguard Worker
913*5e7646d2SAndroid Build Coastguard Worker if (!type[0])
914*5e7646d2SAndroid Build Coastguard Worker {
915*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
916*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Invalid empty MIME type for filter on line %d of "
917*5e7646d2SAndroid Build Coastguard Worker "%s."), fp->line, fp->filename);
918*5e7646d2SAndroid Build Coastguard Worker return (NULL);
919*5e7646d2SAndroid Build Coastguard Worker }
920*5e7646d2SAndroid Build Coastguard Worker
921*5e7646d2SAndroid Build Coastguard Worker if (cost < 0 || cost > 200)
922*5e7646d2SAndroid Build Coastguard Worker {
923*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
924*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Invalid cost for filter on line %d of %s."),
925*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
926*5e7646d2SAndroid Build Coastguard Worker return (NULL);
927*5e7646d2SAndroid Build Coastguard Worker }
928*5e7646d2SAndroid Build Coastguard Worker
929*5e7646d2SAndroid Build Coastguard Worker if (!program[0])
930*5e7646d2SAndroid Build Coastguard Worker {
931*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
932*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Invalid empty program name for filter on line %d "
933*5e7646d2SAndroid Build Coastguard Worker "of %s."), fp->line, fp->filename);
934*5e7646d2SAndroid Build Coastguard Worker return (NULL);
935*5e7646d2SAndroid Build Coastguard Worker }
936*5e7646d2SAndroid Build Coastguard Worker
937*5e7646d2SAndroid Build Coastguard Worker return (new ppdcFilter(type, program, cost));
938*5e7646d2SAndroid Build Coastguard Worker }
939*5e7646d2SAndroid Build Coastguard Worker
940*5e7646d2SAndroid Build Coastguard Worker
941*5e7646d2SAndroid Build Coastguard Worker //
942*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_float()' - Get a single floating-point number.
943*5e7646d2SAndroid Build Coastguard Worker //
944*5e7646d2SAndroid Build Coastguard Worker
945*5e7646d2SAndroid Build Coastguard Worker float // O - Number
get_float(ppdcFile * fp)946*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_float(ppdcFile *fp) // I - File to read
947*5e7646d2SAndroid Build Coastguard Worker {
948*5e7646d2SAndroid Build Coastguard Worker char temp[256], // String buffer
949*5e7646d2SAndroid Build Coastguard Worker *ptr; // Pointer into buffer
950*5e7646d2SAndroid Build Coastguard Worker float val; // Floating point value
951*5e7646d2SAndroid Build Coastguard Worker
952*5e7646d2SAndroid Build Coastguard Worker
953*5e7646d2SAndroid Build Coastguard Worker // Get the number from the file and range-check...
954*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, temp, sizeof(temp)))
955*5e7646d2SAndroid Build Coastguard Worker {
956*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("ppdc: Expected real number on line %d of %s."),
957*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
958*5e7646d2SAndroid Build Coastguard Worker return (-1.0f);
959*5e7646d2SAndroid Build Coastguard Worker }
960*5e7646d2SAndroid Build Coastguard Worker
961*5e7646d2SAndroid Build Coastguard Worker val = (float)strtod(temp, &ptr);
962*5e7646d2SAndroid Build Coastguard Worker
963*5e7646d2SAndroid Build Coastguard Worker if (*ptr)
964*5e7646d2SAndroid Build Coastguard Worker {
965*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
966*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Unknown trailing characters in real number \"%s\" "
967*5e7646d2SAndroid Build Coastguard Worker "on line %d of %s."), temp, fp->line, fp->filename);
968*5e7646d2SAndroid Build Coastguard Worker return (-1.0f);
969*5e7646d2SAndroid Build Coastguard Worker }
970*5e7646d2SAndroid Build Coastguard Worker else
971*5e7646d2SAndroid Build Coastguard Worker return (val);
972*5e7646d2SAndroid Build Coastguard Worker }
973*5e7646d2SAndroid Build Coastguard Worker
974*5e7646d2SAndroid Build Coastguard Worker
975*5e7646d2SAndroid Build Coastguard Worker //
976*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_font()' - Get a font definition.
977*5e7646d2SAndroid Build Coastguard Worker //
978*5e7646d2SAndroid Build Coastguard Worker
979*5e7646d2SAndroid Build Coastguard Worker ppdcFont * // O - Font data
get_font(ppdcFile * fp)980*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_font(ppdcFile *fp) // I - File to read
981*5e7646d2SAndroid Build Coastguard Worker {
982*5e7646d2SAndroid Build Coastguard Worker char name[256], // Font name
983*5e7646d2SAndroid Build Coastguard Worker encoding[256], // Font encoding
984*5e7646d2SAndroid Build Coastguard Worker version[256], // Font version
985*5e7646d2SAndroid Build Coastguard Worker charset[256], // Font charset
986*5e7646d2SAndroid Build Coastguard Worker temp[256]; // Font status string
987*5e7646d2SAndroid Build Coastguard Worker ppdcFontStatus status; // Font status enumeration
988*5e7646d2SAndroid Build Coastguard Worker
989*5e7646d2SAndroid Build Coastguard Worker
990*5e7646d2SAndroid Build Coastguard Worker // Read font parameters as follows:
991*5e7646d2SAndroid Build Coastguard Worker //
992*5e7646d2SAndroid Build Coastguard Worker // Font *
993*5e7646d2SAndroid Build Coastguard Worker // Font name encoding version charset status
994*5e7646d2SAndroid Build Coastguard Worker // %font name encoding version charset status
995*5e7646d2SAndroid Build Coastguard Worker //
996*5e7646d2SAndroid Build Coastguard Worker // "Name" is the PostScript font name.
997*5e7646d2SAndroid Build Coastguard Worker //
998*5e7646d2SAndroid Build Coastguard Worker // "Encoding" is the default encoding of the font: Standard, ISOLatin1,
999*5e7646d2SAndroid Build Coastguard Worker // Special, Expert, ExpertSubset, etc.
1000*5e7646d2SAndroid Build Coastguard Worker //
1001*5e7646d2SAndroid Build Coastguard Worker // "Version" is the version number string.
1002*5e7646d2SAndroid Build Coastguard Worker //
1003*5e7646d2SAndroid Build Coastguard Worker // "Charset" specifies the characters that are included in the font:
1004*5e7646d2SAndroid Build Coastguard Worker // Standard, Special, Expert, Adobe-Identity, etc.
1005*5e7646d2SAndroid Build Coastguard Worker //
1006*5e7646d2SAndroid Build Coastguard Worker // "Status" is the keyword ROM or Disk.
1007*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, name, sizeof(name)))
1008*5e7646d2SAndroid Build Coastguard Worker {
1009*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1010*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected name after Font on line %d of %s."),
1011*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
1012*5e7646d2SAndroid Build Coastguard Worker return (0);
1013*5e7646d2SAndroid Build Coastguard Worker }
1014*5e7646d2SAndroid Build Coastguard Worker
1015*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(name, "*"))
1016*5e7646d2SAndroid Build Coastguard Worker {
1017*5e7646d2SAndroid Build Coastguard Worker // Include all base fonts...
1018*5e7646d2SAndroid Build Coastguard Worker encoding[0] = '\0';
1019*5e7646d2SAndroid Build Coastguard Worker version[0] = '\0';
1020*5e7646d2SAndroid Build Coastguard Worker charset[0] = '\0';
1021*5e7646d2SAndroid Build Coastguard Worker status = PPDC_FONT_ROM;
1022*5e7646d2SAndroid Build Coastguard Worker }
1023*5e7646d2SAndroid Build Coastguard Worker else
1024*5e7646d2SAndroid Build Coastguard Worker {
1025*5e7646d2SAndroid Build Coastguard Worker // Load a full font definition...
1026*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, encoding, sizeof(encoding)))
1027*5e7646d2SAndroid Build Coastguard Worker {
1028*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1029*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected encoding after Font on line %d of "
1030*5e7646d2SAndroid Build Coastguard Worker "%s."), fp->line, fp->filename);
1031*5e7646d2SAndroid Build Coastguard Worker return (0);
1032*5e7646d2SAndroid Build Coastguard Worker }
1033*5e7646d2SAndroid Build Coastguard Worker
1034*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, version, sizeof(version)))
1035*5e7646d2SAndroid Build Coastguard Worker {
1036*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1037*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected version after Font on line %d of "
1038*5e7646d2SAndroid Build Coastguard Worker "%s."), fp->line, fp->filename);
1039*5e7646d2SAndroid Build Coastguard Worker return (0);
1040*5e7646d2SAndroid Build Coastguard Worker }
1041*5e7646d2SAndroid Build Coastguard Worker
1042*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, charset, sizeof(charset)))
1043*5e7646d2SAndroid Build Coastguard Worker {
1044*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1045*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected charset after Font on line %d of "
1046*5e7646d2SAndroid Build Coastguard Worker "%s."), fp->line, fp->filename);
1047*5e7646d2SAndroid Build Coastguard Worker return (0);
1048*5e7646d2SAndroid Build Coastguard Worker }
1049*5e7646d2SAndroid Build Coastguard Worker
1050*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, temp, sizeof(temp)))
1051*5e7646d2SAndroid Build Coastguard Worker {
1052*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1053*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected status after Font on line %d of %s."),
1054*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
1055*5e7646d2SAndroid Build Coastguard Worker return (0);
1056*5e7646d2SAndroid Build Coastguard Worker }
1057*5e7646d2SAndroid Build Coastguard Worker
1058*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(temp, "ROM"))
1059*5e7646d2SAndroid Build Coastguard Worker status = PPDC_FONT_ROM;
1060*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "Disk"))
1061*5e7646d2SAndroid Build Coastguard Worker status = PPDC_FONT_DISK;
1062*5e7646d2SAndroid Build Coastguard Worker else
1063*5e7646d2SAndroid Build Coastguard Worker {
1064*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1065*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Bad status keyword %s on line %d of %s."),
1066*5e7646d2SAndroid Build Coastguard Worker temp, fp->line, fp->filename);
1067*5e7646d2SAndroid Build Coastguard Worker return (0);
1068*5e7646d2SAndroid Build Coastguard Worker }
1069*5e7646d2SAndroid Build Coastguard Worker }
1070*5e7646d2SAndroid Build Coastguard Worker
1071*5e7646d2SAndroid Build Coastguard Worker // printf("Font %s %s %s %s %s\n", name, encoding, version, charset, temp);
1072*5e7646d2SAndroid Build Coastguard Worker
1073*5e7646d2SAndroid Build Coastguard Worker return (new ppdcFont(name, encoding, version, charset, status));
1074*5e7646d2SAndroid Build Coastguard Worker }
1075*5e7646d2SAndroid Build Coastguard Worker
1076*5e7646d2SAndroid Build Coastguard Worker
1077*5e7646d2SAndroid Build Coastguard Worker //
1078*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_generic()' - Get a generic old-style option.
1079*5e7646d2SAndroid Build Coastguard Worker //
1080*5e7646d2SAndroid Build Coastguard Worker
1081*5e7646d2SAndroid Build Coastguard Worker ppdcChoice * // O - Choice data
get_generic(ppdcFile * fp,const char * keyword,const char * tattr,const char * nattr)1082*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_generic(ppdcFile *fp, // I - File to read
1083*5e7646d2SAndroid Build Coastguard Worker const char *keyword,
1084*5e7646d2SAndroid Build Coastguard Worker // I - Keyword name
1085*5e7646d2SAndroid Build Coastguard Worker const char *tattr,
1086*5e7646d2SAndroid Build Coastguard Worker // I - Text attribute
1087*5e7646d2SAndroid Build Coastguard Worker const char *nattr)
1088*5e7646d2SAndroid Build Coastguard Worker // I - Numeric attribute
1089*5e7646d2SAndroid Build Coastguard Worker {
1090*5e7646d2SAndroid Build Coastguard Worker char name[1024], // Name
1091*5e7646d2SAndroid Build Coastguard Worker *text, // Text
1092*5e7646d2SAndroid Build Coastguard Worker command[256]; // Command string
1093*5e7646d2SAndroid Build Coastguard Worker int val; // Numeric value
1094*5e7646d2SAndroid Build Coastguard Worker
1095*5e7646d2SAndroid Build Coastguard Worker
1096*5e7646d2SAndroid Build Coastguard Worker // Read one of the following parameters:
1097*5e7646d2SAndroid Build Coastguard Worker //
1098*5e7646d2SAndroid Build Coastguard Worker // Foo name/text
1099*5e7646d2SAndroid Build Coastguard Worker // Foo integer name/text
1100*5e7646d2SAndroid Build Coastguard Worker if (nattr)
1101*5e7646d2SAndroid Build Coastguard Worker val = get_integer(fp);
1102*5e7646d2SAndroid Build Coastguard Worker else
1103*5e7646d2SAndroid Build Coastguard Worker val = 0;
1104*5e7646d2SAndroid Build Coastguard Worker
1105*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, name, sizeof(name)))
1106*5e7646d2SAndroid Build Coastguard Worker {
1107*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1108*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected name/text after %s on line %d of %s."),
1109*5e7646d2SAndroid Build Coastguard Worker keyword, fp->line, fp->filename);
1110*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1111*5e7646d2SAndroid Build Coastguard Worker }
1112*5e7646d2SAndroid Build Coastguard Worker
1113*5e7646d2SAndroid Build Coastguard Worker if ((text = strchr(name, '/')) != NULL)
1114*5e7646d2SAndroid Build Coastguard Worker *text++ = '\0';
1115*5e7646d2SAndroid Build Coastguard Worker else
1116*5e7646d2SAndroid Build Coastguard Worker text = name;
1117*5e7646d2SAndroid Build Coastguard Worker
1118*5e7646d2SAndroid Build Coastguard Worker if (nattr)
1119*5e7646d2SAndroid Build Coastguard Worker {
1120*5e7646d2SAndroid Build Coastguard Worker if (tattr)
1121*5e7646d2SAndroid Build Coastguard Worker snprintf(command, sizeof(command),
1122*5e7646d2SAndroid Build Coastguard Worker "<</%s(%s)/%s %d>>setpagedevice",
1123*5e7646d2SAndroid Build Coastguard Worker tattr, name, nattr, val);
1124*5e7646d2SAndroid Build Coastguard Worker else
1125*5e7646d2SAndroid Build Coastguard Worker snprintf(command, sizeof(command),
1126*5e7646d2SAndroid Build Coastguard Worker "<</%s %d>>setpagedevice",
1127*5e7646d2SAndroid Build Coastguard Worker nattr, val);
1128*5e7646d2SAndroid Build Coastguard Worker }
1129*5e7646d2SAndroid Build Coastguard Worker else
1130*5e7646d2SAndroid Build Coastguard Worker snprintf(command, sizeof(command),
1131*5e7646d2SAndroid Build Coastguard Worker "<</%s(%s)>>setpagedevice",
1132*5e7646d2SAndroid Build Coastguard Worker tattr, name);
1133*5e7646d2SAndroid Build Coastguard Worker
1134*5e7646d2SAndroid Build Coastguard Worker return (new ppdcChoice(name, text, command));
1135*5e7646d2SAndroid Build Coastguard Worker }
1136*5e7646d2SAndroid Build Coastguard Worker
1137*5e7646d2SAndroid Build Coastguard Worker
1138*5e7646d2SAndroid Build Coastguard Worker //
1139*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_group()' - Get an option group.
1140*5e7646d2SAndroid Build Coastguard Worker //
1141*5e7646d2SAndroid Build Coastguard Worker
1142*5e7646d2SAndroid Build Coastguard Worker ppdcGroup * // O - Group
get_group(ppdcFile * fp,ppdcDriver * d)1143*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_group(ppdcFile *fp, // I - File to read
1144*5e7646d2SAndroid Build Coastguard Worker ppdcDriver *d) // I - Printer driver
1145*5e7646d2SAndroid Build Coastguard Worker {
1146*5e7646d2SAndroid Build Coastguard Worker char name[1024], // UI name
1147*5e7646d2SAndroid Build Coastguard Worker *text; // UI text
1148*5e7646d2SAndroid Build Coastguard Worker ppdcGroup *g; // Group
1149*5e7646d2SAndroid Build Coastguard Worker
1150*5e7646d2SAndroid Build Coastguard Worker
1151*5e7646d2SAndroid Build Coastguard Worker // Read the Group parameters:
1152*5e7646d2SAndroid Build Coastguard Worker //
1153*5e7646d2SAndroid Build Coastguard Worker // Group name/text
1154*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, name, sizeof(name)))
1155*5e7646d2SAndroid Build Coastguard Worker {
1156*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1157*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected group name/text on line %d of %s."),
1158*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
1159*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1160*5e7646d2SAndroid Build Coastguard Worker }
1161*5e7646d2SAndroid Build Coastguard Worker
1162*5e7646d2SAndroid Build Coastguard Worker if ((text = strchr(name, '/')) != NULL)
1163*5e7646d2SAndroid Build Coastguard Worker *text++ = '\0';
1164*5e7646d2SAndroid Build Coastguard Worker else
1165*5e7646d2SAndroid Build Coastguard Worker text = name;
1166*5e7646d2SAndroid Build Coastguard Worker
1167*5e7646d2SAndroid Build Coastguard Worker // See if the group already exists...
1168*5e7646d2SAndroid Build Coastguard Worker if ((g = d->find_group(name)) == NULL)
1169*5e7646d2SAndroid Build Coastguard Worker {
1170*5e7646d2SAndroid Build Coastguard Worker // Nope, add a new one...
1171*5e7646d2SAndroid Build Coastguard Worker g = new ppdcGroup(name, text);
1172*5e7646d2SAndroid Build Coastguard Worker }
1173*5e7646d2SAndroid Build Coastguard Worker
1174*5e7646d2SAndroid Build Coastguard Worker return (g);
1175*5e7646d2SAndroid Build Coastguard Worker }
1176*5e7646d2SAndroid Build Coastguard Worker
1177*5e7646d2SAndroid Build Coastguard Worker
1178*5e7646d2SAndroid Build Coastguard Worker //
1179*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_installable()' - Get an installable option.
1180*5e7646d2SAndroid Build Coastguard Worker //
1181*5e7646d2SAndroid Build Coastguard Worker
1182*5e7646d2SAndroid Build Coastguard Worker ppdcOption * // O - Option
get_installable(ppdcFile * fp)1183*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_installable(ppdcFile *fp)
1184*5e7646d2SAndroid Build Coastguard Worker // I - File to read
1185*5e7646d2SAndroid Build Coastguard Worker {
1186*5e7646d2SAndroid Build Coastguard Worker char name[1024], // Name for installable option
1187*5e7646d2SAndroid Build Coastguard Worker *text; // Text for installable option
1188*5e7646d2SAndroid Build Coastguard Worker ppdcOption *o; // Option
1189*5e7646d2SAndroid Build Coastguard Worker
1190*5e7646d2SAndroid Build Coastguard Worker
1191*5e7646d2SAndroid Build Coastguard Worker // Read the parameter for an installable option:
1192*5e7646d2SAndroid Build Coastguard Worker //
1193*5e7646d2SAndroid Build Coastguard Worker // Installable name/text
1194*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, name, sizeof(name)))
1195*5e7646d2SAndroid Build Coastguard Worker {
1196*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1197*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected name/text after Installable on line %d "
1198*5e7646d2SAndroid Build Coastguard Worker "of %s."), fp->line, fp->filename);
1199*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1200*5e7646d2SAndroid Build Coastguard Worker }
1201*5e7646d2SAndroid Build Coastguard Worker
1202*5e7646d2SAndroid Build Coastguard Worker if ((text = strchr(name, '/')) != NULL)
1203*5e7646d2SAndroid Build Coastguard Worker *text++ = '\0';
1204*5e7646d2SAndroid Build Coastguard Worker else
1205*5e7646d2SAndroid Build Coastguard Worker text = name;
1206*5e7646d2SAndroid Build Coastguard Worker
1207*5e7646d2SAndroid Build Coastguard Worker // Create the option...
1208*5e7646d2SAndroid Build Coastguard Worker o = new ppdcOption(PPDC_BOOLEAN, name, text, PPDC_SECTION_ANY, 10.0f);
1209*5e7646d2SAndroid Build Coastguard Worker
1210*5e7646d2SAndroid Build Coastguard Worker // Add the false and true choices...
1211*5e7646d2SAndroid Build Coastguard Worker o->add_choice(new ppdcChoice("False", "Not Installed", ""));
1212*5e7646d2SAndroid Build Coastguard Worker o->add_choice(new ppdcChoice("True", "Installed", ""));
1213*5e7646d2SAndroid Build Coastguard Worker
1214*5e7646d2SAndroid Build Coastguard Worker return (o);
1215*5e7646d2SAndroid Build Coastguard Worker }
1216*5e7646d2SAndroid Build Coastguard Worker
1217*5e7646d2SAndroid Build Coastguard Worker
1218*5e7646d2SAndroid Build Coastguard Worker //
1219*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_integer()' - Get an integer value from a string.
1220*5e7646d2SAndroid Build Coastguard Worker //
1221*5e7646d2SAndroid Build Coastguard Worker
1222*5e7646d2SAndroid Build Coastguard Worker #define PPDC_XX -1 // Bad
1223*5e7646d2SAndroid Build Coastguard Worker #define PPDC_EQ 0 // ==
1224*5e7646d2SAndroid Build Coastguard Worker #define PPDC_NE 1 // !=
1225*5e7646d2SAndroid Build Coastguard Worker #define PPDC_LT 2 // <
1226*5e7646d2SAndroid Build Coastguard Worker #define PPDC_LE 3 // <=
1227*5e7646d2SAndroid Build Coastguard Worker #define PPDC_GT 4 // >
1228*5e7646d2SAndroid Build Coastguard Worker #define PPDC_GE 5 // >=
1229*5e7646d2SAndroid Build Coastguard Worker
1230*5e7646d2SAndroid Build Coastguard Worker int // O - Integer value
get_integer(const char * v)1231*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_integer(const char *v) // I - Value string
1232*5e7646d2SAndroid Build Coastguard Worker {
1233*5e7646d2SAndroid Build Coastguard Worker long val; // Value
1234*5e7646d2SAndroid Build Coastguard Worker long temp, // Temporary value
1235*5e7646d2SAndroid Build Coastguard Worker temp2; // Second temporary value
1236*5e7646d2SAndroid Build Coastguard Worker char *newv, // New value string pointer
1237*5e7646d2SAndroid Build Coastguard Worker ch; // Temporary character
1238*5e7646d2SAndroid Build Coastguard Worker ppdcVariable *var; // #define variable
1239*5e7646d2SAndroid Build Coastguard Worker int compop; // Comparison operator
1240*5e7646d2SAndroid Build Coastguard Worker
1241*5e7646d2SAndroid Build Coastguard Worker
1242*5e7646d2SAndroid Build Coastguard Worker // Parse the value string...
1243*5e7646d2SAndroid Build Coastguard Worker if (!v)
1244*5e7646d2SAndroid Build Coastguard Worker return (-1);
1245*5e7646d2SAndroid Build Coastguard Worker
1246*5e7646d2SAndroid Build Coastguard Worker if (isdigit(*v & 255) || *v == '-' || *v == '+')
1247*5e7646d2SAndroid Build Coastguard Worker {
1248*5e7646d2SAndroid Build Coastguard Worker // Return a simple integer value
1249*5e7646d2SAndroid Build Coastguard Worker val = strtol(v, (char **)&v, 0);
1250*5e7646d2SAndroid Build Coastguard Worker if (*v || val == LONG_MIN)
1251*5e7646d2SAndroid Build Coastguard Worker return (-1);
1252*5e7646d2SAndroid Build Coastguard Worker else
1253*5e7646d2SAndroid Build Coastguard Worker return ((int)val);
1254*5e7646d2SAndroid Build Coastguard Worker }
1255*5e7646d2SAndroid Build Coastguard Worker else if (*v == '(')
1256*5e7646d2SAndroid Build Coastguard Worker {
1257*5e7646d2SAndroid Build Coastguard Worker // Evaluate and expression in any of the following formats:
1258*5e7646d2SAndroid Build Coastguard Worker //
1259*5e7646d2SAndroid Build Coastguard Worker // (number number ... number) Bitwise OR of all numbers
1260*5e7646d2SAndroid Build Coastguard Worker // (NAME == value) 1 if equal, 0 otherwise
1261*5e7646d2SAndroid Build Coastguard Worker // (NAME != value) 1 if not equal, 0 otherwise
1262*5e7646d2SAndroid Build Coastguard Worker // (NAME < value) 1 if less than, 0 otherwise
1263*5e7646d2SAndroid Build Coastguard Worker // (NAME <= value) 1 if less than or equal, 0 otherwise
1264*5e7646d2SAndroid Build Coastguard Worker // (NAME > value) 1 if greater than, 0 otherwise
1265*5e7646d2SAndroid Build Coastguard Worker // (NAME >= value) 1 if greater than or equal, 0 otherwise
1266*5e7646d2SAndroid Build Coastguard Worker
1267*5e7646d2SAndroid Build Coastguard Worker v ++;
1268*5e7646d2SAndroid Build Coastguard Worker val = 0;
1269*5e7646d2SAndroid Build Coastguard Worker
1270*5e7646d2SAndroid Build Coastguard Worker while (*v && *v != ')')
1271*5e7646d2SAndroid Build Coastguard Worker {
1272*5e7646d2SAndroid Build Coastguard Worker // Skip leading whitespace...
1273*5e7646d2SAndroid Build Coastguard Worker while (*v && isspace(*v & 255))
1274*5e7646d2SAndroid Build Coastguard Worker v ++;
1275*5e7646d2SAndroid Build Coastguard Worker
1276*5e7646d2SAndroid Build Coastguard Worker if (!*v || *v == ')')
1277*5e7646d2SAndroid Build Coastguard Worker break;
1278*5e7646d2SAndroid Build Coastguard Worker
1279*5e7646d2SAndroid Build Coastguard Worker if (isdigit(*v & 255) || *v == '-' || *v == '+')
1280*5e7646d2SAndroid Build Coastguard Worker {
1281*5e7646d2SAndroid Build Coastguard Worker // Bitwise OR a number...
1282*5e7646d2SAndroid Build Coastguard Worker temp = strtol(v, &newv, 0);
1283*5e7646d2SAndroid Build Coastguard Worker
1284*5e7646d2SAndroid Build Coastguard Worker if (!*newv || newv == v || !(isspace(*newv) || *newv == ')') ||
1285*5e7646d2SAndroid Build Coastguard Worker temp == LONG_MIN)
1286*5e7646d2SAndroid Build Coastguard Worker return (-1);
1287*5e7646d2SAndroid Build Coastguard Worker }
1288*5e7646d2SAndroid Build Coastguard Worker else
1289*5e7646d2SAndroid Build Coastguard Worker {
1290*5e7646d2SAndroid Build Coastguard Worker // NAME logicop value
1291*5e7646d2SAndroid Build Coastguard Worker for (newv = (char *)v + 1;
1292*5e7646d2SAndroid Build Coastguard Worker *newv && (isalnum(*newv & 255) || *newv == '_');
1293*5e7646d2SAndroid Build Coastguard Worker newv ++)
1294*5e7646d2SAndroid Build Coastguard Worker /* do nothing */;
1295*5e7646d2SAndroid Build Coastguard Worker
1296*5e7646d2SAndroid Build Coastguard Worker ch = *newv;
1297*5e7646d2SAndroid Build Coastguard Worker *newv = '\0';
1298*5e7646d2SAndroid Build Coastguard Worker
1299*5e7646d2SAndroid Build Coastguard Worker if ((var = find_variable(v)) != NULL)
1300*5e7646d2SAndroid Build Coastguard Worker {
1301*5e7646d2SAndroid Build Coastguard Worker if (!var->value || !var->value->value || !var->value->value[0])
1302*5e7646d2SAndroid Build Coastguard Worker temp = 0;
1303*5e7646d2SAndroid Build Coastguard Worker else if (isdigit(var->value->value[0] & 255) ||
1304*5e7646d2SAndroid Build Coastguard Worker var->value->value[0] == '-' ||
1305*5e7646d2SAndroid Build Coastguard Worker var->value->value[0] == '+')
1306*5e7646d2SAndroid Build Coastguard Worker temp = strtol(var->value->value, NULL, 0);
1307*5e7646d2SAndroid Build Coastguard Worker else
1308*5e7646d2SAndroid Build Coastguard Worker temp = 1;
1309*5e7646d2SAndroid Build Coastguard Worker }
1310*5e7646d2SAndroid Build Coastguard Worker else
1311*5e7646d2SAndroid Build Coastguard Worker temp = 0;
1312*5e7646d2SAndroid Build Coastguard Worker
1313*5e7646d2SAndroid Build Coastguard Worker *newv = ch;
1314*5e7646d2SAndroid Build Coastguard Worker while (isspace(*newv & 255))
1315*5e7646d2SAndroid Build Coastguard Worker newv ++;
1316*5e7646d2SAndroid Build Coastguard Worker
1317*5e7646d2SAndroid Build Coastguard Worker if (!strncmp(newv, "==", 2))
1318*5e7646d2SAndroid Build Coastguard Worker {
1319*5e7646d2SAndroid Build Coastguard Worker compop = PPDC_EQ;
1320*5e7646d2SAndroid Build Coastguard Worker newv += 2;
1321*5e7646d2SAndroid Build Coastguard Worker }
1322*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(newv, "!=", 2))
1323*5e7646d2SAndroid Build Coastguard Worker {
1324*5e7646d2SAndroid Build Coastguard Worker compop = PPDC_NE;
1325*5e7646d2SAndroid Build Coastguard Worker newv += 2;
1326*5e7646d2SAndroid Build Coastguard Worker }
1327*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(newv, "<=", 2))
1328*5e7646d2SAndroid Build Coastguard Worker {
1329*5e7646d2SAndroid Build Coastguard Worker compop = PPDC_LE;
1330*5e7646d2SAndroid Build Coastguard Worker newv += 2;
1331*5e7646d2SAndroid Build Coastguard Worker }
1332*5e7646d2SAndroid Build Coastguard Worker else if (*newv == '<')
1333*5e7646d2SAndroid Build Coastguard Worker {
1334*5e7646d2SAndroid Build Coastguard Worker compop = PPDC_LT;
1335*5e7646d2SAndroid Build Coastguard Worker newv ++;
1336*5e7646d2SAndroid Build Coastguard Worker }
1337*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(newv, ">=", 2))
1338*5e7646d2SAndroid Build Coastguard Worker {
1339*5e7646d2SAndroid Build Coastguard Worker compop = PPDC_GE;
1340*5e7646d2SAndroid Build Coastguard Worker newv += 2;
1341*5e7646d2SAndroid Build Coastguard Worker }
1342*5e7646d2SAndroid Build Coastguard Worker else if (*newv == '>')
1343*5e7646d2SAndroid Build Coastguard Worker {
1344*5e7646d2SAndroid Build Coastguard Worker compop = PPDC_GT;
1345*5e7646d2SAndroid Build Coastguard Worker newv ++;
1346*5e7646d2SAndroid Build Coastguard Worker }
1347*5e7646d2SAndroid Build Coastguard Worker else
1348*5e7646d2SAndroid Build Coastguard Worker compop = PPDC_XX;
1349*5e7646d2SAndroid Build Coastguard Worker
1350*5e7646d2SAndroid Build Coastguard Worker if (compop != PPDC_XX)
1351*5e7646d2SAndroid Build Coastguard Worker {
1352*5e7646d2SAndroid Build Coastguard Worker while (isspace(*newv & 255))
1353*5e7646d2SAndroid Build Coastguard Worker newv ++;
1354*5e7646d2SAndroid Build Coastguard Worker
1355*5e7646d2SAndroid Build Coastguard Worker if (*newv == ')' || !*newv)
1356*5e7646d2SAndroid Build Coastguard Worker return (-1);
1357*5e7646d2SAndroid Build Coastguard Worker
1358*5e7646d2SAndroid Build Coastguard Worker if (isdigit(*newv & 255) || *newv == '-' || *newv == '+')
1359*5e7646d2SAndroid Build Coastguard Worker {
1360*5e7646d2SAndroid Build Coastguard Worker // Get the second number...
1361*5e7646d2SAndroid Build Coastguard Worker temp2 = strtol(newv, &newv, 0);
1362*5e7646d2SAndroid Build Coastguard Worker if (!*newv || newv == v || !(isspace(*newv) || *newv == ')') ||
1363*5e7646d2SAndroid Build Coastguard Worker temp == LONG_MIN)
1364*5e7646d2SAndroid Build Coastguard Worker return (-1);
1365*5e7646d2SAndroid Build Coastguard Worker }
1366*5e7646d2SAndroid Build Coastguard Worker else
1367*5e7646d2SAndroid Build Coastguard Worker {
1368*5e7646d2SAndroid Build Coastguard Worker // Lookup the second name...
1369*5e7646d2SAndroid Build Coastguard Worker for (v = newv, newv ++;
1370*5e7646d2SAndroid Build Coastguard Worker *newv && (isalnum(*newv & 255) || *newv == '_');
1371*5e7646d2SAndroid Build Coastguard Worker newv ++);
1372*5e7646d2SAndroid Build Coastguard Worker
1373*5e7646d2SAndroid Build Coastguard Worker ch = *newv;
1374*5e7646d2SAndroid Build Coastguard Worker *newv = '\0';
1375*5e7646d2SAndroid Build Coastguard Worker
1376*5e7646d2SAndroid Build Coastguard Worker if ((var = find_variable(v)) != NULL)
1377*5e7646d2SAndroid Build Coastguard Worker {
1378*5e7646d2SAndroid Build Coastguard Worker if (!var->value || !var->value->value || !var->value->value[0])
1379*5e7646d2SAndroid Build Coastguard Worker temp2 = 0;
1380*5e7646d2SAndroid Build Coastguard Worker else if (isdigit(var->value->value[0] & 255) ||
1381*5e7646d2SAndroid Build Coastguard Worker var->value->value[0] == '-' ||
1382*5e7646d2SAndroid Build Coastguard Worker var->value->value[0] == '+')
1383*5e7646d2SAndroid Build Coastguard Worker temp2 = strtol(var->value->value, NULL, 0);
1384*5e7646d2SAndroid Build Coastguard Worker else
1385*5e7646d2SAndroid Build Coastguard Worker temp2 = 1;
1386*5e7646d2SAndroid Build Coastguard Worker }
1387*5e7646d2SAndroid Build Coastguard Worker else
1388*5e7646d2SAndroid Build Coastguard Worker temp2 = 0;
1389*5e7646d2SAndroid Build Coastguard Worker
1390*5e7646d2SAndroid Build Coastguard Worker *newv = ch;
1391*5e7646d2SAndroid Build Coastguard Worker }
1392*5e7646d2SAndroid Build Coastguard Worker
1393*5e7646d2SAndroid Build Coastguard Worker // Do the comparison...
1394*5e7646d2SAndroid Build Coastguard Worker switch (compop)
1395*5e7646d2SAndroid Build Coastguard Worker {
1396*5e7646d2SAndroid Build Coastguard Worker case PPDC_EQ :
1397*5e7646d2SAndroid Build Coastguard Worker temp = temp == temp2;
1398*5e7646d2SAndroid Build Coastguard Worker break;
1399*5e7646d2SAndroid Build Coastguard Worker case PPDC_NE :
1400*5e7646d2SAndroid Build Coastguard Worker temp = temp != temp2;
1401*5e7646d2SAndroid Build Coastguard Worker break;
1402*5e7646d2SAndroid Build Coastguard Worker case PPDC_LT :
1403*5e7646d2SAndroid Build Coastguard Worker temp = temp < temp2;
1404*5e7646d2SAndroid Build Coastguard Worker break;
1405*5e7646d2SAndroid Build Coastguard Worker case PPDC_LE :
1406*5e7646d2SAndroid Build Coastguard Worker temp = temp <= temp2;
1407*5e7646d2SAndroid Build Coastguard Worker break;
1408*5e7646d2SAndroid Build Coastguard Worker case PPDC_GT :
1409*5e7646d2SAndroid Build Coastguard Worker temp = temp > temp2;
1410*5e7646d2SAndroid Build Coastguard Worker break;
1411*5e7646d2SAndroid Build Coastguard Worker case PPDC_GE :
1412*5e7646d2SAndroid Build Coastguard Worker temp = temp >= temp2;
1413*5e7646d2SAndroid Build Coastguard Worker break;
1414*5e7646d2SAndroid Build Coastguard Worker }
1415*5e7646d2SAndroid Build Coastguard Worker }
1416*5e7646d2SAndroid Build Coastguard Worker }
1417*5e7646d2SAndroid Build Coastguard Worker
1418*5e7646d2SAndroid Build Coastguard Worker val |= temp;
1419*5e7646d2SAndroid Build Coastguard Worker v = newv;
1420*5e7646d2SAndroid Build Coastguard Worker }
1421*5e7646d2SAndroid Build Coastguard Worker
1422*5e7646d2SAndroid Build Coastguard Worker if (*v == ')' && !v[1])
1423*5e7646d2SAndroid Build Coastguard Worker return ((int)val);
1424*5e7646d2SAndroid Build Coastguard Worker else
1425*5e7646d2SAndroid Build Coastguard Worker return (-1);
1426*5e7646d2SAndroid Build Coastguard Worker }
1427*5e7646d2SAndroid Build Coastguard Worker else if ((var = find_variable(v)) != NULL)
1428*5e7646d2SAndroid Build Coastguard Worker {
1429*5e7646d2SAndroid Build Coastguard Worker // NAME by itself returns 1 if the #define variable is not blank and
1430*5e7646d2SAndroid Build Coastguard Worker // not "0"...
1431*5e7646d2SAndroid Build Coastguard Worker return (var->value->value && var->value->value[0] &&
1432*5e7646d2SAndroid Build Coastguard Worker strcmp(var->value->value, "0"));
1433*5e7646d2SAndroid Build Coastguard Worker }
1434*5e7646d2SAndroid Build Coastguard Worker else
1435*5e7646d2SAndroid Build Coastguard Worker {
1436*5e7646d2SAndroid Build Coastguard Worker // Anything else is an error...
1437*5e7646d2SAndroid Build Coastguard Worker return (-1);
1438*5e7646d2SAndroid Build Coastguard Worker }
1439*5e7646d2SAndroid Build Coastguard Worker }
1440*5e7646d2SAndroid Build Coastguard Worker
1441*5e7646d2SAndroid Build Coastguard Worker
1442*5e7646d2SAndroid Build Coastguard Worker //
1443*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_integer()' - Get an integer value from a file.
1444*5e7646d2SAndroid Build Coastguard Worker //
1445*5e7646d2SAndroid Build Coastguard Worker
1446*5e7646d2SAndroid Build Coastguard Worker int // O - Integer value
get_integer(ppdcFile * fp)1447*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_integer(ppdcFile *fp) // I - File to read
1448*5e7646d2SAndroid Build Coastguard Worker {
1449*5e7646d2SAndroid Build Coastguard Worker char temp[1024]; // String buffer
1450*5e7646d2SAndroid Build Coastguard Worker
1451*5e7646d2SAndroid Build Coastguard Worker
1452*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, temp, sizeof(temp)))
1453*5e7646d2SAndroid Build Coastguard Worker {
1454*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("ppdc: Expected integer on line %d of %s."),
1455*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
1456*5e7646d2SAndroid Build Coastguard Worker return (-1);
1457*5e7646d2SAndroid Build Coastguard Worker }
1458*5e7646d2SAndroid Build Coastguard Worker else
1459*5e7646d2SAndroid Build Coastguard Worker return (get_integer(temp));
1460*5e7646d2SAndroid Build Coastguard Worker }
1461*5e7646d2SAndroid Build Coastguard Worker
1462*5e7646d2SAndroid Build Coastguard Worker
1463*5e7646d2SAndroid Build Coastguard Worker //
1464*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_measurement()' - Get a measurement value.
1465*5e7646d2SAndroid Build Coastguard Worker //
1466*5e7646d2SAndroid Build Coastguard Worker
1467*5e7646d2SAndroid Build Coastguard Worker float // O - Measurement value in points
get_measurement(ppdcFile * fp)1468*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_measurement(ppdcFile *fp)
1469*5e7646d2SAndroid Build Coastguard Worker // I - File to read
1470*5e7646d2SAndroid Build Coastguard Worker {
1471*5e7646d2SAndroid Build Coastguard Worker char buffer[256], // Number buffer
1472*5e7646d2SAndroid Build Coastguard Worker *ptr; // Pointer into buffer
1473*5e7646d2SAndroid Build Coastguard Worker float val; // Measurement value
1474*5e7646d2SAndroid Build Coastguard Worker
1475*5e7646d2SAndroid Build Coastguard Worker
1476*5e7646d2SAndroid Build Coastguard Worker // Grab a token from the file...
1477*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, buffer, sizeof(buffer)))
1478*5e7646d2SAndroid Build Coastguard Worker return (-1.0f);
1479*5e7646d2SAndroid Build Coastguard Worker
1480*5e7646d2SAndroid Build Coastguard Worker // Get the floating point value of "s" and skip all digits and decimal points.
1481*5e7646d2SAndroid Build Coastguard Worker val = (float)strtod(buffer, &ptr);
1482*5e7646d2SAndroid Build Coastguard Worker
1483*5e7646d2SAndroid Build Coastguard Worker // Check for a trailing unit specifier...
1484*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(ptr, "mm"))
1485*5e7646d2SAndroid Build Coastguard Worker val *= 72.0f / 25.4f;
1486*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(ptr, "cm"))
1487*5e7646d2SAndroid Build Coastguard Worker val *= 72.0f / 2.54f;
1488*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(ptr, "m"))
1489*5e7646d2SAndroid Build Coastguard Worker val *= 72.0f / 0.0254f;
1490*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(ptr, "in"))
1491*5e7646d2SAndroid Build Coastguard Worker val *= 72.0f;
1492*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(ptr, "ft"))
1493*5e7646d2SAndroid Build Coastguard Worker val *= 72.0f * 12.0f;
1494*5e7646d2SAndroid Build Coastguard Worker else if (_cups_strcasecmp(ptr, "pt") && *ptr)
1495*5e7646d2SAndroid Build Coastguard Worker return (-1.0f);
1496*5e7646d2SAndroid Build Coastguard Worker
1497*5e7646d2SAndroid Build Coastguard Worker return (val);
1498*5e7646d2SAndroid Build Coastguard Worker }
1499*5e7646d2SAndroid Build Coastguard Worker
1500*5e7646d2SAndroid Build Coastguard Worker
1501*5e7646d2SAndroid Build Coastguard Worker //
1502*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_option()' - Get an option definition.
1503*5e7646d2SAndroid Build Coastguard Worker //
1504*5e7646d2SAndroid Build Coastguard Worker
1505*5e7646d2SAndroid Build Coastguard Worker ppdcOption * // O - Option
get_option(ppdcFile * fp,ppdcDriver * d,ppdcGroup * g)1506*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_option(ppdcFile *fp, // I - File to read
1507*5e7646d2SAndroid Build Coastguard Worker ppdcDriver *d, // I - Printer driver
1508*5e7646d2SAndroid Build Coastguard Worker ppdcGroup *g) // I - Current group
1509*5e7646d2SAndroid Build Coastguard Worker {
1510*5e7646d2SAndroid Build Coastguard Worker char name[1024], // UI name
1511*5e7646d2SAndroid Build Coastguard Worker *text, // UI text
1512*5e7646d2SAndroid Build Coastguard Worker type[256]; // UI type string
1513*5e7646d2SAndroid Build Coastguard Worker ppdcOptType ot; // Option type value
1514*5e7646d2SAndroid Build Coastguard Worker ppdcOptSection section; // Option section
1515*5e7646d2SAndroid Build Coastguard Worker float order; // Option order
1516*5e7646d2SAndroid Build Coastguard Worker ppdcOption *o; // Option
1517*5e7646d2SAndroid Build Coastguard Worker ppdcGroup *mg; // Matching group, if any
1518*5e7646d2SAndroid Build Coastguard Worker
1519*5e7646d2SAndroid Build Coastguard Worker
1520*5e7646d2SAndroid Build Coastguard Worker // Read the Option parameters:
1521*5e7646d2SAndroid Build Coastguard Worker //
1522*5e7646d2SAndroid Build Coastguard Worker // Option name/text type section order
1523*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, name, sizeof(name)))
1524*5e7646d2SAndroid Build Coastguard Worker {
1525*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1526*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected option name/text on line %d of %s."),
1527*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
1528*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1529*5e7646d2SAndroid Build Coastguard Worker }
1530*5e7646d2SAndroid Build Coastguard Worker
1531*5e7646d2SAndroid Build Coastguard Worker if ((text = strchr(name, '/')) != NULL)
1532*5e7646d2SAndroid Build Coastguard Worker *text++ = '\0';
1533*5e7646d2SAndroid Build Coastguard Worker else
1534*5e7646d2SAndroid Build Coastguard Worker text = name;
1535*5e7646d2SAndroid Build Coastguard Worker
1536*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, type, sizeof(type)))
1537*5e7646d2SAndroid Build Coastguard Worker {
1538*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("ppdc: Expected option type on line %d of %s."),
1539*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
1540*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1541*5e7646d2SAndroid Build Coastguard Worker }
1542*5e7646d2SAndroid Build Coastguard Worker
1543*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(type, "boolean"))
1544*5e7646d2SAndroid Build Coastguard Worker ot = PPDC_BOOLEAN;
1545*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(type, "pickone"))
1546*5e7646d2SAndroid Build Coastguard Worker ot = PPDC_PICKONE;
1547*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(type, "pickmany"))
1548*5e7646d2SAndroid Build Coastguard Worker ot = PPDC_PICKMANY;
1549*5e7646d2SAndroid Build Coastguard Worker else
1550*5e7646d2SAndroid Build Coastguard Worker {
1551*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1552*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Invalid option type \"%s\" on line %d of %s."),
1553*5e7646d2SAndroid Build Coastguard Worker type, fp->line, fp->filename);
1554*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1555*5e7646d2SAndroid Build Coastguard Worker }
1556*5e7646d2SAndroid Build Coastguard Worker
1557*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, type, sizeof(type)))
1558*5e7646d2SAndroid Build Coastguard Worker {
1559*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1560*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected option section on line %d of %s."),
1561*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
1562*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1563*5e7646d2SAndroid Build Coastguard Worker }
1564*5e7646d2SAndroid Build Coastguard Worker
1565*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(type, "AnySetup"))
1566*5e7646d2SAndroid Build Coastguard Worker section = PPDC_SECTION_ANY;
1567*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(type, "DocumentSetup"))
1568*5e7646d2SAndroid Build Coastguard Worker section = PPDC_SECTION_DOCUMENT;
1569*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(type, "ExitServer"))
1570*5e7646d2SAndroid Build Coastguard Worker section = PPDC_SECTION_EXIT;
1571*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(type, "JCLSetup"))
1572*5e7646d2SAndroid Build Coastguard Worker section = PPDC_SECTION_JCL;
1573*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(type, "PageSetup"))
1574*5e7646d2SAndroid Build Coastguard Worker section = PPDC_SECTION_PAGE;
1575*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(type, "Prolog"))
1576*5e7646d2SAndroid Build Coastguard Worker section = PPDC_SECTION_PROLOG;
1577*5e7646d2SAndroid Build Coastguard Worker else
1578*5e7646d2SAndroid Build Coastguard Worker {
1579*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1580*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Invalid option section \"%s\" on line %d of "
1581*5e7646d2SAndroid Build Coastguard Worker "%s."), type, fp->line, fp->filename);
1582*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1583*5e7646d2SAndroid Build Coastguard Worker }
1584*5e7646d2SAndroid Build Coastguard Worker
1585*5e7646d2SAndroid Build Coastguard Worker order = get_float(fp);
1586*5e7646d2SAndroid Build Coastguard Worker
1587*5e7646d2SAndroid Build Coastguard Worker // See if the option already exists...
1588*5e7646d2SAndroid Build Coastguard Worker if ((o = d->find_option_group(name, &mg)) == NULL)
1589*5e7646d2SAndroid Build Coastguard Worker {
1590*5e7646d2SAndroid Build Coastguard Worker // Nope, add a new one...
1591*5e7646d2SAndroid Build Coastguard Worker o = new ppdcOption(ot, name, text, section, order);
1592*5e7646d2SAndroid Build Coastguard Worker }
1593*5e7646d2SAndroid Build Coastguard Worker else if (o->type != ot)
1594*5e7646d2SAndroid Build Coastguard Worker {
1595*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1596*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Option %s redefined with a different type on line "
1597*5e7646d2SAndroid Build Coastguard Worker "%d of %s."), name, fp->line, fp->filename);
1598*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1599*5e7646d2SAndroid Build Coastguard Worker }
1600*5e7646d2SAndroid Build Coastguard Worker else if (g != mg)
1601*5e7646d2SAndroid Build Coastguard Worker {
1602*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1603*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Option %s defined in two different groups on line "
1604*5e7646d2SAndroid Build Coastguard Worker "%d of %s."), name, fp->line, fp->filename);
1605*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1606*5e7646d2SAndroid Build Coastguard Worker }
1607*5e7646d2SAndroid Build Coastguard Worker
1608*5e7646d2SAndroid Build Coastguard Worker return (o);
1609*5e7646d2SAndroid Build Coastguard Worker }
1610*5e7646d2SAndroid Build Coastguard Worker
1611*5e7646d2SAndroid Build Coastguard Worker
1612*5e7646d2SAndroid Build Coastguard Worker //
1613*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_po()' - Get a message catalog.
1614*5e7646d2SAndroid Build Coastguard Worker //
1615*5e7646d2SAndroid Build Coastguard Worker
1616*5e7646d2SAndroid Build Coastguard Worker ppdcCatalog * // O - Message catalog
get_po(ppdcFile * fp)1617*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_po(ppdcFile *fp) // I - File to read
1618*5e7646d2SAndroid Build Coastguard Worker {
1619*5e7646d2SAndroid Build Coastguard Worker char locale[32], // Locale name
1620*5e7646d2SAndroid Build Coastguard Worker poname[1024], // Message catalog filename
1621*5e7646d2SAndroid Build Coastguard Worker basedir[1024], // Base directory
1622*5e7646d2SAndroid Build Coastguard Worker *baseptr, // Pointer into directory
1623*5e7646d2SAndroid Build Coastguard Worker pofilename[1024]; // Full filename of message catalog
1624*5e7646d2SAndroid Build Coastguard Worker ppdcCatalog *cat; // Message catalog
1625*5e7646d2SAndroid Build Coastguard Worker
1626*5e7646d2SAndroid Build Coastguard Worker
1627*5e7646d2SAndroid Build Coastguard Worker // Read the #po parameters:
1628*5e7646d2SAndroid Build Coastguard Worker //
1629*5e7646d2SAndroid Build Coastguard Worker // #po locale "filename.po"
1630*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, locale, sizeof(locale)))
1631*5e7646d2SAndroid Build Coastguard Worker {
1632*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1633*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected locale after #po on line %d of %s."),
1634*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
1635*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1636*5e7646d2SAndroid Build Coastguard Worker }
1637*5e7646d2SAndroid Build Coastguard Worker
1638*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, poname, sizeof(poname)))
1639*5e7646d2SAndroid Build Coastguard Worker {
1640*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1641*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected filename after #po %s on line %d of "
1642*5e7646d2SAndroid Build Coastguard Worker "%s."), locale, fp->line, fp->filename);
1643*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1644*5e7646d2SAndroid Build Coastguard Worker }
1645*5e7646d2SAndroid Build Coastguard Worker
1646*5e7646d2SAndroid Build Coastguard Worker // See if the locale is already loaded...
1647*5e7646d2SAndroid Build Coastguard Worker if (find_po(locale))
1648*5e7646d2SAndroid Build Coastguard Worker {
1649*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1650*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Duplicate #po for locale %s on line %d of %s."),
1651*5e7646d2SAndroid Build Coastguard Worker locale, fp->line, fp->filename);
1652*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1653*5e7646d2SAndroid Build Coastguard Worker }
1654*5e7646d2SAndroid Build Coastguard Worker
1655*5e7646d2SAndroid Build Coastguard Worker // Figure out the current directory...
1656*5e7646d2SAndroid Build Coastguard Worker strlcpy(basedir, fp->filename, sizeof(basedir));
1657*5e7646d2SAndroid Build Coastguard Worker
1658*5e7646d2SAndroid Build Coastguard Worker if ((baseptr = strrchr(basedir, '/')) != NULL)
1659*5e7646d2SAndroid Build Coastguard Worker *baseptr = '\0';
1660*5e7646d2SAndroid Build Coastguard Worker else
1661*5e7646d2SAndroid Build Coastguard Worker strlcpy(basedir, ".", sizeof(basedir));
1662*5e7646d2SAndroid Build Coastguard Worker
1663*5e7646d2SAndroid Build Coastguard Worker // Find the po file...
1664*5e7646d2SAndroid Build Coastguard Worker pofilename[0] = '\0';
1665*5e7646d2SAndroid Build Coastguard Worker
1666*5e7646d2SAndroid Build Coastguard Worker if (!poname[0] ||
1667*5e7646d2SAndroid Build Coastguard Worker find_include(poname, basedir, pofilename, sizeof(pofilename)))
1668*5e7646d2SAndroid Build Coastguard Worker {
1669*5e7646d2SAndroid Build Coastguard Worker // Found it, so load it...
1670*5e7646d2SAndroid Build Coastguard Worker cat = new ppdcCatalog(locale, pofilename);
1671*5e7646d2SAndroid Build Coastguard Worker
1672*5e7646d2SAndroid Build Coastguard Worker // Reset the filename to the name supplied by the user...
1673*5e7646d2SAndroid Build Coastguard Worker cat->filename->release();
1674*5e7646d2SAndroid Build Coastguard Worker cat->filename = new ppdcString(poname);
1675*5e7646d2SAndroid Build Coastguard Worker
1676*5e7646d2SAndroid Build Coastguard Worker // Return the catalog...
1677*5e7646d2SAndroid Build Coastguard Worker return (cat);
1678*5e7646d2SAndroid Build Coastguard Worker }
1679*5e7646d2SAndroid Build Coastguard Worker else
1680*5e7646d2SAndroid Build Coastguard Worker {
1681*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1682*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Unable to find #po file %s on line %d of %s."),
1683*5e7646d2SAndroid Build Coastguard Worker poname, fp->line, fp->filename);
1684*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1685*5e7646d2SAndroid Build Coastguard Worker }
1686*5e7646d2SAndroid Build Coastguard Worker }
1687*5e7646d2SAndroid Build Coastguard Worker
1688*5e7646d2SAndroid Build Coastguard Worker
1689*5e7646d2SAndroid Build Coastguard Worker //
1690*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_resolution()' - Get an old-style resolution option.
1691*5e7646d2SAndroid Build Coastguard Worker //
1692*5e7646d2SAndroid Build Coastguard Worker
1693*5e7646d2SAndroid Build Coastguard Worker ppdcChoice * // O - Choice data
get_resolution(ppdcFile * fp)1694*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_resolution(ppdcFile *fp)// I - File to read
1695*5e7646d2SAndroid Build Coastguard Worker {
1696*5e7646d2SAndroid Build Coastguard Worker char name[1024], // Name
1697*5e7646d2SAndroid Build Coastguard Worker *text, // Text
1698*5e7646d2SAndroid Build Coastguard Worker temp[256], // Temporary string
1699*5e7646d2SAndroid Build Coastguard Worker command[256], // Command string
1700*5e7646d2SAndroid Build Coastguard Worker *commptr; // Pointer into command
1701*5e7646d2SAndroid Build Coastguard Worker int xdpi, ydpi, // X + Y resolution
1702*5e7646d2SAndroid Build Coastguard Worker color_order, // Color order
1703*5e7646d2SAndroid Build Coastguard Worker color_space, // Colorspace
1704*5e7646d2SAndroid Build Coastguard Worker compression, // Compression mode
1705*5e7646d2SAndroid Build Coastguard Worker depth, // Bits per color
1706*5e7646d2SAndroid Build Coastguard Worker row_count, // Row count
1707*5e7646d2SAndroid Build Coastguard Worker row_feed, // Row feed
1708*5e7646d2SAndroid Build Coastguard Worker row_step; // Row step/interval
1709*5e7646d2SAndroid Build Coastguard Worker
1710*5e7646d2SAndroid Build Coastguard Worker
1711*5e7646d2SAndroid Build Coastguard Worker // Read the resolution parameters:
1712*5e7646d2SAndroid Build Coastguard Worker //
1713*5e7646d2SAndroid Build Coastguard Worker // Resolution colorspace bits row-count row-feed row-step name/text
1714*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, temp, sizeof(temp)))
1715*5e7646d2SAndroid Build Coastguard Worker {
1716*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1717*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected override field after Resolution on line "
1718*5e7646d2SAndroid Build Coastguard Worker "%d of %s."), fp->line, fp->filename);
1719*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1720*5e7646d2SAndroid Build Coastguard Worker }
1721*5e7646d2SAndroid Build Coastguard Worker
1722*5e7646d2SAndroid Build Coastguard Worker color_order = get_color_order(temp);
1723*5e7646d2SAndroid Build Coastguard Worker color_space = get_color_space(temp);
1724*5e7646d2SAndroid Build Coastguard Worker compression = get_integer(temp);
1725*5e7646d2SAndroid Build Coastguard Worker
1726*5e7646d2SAndroid Build Coastguard Worker depth = get_integer(fp);
1727*5e7646d2SAndroid Build Coastguard Worker row_count = get_integer(fp);
1728*5e7646d2SAndroid Build Coastguard Worker row_feed = get_integer(fp);
1729*5e7646d2SAndroid Build Coastguard Worker row_step = get_integer(fp);
1730*5e7646d2SAndroid Build Coastguard Worker
1731*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, name, sizeof(name)))
1732*5e7646d2SAndroid Build Coastguard Worker {
1733*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1734*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected name/text after Resolution on line %d of "
1735*5e7646d2SAndroid Build Coastguard Worker "%s."), fp->line, fp->filename);
1736*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1737*5e7646d2SAndroid Build Coastguard Worker }
1738*5e7646d2SAndroid Build Coastguard Worker
1739*5e7646d2SAndroid Build Coastguard Worker if ((text = strchr(name, '/')) != NULL)
1740*5e7646d2SAndroid Build Coastguard Worker *text++ = '\0';
1741*5e7646d2SAndroid Build Coastguard Worker else
1742*5e7646d2SAndroid Build Coastguard Worker text = name;
1743*5e7646d2SAndroid Build Coastguard Worker
1744*5e7646d2SAndroid Build Coastguard Worker switch (sscanf(name, "%dx%d", &xdpi, &ydpi))
1745*5e7646d2SAndroid Build Coastguard Worker {
1746*5e7646d2SAndroid Build Coastguard Worker case 1 :
1747*5e7646d2SAndroid Build Coastguard Worker ydpi = xdpi;
1748*5e7646d2SAndroid Build Coastguard Worker break;
1749*5e7646d2SAndroid Build Coastguard Worker case 2 :
1750*5e7646d2SAndroid Build Coastguard Worker break;
1751*5e7646d2SAndroid Build Coastguard Worker default :
1752*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1753*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Bad resolution name \"%s\" on line %d of "
1754*5e7646d2SAndroid Build Coastguard Worker "%s."), name, fp->line, fp->filename);
1755*5e7646d2SAndroid Build Coastguard Worker break;
1756*5e7646d2SAndroid Build Coastguard Worker }
1757*5e7646d2SAndroid Build Coastguard Worker
1758*5e7646d2SAndroid Build Coastguard Worker // Create the necessary PS commands...
1759*5e7646d2SAndroid Build Coastguard Worker snprintf(command, sizeof(command),
1760*5e7646d2SAndroid Build Coastguard Worker "<</HWResolution[%d %d]/cupsBitsPerColor %d/cupsRowCount %d"
1761*5e7646d2SAndroid Build Coastguard Worker "/cupsRowFeed %d/cupsRowStep %d",
1762*5e7646d2SAndroid Build Coastguard Worker xdpi, ydpi, depth, row_count, row_feed, row_step);
1763*5e7646d2SAndroid Build Coastguard Worker commptr = command + strlen(command);
1764*5e7646d2SAndroid Build Coastguard Worker
1765*5e7646d2SAndroid Build Coastguard Worker if (color_order >= 0)
1766*5e7646d2SAndroid Build Coastguard Worker {
1767*5e7646d2SAndroid Build Coastguard Worker snprintf(commptr, sizeof(command) - (size_t)(commptr - command),
1768*5e7646d2SAndroid Build Coastguard Worker "/cupsColorOrder %d", color_order);
1769*5e7646d2SAndroid Build Coastguard Worker commptr += strlen(commptr);
1770*5e7646d2SAndroid Build Coastguard Worker }
1771*5e7646d2SAndroid Build Coastguard Worker
1772*5e7646d2SAndroid Build Coastguard Worker if (color_space >= 0)
1773*5e7646d2SAndroid Build Coastguard Worker {
1774*5e7646d2SAndroid Build Coastguard Worker snprintf(commptr, sizeof(command) - (size_t)(commptr - command),
1775*5e7646d2SAndroid Build Coastguard Worker "/cupsColorSpace %d", color_space);
1776*5e7646d2SAndroid Build Coastguard Worker commptr += strlen(commptr);
1777*5e7646d2SAndroid Build Coastguard Worker }
1778*5e7646d2SAndroid Build Coastguard Worker
1779*5e7646d2SAndroid Build Coastguard Worker if (compression >= 0)
1780*5e7646d2SAndroid Build Coastguard Worker {
1781*5e7646d2SAndroid Build Coastguard Worker snprintf(commptr, sizeof(command) - (size_t)(commptr - command),
1782*5e7646d2SAndroid Build Coastguard Worker "/cupsCompression %d", compression);
1783*5e7646d2SAndroid Build Coastguard Worker commptr += strlen(commptr);
1784*5e7646d2SAndroid Build Coastguard Worker }
1785*5e7646d2SAndroid Build Coastguard Worker
1786*5e7646d2SAndroid Build Coastguard Worker snprintf(commptr, sizeof(command) - (size_t)(commptr - command), ">>setpagedevice");
1787*5e7646d2SAndroid Build Coastguard Worker
1788*5e7646d2SAndroid Build Coastguard Worker // Return the new choice...
1789*5e7646d2SAndroid Build Coastguard Worker return (new ppdcChoice(name, text, command));
1790*5e7646d2SAndroid Build Coastguard Worker }
1791*5e7646d2SAndroid Build Coastguard Worker
1792*5e7646d2SAndroid Build Coastguard Worker
1793*5e7646d2SAndroid Build Coastguard Worker //
1794*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_simple_profile()' - Get a simple color profile definition.
1795*5e7646d2SAndroid Build Coastguard Worker //
1796*5e7646d2SAndroid Build Coastguard Worker
1797*5e7646d2SAndroid Build Coastguard Worker ppdcProfile * // O - Color profile
get_simple_profile(ppdcFile * fp)1798*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_simple_profile(ppdcFile *fp)
1799*5e7646d2SAndroid Build Coastguard Worker // I - File to read
1800*5e7646d2SAndroid Build Coastguard Worker {
1801*5e7646d2SAndroid Build Coastguard Worker char resolution[1024], // Resolution/media type
1802*5e7646d2SAndroid Build Coastguard Worker *media_type; // Media type
1803*5e7646d2SAndroid Build Coastguard Worker float m[9]; // Transform matrix
1804*5e7646d2SAndroid Build Coastguard Worker float kd, rd, g; // Densities and gamma
1805*5e7646d2SAndroid Build Coastguard Worker float red, green, blue; // RGB adjustments
1806*5e7646d2SAndroid Build Coastguard Worker float yellow; // Yellow density
1807*5e7646d2SAndroid Build Coastguard Worker float color; // Color density values
1808*5e7646d2SAndroid Build Coastguard Worker
1809*5e7646d2SAndroid Build Coastguard Worker
1810*5e7646d2SAndroid Build Coastguard Worker // Get the SimpleColorProfile parameters:
1811*5e7646d2SAndroid Build Coastguard Worker //
1812*5e7646d2SAndroid Build Coastguard Worker // SimpleColorProfile resolution/mediatype black-density yellow-density
1813*5e7646d2SAndroid Build Coastguard Worker // red-density gamma red-adjust green-adjust blue-adjust
1814*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, resolution, sizeof(resolution)))
1815*5e7646d2SAndroid Build Coastguard Worker {
1816*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1817*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected resolution/mediatype following "
1818*5e7646d2SAndroid Build Coastguard Worker "SimpleColorProfile on line %d of %s."),
1819*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
1820*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1821*5e7646d2SAndroid Build Coastguard Worker }
1822*5e7646d2SAndroid Build Coastguard Worker
1823*5e7646d2SAndroid Build Coastguard Worker if ((media_type = strchr(resolution, '/')) != NULL)
1824*5e7646d2SAndroid Build Coastguard Worker *media_type++ = '\0';
1825*5e7646d2SAndroid Build Coastguard Worker else
1826*5e7646d2SAndroid Build Coastguard Worker media_type = resolution;
1827*5e7646d2SAndroid Build Coastguard Worker
1828*5e7646d2SAndroid Build Coastguard Worker // Collect the profile parameters...
1829*5e7646d2SAndroid Build Coastguard Worker kd = get_float(fp);
1830*5e7646d2SAndroid Build Coastguard Worker yellow = get_float(fp);
1831*5e7646d2SAndroid Build Coastguard Worker rd = get_float(fp);
1832*5e7646d2SAndroid Build Coastguard Worker g = get_float(fp);
1833*5e7646d2SAndroid Build Coastguard Worker red = get_float(fp);
1834*5e7646d2SAndroid Build Coastguard Worker green = get_float(fp);
1835*5e7646d2SAndroid Build Coastguard Worker blue = get_float(fp);
1836*5e7646d2SAndroid Build Coastguard Worker
1837*5e7646d2SAndroid Build Coastguard Worker // Build the color profile...
1838*5e7646d2SAndroid Build Coastguard Worker color = 0.5f * rd / kd - kd;
1839*5e7646d2SAndroid Build Coastguard Worker m[0] = 1.0f; // C
1840*5e7646d2SAndroid Build Coastguard Worker m[1] = color + blue; // C + M (blue)
1841*5e7646d2SAndroid Build Coastguard Worker m[2] = color - green; // C + Y (green)
1842*5e7646d2SAndroid Build Coastguard Worker m[3] = color - blue; // M + C (blue)
1843*5e7646d2SAndroid Build Coastguard Worker m[4] = 1.0f; // M
1844*5e7646d2SAndroid Build Coastguard Worker m[5] = color + red; // M + Y (red)
1845*5e7646d2SAndroid Build Coastguard Worker m[6] = yellow * (color + green); // Y + C (green)
1846*5e7646d2SAndroid Build Coastguard Worker m[7] = yellow * (color - red); // Y + M (red)
1847*5e7646d2SAndroid Build Coastguard Worker m[8] = yellow; // Y
1848*5e7646d2SAndroid Build Coastguard Worker
1849*5e7646d2SAndroid Build Coastguard Worker if (m[1] > 0.0f)
1850*5e7646d2SAndroid Build Coastguard Worker {
1851*5e7646d2SAndroid Build Coastguard Worker m[3] -= m[1];
1852*5e7646d2SAndroid Build Coastguard Worker m[1] = 0.0f;
1853*5e7646d2SAndroid Build Coastguard Worker }
1854*5e7646d2SAndroid Build Coastguard Worker else if (m[3] > 0.0f)
1855*5e7646d2SAndroid Build Coastguard Worker {
1856*5e7646d2SAndroid Build Coastguard Worker m[1] -= m[3];
1857*5e7646d2SAndroid Build Coastguard Worker m[3] = 0.0f;
1858*5e7646d2SAndroid Build Coastguard Worker }
1859*5e7646d2SAndroid Build Coastguard Worker
1860*5e7646d2SAndroid Build Coastguard Worker if (m[2] > 0.0f)
1861*5e7646d2SAndroid Build Coastguard Worker {
1862*5e7646d2SAndroid Build Coastguard Worker m[6] -= m[2];
1863*5e7646d2SAndroid Build Coastguard Worker m[2] = 0.0f;
1864*5e7646d2SAndroid Build Coastguard Worker }
1865*5e7646d2SAndroid Build Coastguard Worker else if (m[6] > 0.0f)
1866*5e7646d2SAndroid Build Coastguard Worker {
1867*5e7646d2SAndroid Build Coastguard Worker m[2] -= m[6];
1868*5e7646d2SAndroid Build Coastguard Worker m[6] = 0.0f;
1869*5e7646d2SAndroid Build Coastguard Worker }
1870*5e7646d2SAndroid Build Coastguard Worker
1871*5e7646d2SAndroid Build Coastguard Worker if (m[5] > 0.0f)
1872*5e7646d2SAndroid Build Coastguard Worker {
1873*5e7646d2SAndroid Build Coastguard Worker m[7] -= m[5];
1874*5e7646d2SAndroid Build Coastguard Worker m[5] = 0.0f;
1875*5e7646d2SAndroid Build Coastguard Worker }
1876*5e7646d2SAndroid Build Coastguard Worker else if (m[7] > 0.0f)
1877*5e7646d2SAndroid Build Coastguard Worker {
1878*5e7646d2SAndroid Build Coastguard Worker m[5] -= m[7];
1879*5e7646d2SAndroid Build Coastguard Worker m[7] = 0.0f;
1880*5e7646d2SAndroid Build Coastguard Worker }
1881*5e7646d2SAndroid Build Coastguard Worker
1882*5e7646d2SAndroid Build Coastguard Worker // Return the new profile...
1883*5e7646d2SAndroid Build Coastguard Worker return (new ppdcProfile(resolution, media_type, kd, g, m));
1884*5e7646d2SAndroid Build Coastguard Worker }
1885*5e7646d2SAndroid Build Coastguard Worker
1886*5e7646d2SAndroid Build Coastguard Worker
1887*5e7646d2SAndroid Build Coastguard Worker //
1888*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_size()' - Get a media size definition from a file.
1889*5e7646d2SAndroid Build Coastguard Worker //
1890*5e7646d2SAndroid Build Coastguard Worker
1891*5e7646d2SAndroid Build Coastguard Worker ppdcMediaSize * // O - Media size
get_size(ppdcFile * fp)1892*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_size(ppdcFile *fp) // I - File to read
1893*5e7646d2SAndroid Build Coastguard Worker {
1894*5e7646d2SAndroid Build Coastguard Worker char name[1024], // Name
1895*5e7646d2SAndroid Build Coastguard Worker *text; // Text
1896*5e7646d2SAndroid Build Coastguard Worker float width, // Width
1897*5e7646d2SAndroid Build Coastguard Worker length; // Length
1898*5e7646d2SAndroid Build Coastguard Worker
1899*5e7646d2SAndroid Build Coastguard Worker
1900*5e7646d2SAndroid Build Coastguard Worker // Get the name, text, width, and length:
1901*5e7646d2SAndroid Build Coastguard Worker //
1902*5e7646d2SAndroid Build Coastguard Worker // #media name/text width length
1903*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, name, sizeof(name)))
1904*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1905*5e7646d2SAndroid Build Coastguard Worker
1906*5e7646d2SAndroid Build Coastguard Worker if ((text = strchr(name, '/')) != NULL)
1907*5e7646d2SAndroid Build Coastguard Worker *text++ = '\0';
1908*5e7646d2SAndroid Build Coastguard Worker else
1909*5e7646d2SAndroid Build Coastguard Worker text = name;
1910*5e7646d2SAndroid Build Coastguard Worker
1911*5e7646d2SAndroid Build Coastguard Worker if ((width = get_measurement(fp)) < 0.0f)
1912*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1913*5e7646d2SAndroid Build Coastguard Worker
1914*5e7646d2SAndroid Build Coastguard Worker if ((length = get_measurement(fp)) < 0.0f)
1915*5e7646d2SAndroid Build Coastguard Worker return (NULL);
1916*5e7646d2SAndroid Build Coastguard Worker
1917*5e7646d2SAndroid Build Coastguard Worker // Return the new media size...
1918*5e7646d2SAndroid Build Coastguard Worker return (new ppdcMediaSize(name, text, width, length, 0.0f, 0.0f, 0.0f, 0.0f));
1919*5e7646d2SAndroid Build Coastguard Worker }
1920*5e7646d2SAndroid Build Coastguard Worker
1921*5e7646d2SAndroid Build Coastguard Worker
1922*5e7646d2SAndroid Build Coastguard Worker //
1923*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_token()' - Get a token from a file.
1924*5e7646d2SAndroid Build Coastguard Worker //
1925*5e7646d2SAndroid Build Coastguard Worker
1926*5e7646d2SAndroid Build Coastguard Worker char * // O - Token string or NULL
get_token(ppdcFile * fp,char * buffer,int buflen)1927*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_token(ppdcFile *fp, // I - File to read
1928*5e7646d2SAndroid Build Coastguard Worker char *buffer, // I - Buffer
1929*5e7646d2SAndroid Build Coastguard Worker int buflen) // I - Length of buffer
1930*5e7646d2SAndroid Build Coastguard Worker {
1931*5e7646d2SAndroid Build Coastguard Worker char *bufptr, // Pointer into string buffer
1932*5e7646d2SAndroid Build Coastguard Worker *bufend; // End of string buffer
1933*5e7646d2SAndroid Build Coastguard Worker int ch, // Character from file
1934*5e7646d2SAndroid Build Coastguard Worker nextch, // Next char in file
1935*5e7646d2SAndroid Build Coastguard Worker quote, // Quote character used...
1936*5e7646d2SAndroid Build Coastguard Worker empty, // Empty input?
1937*5e7646d2SAndroid Build Coastguard Worker startline; // Start line for quote
1938*5e7646d2SAndroid Build Coastguard Worker char name[256], // Name string
1939*5e7646d2SAndroid Build Coastguard Worker *nameptr; // Name pointer
1940*5e7646d2SAndroid Build Coastguard Worker ppdcVariable *var; // Variable pointer
1941*5e7646d2SAndroid Build Coastguard Worker
1942*5e7646d2SAndroid Build Coastguard Worker
1943*5e7646d2SAndroid Build Coastguard Worker // Mark the beginning and end of the buffer...
1944*5e7646d2SAndroid Build Coastguard Worker bufptr = buffer;
1945*5e7646d2SAndroid Build Coastguard Worker bufend = buffer + buflen - 1;
1946*5e7646d2SAndroid Build Coastguard Worker
1947*5e7646d2SAndroid Build Coastguard Worker // Loop intil we've read a token...
1948*5e7646d2SAndroid Build Coastguard Worker quote = 0;
1949*5e7646d2SAndroid Build Coastguard Worker startline = 0;
1950*5e7646d2SAndroid Build Coastguard Worker empty = 1;
1951*5e7646d2SAndroid Build Coastguard Worker
1952*5e7646d2SAndroid Build Coastguard Worker while ((ch = fp->get()) != EOF)
1953*5e7646d2SAndroid Build Coastguard Worker {
1954*5e7646d2SAndroid Build Coastguard Worker if (isspace(ch) && !quote)
1955*5e7646d2SAndroid Build Coastguard Worker {
1956*5e7646d2SAndroid Build Coastguard Worker if (empty)
1957*5e7646d2SAndroid Build Coastguard Worker continue;
1958*5e7646d2SAndroid Build Coastguard Worker else
1959*5e7646d2SAndroid Build Coastguard Worker break;
1960*5e7646d2SAndroid Build Coastguard Worker }
1961*5e7646d2SAndroid Build Coastguard Worker else if (ch == '$')
1962*5e7646d2SAndroid Build Coastguard Worker {
1963*5e7646d2SAndroid Build Coastguard Worker // Variable substitution
1964*5e7646d2SAndroid Build Coastguard Worker empty = 0;
1965*5e7646d2SAndroid Build Coastguard Worker
1966*5e7646d2SAndroid Build Coastguard Worker for (nameptr = name; (ch = fp->peek()) != EOF;)
1967*5e7646d2SAndroid Build Coastguard Worker {
1968*5e7646d2SAndroid Build Coastguard Worker if (!isalnum(ch) && ch != '_')
1969*5e7646d2SAndroid Build Coastguard Worker break;
1970*5e7646d2SAndroid Build Coastguard Worker else if (nameptr < (name + sizeof(name) - 1))
1971*5e7646d2SAndroid Build Coastguard Worker *nameptr++ = (char)fp->get();
1972*5e7646d2SAndroid Build Coastguard Worker }
1973*5e7646d2SAndroid Build Coastguard Worker
1974*5e7646d2SAndroid Build Coastguard Worker if (nameptr == name)
1975*5e7646d2SAndroid Build Coastguard Worker {
1976*5e7646d2SAndroid Build Coastguard Worker // Just substitute this character...
1977*5e7646d2SAndroid Build Coastguard Worker if (ch == '$')
1978*5e7646d2SAndroid Build Coastguard Worker {
1979*5e7646d2SAndroid Build Coastguard Worker // $$ = $
1980*5e7646d2SAndroid Build Coastguard Worker if (bufptr < bufend)
1981*5e7646d2SAndroid Build Coastguard Worker *bufptr++ = (char)fp->get();
1982*5e7646d2SAndroid Build Coastguard Worker }
1983*5e7646d2SAndroid Build Coastguard Worker else
1984*5e7646d2SAndroid Build Coastguard Worker {
1985*5e7646d2SAndroid Build Coastguard Worker // $ch = $ch
1986*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1987*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Bad variable substitution ($%c) on line %d "
1988*5e7646d2SAndroid Build Coastguard Worker "of %s."), ch, fp->line, fp->filename);
1989*5e7646d2SAndroid Build Coastguard Worker
1990*5e7646d2SAndroid Build Coastguard Worker if (bufptr < bufend)
1991*5e7646d2SAndroid Build Coastguard Worker *bufptr++ = '$';
1992*5e7646d2SAndroid Build Coastguard Worker }
1993*5e7646d2SAndroid Build Coastguard Worker }
1994*5e7646d2SAndroid Build Coastguard Worker else
1995*5e7646d2SAndroid Build Coastguard Worker {
1996*5e7646d2SAndroid Build Coastguard Worker // Substitute the variable value...
1997*5e7646d2SAndroid Build Coastguard Worker *nameptr = '\0';
1998*5e7646d2SAndroid Build Coastguard Worker var = find_variable(name);
1999*5e7646d2SAndroid Build Coastguard Worker if (var)
2000*5e7646d2SAndroid Build Coastguard Worker {
2001*5e7646d2SAndroid Build Coastguard Worker strlcpy(bufptr, var->value->value, (size_t)(bufend - bufptr + 1));
2002*5e7646d2SAndroid Build Coastguard Worker bufptr += strlen(bufptr);
2003*5e7646d2SAndroid Build Coastguard Worker }
2004*5e7646d2SAndroid Build Coastguard Worker else
2005*5e7646d2SAndroid Build Coastguard Worker {
2006*5e7646d2SAndroid Build Coastguard Worker if (!(cond_state & PPDC_COND_SKIP))
2007*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
2008*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Undefined variable (%s) on line %d of "
2009*5e7646d2SAndroid Build Coastguard Worker "%s."), name, fp->line, fp->filename);
2010*5e7646d2SAndroid Build Coastguard Worker
2011*5e7646d2SAndroid Build Coastguard Worker snprintf(bufptr, (size_t)(bufend - bufptr + 1), "$%s", name);
2012*5e7646d2SAndroid Build Coastguard Worker bufptr += strlen(bufptr);
2013*5e7646d2SAndroid Build Coastguard Worker }
2014*5e7646d2SAndroid Build Coastguard Worker }
2015*5e7646d2SAndroid Build Coastguard Worker }
2016*5e7646d2SAndroid Build Coastguard Worker else if (ch == '/' && !quote)
2017*5e7646d2SAndroid Build Coastguard Worker {
2018*5e7646d2SAndroid Build Coastguard Worker // Possibly a comment...
2019*5e7646d2SAndroid Build Coastguard Worker nextch = fp->peek();
2020*5e7646d2SAndroid Build Coastguard Worker
2021*5e7646d2SAndroid Build Coastguard Worker if (nextch == '*')
2022*5e7646d2SAndroid Build Coastguard Worker {
2023*5e7646d2SAndroid Build Coastguard Worker // C comment...
2024*5e7646d2SAndroid Build Coastguard Worker fp->get();
2025*5e7646d2SAndroid Build Coastguard Worker ch = fp->get();
2026*5e7646d2SAndroid Build Coastguard Worker while ((nextch = fp->get()) != EOF)
2027*5e7646d2SAndroid Build Coastguard Worker {
2028*5e7646d2SAndroid Build Coastguard Worker if (ch == '*' && nextch == '/')
2029*5e7646d2SAndroid Build Coastguard Worker break;
2030*5e7646d2SAndroid Build Coastguard Worker
2031*5e7646d2SAndroid Build Coastguard Worker ch = nextch;
2032*5e7646d2SAndroid Build Coastguard Worker }
2033*5e7646d2SAndroid Build Coastguard Worker
2034*5e7646d2SAndroid Build Coastguard Worker if (nextch == EOF)
2035*5e7646d2SAndroid Build Coastguard Worker break;
2036*5e7646d2SAndroid Build Coastguard Worker }
2037*5e7646d2SAndroid Build Coastguard Worker else if (nextch == '/')
2038*5e7646d2SAndroid Build Coastguard Worker {
2039*5e7646d2SAndroid Build Coastguard Worker // C++ comment...
2040*5e7646d2SAndroid Build Coastguard Worker while ((nextch = fp->get()) != EOF)
2041*5e7646d2SAndroid Build Coastguard Worker if (nextch == '\n')
2042*5e7646d2SAndroid Build Coastguard Worker break;
2043*5e7646d2SAndroid Build Coastguard Worker
2044*5e7646d2SAndroid Build Coastguard Worker if (nextch == EOF)
2045*5e7646d2SAndroid Build Coastguard Worker break;
2046*5e7646d2SAndroid Build Coastguard Worker }
2047*5e7646d2SAndroid Build Coastguard Worker else
2048*5e7646d2SAndroid Build Coastguard Worker {
2049*5e7646d2SAndroid Build Coastguard Worker // Not a comment...
2050*5e7646d2SAndroid Build Coastguard Worker empty = 0;
2051*5e7646d2SAndroid Build Coastguard Worker
2052*5e7646d2SAndroid Build Coastguard Worker if (bufptr < bufend)
2053*5e7646d2SAndroid Build Coastguard Worker *bufptr++ = (char)ch;
2054*5e7646d2SAndroid Build Coastguard Worker }
2055*5e7646d2SAndroid Build Coastguard Worker }
2056*5e7646d2SAndroid Build Coastguard Worker else if (ch == '\'' || ch == '\"')
2057*5e7646d2SAndroid Build Coastguard Worker {
2058*5e7646d2SAndroid Build Coastguard Worker empty = 0;
2059*5e7646d2SAndroid Build Coastguard Worker
2060*5e7646d2SAndroid Build Coastguard Worker if (quote == ch)
2061*5e7646d2SAndroid Build Coastguard Worker {
2062*5e7646d2SAndroid Build Coastguard Worker // Ending the current quoted string...
2063*5e7646d2SAndroid Build Coastguard Worker quote = 0;
2064*5e7646d2SAndroid Build Coastguard Worker }
2065*5e7646d2SAndroid Build Coastguard Worker else if (quote)
2066*5e7646d2SAndroid Build Coastguard Worker {
2067*5e7646d2SAndroid Build Coastguard Worker // Insert the opposing quote char...
2068*5e7646d2SAndroid Build Coastguard Worker if (bufptr < bufend)
2069*5e7646d2SAndroid Build Coastguard Worker *bufptr++ = (char)ch;
2070*5e7646d2SAndroid Build Coastguard Worker }
2071*5e7646d2SAndroid Build Coastguard Worker else
2072*5e7646d2SAndroid Build Coastguard Worker {
2073*5e7646d2SAndroid Build Coastguard Worker // Start a new quoted string...
2074*5e7646d2SAndroid Build Coastguard Worker startline = fp->line;
2075*5e7646d2SAndroid Build Coastguard Worker quote = ch;
2076*5e7646d2SAndroid Build Coastguard Worker }
2077*5e7646d2SAndroid Build Coastguard Worker }
2078*5e7646d2SAndroid Build Coastguard Worker else if ((ch == '(' || ch == '<') && !quote)
2079*5e7646d2SAndroid Build Coastguard Worker {
2080*5e7646d2SAndroid Build Coastguard Worker empty = 0;
2081*5e7646d2SAndroid Build Coastguard Worker quote = ch;
2082*5e7646d2SAndroid Build Coastguard Worker startline = fp->line;
2083*5e7646d2SAndroid Build Coastguard Worker
2084*5e7646d2SAndroid Build Coastguard Worker if (bufptr < bufend)
2085*5e7646d2SAndroid Build Coastguard Worker *bufptr++ = (char)ch;
2086*5e7646d2SAndroid Build Coastguard Worker }
2087*5e7646d2SAndroid Build Coastguard Worker else if ((ch == ')' && quote == '(') || (ch == '>' && quote == '<'))
2088*5e7646d2SAndroid Build Coastguard Worker {
2089*5e7646d2SAndroid Build Coastguard Worker quote = 0;
2090*5e7646d2SAndroid Build Coastguard Worker
2091*5e7646d2SAndroid Build Coastguard Worker if (bufptr < bufend)
2092*5e7646d2SAndroid Build Coastguard Worker *bufptr++ = (char)ch;
2093*5e7646d2SAndroid Build Coastguard Worker }
2094*5e7646d2SAndroid Build Coastguard Worker else if (ch == '\\')
2095*5e7646d2SAndroid Build Coastguard Worker {
2096*5e7646d2SAndroid Build Coastguard Worker empty = 0;
2097*5e7646d2SAndroid Build Coastguard Worker
2098*5e7646d2SAndroid Build Coastguard Worker if ((ch = fp->get()) == EOF)
2099*5e7646d2SAndroid Build Coastguard Worker break;
2100*5e7646d2SAndroid Build Coastguard Worker
2101*5e7646d2SAndroid Build Coastguard Worker if (bufptr < bufend)
2102*5e7646d2SAndroid Build Coastguard Worker *bufptr++ = (char)ch;
2103*5e7646d2SAndroid Build Coastguard Worker }
2104*5e7646d2SAndroid Build Coastguard Worker else if (bufptr < bufend)
2105*5e7646d2SAndroid Build Coastguard Worker {
2106*5e7646d2SAndroid Build Coastguard Worker empty = 0;
2107*5e7646d2SAndroid Build Coastguard Worker
2108*5e7646d2SAndroid Build Coastguard Worker *bufptr++ = (char)ch;
2109*5e7646d2SAndroid Build Coastguard Worker
2110*5e7646d2SAndroid Build Coastguard Worker if ((ch == '{' || ch == '}') && !quote)
2111*5e7646d2SAndroid Build Coastguard Worker break;
2112*5e7646d2SAndroid Build Coastguard Worker }
2113*5e7646d2SAndroid Build Coastguard Worker }
2114*5e7646d2SAndroid Build Coastguard Worker
2115*5e7646d2SAndroid Build Coastguard Worker if (quote)
2116*5e7646d2SAndroid Build Coastguard Worker {
2117*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
2118*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Unterminated string starting with %c on line %d "
2119*5e7646d2SAndroid Build Coastguard Worker "of %s."), quote, startline, fp->filename);
2120*5e7646d2SAndroid Build Coastguard Worker return (NULL);
2121*5e7646d2SAndroid Build Coastguard Worker }
2122*5e7646d2SAndroid Build Coastguard Worker
2123*5e7646d2SAndroid Build Coastguard Worker if (empty)
2124*5e7646d2SAndroid Build Coastguard Worker return (NULL);
2125*5e7646d2SAndroid Build Coastguard Worker else
2126*5e7646d2SAndroid Build Coastguard Worker {
2127*5e7646d2SAndroid Build Coastguard Worker *bufptr = '\0';
2128*5e7646d2SAndroid Build Coastguard Worker return (buffer);
2129*5e7646d2SAndroid Build Coastguard Worker }
2130*5e7646d2SAndroid Build Coastguard Worker }
2131*5e7646d2SAndroid Build Coastguard Worker
2132*5e7646d2SAndroid Build Coastguard Worker
2133*5e7646d2SAndroid Build Coastguard Worker //
2134*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::get_variable()' - Get a variable definition.
2135*5e7646d2SAndroid Build Coastguard Worker //
2136*5e7646d2SAndroid Build Coastguard Worker
2137*5e7646d2SAndroid Build Coastguard Worker ppdcVariable * // O - Variable
get_variable(ppdcFile * fp)2138*5e7646d2SAndroid Build Coastguard Worker ppdcSource::get_variable(ppdcFile *fp) // I - File to read
2139*5e7646d2SAndroid Build Coastguard Worker {
2140*5e7646d2SAndroid Build Coastguard Worker char name[1024], // Name
2141*5e7646d2SAndroid Build Coastguard Worker value[1024]; // Value
2142*5e7646d2SAndroid Build Coastguard Worker
2143*5e7646d2SAndroid Build Coastguard Worker
2144*5e7646d2SAndroid Build Coastguard Worker // Get the name and value:
2145*5e7646d2SAndroid Build Coastguard Worker //
2146*5e7646d2SAndroid Build Coastguard Worker // #define name value
2147*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, name, sizeof(name)))
2148*5e7646d2SAndroid Build Coastguard Worker return (NULL);
2149*5e7646d2SAndroid Build Coastguard Worker
2150*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, value, sizeof(value)))
2151*5e7646d2SAndroid Build Coastguard Worker return (NULL);
2152*5e7646d2SAndroid Build Coastguard Worker
2153*5e7646d2SAndroid Build Coastguard Worker // Set the variable...
2154*5e7646d2SAndroid Build Coastguard Worker return (set_variable(name, value));
2155*5e7646d2SAndroid Build Coastguard Worker }
2156*5e7646d2SAndroid Build Coastguard Worker
2157*5e7646d2SAndroid Build Coastguard Worker
2158*5e7646d2SAndroid Build Coastguard Worker //
2159*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::quotef()' - Write a formatted, quoted string...
2160*5e7646d2SAndroid Build Coastguard Worker //
2161*5e7646d2SAndroid Build Coastguard Worker
2162*5e7646d2SAndroid Build Coastguard Worker int // O - Number bytes on success, -1 on failure
quotef(cups_file_t * fp,const char * format,...)2163*5e7646d2SAndroid Build Coastguard Worker ppdcSource::quotef(cups_file_t *fp, // I - File to write to
2164*5e7646d2SAndroid Build Coastguard Worker const char *format, // I - Printf-style format string
2165*5e7646d2SAndroid Build Coastguard Worker ...) // I - Additional args as needed
2166*5e7646d2SAndroid Build Coastguard Worker {
2167*5e7646d2SAndroid Build Coastguard Worker va_list ap; // Pointer to additional arguments
2168*5e7646d2SAndroid Build Coastguard Worker int bytes; // Bytes written
2169*5e7646d2SAndroid Build Coastguard Worker char sign, // Sign of format width
2170*5e7646d2SAndroid Build Coastguard Worker size, // Size character (h, l, L)
2171*5e7646d2SAndroid Build Coastguard Worker type; // Format type character
2172*5e7646d2SAndroid Build Coastguard Worker const char *bufformat; // Start of format
2173*5e7646d2SAndroid Build Coastguard Worker int width, // Width of field
2174*5e7646d2SAndroid Build Coastguard Worker prec; // Number of characters of precision
2175*5e7646d2SAndroid Build Coastguard Worker char tformat[100]; // Temporary format string for fprintf()
2176*5e7646d2SAndroid Build Coastguard Worker char *s; // Pointer to string
2177*5e7646d2SAndroid Build Coastguard Worker int slen; // Length of string
2178*5e7646d2SAndroid Build Coastguard Worker int i; // Looping var
2179*5e7646d2SAndroid Build Coastguard Worker
2180*5e7646d2SAndroid Build Coastguard Worker
2181*5e7646d2SAndroid Build Coastguard Worker // Range check input...
2182*5e7646d2SAndroid Build Coastguard Worker if (!fp || !format)
2183*5e7646d2SAndroid Build Coastguard Worker return (-1);
2184*5e7646d2SAndroid Build Coastguard Worker
2185*5e7646d2SAndroid Build Coastguard Worker // Loop through the format string, formatting as needed...
2186*5e7646d2SAndroid Build Coastguard Worker va_start(ap, format);
2187*5e7646d2SAndroid Build Coastguard Worker
2188*5e7646d2SAndroid Build Coastguard Worker bytes = 0;
2189*5e7646d2SAndroid Build Coastguard Worker
2190*5e7646d2SAndroid Build Coastguard Worker while (*format)
2191*5e7646d2SAndroid Build Coastguard Worker {
2192*5e7646d2SAndroid Build Coastguard Worker if (*format == '%')
2193*5e7646d2SAndroid Build Coastguard Worker {
2194*5e7646d2SAndroid Build Coastguard Worker bufformat = format;
2195*5e7646d2SAndroid Build Coastguard Worker format ++;
2196*5e7646d2SAndroid Build Coastguard Worker
2197*5e7646d2SAndroid Build Coastguard Worker if (*format == '%')
2198*5e7646d2SAndroid Build Coastguard Worker {
2199*5e7646d2SAndroid Build Coastguard Worker cupsFilePutChar(fp, *format++);
2200*5e7646d2SAndroid Build Coastguard Worker bytes ++;
2201*5e7646d2SAndroid Build Coastguard Worker continue;
2202*5e7646d2SAndroid Build Coastguard Worker }
2203*5e7646d2SAndroid Build Coastguard Worker else if (strchr(" -+#\'", *format))
2204*5e7646d2SAndroid Build Coastguard Worker sign = *format++;
2205*5e7646d2SAndroid Build Coastguard Worker else
2206*5e7646d2SAndroid Build Coastguard Worker sign = 0;
2207*5e7646d2SAndroid Build Coastguard Worker
2208*5e7646d2SAndroid Build Coastguard Worker width = 0;
2209*5e7646d2SAndroid Build Coastguard Worker while (isdigit(*format))
2210*5e7646d2SAndroid Build Coastguard Worker width = width * 10 + *format++ - '0';
2211*5e7646d2SAndroid Build Coastguard Worker
2212*5e7646d2SAndroid Build Coastguard Worker if (*format == '.')
2213*5e7646d2SAndroid Build Coastguard Worker {
2214*5e7646d2SAndroid Build Coastguard Worker format ++;
2215*5e7646d2SAndroid Build Coastguard Worker prec = 0;
2216*5e7646d2SAndroid Build Coastguard Worker
2217*5e7646d2SAndroid Build Coastguard Worker while (isdigit(*format))
2218*5e7646d2SAndroid Build Coastguard Worker prec = prec * 10 + *format++ - '0';
2219*5e7646d2SAndroid Build Coastguard Worker }
2220*5e7646d2SAndroid Build Coastguard Worker else
2221*5e7646d2SAndroid Build Coastguard Worker prec = -1;
2222*5e7646d2SAndroid Build Coastguard Worker
2223*5e7646d2SAndroid Build Coastguard Worker if (*format == 'l' && format[1] == 'l')
2224*5e7646d2SAndroid Build Coastguard Worker {
2225*5e7646d2SAndroid Build Coastguard Worker size = 'L';
2226*5e7646d2SAndroid Build Coastguard Worker format += 2;
2227*5e7646d2SAndroid Build Coastguard Worker }
2228*5e7646d2SAndroid Build Coastguard Worker else if (*format == 'h' || *format == 'l' || *format == 'L')
2229*5e7646d2SAndroid Build Coastguard Worker size = *format++;
2230*5e7646d2SAndroid Build Coastguard Worker else
2231*5e7646d2SAndroid Build Coastguard Worker size = '\0';
2232*5e7646d2SAndroid Build Coastguard Worker
2233*5e7646d2SAndroid Build Coastguard Worker if (!*format)
2234*5e7646d2SAndroid Build Coastguard Worker break;
2235*5e7646d2SAndroid Build Coastguard Worker
2236*5e7646d2SAndroid Build Coastguard Worker type = *format++;
2237*5e7646d2SAndroid Build Coastguard Worker
2238*5e7646d2SAndroid Build Coastguard Worker switch (type)
2239*5e7646d2SAndroid Build Coastguard Worker {
2240*5e7646d2SAndroid Build Coastguard Worker case 'E' : // Floating point formats
2241*5e7646d2SAndroid Build Coastguard Worker case 'G' :
2242*5e7646d2SAndroid Build Coastguard Worker case 'e' :
2243*5e7646d2SAndroid Build Coastguard Worker case 'f' :
2244*5e7646d2SAndroid Build Coastguard Worker case 'g' :
2245*5e7646d2SAndroid Build Coastguard Worker if ((format - bufformat + 1) > (int)sizeof(tformat))
2246*5e7646d2SAndroid Build Coastguard Worker break;
2247*5e7646d2SAndroid Build Coastguard Worker
2248*5e7646d2SAndroid Build Coastguard Worker memcpy(tformat, bufformat, (size_t)(format - bufformat));
2249*5e7646d2SAndroid Build Coastguard Worker tformat[format - bufformat] = '\0';
2250*5e7646d2SAndroid Build Coastguard Worker
2251*5e7646d2SAndroid Build Coastguard Worker bytes += cupsFilePrintf(fp, tformat, va_arg(ap, double));
2252*5e7646d2SAndroid Build Coastguard Worker break;
2253*5e7646d2SAndroid Build Coastguard Worker
2254*5e7646d2SAndroid Build Coastguard Worker case 'B' : // Integer formats
2255*5e7646d2SAndroid Build Coastguard Worker case 'X' :
2256*5e7646d2SAndroid Build Coastguard Worker case 'b' :
2257*5e7646d2SAndroid Build Coastguard Worker case 'd' :
2258*5e7646d2SAndroid Build Coastguard Worker case 'i' :
2259*5e7646d2SAndroid Build Coastguard Worker case 'o' :
2260*5e7646d2SAndroid Build Coastguard Worker case 'u' :
2261*5e7646d2SAndroid Build Coastguard Worker case 'x' :
2262*5e7646d2SAndroid Build Coastguard Worker if ((format - bufformat + 1) > (int)sizeof(tformat))
2263*5e7646d2SAndroid Build Coastguard Worker break;
2264*5e7646d2SAndroid Build Coastguard Worker
2265*5e7646d2SAndroid Build Coastguard Worker memcpy(tformat, bufformat, (size_t)(format - bufformat));
2266*5e7646d2SAndroid Build Coastguard Worker tformat[format - bufformat] = '\0';
2267*5e7646d2SAndroid Build Coastguard Worker
2268*5e7646d2SAndroid Build Coastguard Worker # ifdef HAVE_LONG_LONG
2269*5e7646d2SAndroid Build Coastguard Worker if (size == 'L')
2270*5e7646d2SAndroid Build Coastguard Worker bytes += cupsFilePrintf(fp, tformat, va_arg(ap, long long));
2271*5e7646d2SAndroid Build Coastguard Worker else
2272*5e7646d2SAndroid Build Coastguard Worker # endif /* HAVE_LONG_LONG */
2273*5e7646d2SAndroid Build Coastguard Worker if (size == 'l')
2274*5e7646d2SAndroid Build Coastguard Worker bytes += cupsFilePrintf(fp, tformat, va_arg(ap, long));
2275*5e7646d2SAndroid Build Coastguard Worker else
2276*5e7646d2SAndroid Build Coastguard Worker bytes += cupsFilePrintf(fp, tformat, va_arg(ap, int));
2277*5e7646d2SAndroid Build Coastguard Worker break;
2278*5e7646d2SAndroid Build Coastguard Worker
2279*5e7646d2SAndroid Build Coastguard Worker case 'p' : // Pointer value
2280*5e7646d2SAndroid Build Coastguard Worker if ((format - bufformat + 1) > (int)sizeof(tformat))
2281*5e7646d2SAndroid Build Coastguard Worker break;
2282*5e7646d2SAndroid Build Coastguard Worker
2283*5e7646d2SAndroid Build Coastguard Worker memcpy(tformat, bufformat, (size_t)(format - bufformat));
2284*5e7646d2SAndroid Build Coastguard Worker tformat[format - bufformat] = '\0';
2285*5e7646d2SAndroid Build Coastguard Worker
2286*5e7646d2SAndroid Build Coastguard Worker bytes += cupsFilePrintf(fp, tformat, va_arg(ap, void *));
2287*5e7646d2SAndroid Build Coastguard Worker break;
2288*5e7646d2SAndroid Build Coastguard Worker
2289*5e7646d2SAndroid Build Coastguard Worker case 'c' : // Character or character array
2290*5e7646d2SAndroid Build Coastguard Worker if (width <= 1)
2291*5e7646d2SAndroid Build Coastguard Worker {
2292*5e7646d2SAndroid Build Coastguard Worker bytes ++;
2293*5e7646d2SAndroid Build Coastguard Worker cupsFilePutChar(fp, va_arg(ap, int));
2294*5e7646d2SAndroid Build Coastguard Worker }
2295*5e7646d2SAndroid Build Coastguard Worker else
2296*5e7646d2SAndroid Build Coastguard Worker {
2297*5e7646d2SAndroid Build Coastguard Worker cupsFileWrite(fp, va_arg(ap, char *), (size_t)width);
2298*5e7646d2SAndroid Build Coastguard Worker bytes += width;
2299*5e7646d2SAndroid Build Coastguard Worker }
2300*5e7646d2SAndroid Build Coastguard Worker break;
2301*5e7646d2SAndroid Build Coastguard Worker
2302*5e7646d2SAndroid Build Coastguard Worker case 's' : // String
2303*5e7646d2SAndroid Build Coastguard Worker if ((s = va_arg(ap, char *)) == NULL)
2304*5e7646d2SAndroid Build Coastguard Worker s = (char *)"(nil)";
2305*5e7646d2SAndroid Build Coastguard Worker
2306*5e7646d2SAndroid Build Coastguard Worker slen = (int)strlen(s);
2307*5e7646d2SAndroid Build Coastguard Worker if (slen > width && prec != width)
2308*5e7646d2SAndroid Build Coastguard Worker width = slen;
2309*5e7646d2SAndroid Build Coastguard Worker
2310*5e7646d2SAndroid Build Coastguard Worker if (slen > width)
2311*5e7646d2SAndroid Build Coastguard Worker slen = width;
2312*5e7646d2SAndroid Build Coastguard Worker
2313*5e7646d2SAndroid Build Coastguard Worker if (sign != '-')
2314*5e7646d2SAndroid Build Coastguard Worker {
2315*5e7646d2SAndroid Build Coastguard Worker for (i = width - slen; i > 0; i --, bytes ++)
2316*5e7646d2SAndroid Build Coastguard Worker cupsFilePutChar(fp, ' ');
2317*5e7646d2SAndroid Build Coastguard Worker }
2318*5e7646d2SAndroid Build Coastguard Worker
2319*5e7646d2SAndroid Build Coastguard Worker for (i = slen; i > 0; i --, s ++, bytes ++)
2320*5e7646d2SAndroid Build Coastguard Worker {
2321*5e7646d2SAndroid Build Coastguard Worker if (*s == '\\' || *s == '\"')
2322*5e7646d2SAndroid Build Coastguard Worker {
2323*5e7646d2SAndroid Build Coastguard Worker cupsFilePutChar(fp, '\\');
2324*5e7646d2SAndroid Build Coastguard Worker bytes ++;
2325*5e7646d2SAndroid Build Coastguard Worker }
2326*5e7646d2SAndroid Build Coastguard Worker
2327*5e7646d2SAndroid Build Coastguard Worker cupsFilePutChar(fp, *s);
2328*5e7646d2SAndroid Build Coastguard Worker }
2329*5e7646d2SAndroid Build Coastguard Worker
2330*5e7646d2SAndroid Build Coastguard Worker if (sign == '-')
2331*5e7646d2SAndroid Build Coastguard Worker {
2332*5e7646d2SAndroid Build Coastguard Worker for (i = width - slen; i > 0; i --, bytes ++)
2333*5e7646d2SAndroid Build Coastguard Worker cupsFilePutChar(fp, ' ');
2334*5e7646d2SAndroid Build Coastguard Worker }
2335*5e7646d2SAndroid Build Coastguard Worker break;
2336*5e7646d2SAndroid Build Coastguard Worker }
2337*5e7646d2SAndroid Build Coastguard Worker }
2338*5e7646d2SAndroid Build Coastguard Worker else
2339*5e7646d2SAndroid Build Coastguard Worker {
2340*5e7646d2SAndroid Build Coastguard Worker cupsFilePutChar(fp, *format++);
2341*5e7646d2SAndroid Build Coastguard Worker bytes ++;
2342*5e7646d2SAndroid Build Coastguard Worker }
2343*5e7646d2SAndroid Build Coastguard Worker }
2344*5e7646d2SAndroid Build Coastguard Worker
2345*5e7646d2SAndroid Build Coastguard Worker va_end(ap);
2346*5e7646d2SAndroid Build Coastguard Worker
2347*5e7646d2SAndroid Build Coastguard Worker // Return the number of characters written.
2348*5e7646d2SAndroid Build Coastguard Worker return (bytes);
2349*5e7646d2SAndroid Build Coastguard Worker }
2350*5e7646d2SAndroid Build Coastguard Worker
2351*5e7646d2SAndroid Build Coastguard Worker
2352*5e7646d2SAndroid Build Coastguard Worker //
2353*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::read_file()' - Read a driver source file.
2354*5e7646d2SAndroid Build Coastguard Worker //
2355*5e7646d2SAndroid Build Coastguard Worker
2356*5e7646d2SAndroid Build Coastguard Worker void
read_file(const char * f,cups_file_t * ffp)2357*5e7646d2SAndroid Build Coastguard Worker ppdcSource::read_file(const char *f, // I - File to read
2358*5e7646d2SAndroid Build Coastguard Worker cups_file_t *ffp) // I - File pointer to use
2359*5e7646d2SAndroid Build Coastguard Worker {
2360*5e7646d2SAndroid Build Coastguard Worker ppdcFile *fp = new ppdcFile(f, ffp);
2361*5e7646d2SAndroid Build Coastguard Worker scan_file(fp);
2362*5e7646d2SAndroid Build Coastguard Worker delete fp;
2363*5e7646d2SAndroid Build Coastguard Worker
2364*5e7646d2SAndroid Build Coastguard Worker if (cond_current != cond_stack)
2365*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("ppdc: Missing #endif at end of \"%s\"."), f);
2366*5e7646d2SAndroid Build Coastguard Worker }
2367*5e7646d2SAndroid Build Coastguard Worker
2368*5e7646d2SAndroid Build Coastguard Worker
2369*5e7646d2SAndroid Build Coastguard Worker //
2370*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::scan_file()' - Scan a driver source file.
2371*5e7646d2SAndroid Build Coastguard Worker //
2372*5e7646d2SAndroid Build Coastguard Worker
2373*5e7646d2SAndroid Build Coastguard Worker void
scan_file(ppdcFile * fp,ppdcDriver * td,bool inc)2374*5e7646d2SAndroid Build Coastguard Worker ppdcSource::scan_file(ppdcFile *fp, // I - File to read
2375*5e7646d2SAndroid Build Coastguard Worker ppdcDriver *td, // I - Driver template
2376*5e7646d2SAndroid Build Coastguard Worker bool inc) // I - Including?
2377*5e7646d2SAndroid Build Coastguard Worker {
2378*5e7646d2SAndroid Build Coastguard Worker ppdcDriver *d; // Current driver
2379*5e7646d2SAndroid Build Coastguard Worker ppdcGroup *g, // Current group
2380*5e7646d2SAndroid Build Coastguard Worker *mg, // Matching group
2381*5e7646d2SAndroid Build Coastguard Worker *general, // General options group
2382*5e7646d2SAndroid Build Coastguard Worker *install; // Installable options group
2383*5e7646d2SAndroid Build Coastguard Worker ppdcOption *o; // Current option
2384*5e7646d2SAndroid Build Coastguard Worker ppdcChoice *c; // Current choice
2385*5e7646d2SAndroid Build Coastguard Worker char temp[256], // Token from file...
2386*5e7646d2SAndroid Build Coastguard Worker *ptr; // Pointer into token
2387*5e7646d2SAndroid Build Coastguard Worker int isdefault; // Default option?
2388*5e7646d2SAndroid Build Coastguard Worker
2389*5e7646d2SAndroid Build Coastguard Worker
2390*5e7646d2SAndroid Build Coastguard Worker // Initialize things as needed...
2391*5e7646d2SAndroid Build Coastguard Worker if (inc && td)
2392*5e7646d2SAndroid Build Coastguard Worker {
2393*5e7646d2SAndroid Build Coastguard Worker d = td;
2394*5e7646d2SAndroid Build Coastguard Worker d->retain();
2395*5e7646d2SAndroid Build Coastguard Worker }
2396*5e7646d2SAndroid Build Coastguard Worker else
2397*5e7646d2SAndroid Build Coastguard Worker d = new ppdcDriver(td);
2398*5e7646d2SAndroid Build Coastguard Worker
2399*5e7646d2SAndroid Build Coastguard Worker if ((general = d->find_group("General")) == NULL)
2400*5e7646d2SAndroid Build Coastguard Worker {
2401*5e7646d2SAndroid Build Coastguard Worker general = new ppdcGroup("General", NULL);
2402*5e7646d2SAndroid Build Coastguard Worker d->add_group(general);
2403*5e7646d2SAndroid Build Coastguard Worker }
2404*5e7646d2SAndroid Build Coastguard Worker
2405*5e7646d2SAndroid Build Coastguard Worker if ((install = d->find_group("InstallableOptions")) == NULL)
2406*5e7646d2SAndroid Build Coastguard Worker {
2407*5e7646d2SAndroid Build Coastguard Worker install = new ppdcGroup("InstallableOptions", "Installable Options");
2408*5e7646d2SAndroid Build Coastguard Worker d->add_group(install);
2409*5e7646d2SAndroid Build Coastguard Worker }
2410*5e7646d2SAndroid Build Coastguard Worker
2411*5e7646d2SAndroid Build Coastguard Worker // Loop until EOF or }
2412*5e7646d2SAndroid Build Coastguard Worker o = 0;
2413*5e7646d2SAndroid Build Coastguard Worker g = general;
2414*5e7646d2SAndroid Build Coastguard Worker
2415*5e7646d2SAndroid Build Coastguard Worker while (get_token(fp, temp, sizeof(temp)))
2416*5e7646d2SAndroid Build Coastguard Worker {
2417*5e7646d2SAndroid Build Coastguard Worker if (temp[0] == '*')
2418*5e7646d2SAndroid Build Coastguard Worker {
2419*5e7646d2SAndroid Build Coastguard Worker // Mark the next choice as the default
2420*5e7646d2SAndroid Build Coastguard Worker isdefault = 1;
2421*5e7646d2SAndroid Build Coastguard Worker
2422*5e7646d2SAndroid Build Coastguard Worker for (ptr = temp; ptr[1]; ptr ++)
2423*5e7646d2SAndroid Build Coastguard Worker *ptr = ptr[1];
2424*5e7646d2SAndroid Build Coastguard Worker
2425*5e7646d2SAndroid Build Coastguard Worker *ptr = '\0';
2426*5e7646d2SAndroid Build Coastguard Worker }
2427*5e7646d2SAndroid Build Coastguard Worker else
2428*5e7646d2SAndroid Build Coastguard Worker {
2429*5e7646d2SAndroid Build Coastguard Worker // Don't mark the next choice as the default
2430*5e7646d2SAndroid Build Coastguard Worker isdefault = 0;
2431*5e7646d2SAndroid Build Coastguard Worker }
2432*5e7646d2SAndroid Build Coastguard Worker
2433*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(temp, "}"))
2434*5e7646d2SAndroid Build Coastguard Worker {
2435*5e7646d2SAndroid Build Coastguard Worker // Close this one out...
2436*5e7646d2SAndroid Build Coastguard Worker break;
2437*5e7646d2SAndroid Build Coastguard Worker }
2438*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "{"))
2439*5e7646d2SAndroid Build Coastguard Worker {
2440*5e7646d2SAndroid Build Coastguard Worker // Open a new child...
2441*5e7646d2SAndroid Build Coastguard Worker scan_file(fp, d);
2442*5e7646d2SAndroid Build Coastguard Worker }
2443*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "#if"))
2444*5e7646d2SAndroid Build Coastguard Worker {
2445*5e7646d2SAndroid Build Coastguard Worker if ((cond_current - cond_stack) >= 100)
2446*5e7646d2SAndroid Build Coastguard Worker {
2447*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
2448*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Too many nested #if's on line %d of %s."),
2449*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
2450*5e7646d2SAndroid Build Coastguard Worker break;
2451*5e7646d2SAndroid Build Coastguard Worker }
2452*5e7646d2SAndroid Build Coastguard Worker
2453*5e7646d2SAndroid Build Coastguard Worker cond_current ++;
2454*5e7646d2SAndroid Build Coastguard Worker if (get_integer(fp) > 0)
2455*5e7646d2SAndroid Build Coastguard Worker *cond_current = PPDC_COND_SATISFIED;
2456*5e7646d2SAndroid Build Coastguard Worker else
2457*5e7646d2SAndroid Build Coastguard Worker {
2458*5e7646d2SAndroid Build Coastguard Worker *cond_current = PPDC_COND_SKIP;
2459*5e7646d2SAndroid Build Coastguard Worker cond_state |= PPDC_COND_SKIP;
2460*5e7646d2SAndroid Build Coastguard Worker }
2461*5e7646d2SAndroid Build Coastguard Worker }
2462*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "#elif"))
2463*5e7646d2SAndroid Build Coastguard Worker {
2464*5e7646d2SAndroid Build Coastguard Worker if (cond_current == cond_stack)
2465*5e7646d2SAndroid Build Coastguard Worker {
2466*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("ppdc: Missing #if on line %d of %s."),
2467*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
2468*5e7646d2SAndroid Build Coastguard Worker break;
2469*5e7646d2SAndroid Build Coastguard Worker }
2470*5e7646d2SAndroid Build Coastguard Worker
2471*5e7646d2SAndroid Build Coastguard Worker if (*cond_current & PPDC_COND_SATISFIED)
2472*5e7646d2SAndroid Build Coastguard Worker {
2473*5e7646d2SAndroid Build Coastguard Worker get_integer(fp);
2474*5e7646d2SAndroid Build Coastguard Worker *cond_current |= PPDC_COND_SKIP;
2475*5e7646d2SAndroid Build Coastguard Worker }
2476*5e7646d2SAndroid Build Coastguard Worker else if (get_integer(fp) > 0)
2477*5e7646d2SAndroid Build Coastguard Worker {
2478*5e7646d2SAndroid Build Coastguard Worker *cond_current |= PPDC_COND_SATISFIED;
2479*5e7646d2SAndroid Build Coastguard Worker *cond_current &= ~PPDC_COND_SKIP;
2480*5e7646d2SAndroid Build Coastguard Worker }
2481*5e7646d2SAndroid Build Coastguard Worker else
2482*5e7646d2SAndroid Build Coastguard Worker *cond_current |= PPDC_COND_SKIP;
2483*5e7646d2SAndroid Build Coastguard Worker
2484*5e7646d2SAndroid Build Coastguard Worker // Update the current state
2485*5e7646d2SAndroid Build Coastguard Worker int *cond_temp = cond_current; // Temporary stack pointer
2486*5e7646d2SAndroid Build Coastguard Worker
2487*5e7646d2SAndroid Build Coastguard Worker cond_state = PPDC_COND_NORMAL;
2488*5e7646d2SAndroid Build Coastguard Worker while (cond_temp > cond_stack)
2489*5e7646d2SAndroid Build Coastguard Worker if (*cond_temp & PPDC_COND_SKIP)
2490*5e7646d2SAndroid Build Coastguard Worker {
2491*5e7646d2SAndroid Build Coastguard Worker cond_state = PPDC_COND_SKIP;
2492*5e7646d2SAndroid Build Coastguard Worker break;
2493*5e7646d2SAndroid Build Coastguard Worker }
2494*5e7646d2SAndroid Build Coastguard Worker else
2495*5e7646d2SAndroid Build Coastguard Worker cond_temp --;
2496*5e7646d2SAndroid Build Coastguard Worker }
2497*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "#else"))
2498*5e7646d2SAndroid Build Coastguard Worker {
2499*5e7646d2SAndroid Build Coastguard Worker if (cond_current == cond_stack)
2500*5e7646d2SAndroid Build Coastguard Worker {
2501*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("ppdc: Missing #if on line %d of %s."),
2502*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
2503*5e7646d2SAndroid Build Coastguard Worker break;
2504*5e7646d2SAndroid Build Coastguard Worker }
2505*5e7646d2SAndroid Build Coastguard Worker
2506*5e7646d2SAndroid Build Coastguard Worker if (*cond_current & PPDC_COND_SATISFIED)
2507*5e7646d2SAndroid Build Coastguard Worker *cond_current |= PPDC_COND_SKIP;
2508*5e7646d2SAndroid Build Coastguard Worker else
2509*5e7646d2SAndroid Build Coastguard Worker {
2510*5e7646d2SAndroid Build Coastguard Worker *cond_current |= PPDC_COND_SATISFIED;
2511*5e7646d2SAndroid Build Coastguard Worker *cond_current &= ~PPDC_COND_SKIP;
2512*5e7646d2SAndroid Build Coastguard Worker }
2513*5e7646d2SAndroid Build Coastguard Worker
2514*5e7646d2SAndroid Build Coastguard Worker // Update the current state
2515*5e7646d2SAndroid Build Coastguard Worker int *cond_temp = cond_current; // Temporary stack pointer
2516*5e7646d2SAndroid Build Coastguard Worker
2517*5e7646d2SAndroid Build Coastguard Worker cond_state = PPDC_COND_NORMAL;
2518*5e7646d2SAndroid Build Coastguard Worker while (cond_temp > cond_stack)
2519*5e7646d2SAndroid Build Coastguard Worker if (*cond_temp & PPDC_COND_SKIP)
2520*5e7646d2SAndroid Build Coastguard Worker {
2521*5e7646d2SAndroid Build Coastguard Worker cond_state = PPDC_COND_SKIP;
2522*5e7646d2SAndroid Build Coastguard Worker break;
2523*5e7646d2SAndroid Build Coastguard Worker }
2524*5e7646d2SAndroid Build Coastguard Worker else
2525*5e7646d2SAndroid Build Coastguard Worker cond_temp --;
2526*5e7646d2SAndroid Build Coastguard Worker }
2527*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "#endif"))
2528*5e7646d2SAndroid Build Coastguard Worker {
2529*5e7646d2SAndroid Build Coastguard Worker if (cond_current == cond_stack)
2530*5e7646d2SAndroid Build Coastguard Worker {
2531*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("ppdc: Missing #if on line %d of %s."),
2532*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
2533*5e7646d2SAndroid Build Coastguard Worker break;
2534*5e7646d2SAndroid Build Coastguard Worker }
2535*5e7646d2SAndroid Build Coastguard Worker
2536*5e7646d2SAndroid Build Coastguard Worker cond_current --;
2537*5e7646d2SAndroid Build Coastguard Worker
2538*5e7646d2SAndroid Build Coastguard Worker // Update the current state
2539*5e7646d2SAndroid Build Coastguard Worker int *cond_temp = cond_current; // Temporary stack pointer
2540*5e7646d2SAndroid Build Coastguard Worker
2541*5e7646d2SAndroid Build Coastguard Worker cond_state = PPDC_COND_NORMAL;
2542*5e7646d2SAndroid Build Coastguard Worker while (cond_temp > cond_stack)
2543*5e7646d2SAndroid Build Coastguard Worker if (*cond_temp & PPDC_COND_SKIP)
2544*5e7646d2SAndroid Build Coastguard Worker {
2545*5e7646d2SAndroid Build Coastguard Worker cond_state = PPDC_COND_SKIP;
2546*5e7646d2SAndroid Build Coastguard Worker break;
2547*5e7646d2SAndroid Build Coastguard Worker }
2548*5e7646d2SAndroid Build Coastguard Worker else
2549*5e7646d2SAndroid Build Coastguard Worker cond_temp --;
2550*5e7646d2SAndroid Build Coastguard Worker }
2551*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "#define"))
2552*5e7646d2SAndroid Build Coastguard Worker {
2553*5e7646d2SAndroid Build Coastguard Worker // Get the variable...
2554*5e7646d2SAndroid Build Coastguard Worker get_variable(fp);
2555*5e7646d2SAndroid Build Coastguard Worker }
2556*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "#include"))
2557*5e7646d2SAndroid Build Coastguard Worker {
2558*5e7646d2SAndroid Build Coastguard Worker // #include filename
2559*5e7646d2SAndroid Build Coastguard Worker char basedir[1024], // Base directory
2560*5e7646d2SAndroid Build Coastguard Worker *baseptr, // Pointer into directory
2561*5e7646d2SAndroid Build Coastguard Worker inctemp[1024], // Initial filename
2562*5e7646d2SAndroid Build Coastguard Worker incname[1024]; // Include filename
2563*5e7646d2SAndroid Build Coastguard Worker ppdcFile *incfile; // Include file
2564*5e7646d2SAndroid Build Coastguard Worker int *old_current = cond_current;
2565*5e7646d2SAndroid Build Coastguard Worker // Previous current stack
2566*5e7646d2SAndroid Build Coastguard Worker
2567*5e7646d2SAndroid Build Coastguard Worker
2568*5e7646d2SAndroid Build Coastguard Worker // Get the include name...
2569*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, inctemp, sizeof(inctemp)))
2570*5e7646d2SAndroid Build Coastguard Worker {
2571*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
2572*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected include filename on line %d of "
2573*5e7646d2SAndroid Build Coastguard Worker "%s."), fp->line, fp->filename);
2574*5e7646d2SAndroid Build Coastguard Worker break;
2575*5e7646d2SAndroid Build Coastguard Worker }
2576*5e7646d2SAndroid Build Coastguard Worker
2577*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
2578*5e7646d2SAndroid Build Coastguard Worker continue;
2579*5e7646d2SAndroid Build Coastguard Worker
2580*5e7646d2SAndroid Build Coastguard Worker // Figure out the current directory...
2581*5e7646d2SAndroid Build Coastguard Worker strlcpy(basedir, fp->filename, sizeof(basedir));
2582*5e7646d2SAndroid Build Coastguard Worker
2583*5e7646d2SAndroid Build Coastguard Worker if ((baseptr = strrchr(basedir, '/')) != NULL)
2584*5e7646d2SAndroid Build Coastguard Worker *baseptr = '\0';
2585*5e7646d2SAndroid Build Coastguard Worker else
2586*5e7646d2SAndroid Build Coastguard Worker strlcpy(basedir, ".", sizeof(basedir));
2587*5e7646d2SAndroid Build Coastguard Worker
2588*5e7646d2SAndroid Build Coastguard Worker // Find the include file...
2589*5e7646d2SAndroid Build Coastguard Worker if (find_include(inctemp, basedir, incname, sizeof(incname)))
2590*5e7646d2SAndroid Build Coastguard Worker {
2591*5e7646d2SAndroid Build Coastguard Worker // Open the include file, scan it, and then close it...
2592*5e7646d2SAndroid Build Coastguard Worker incfile = new ppdcFile(incname);
2593*5e7646d2SAndroid Build Coastguard Worker scan_file(incfile, d, true);
2594*5e7646d2SAndroid Build Coastguard Worker delete incfile;
2595*5e7646d2SAndroid Build Coastguard Worker
2596*5e7646d2SAndroid Build Coastguard Worker if (cond_current != old_current)
2597*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("ppdc: Missing #endif at end of \"%s\"."),
2598*5e7646d2SAndroid Build Coastguard Worker incname);
2599*5e7646d2SAndroid Build Coastguard Worker }
2600*5e7646d2SAndroid Build Coastguard Worker else
2601*5e7646d2SAndroid Build Coastguard Worker {
2602*5e7646d2SAndroid Build Coastguard Worker // Can't find it!
2603*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
2604*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Unable to find include file \"%s\" on line %d "
2605*5e7646d2SAndroid Build Coastguard Worker "of %s."), inctemp, fp->line, fp->filename);
2606*5e7646d2SAndroid Build Coastguard Worker break;
2607*5e7646d2SAndroid Build Coastguard Worker }
2608*5e7646d2SAndroid Build Coastguard Worker }
2609*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "#media"))
2610*5e7646d2SAndroid Build Coastguard Worker {
2611*5e7646d2SAndroid Build Coastguard Worker ppdcMediaSize *m; // Media size
2612*5e7646d2SAndroid Build Coastguard Worker
2613*5e7646d2SAndroid Build Coastguard Worker
2614*5e7646d2SAndroid Build Coastguard Worker // Get a media size...
2615*5e7646d2SAndroid Build Coastguard Worker m = get_size(fp);
2616*5e7646d2SAndroid Build Coastguard Worker if (m)
2617*5e7646d2SAndroid Build Coastguard Worker {
2618*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
2619*5e7646d2SAndroid Build Coastguard Worker m->release();
2620*5e7646d2SAndroid Build Coastguard Worker else
2621*5e7646d2SAndroid Build Coastguard Worker sizes->add(m);
2622*5e7646d2SAndroid Build Coastguard Worker }
2623*5e7646d2SAndroid Build Coastguard Worker }
2624*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "#po"))
2625*5e7646d2SAndroid Build Coastguard Worker {
2626*5e7646d2SAndroid Build Coastguard Worker ppdcCatalog *cat; // Message catalog
2627*5e7646d2SAndroid Build Coastguard Worker
2628*5e7646d2SAndroid Build Coastguard Worker
2629*5e7646d2SAndroid Build Coastguard Worker // Get a message catalog...
2630*5e7646d2SAndroid Build Coastguard Worker cat = get_po(fp);
2631*5e7646d2SAndroid Build Coastguard Worker if (cat)
2632*5e7646d2SAndroid Build Coastguard Worker {
2633*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
2634*5e7646d2SAndroid Build Coastguard Worker cat->release();
2635*5e7646d2SAndroid Build Coastguard Worker else
2636*5e7646d2SAndroid Build Coastguard Worker po_files->add(cat);
2637*5e7646d2SAndroid Build Coastguard Worker }
2638*5e7646d2SAndroid Build Coastguard Worker }
2639*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "Attribute") ||
2640*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(temp, "LocAttribute"))
2641*5e7646d2SAndroid Build Coastguard Worker {
2642*5e7646d2SAndroid Build Coastguard Worker ppdcAttr *a; // Attribute
2643*5e7646d2SAndroid Build Coastguard Worker
2644*5e7646d2SAndroid Build Coastguard Worker
2645*5e7646d2SAndroid Build Coastguard Worker // Get an attribute...
2646*5e7646d2SAndroid Build Coastguard Worker a = get_attr(fp, !_cups_strcasecmp(temp, "LocAttribute"));
2647*5e7646d2SAndroid Build Coastguard Worker if (a)
2648*5e7646d2SAndroid Build Coastguard Worker {
2649*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
2650*5e7646d2SAndroid Build Coastguard Worker a->release();
2651*5e7646d2SAndroid Build Coastguard Worker else
2652*5e7646d2SAndroid Build Coastguard Worker d->add_attr(a);
2653*5e7646d2SAndroid Build Coastguard Worker }
2654*5e7646d2SAndroid Build Coastguard Worker }
2655*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "Choice"))
2656*5e7646d2SAndroid Build Coastguard Worker {
2657*5e7646d2SAndroid Build Coastguard Worker // Get a choice...
2658*5e7646d2SAndroid Build Coastguard Worker c = get_choice(fp);
2659*5e7646d2SAndroid Build Coastguard Worker if (!c)
2660*5e7646d2SAndroid Build Coastguard Worker break;
2661*5e7646d2SAndroid Build Coastguard Worker
2662*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
2663*5e7646d2SAndroid Build Coastguard Worker {
2664*5e7646d2SAndroid Build Coastguard Worker c->release();
2665*5e7646d2SAndroid Build Coastguard Worker continue;
2666*5e7646d2SAndroid Build Coastguard Worker }
2667*5e7646d2SAndroid Build Coastguard Worker
2668*5e7646d2SAndroid Build Coastguard Worker // Add it to the current option...
2669*5e7646d2SAndroid Build Coastguard Worker if (!o)
2670*5e7646d2SAndroid Build Coastguard Worker {
2671*5e7646d2SAndroid Build Coastguard Worker c->release();
2672*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
2673*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Choice found on line %d of %s with no "
2674*5e7646d2SAndroid Build Coastguard Worker "Option."), fp->line, fp->filename);
2675*5e7646d2SAndroid Build Coastguard Worker break;
2676*5e7646d2SAndroid Build Coastguard Worker }
2677*5e7646d2SAndroid Build Coastguard Worker
2678*5e7646d2SAndroid Build Coastguard Worker o->add_choice(c);
2679*5e7646d2SAndroid Build Coastguard Worker
2680*5e7646d2SAndroid Build Coastguard Worker if (isdefault)
2681*5e7646d2SAndroid Build Coastguard Worker o->set_defchoice(c);
2682*5e7646d2SAndroid Build Coastguard Worker }
2683*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "ColorDevice"))
2684*5e7646d2SAndroid Build Coastguard Worker {
2685*5e7646d2SAndroid Build Coastguard Worker // ColorDevice boolean
2686*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
2687*5e7646d2SAndroid Build Coastguard Worker get_boolean(fp);
2688*5e7646d2SAndroid Build Coastguard Worker else
2689*5e7646d2SAndroid Build Coastguard Worker d->color_device = get_boolean(fp);
2690*5e7646d2SAndroid Build Coastguard Worker }
2691*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "ColorModel"))
2692*5e7646d2SAndroid Build Coastguard Worker {
2693*5e7646d2SAndroid Build Coastguard Worker // Get the color model
2694*5e7646d2SAndroid Build Coastguard Worker c = get_color_model(fp);
2695*5e7646d2SAndroid Build Coastguard Worker if (!c)
2696*5e7646d2SAndroid Build Coastguard Worker continue;
2697*5e7646d2SAndroid Build Coastguard Worker
2698*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
2699*5e7646d2SAndroid Build Coastguard Worker {
2700*5e7646d2SAndroid Build Coastguard Worker c->release();
2701*5e7646d2SAndroid Build Coastguard Worker continue;
2702*5e7646d2SAndroid Build Coastguard Worker }
2703*5e7646d2SAndroid Build Coastguard Worker
2704*5e7646d2SAndroid Build Coastguard Worker // Add the choice to the ColorModel option...
2705*5e7646d2SAndroid Build Coastguard Worker if ((o = d->find_option("ColorModel")) == NULL)
2706*5e7646d2SAndroid Build Coastguard Worker {
2707*5e7646d2SAndroid Build Coastguard Worker // Create the ColorModel option...
2708*5e7646d2SAndroid Build Coastguard Worker o = new ppdcOption(PPDC_PICKONE, "ColorModel", "Color Mode", PPDC_SECTION_ANY, 10.0f);
2709*5e7646d2SAndroid Build Coastguard Worker g = general;
2710*5e7646d2SAndroid Build Coastguard Worker g->add_option(o);
2711*5e7646d2SAndroid Build Coastguard Worker }
2712*5e7646d2SAndroid Build Coastguard Worker
2713*5e7646d2SAndroid Build Coastguard Worker o->add_choice(c);
2714*5e7646d2SAndroid Build Coastguard Worker
2715*5e7646d2SAndroid Build Coastguard Worker if (isdefault)
2716*5e7646d2SAndroid Build Coastguard Worker o->set_defchoice(c);
2717*5e7646d2SAndroid Build Coastguard Worker
2718*5e7646d2SAndroid Build Coastguard Worker o = NULL;
2719*5e7646d2SAndroid Build Coastguard Worker }
2720*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "ColorProfile"))
2721*5e7646d2SAndroid Build Coastguard Worker {
2722*5e7646d2SAndroid Build Coastguard Worker ppdcProfile *p; // Color profile
2723*5e7646d2SAndroid Build Coastguard Worker
2724*5e7646d2SAndroid Build Coastguard Worker
2725*5e7646d2SAndroid Build Coastguard Worker // Get the color profile...
2726*5e7646d2SAndroid Build Coastguard Worker p = get_color_profile(fp);
2727*5e7646d2SAndroid Build Coastguard Worker
2728*5e7646d2SAndroid Build Coastguard Worker if (p)
2729*5e7646d2SAndroid Build Coastguard Worker {
2730*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
2731*5e7646d2SAndroid Build Coastguard Worker p->release();
2732*5e7646d2SAndroid Build Coastguard Worker else
2733*5e7646d2SAndroid Build Coastguard Worker d->profiles->add(p);
2734*5e7646d2SAndroid Build Coastguard Worker }
2735*5e7646d2SAndroid Build Coastguard Worker }
2736*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "Copyright"))
2737*5e7646d2SAndroid Build Coastguard Worker {
2738*5e7646d2SAndroid Build Coastguard Worker // Copyright string
2739*5e7646d2SAndroid Build Coastguard Worker char copytemp[8192], // Copyright string
2740*5e7646d2SAndroid Build Coastguard Worker *copyptr, // Pointer into string
2741*5e7646d2SAndroid Build Coastguard Worker *copyend; // Pointer to end of string
2742*5e7646d2SAndroid Build Coastguard Worker
2743*5e7646d2SAndroid Build Coastguard Worker
2744*5e7646d2SAndroid Build Coastguard Worker // Get the copyright string...
2745*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, copytemp, sizeof(temp)))
2746*5e7646d2SAndroid Build Coastguard Worker {
2747*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
2748*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected string after Copyright on line %d "
2749*5e7646d2SAndroid Build Coastguard Worker "of %s."), fp->line, fp->filename);
2750*5e7646d2SAndroid Build Coastguard Worker break;
2751*5e7646d2SAndroid Build Coastguard Worker }
2752*5e7646d2SAndroid Build Coastguard Worker
2753*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
2754*5e7646d2SAndroid Build Coastguard Worker continue;
2755*5e7646d2SAndroid Build Coastguard Worker
2756*5e7646d2SAndroid Build Coastguard Worker // Break it up into individual lines...
2757*5e7646d2SAndroid Build Coastguard Worker for (copyptr = copytemp; copyptr; copyptr = copyend)
2758*5e7646d2SAndroid Build Coastguard Worker {
2759*5e7646d2SAndroid Build Coastguard Worker if ((copyend = strchr(copyptr, '\n')) != NULL)
2760*5e7646d2SAndroid Build Coastguard Worker *copyend++ = '\0';
2761*5e7646d2SAndroid Build Coastguard Worker
2762*5e7646d2SAndroid Build Coastguard Worker d->copyright->add(new ppdcString(copyptr));
2763*5e7646d2SAndroid Build Coastguard Worker }
2764*5e7646d2SAndroid Build Coastguard Worker }
2765*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "CustomMedia"))
2766*5e7646d2SAndroid Build Coastguard Worker {
2767*5e7646d2SAndroid Build Coastguard Worker ppdcMediaSize *m; // Media size
2768*5e7646d2SAndroid Build Coastguard Worker
2769*5e7646d2SAndroid Build Coastguard Worker
2770*5e7646d2SAndroid Build Coastguard Worker // Get a custom media size...
2771*5e7646d2SAndroid Build Coastguard Worker m = get_custom_size(fp);
2772*5e7646d2SAndroid Build Coastguard Worker
2773*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
2774*5e7646d2SAndroid Build Coastguard Worker {
2775*5e7646d2SAndroid Build Coastguard Worker m->release();
2776*5e7646d2SAndroid Build Coastguard Worker continue;
2777*5e7646d2SAndroid Build Coastguard Worker }
2778*5e7646d2SAndroid Build Coastguard Worker
2779*5e7646d2SAndroid Build Coastguard Worker if (m)
2780*5e7646d2SAndroid Build Coastguard Worker d->sizes->add(m);
2781*5e7646d2SAndroid Build Coastguard Worker
2782*5e7646d2SAndroid Build Coastguard Worker if (isdefault)
2783*5e7646d2SAndroid Build Coastguard Worker d->set_default_size(m);
2784*5e7646d2SAndroid Build Coastguard Worker }
2785*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "Cutter"))
2786*5e7646d2SAndroid Build Coastguard Worker {
2787*5e7646d2SAndroid Build Coastguard Worker // Cutter boolean
2788*5e7646d2SAndroid Build Coastguard Worker int have_cutter; // Have a paper cutter?
2789*5e7646d2SAndroid Build Coastguard Worker
2790*5e7646d2SAndroid Build Coastguard Worker
2791*5e7646d2SAndroid Build Coastguard Worker have_cutter = get_boolean(fp);
2792*5e7646d2SAndroid Build Coastguard Worker if (have_cutter <= 0 || cond_state)
2793*5e7646d2SAndroid Build Coastguard Worker continue;
2794*5e7646d2SAndroid Build Coastguard Worker
2795*5e7646d2SAndroid Build Coastguard Worker if ((o = d->find_option("CutMedia")) == NULL)
2796*5e7646d2SAndroid Build Coastguard Worker {
2797*5e7646d2SAndroid Build Coastguard Worker o = new ppdcOption(PPDC_BOOLEAN, "CutMedia", "Cut Media", PPDC_SECTION_ANY, 10.0f);
2798*5e7646d2SAndroid Build Coastguard Worker
2799*5e7646d2SAndroid Build Coastguard Worker g = general;
2800*5e7646d2SAndroid Build Coastguard Worker g->add_option(o);
2801*5e7646d2SAndroid Build Coastguard Worker
2802*5e7646d2SAndroid Build Coastguard Worker c = new ppdcChoice("False", NULL, "<</CutMedia 0>>setpagedevice");
2803*5e7646d2SAndroid Build Coastguard Worker o->add_choice(c);
2804*5e7646d2SAndroid Build Coastguard Worker o->set_defchoice(c);
2805*5e7646d2SAndroid Build Coastguard Worker
2806*5e7646d2SAndroid Build Coastguard Worker c = new ppdcChoice("True", NULL, "<</CutMedia 4>>setpagedevice");
2807*5e7646d2SAndroid Build Coastguard Worker o->add_choice(c);
2808*5e7646d2SAndroid Build Coastguard Worker }
2809*5e7646d2SAndroid Build Coastguard Worker
2810*5e7646d2SAndroid Build Coastguard Worker o = NULL;
2811*5e7646d2SAndroid Build Coastguard Worker }
2812*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "Darkness"))
2813*5e7646d2SAndroid Build Coastguard Worker {
2814*5e7646d2SAndroid Build Coastguard Worker // Get the darkness choice...
2815*5e7646d2SAndroid Build Coastguard Worker c = get_generic(fp, "Darkness", NULL, "cupsCompression");
2816*5e7646d2SAndroid Build Coastguard Worker if (!c)
2817*5e7646d2SAndroid Build Coastguard Worker continue;
2818*5e7646d2SAndroid Build Coastguard Worker
2819*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
2820*5e7646d2SAndroid Build Coastguard Worker {
2821*5e7646d2SAndroid Build Coastguard Worker c->release();
2822*5e7646d2SAndroid Build Coastguard Worker continue;
2823*5e7646d2SAndroid Build Coastguard Worker }
2824*5e7646d2SAndroid Build Coastguard Worker
2825*5e7646d2SAndroid Build Coastguard Worker // Add the choice to the cupsDarkness option...
2826*5e7646d2SAndroid Build Coastguard Worker if ((o = d->find_option_group("cupsDarkness", &mg)) == NULL)
2827*5e7646d2SAndroid Build Coastguard Worker {
2828*5e7646d2SAndroid Build Coastguard Worker // Create the cupsDarkness option...
2829*5e7646d2SAndroid Build Coastguard Worker o = new ppdcOption(PPDC_PICKONE, "cupsDarkness", "Darkness", PPDC_SECTION_ANY, 10.0f);
2830*5e7646d2SAndroid Build Coastguard Worker g = general;
2831*5e7646d2SAndroid Build Coastguard Worker g->add_option(o);
2832*5e7646d2SAndroid Build Coastguard Worker }
2833*5e7646d2SAndroid Build Coastguard Worker else if (mg != general)
2834*5e7646d2SAndroid Build Coastguard Worker {
2835*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
2836*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Option %s defined in two different groups on "
2837*5e7646d2SAndroid Build Coastguard Worker "line %d of %s."), "cupsDarkness", fp->line,
2838*5e7646d2SAndroid Build Coastguard Worker fp->filename);
2839*5e7646d2SAndroid Build Coastguard Worker c->release();
2840*5e7646d2SAndroid Build Coastguard Worker continue;
2841*5e7646d2SAndroid Build Coastguard Worker }
2842*5e7646d2SAndroid Build Coastguard Worker
2843*5e7646d2SAndroid Build Coastguard Worker o->add_choice(c);
2844*5e7646d2SAndroid Build Coastguard Worker
2845*5e7646d2SAndroid Build Coastguard Worker if (isdefault)
2846*5e7646d2SAndroid Build Coastguard Worker o->set_defchoice(c);
2847*5e7646d2SAndroid Build Coastguard Worker
2848*5e7646d2SAndroid Build Coastguard Worker o = NULL;
2849*5e7646d2SAndroid Build Coastguard Worker }
2850*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "DriverType"))
2851*5e7646d2SAndroid Build Coastguard Worker {
2852*5e7646d2SAndroid Build Coastguard Worker int i; // Looping var
2853*5e7646d2SAndroid Build Coastguard Worker
2854*5e7646d2SAndroid Build Coastguard Worker
2855*5e7646d2SAndroid Build Coastguard Worker // DriverType keyword
2856*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, temp, sizeof(temp)))
2857*5e7646d2SAndroid Build Coastguard Worker {
2858*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
2859*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected driver type keyword following "
2860*5e7646d2SAndroid Build Coastguard Worker "DriverType on line %d of %s."),
2861*5e7646d2SAndroid Build Coastguard Worker fp->line, fp->filename);
2862*5e7646d2SAndroid Build Coastguard Worker continue;
2863*5e7646d2SAndroid Build Coastguard Worker }
2864*5e7646d2SAndroid Build Coastguard Worker
2865*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
2866*5e7646d2SAndroid Build Coastguard Worker continue;
2867*5e7646d2SAndroid Build Coastguard Worker
2868*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < (int)(sizeof(driver_types) / sizeof(driver_types[0])); i ++)
2869*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(temp, driver_types[i]))
2870*5e7646d2SAndroid Build Coastguard Worker break;
2871*5e7646d2SAndroid Build Coastguard Worker
2872*5e7646d2SAndroid Build Coastguard Worker if (i < (int)(sizeof(driver_types) / sizeof(driver_types[0])))
2873*5e7646d2SAndroid Build Coastguard Worker d->type = (ppdcDrvType)i;
2874*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "dymo"))
2875*5e7646d2SAndroid Build Coastguard Worker d->type = PPDC_DRIVER_LABEL;
2876*5e7646d2SAndroid Build Coastguard Worker else
2877*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
2878*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Unknown driver type %s on line %d of %s."),
2879*5e7646d2SAndroid Build Coastguard Worker temp, fp->line, fp->filename);
2880*5e7646d2SAndroid Build Coastguard Worker }
2881*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "Duplex"))
2882*5e7646d2SAndroid Build Coastguard Worker get_duplex(fp, d);
2883*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "Filter"))
2884*5e7646d2SAndroid Build Coastguard Worker {
2885*5e7646d2SAndroid Build Coastguard Worker ppdcFilter *f; // Filter
2886*5e7646d2SAndroid Build Coastguard Worker
2887*5e7646d2SAndroid Build Coastguard Worker
2888*5e7646d2SAndroid Build Coastguard Worker // Get the filter value...
2889*5e7646d2SAndroid Build Coastguard Worker f = get_filter(fp);
2890*5e7646d2SAndroid Build Coastguard Worker if (f)
2891*5e7646d2SAndroid Build Coastguard Worker {
2892*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
2893*5e7646d2SAndroid Build Coastguard Worker f->release();
2894*5e7646d2SAndroid Build Coastguard Worker else
2895*5e7646d2SAndroid Build Coastguard Worker d->filters->add(f);
2896*5e7646d2SAndroid Build Coastguard Worker }
2897*5e7646d2SAndroid Build Coastguard Worker }
2898*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "Finishing"))
2899*5e7646d2SAndroid Build Coastguard Worker {
2900*5e7646d2SAndroid Build Coastguard Worker // Get the finishing choice...
2901*5e7646d2SAndroid Build Coastguard Worker c = get_generic(fp, "Finishing", "OutputType", NULL);
2902*5e7646d2SAndroid Build Coastguard Worker if (!c)
2903*5e7646d2SAndroid Build Coastguard Worker continue;
2904*5e7646d2SAndroid Build Coastguard Worker
2905*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
2906*5e7646d2SAndroid Build Coastguard Worker {
2907*5e7646d2SAndroid Build Coastguard Worker c->release();
2908*5e7646d2SAndroid Build Coastguard Worker continue;
2909*5e7646d2SAndroid Build Coastguard Worker }
2910*5e7646d2SAndroid Build Coastguard Worker
2911*5e7646d2SAndroid Build Coastguard Worker // Add the choice to the cupsFinishing option...
2912*5e7646d2SAndroid Build Coastguard Worker if ((o = d->find_option_group("cupsFinishing", &mg)) == NULL)
2913*5e7646d2SAndroid Build Coastguard Worker {
2914*5e7646d2SAndroid Build Coastguard Worker // Create the cupsFinishing option...
2915*5e7646d2SAndroid Build Coastguard Worker o = new ppdcOption(PPDC_PICKONE, "cupsFinishing", "Finishing", PPDC_SECTION_ANY, 10.0f);
2916*5e7646d2SAndroid Build Coastguard Worker g = general;
2917*5e7646d2SAndroid Build Coastguard Worker g->add_option(o);
2918*5e7646d2SAndroid Build Coastguard Worker }
2919*5e7646d2SAndroid Build Coastguard Worker else if (mg != general)
2920*5e7646d2SAndroid Build Coastguard Worker {
2921*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
2922*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Option %s defined in two different groups on "
2923*5e7646d2SAndroid Build Coastguard Worker "line %d of %s."), "cupsFinishing", fp->line,
2924*5e7646d2SAndroid Build Coastguard Worker fp->filename);
2925*5e7646d2SAndroid Build Coastguard Worker c->release();
2926*5e7646d2SAndroid Build Coastguard Worker continue;
2927*5e7646d2SAndroid Build Coastguard Worker }
2928*5e7646d2SAndroid Build Coastguard Worker
2929*5e7646d2SAndroid Build Coastguard Worker o->add_choice(c);
2930*5e7646d2SAndroid Build Coastguard Worker
2931*5e7646d2SAndroid Build Coastguard Worker if (isdefault)
2932*5e7646d2SAndroid Build Coastguard Worker o->set_defchoice(c);
2933*5e7646d2SAndroid Build Coastguard Worker
2934*5e7646d2SAndroid Build Coastguard Worker o = NULL;
2935*5e7646d2SAndroid Build Coastguard Worker }
2936*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "Font") ||
2937*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(temp, "#font"))
2938*5e7646d2SAndroid Build Coastguard Worker {
2939*5e7646d2SAndroid Build Coastguard Worker ppdcFont *f; // Font
2940*5e7646d2SAndroid Build Coastguard Worker
2941*5e7646d2SAndroid Build Coastguard Worker
2942*5e7646d2SAndroid Build Coastguard Worker // Get a font...
2943*5e7646d2SAndroid Build Coastguard Worker f = get_font(fp);
2944*5e7646d2SAndroid Build Coastguard Worker if (f)
2945*5e7646d2SAndroid Build Coastguard Worker {
2946*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
2947*5e7646d2SAndroid Build Coastguard Worker f->release();
2948*5e7646d2SAndroid Build Coastguard Worker else
2949*5e7646d2SAndroid Build Coastguard Worker {
2950*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(temp, "#font"))
2951*5e7646d2SAndroid Build Coastguard Worker base_fonts->add(f);
2952*5e7646d2SAndroid Build Coastguard Worker else
2953*5e7646d2SAndroid Build Coastguard Worker d->add_font(f);
2954*5e7646d2SAndroid Build Coastguard Worker
2955*5e7646d2SAndroid Build Coastguard Worker if (isdefault)
2956*5e7646d2SAndroid Build Coastguard Worker d->set_default_font(f);
2957*5e7646d2SAndroid Build Coastguard Worker }
2958*5e7646d2SAndroid Build Coastguard Worker }
2959*5e7646d2SAndroid Build Coastguard Worker }
2960*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "Group"))
2961*5e7646d2SAndroid Build Coastguard Worker {
2962*5e7646d2SAndroid Build Coastguard Worker // Get a group...
2963*5e7646d2SAndroid Build Coastguard Worker ppdcGroup *tempg = get_group(fp, d);
2964*5e7646d2SAndroid Build Coastguard Worker
2965*5e7646d2SAndroid Build Coastguard Worker if (!tempg)
2966*5e7646d2SAndroid Build Coastguard Worker break;
2967*5e7646d2SAndroid Build Coastguard Worker
2968*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
2969*5e7646d2SAndroid Build Coastguard Worker {
2970*5e7646d2SAndroid Build Coastguard Worker if (!d->find_group(tempg->name->value))
2971*5e7646d2SAndroid Build Coastguard Worker tempg->release();
2972*5e7646d2SAndroid Build Coastguard Worker }
2973*5e7646d2SAndroid Build Coastguard Worker else
2974*5e7646d2SAndroid Build Coastguard Worker {
2975*5e7646d2SAndroid Build Coastguard Worker if (!d->find_group(tempg->name->value))
2976*5e7646d2SAndroid Build Coastguard Worker d->add_group(tempg);
2977*5e7646d2SAndroid Build Coastguard Worker
2978*5e7646d2SAndroid Build Coastguard Worker g = tempg;
2979*5e7646d2SAndroid Build Coastguard Worker }
2980*5e7646d2SAndroid Build Coastguard Worker }
2981*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "HWMargins"))
2982*5e7646d2SAndroid Build Coastguard Worker {
2983*5e7646d2SAndroid Build Coastguard Worker // HWMargins left bottom right top
2984*5e7646d2SAndroid Build Coastguard Worker d->left_margin = get_measurement(fp);
2985*5e7646d2SAndroid Build Coastguard Worker d->bottom_margin = get_measurement(fp);
2986*5e7646d2SAndroid Build Coastguard Worker d->right_margin = get_measurement(fp);
2987*5e7646d2SAndroid Build Coastguard Worker d->top_margin = get_measurement(fp);
2988*5e7646d2SAndroid Build Coastguard Worker }
2989*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "InputSlot"))
2990*5e7646d2SAndroid Build Coastguard Worker {
2991*5e7646d2SAndroid Build Coastguard Worker // Get the input slot choice...
2992*5e7646d2SAndroid Build Coastguard Worker c = get_generic(fp, "InputSlot", NULL, "MediaPosition");
2993*5e7646d2SAndroid Build Coastguard Worker if (!c)
2994*5e7646d2SAndroid Build Coastguard Worker continue;
2995*5e7646d2SAndroid Build Coastguard Worker
2996*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
2997*5e7646d2SAndroid Build Coastguard Worker {
2998*5e7646d2SAndroid Build Coastguard Worker c->release();
2999*5e7646d2SAndroid Build Coastguard Worker continue;
3000*5e7646d2SAndroid Build Coastguard Worker }
3001*5e7646d2SAndroid Build Coastguard Worker
3002*5e7646d2SAndroid Build Coastguard Worker // Add the choice to the InputSlot option...
3003*5e7646d2SAndroid Build Coastguard Worker
3004*5e7646d2SAndroid Build Coastguard Worker if ((o = d->find_option_group("InputSlot", &mg)) == NULL)
3005*5e7646d2SAndroid Build Coastguard Worker {
3006*5e7646d2SAndroid Build Coastguard Worker // Create the InputSlot option...
3007*5e7646d2SAndroid Build Coastguard Worker o = new ppdcOption(PPDC_PICKONE, "InputSlot", "Media Source",
3008*5e7646d2SAndroid Build Coastguard Worker PPDC_SECTION_ANY, 10.0f);
3009*5e7646d2SAndroid Build Coastguard Worker g = general;
3010*5e7646d2SAndroid Build Coastguard Worker g->add_option(o);
3011*5e7646d2SAndroid Build Coastguard Worker }
3012*5e7646d2SAndroid Build Coastguard Worker else if (mg != general)
3013*5e7646d2SAndroid Build Coastguard Worker {
3014*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
3015*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Option %s defined in two different groups on "
3016*5e7646d2SAndroid Build Coastguard Worker "line %d of %s."), "InputSlot", fp->line,
3017*5e7646d2SAndroid Build Coastguard Worker fp->filename);
3018*5e7646d2SAndroid Build Coastguard Worker c->release();
3019*5e7646d2SAndroid Build Coastguard Worker continue;
3020*5e7646d2SAndroid Build Coastguard Worker }
3021*5e7646d2SAndroid Build Coastguard Worker
3022*5e7646d2SAndroid Build Coastguard Worker o->add_choice(c);
3023*5e7646d2SAndroid Build Coastguard Worker
3024*5e7646d2SAndroid Build Coastguard Worker if (isdefault)
3025*5e7646d2SAndroid Build Coastguard Worker o->set_defchoice(c);
3026*5e7646d2SAndroid Build Coastguard Worker
3027*5e7646d2SAndroid Build Coastguard Worker o = NULL;
3028*5e7646d2SAndroid Build Coastguard Worker }
3029*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "Installable"))
3030*5e7646d2SAndroid Build Coastguard Worker {
3031*5e7646d2SAndroid Build Coastguard Worker // Get the installable option...
3032*5e7646d2SAndroid Build Coastguard Worker o = get_installable(fp);
3033*5e7646d2SAndroid Build Coastguard Worker
3034*5e7646d2SAndroid Build Coastguard Worker // Add it as needed...
3035*5e7646d2SAndroid Build Coastguard Worker if (o)
3036*5e7646d2SAndroid Build Coastguard Worker {
3037*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
3038*5e7646d2SAndroid Build Coastguard Worker o->release();
3039*5e7646d2SAndroid Build Coastguard Worker else
3040*5e7646d2SAndroid Build Coastguard Worker install->add_option(o);
3041*5e7646d2SAndroid Build Coastguard Worker
3042*5e7646d2SAndroid Build Coastguard Worker o = NULL;
3043*5e7646d2SAndroid Build Coastguard Worker }
3044*5e7646d2SAndroid Build Coastguard Worker }
3045*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "ManualCopies"))
3046*5e7646d2SAndroid Build Coastguard Worker {
3047*5e7646d2SAndroid Build Coastguard Worker // ManualCopies boolean
3048*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
3049*5e7646d2SAndroid Build Coastguard Worker get_boolean(fp);
3050*5e7646d2SAndroid Build Coastguard Worker else
3051*5e7646d2SAndroid Build Coastguard Worker d->manual_copies = get_boolean(fp);
3052*5e7646d2SAndroid Build Coastguard Worker }
3053*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "Manufacturer"))
3054*5e7646d2SAndroid Build Coastguard Worker {
3055*5e7646d2SAndroid Build Coastguard Worker // Manufacturer name
3056*5e7646d2SAndroid Build Coastguard Worker char name[256]; // Model name string
3057*5e7646d2SAndroid Build Coastguard Worker
3058*5e7646d2SAndroid Build Coastguard Worker
3059*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, name, sizeof(name)))
3060*5e7646d2SAndroid Build Coastguard Worker {
3061*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
3062*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected name after Manufacturer on line %d "
3063*5e7646d2SAndroid Build Coastguard Worker "of %s."), fp->line, fp->filename);
3064*5e7646d2SAndroid Build Coastguard Worker break;
3065*5e7646d2SAndroid Build Coastguard Worker }
3066*5e7646d2SAndroid Build Coastguard Worker
3067*5e7646d2SAndroid Build Coastguard Worker if (!cond_state)
3068*5e7646d2SAndroid Build Coastguard Worker d->set_manufacturer(name);
3069*5e7646d2SAndroid Build Coastguard Worker }
3070*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "MaxSize"))
3071*5e7646d2SAndroid Build Coastguard Worker {
3072*5e7646d2SAndroid Build Coastguard Worker // MaxSize width length
3073*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
3074*5e7646d2SAndroid Build Coastguard Worker {
3075*5e7646d2SAndroid Build Coastguard Worker get_measurement(fp);
3076*5e7646d2SAndroid Build Coastguard Worker get_measurement(fp);
3077*5e7646d2SAndroid Build Coastguard Worker }
3078*5e7646d2SAndroid Build Coastguard Worker else
3079*5e7646d2SAndroid Build Coastguard Worker {
3080*5e7646d2SAndroid Build Coastguard Worker d->max_width = get_measurement(fp);
3081*5e7646d2SAndroid Build Coastguard Worker d->max_length = get_measurement(fp);
3082*5e7646d2SAndroid Build Coastguard Worker }
3083*5e7646d2SAndroid Build Coastguard Worker }
3084*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "MediaSize"))
3085*5e7646d2SAndroid Build Coastguard Worker {
3086*5e7646d2SAndroid Build Coastguard Worker // MediaSize keyword
3087*5e7646d2SAndroid Build Coastguard Worker char name[41]; // Media size name
3088*5e7646d2SAndroid Build Coastguard Worker ppdcMediaSize *m, // Matching media size...
3089*5e7646d2SAndroid Build Coastguard Worker *dm; // Driver media size...
3090*5e7646d2SAndroid Build Coastguard Worker
3091*5e7646d2SAndroid Build Coastguard Worker
3092*5e7646d2SAndroid Build Coastguard Worker if (get_token(fp, name, sizeof(name)) == NULL)
3093*5e7646d2SAndroid Build Coastguard Worker {
3094*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
3095*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected name after MediaSize on line %d of "
3096*5e7646d2SAndroid Build Coastguard Worker "%s."), fp->line, fp->filename);
3097*5e7646d2SAndroid Build Coastguard Worker break;
3098*5e7646d2SAndroid Build Coastguard Worker }
3099*5e7646d2SAndroid Build Coastguard Worker
3100*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
3101*5e7646d2SAndroid Build Coastguard Worker continue;
3102*5e7646d2SAndroid Build Coastguard Worker
3103*5e7646d2SAndroid Build Coastguard Worker m = find_size(name);
3104*5e7646d2SAndroid Build Coastguard Worker
3105*5e7646d2SAndroid Build Coastguard Worker if (!m)
3106*5e7646d2SAndroid Build Coastguard Worker {
3107*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
3108*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Unknown media size \"%s\" on line %d of "
3109*5e7646d2SAndroid Build Coastguard Worker "%s."), name, fp->line, fp->filename);
3110*5e7646d2SAndroid Build Coastguard Worker break;
3111*5e7646d2SAndroid Build Coastguard Worker }
3112*5e7646d2SAndroid Build Coastguard Worker
3113*5e7646d2SAndroid Build Coastguard Worker // Add this size to the driver...
3114*5e7646d2SAndroid Build Coastguard Worker dm = new ppdcMediaSize(m->name->value, m->text->value,
3115*5e7646d2SAndroid Build Coastguard Worker m->width, m->length, d->left_margin,
3116*5e7646d2SAndroid Build Coastguard Worker d->bottom_margin, d->right_margin,
3117*5e7646d2SAndroid Build Coastguard Worker d->top_margin);
3118*5e7646d2SAndroid Build Coastguard Worker d->sizes->add(dm);
3119*5e7646d2SAndroid Build Coastguard Worker
3120*5e7646d2SAndroid Build Coastguard Worker if (isdefault)
3121*5e7646d2SAndroid Build Coastguard Worker d->set_default_size(dm);
3122*5e7646d2SAndroid Build Coastguard Worker }
3123*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "MediaType"))
3124*5e7646d2SAndroid Build Coastguard Worker {
3125*5e7646d2SAndroid Build Coastguard Worker // Get the media type choice...
3126*5e7646d2SAndroid Build Coastguard Worker c = get_generic(fp, "MediaType", "MediaType", "cupsMediaType");
3127*5e7646d2SAndroid Build Coastguard Worker if (!c)
3128*5e7646d2SAndroid Build Coastguard Worker continue;
3129*5e7646d2SAndroid Build Coastguard Worker
3130*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
3131*5e7646d2SAndroid Build Coastguard Worker {
3132*5e7646d2SAndroid Build Coastguard Worker c->release();
3133*5e7646d2SAndroid Build Coastguard Worker continue;
3134*5e7646d2SAndroid Build Coastguard Worker }
3135*5e7646d2SAndroid Build Coastguard Worker
3136*5e7646d2SAndroid Build Coastguard Worker // Add the choice to the MediaType option...
3137*5e7646d2SAndroid Build Coastguard Worker if ((o = d->find_option_group("MediaType", &mg)) == NULL)
3138*5e7646d2SAndroid Build Coastguard Worker {
3139*5e7646d2SAndroid Build Coastguard Worker // Create the MediaType option...
3140*5e7646d2SAndroid Build Coastguard Worker o = new ppdcOption(PPDC_PICKONE, "MediaType", "Media Type",
3141*5e7646d2SAndroid Build Coastguard Worker PPDC_SECTION_ANY, 10.0f);
3142*5e7646d2SAndroid Build Coastguard Worker g = general;
3143*5e7646d2SAndroid Build Coastguard Worker g->add_option(o);
3144*5e7646d2SAndroid Build Coastguard Worker }
3145*5e7646d2SAndroid Build Coastguard Worker else if (mg != general)
3146*5e7646d2SAndroid Build Coastguard Worker {
3147*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
3148*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Option %s defined in two different groups on "
3149*5e7646d2SAndroid Build Coastguard Worker "line %d of %s."), "MediaType", fp->line,
3150*5e7646d2SAndroid Build Coastguard Worker fp->filename);
3151*5e7646d2SAndroid Build Coastguard Worker c->release();
3152*5e7646d2SAndroid Build Coastguard Worker continue;
3153*5e7646d2SAndroid Build Coastguard Worker }
3154*5e7646d2SAndroid Build Coastguard Worker
3155*5e7646d2SAndroid Build Coastguard Worker o->add_choice(c);
3156*5e7646d2SAndroid Build Coastguard Worker
3157*5e7646d2SAndroid Build Coastguard Worker if (isdefault)
3158*5e7646d2SAndroid Build Coastguard Worker o->set_defchoice(c);
3159*5e7646d2SAndroid Build Coastguard Worker
3160*5e7646d2SAndroid Build Coastguard Worker o = NULL;
3161*5e7646d2SAndroid Build Coastguard Worker }
3162*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "MinSize"))
3163*5e7646d2SAndroid Build Coastguard Worker {
3164*5e7646d2SAndroid Build Coastguard Worker // MinSize width length
3165*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
3166*5e7646d2SAndroid Build Coastguard Worker {
3167*5e7646d2SAndroid Build Coastguard Worker get_measurement(fp);
3168*5e7646d2SAndroid Build Coastguard Worker get_measurement(fp);
3169*5e7646d2SAndroid Build Coastguard Worker }
3170*5e7646d2SAndroid Build Coastguard Worker else
3171*5e7646d2SAndroid Build Coastguard Worker {
3172*5e7646d2SAndroid Build Coastguard Worker d->min_width = get_measurement(fp);
3173*5e7646d2SAndroid Build Coastguard Worker d->min_length = get_measurement(fp);
3174*5e7646d2SAndroid Build Coastguard Worker }
3175*5e7646d2SAndroid Build Coastguard Worker }
3176*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "ModelName"))
3177*5e7646d2SAndroid Build Coastguard Worker {
3178*5e7646d2SAndroid Build Coastguard Worker // ModelName name
3179*5e7646d2SAndroid Build Coastguard Worker char name[256]; // Model name string
3180*5e7646d2SAndroid Build Coastguard Worker
3181*5e7646d2SAndroid Build Coastguard Worker
3182*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, name, sizeof(name)))
3183*5e7646d2SAndroid Build Coastguard Worker {
3184*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
3185*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected name after ModelName on line %d of "
3186*5e7646d2SAndroid Build Coastguard Worker "%s."), fp->line, fp->filename);
3187*5e7646d2SAndroid Build Coastguard Worker break;
3188*5e7646d2SAndroid Build Coastguard Worker }
3189*5e7646d2SAndroid Build Coastguard Worker
3190*5e7646d2SAndroid Build Coastguard Worker if (!cond_state)
3191*5e7646d2SAndroid Build Coastguard Worker d->set_model_name(name);
3192*5e7646d2SAndroid Build Coastguard Worker }
3193*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "ModelNumber"))
3194*5e7646d2SAndroid Build Coastguard Worker {
3195*5e7646d2SAndroid Build Coastguard Worker // ModelNumber number
3196*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
3197*5e7646d2SAndroid Build Coastguard Worker get_integer(fp);
3198*5e7646d2SAndroid Build Coastguard Worker else
3199*5e7646d2SAndroid Build Coastguard Worker d->model_number = get_integer(fp);
3200*5e7646d2SAndroid Build Coastguard Worker }
3201*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "Option"))
3202*5e7646d2SAndroid Build Coastguard Worker {
3203*5e7646d2SAndroid Build Coastguard Worker // Get an option...
3204*5e7646d2SAndroid Build Coastguard Worker ppdcOption *tempo = get_option(fp, d, g);
3205*5e7646d2SAndroid Build Coastguard Worker
3206*5e7646d2SAndroid Build Coastguard Worker if (!tempo)
3207*5e7646d2SAndroid Build Coastguard Worker break;
3208*5e7646d2SAndroid Build Coastguard Worker
3209*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
3210*5e7646d2SAndroid Build Coastguard Worker {
3211*5e7646d2SAndroid Build Coastguard Worker if (!g->find_option(tempo->name->value))
3212*5e7646d2SAndroid Build Coastguard Worker tempo->release();
3213*5e7646d2SAndroid Build Coastguard Worker }
3214*5e7646d2SAndroid Build Coastguard Worker else
3215*5e7646d2SAndroid Build Coastguard Worker {
3216*5e7646d2SAndroid Build Coastguard Worker if (!g->find_option(tempo->name->value))
3217*5e7646d2SAndroid Build Coastguard Worker g->add_option(tempo);
3218*5e7646d2SAndroid Build Coastguard Worker
3219*5e7646d2SAndroid Build Coastguard Worker o = tempo;
3220*5e7646d2SAndroid Build Coastguard Worker }
3221*5e7646d2SAndroid Build Coastguard Worker }
3222*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "FileName"))
3223*5e7646d2SAndroid Build Coastguard Worker {
3224*5e7646d2SAndroid Build Coastguard Worker // FileName name
3225*5e7646d2SAndroid Build Coastguard Worker char name[256]; // Filename string
3226*5e7646d2SAndroid Build Coastguard Worker
3227*5e7646d2SAndroid Build Coastguard Worker
3228*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, name, sizeof(name)))
3229*5e7646d2SAndroid Build Coastguard Worker {
3230*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
3231*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected name after FileName on line %d of "
3232*5e7646d2SAndroid Build Coastguard Worker "%s."), fp->line, fp->filename);
3233*5e7646d2SAndroid Build Coastguard Worker break;
3234*5e7646d2SAndroid Build Coastguard Worker }
3235*5e7646d2SAndroid Build Coastguard Worker
3236*5e7646d2SAndroid Build Coastguard Worker if (!cond_state)
3237*5e7646d2SAndroid Build Coastguard Worker d->set_file_name(name);
3238*5e7646d2SAndroid Build Coastguard Worker }
3239*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "PCFileName"))
3240*5e7646d2SAndroid Build Coastguard Worker {
3241*5e7646d2SAndroid Build Coastguard Worker // PCFileName name
3242*5e7646d2SAndroid Build Coastguard Worker char name[256]; // PC filename string
3243*5e7646d2SAndroid Build Coastguard Worker
3244*5e7646d2SAndroid Build Coastguard Worker
3245*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, name, sizeof(name)))
3246*5e7646d2SAndroid Build Coastguard Worker {
3247*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
3248*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected name after PCFileName on line %d of "
3249*5e7646d2SAndroid Build Coastguard Worker "%s."), fp->line, fp->filename);
3250*5e7646d2SAndroid Build Coastguard Worker break;
3251*5e7646d2SAndroid Build Coastguard Worker }
3252*5e7646d2SAndroid Build Coastguard Worker
3253*5e7646d2SAndroid Build Coastguard Worker if (!cond_state)
3254*5e7646d2SAndroid Build Coastguard Worker d->set_pc_file_name(name);
3255*5e7646d2SAndroid Build Coastguard Worker }
3256*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "Resolution"))
3257*5e7646d2SAndroid Build Coastguard Worker {
3258*5e7646d2SAndroid Build Coastguard Worker // Get the resolution choice...
3259*5e7646d2SAndroid Build Coastguard Worker c = get_resolution(fp);
3260*5e7646d2SAndroid Build Coastguard Worker if (!c)
3261*5e7646d2SAndroid Build Coastguard Worker continue;
3262*5e7646d2SAndroid Build Coastguard Worker
3263*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
3264*5e7646d2SAndroid Build Coastguard Worker {
3265*5e7646d2SAndroid Build Coastguard Worker c->release();
3266*5e7646d2SAndroid Build Coastguard Worker continue;
3267*5e7646d2SAndroid Build Coastguard Worker }
3268*5e7646d2SAndroid Build Coastguard Worker
3269*5e7646d2SAndroid Build Coastguard Worker // Add the choice to the Resolution option...
3270*5e7646d2SAndroid Build Coastguard Worker if ((o = d->find_option_group("Resolution", &mg)) == NULL)
3271*5e7646d2SAndroid Build Coastguard Worker {
3272*5e7646d2SAndroid Build Coastguard Worker // Create the Resolution option...
3273*5e7646d2SAndroid Build Coastguard Worker o = new ppdcOption(PPDC_PICKONE, "Resolution", NULL, PPDC_SECTION_ANY,
3274*5e7646d2SAndroid Build Coastguard Worker 10.0f);
3275*5e7646d2SAndroid Build Coastguard Worker g = general;
3276*5e7646d2SAndroid Build Coastguard Worker g->add_option(o);
3277*5e7646d2SAndroid Build Coastguard Worker }
3278*5e7646d2SAndroid Build Coastguard Worker else if (mg != general)
3279*5e7646d2SAndroid Build Coastguard Worker {
3280*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
3281*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Option %s defined in two different groups on "
3282*5e7646d2SAndroid Build Coastguard Worker "line %d of %s."), "Resolution", fp->line,
3283*5e7646d2SAndroid Build Coastguard Worker fp->filename);
3284*5e7646d2SAndroid Build Coastguard Worker c->release();
3285*5e7646d2SAndroid Build Coastguard Worker continue;
3286*5e7646d2SAndroid Build Coastguard Worker }
3287*5e7646d2SAndroid Build Coastguard Worker
3288*5e7646d2SAndroid Build Coastguard Worker o->add_choice(c);
3289*5e7646d2SAndroid Build Coastguard Worker
3290*5e7646d2SAndroid Build Coastguard Worker if (isdefault)
3291*5e7646d2SAndroid Build Coastguard Worker o->set_defchoice(c);
3292*5e7646d2SAndroid Build Coastguard Worker
3293*5e7646d2SAndroid Build Coastguard Worker o = NULL;
3294*5e7646d2SAndroid Build Coastguard Worker }
3295*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "SimpleColorProfile"))
3296*5e7646d2SAndroid Build Coastguard Worker {
3297*5e7646d2SAndroid Build Coastguard Worker ppdcProfile *p; // Color profile
3298*5e7646d2SAndroid Build Coastguard Worker
3299*5e7646d2SAndroid Build Coastguard Worker
3300*5e7646d2SAndroid Build Coastguard Worker // Get the color profile...
3301*5e7646d2SAndroid Build Coastguard Worker p = get_simple_profile(fp);
3302*5e7646d2SAndroid Build Coastguard Worker
3303*5e7646d2SAndroid Build Coastguard Worker if (p)
3304*5e7646d2SAndroid Build Coastguard Worker {
3305*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
3306*5e7646d2SAndroid Build Coastguard Worker p->release();
3307*5e7646d2SAndroid Build Coastguard Worker else
3308*5e7646d2SAndroid Build Coastguard Worker d->profiles->add(p);
3309*5e7646d2SAndroid Build Coastguard Worker }
3310*5e7646d2SAndroid Build Coastguard Worker }
3311*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "Throughput"))
3312*5e7646d2SAndroid Build Coastguard Worker {
3313*5e7646d2SAndroid Build Coastguard Worker // Throughput number
3314*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
3315*5e7646d2SAndroid Build Coastguard Worker get_integer(fp);
3316*5e7646d2SAndroid Build Coastguard Worker else
3317*5e7646d2SAndroid Build Coastguard Worker d->throughput = get_integer(fp);
3318*5e7646d2SAndroid Build Coastguard Worker }
3319*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "UIConstraints"))
3320*5e7646d2SAndroid Build Coastguard Worker {
3321*5e7646d2SAndroid Build Coastguard Worker ppdcConstraint *con; // Constraint
3322*5e7646d2SAndroid Build Coastguard Worker
3323*5e7646d2SAndroid Build Coastguard Worker
3324*5e7646d2SAndroid Build Coastguard Worker con = get_constraint(fp);
3325*5e7646d2SAndroid Build Coastguard Worker
3326*5e7646d2SAndroid Build Coastguard Worker if (con)
3327*5e7646d2SAndroid Build Coastguard Worker {
3328*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
3329*5e7646d2SAndroid Build Coastguard Worker con->release();
3330*5e7646d2SAndroid Build Coastguard Worker else
3331*5e7646d2SAndroid Build Coastguard Worker d->constraints->add(con);
3332*5e7646d2SAndroid Build Coastguard Worker }
3333*5e7646d2SAndroid Build Coastguard Worker }
3334*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "VariablePaperSize"))
3335*5e7646d2SAndroid Build Coastguard Worker {
3336*5e7646d2SAndroid Build Coastguard Worker // VariablePaperSize boolean
3337*5e7646d2SAndroid Build Coastguard Worker if (cond_state)
3338*5e7646d2SAndroid Build Coastguard Worker get_boolean(fp);
3339*5e7646d2SAndroid Build Coastguard Worker else
3340*5e7646d2SAndroid Build Coastguard Worker d->variable_paper_size = get_boolean(fp);
3341*5e7646d2SAndroid Build Coastguard Worker }
3342*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(temp, "Version"))
3343*5e7646d2SAndroid Build Coastguard Worker {
3344*5e7646d2SAndroid Build Coastguard Worker // Version string
3345*5e7646d2SAndroid Build Coastguard Worker char name[256]; // Model name string
3346*5e7646d2SAndroid Build Coastguard Worker
3347*5e7646d2SAndroid Build Coastguard Worker
3348*5e7646d2SAndroid Build Coastguard Worker if (!get_token(fp, name, sizeof(name)))
3349*5e7646d2SAndroid Build Coastguard Worker {
3350*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
3351*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Expected string after Version on line %d of "
3352*5e7646d2SAndroid Build Coastguard Worker "%s."), fp->line, fp->filename);
3353*5e7646d2SAndroid Build Coastguard Worker break;
3354*5e7646d2SAndroid Build Coastguard Worker }
3355*5e7646d2SAndroid Build Coastguard Worker
3356*5e7646d2SAndroid Build Coastguard Worker if (!cond_state)
3357*5e7646d2SAndroid Build Coastguard Worker d->set_version(name);
3358*5e7646d2SAndroid Build Coastguard Worker }
3359*5e7646d2SAndroid Build Coastguard Worker else
3360*5e7646d2SAndroid Build Coastguard Worker {
3361*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
3362*5e7646d2SAndroid Build Coastguard Worker _("ppdc: Unknown token \"%s\" seen on line %d of %s."),
3363*5e7646d2SAndroid Build Coastguard Worker temp, fp->line, fp->filename);
3364*5e7646d2SAndroid Build Coastguard Worker break;
3365*5e7646d2SAndroid Build Coastguard Worker }
3366*5e7646d2SAndroid Build Coastguard Worker }
3367*5e7646d2SAndroid Build Coastguard Worker
3368*5e7646d2SAndroid Build Coastguard Worker // Done processing this block, is there anything to save?
3369*5e7646d2SAndroid Build Coastguard Worker if (!inc)
3370*5e7646d2SAndroid Build Coastguard Worker {
3371*5e7646d2SAndroid Build Coastguard Worker if (!d->pc_file_name || !d->model_name || !d->manufacturer || !d->version ||
3372*5e7646d2SAndroid Build Coastguard Worker !d->sizes->count)
3373*5e7646d2SAndroid Build Coastguard Worker {
3374*5e7646d2SAndroid Build Coastguard Worker // Nothing to save...
3375*5e7646d2SAndroid Build Coastguard Worker d->release();
3376*5e7646d2SAndroid Build Coastguard Worker }
3377*5e7646d2SAndroid Build Coastguard Worker else
3378*5e7646d2SAndroid Build Coastguard Worker {
3379*5e7646d2SAndroid Build Coastguard Worker // Got a driver, save it...
3380*5e7646d2SAndroid Build Coastguard Worker drivers->add(d);
3381*5e7646d2SAndroid Build Coastguard Worker }
3382*5e7646d2SAndroid Build Coastguard Worker }
3383*5e7646d2SAndroid Build Coastguard Worker else if (inc && td)
3384*5e7646d2SAndroid Build Coastguard Worker td->release();
3385*5e7646d2SAndroid Build Coastguard Worker }
3386*5e7646d2SAndroid Build Coastguard Worker
3387*5e7646d2SAndroid Build Coastguard Worker
3388*5e7646d2SAndroid Build Coastguard Worker //
3389*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::set_variable()' - Set a variable.
3390*5e7646d2SAndroid Build Coastguard Worker //
3391*5e7646d2SAndroid Build Coastguard Worker
3392*5e7646d2SAndroid Build Coastguard Worker ppdcVariable * // O - Variable
set_variable(const char * name,const char * value)3393*5e7646d2SAndroid Build Coastguard Worker ppdcSource::set_variable(
3394*5e7646d2SAndroid Build Coastguard Worker const char *name, // I - Name
3395*5e7646d2SAndroid Build Coastguard Worker const char *value) // I - Value
3396*5e7646d2SAndroid Build Coastguard Worker {
3397*5e7646d2SAndroid Build Coastguard Worker ppdcVariable *v; // Variable
3398*5e7646d2SAndroid Build Coastguard Worker
3399*5e7646d2SAndroid Build Coastguard Worker
3400*5e7646d2SAndroid Build Coastguard Worker // See if the variable exists already...
3401*5e7646d2SAndroid Build Coastguard Worker v = find_variable(name);
3402*5e7646d2SAndroid Build Coastguard Worker if (v)
3403*5e7646d2SAndroid Build Coastguard Worker {
3404*5e7646d2SAndroid Build Coastguard Worker // Change the variable value...
3405*5e7646d2SAndroid Build Coastguard Worker v->set_value(value);
3406*5e7646d2SAndroid Build Coastguard Worker }
3407*5e7646d2SAndroid Build Coastguard Worker else
3408*5e7646d2SAndroid Build Coastguard Worker {
3409*5e7646d2SAndroid Build Coastguard Worker // Create a new variable and add it...
3410*5e7646d2SAndroid Build Coastguard Worker v = new ppdcVariable(name, value);
3411*5e7646d2SAndroid Build Coastguard Worker vars->add(v);
3412*5e7646d2SAndroid Build Coastguard Worker }
3413*5e7646d2SAndroid Build Coastguard Worker
3414*5e7646d2SAndroid Build Coastguard Worker return (v);
3415*5e7646d2SAndroid Build Coastguard Worker }
3416*5e7646d2SAndroid Build Coastguard Worker
3417*5e7646d2SAndroid Build Coastguard Worker
3418*5e7646d2SAndroid Build Coastguard Worker //
3419*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::write_file()' - Write the current source data to a file.
3420*5e7646d2SAndroid Build Coastguard Worker //
3421*5e7646d2SAndroid Build Coastguard Worker
3422*5e7646d2SAndroid Build Coastguard Worker int // O - 0 on success, -1 on error
write_file(const char * f)3423*5e7646d2SAndroid Build Coastguard Worker ppdcSource::write_file(const char *f) // I - File to write
3424*5e7646d2SAndroid Build Coastguard Worker {
3425*5e7646d2SAndroid Build Coastguard Worker cups_file_t *fp; // Output file
3426*5e7646d2SAndroid Build Coastguard Worker char bckname[1024]; // Backup file
3427*5e7646d2SAndroid Build Coastguard Worker ppdcDriver *d; // Current driver
3428*5e7646d2SAndroid Build Coastguard Worker ppdcString *st; // Current string
3429*5e7646d2SAndroid Build Coastguard Worker ppdcAttr *a; // Current attribute
3430*5e7646d2SAndroid Build Coastguard Worker ppdcConstraint *co; // Current constraint
3431*5e7646d2SAndroid Build Coastguard Worker ppdcFilter *fi; // Current filter
3432*5e7646d2SAndroid Build Coastguard Worker ppdcFont *fo; // Current font
3433*5e7646d2SAndroid Build Coastguard Worker ppdcGroup *g; // Current group
3434*5e7646d2SAndroid Build Coastguard Worker ppdcOption *o; // Current option
3435*5e7646d2SAndroid Build Coastguard Worker ppdcChoice *ch; // Current choice
3436*5e7646d2SAndroid Build Coastguard Worker ppdcProfile *p; // Current color profile
3437*5e7646d2SAndroid Build Coastguard Worker ppdcMediaSize *si; // Current media size
3438*5e7646d2SAndroid Build Coastguard Worker float left, // Current left margin
3439*5e7646d2SAndroid Build Coastguard Worker bottom, // Current bottom margin
3440*5e7646d2SAndroid Build Coastguard Worker right, // Current right margin
3441*5e7646d2SAndroid Build Coastguard Worker top; // Current top margin
3442*5e7646d2SAndroid Build Coastguard Worker int dtused[PPDC_DRIVER_MAX];// Driver type usage...
3443*5e7646d2SAndroid Build Coastguard Worker
3444*5e7646d2SAndroid Build Coastguard Worker
3445*5e7646d2SAndroid Build Coastguard Worker // Rename the current file, if any, to .bck...
3446*5e7646d2SAndroid Build Coastguard Worker snprintf(bckname, sizeof(bckname), "%s.bck", f);
3447*5e7646d2SAndroid Build Coastguard Worker rename(f, bckname);
3448*5e7646d2SAndroid Build Coastguard Worker
3449*5e7646d2SAndroid Build Coastguard Worker // Open the output file...
3450*5e7646d2SAndroid Build Coastguard Worker fp = cupsFileOpen(f, "w");
3451*5e7646d2SAndroid Build Coastguard Worker
3452*5e7646d2SAndroid Build Coastguard Worker if (!fp)
3453*5e7646d2SAndroid Build Coastguard Worker {
3454*5e7646d2SAndroid Build Coastguard Worker // Can't create file; restore backup and return...
3455*5e7646d2SAndroid Build Coastguard Worker rename(bckname, f);
3456*5e7646d2SAndroid Build Coastguard Worker return (-1);
3457*5e7646d2SAndroid Build Coastguard Worker }
3458*5e7646d2SAndroid Build Coastguard Worker
3459*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "// CUPS PPD Compiler " CUPS_SVERSION "\n\n");
3460*5e7646d2SAndroid Build Coastguard Worker
3461*5e7646d2SAndroid Build Coastguard Worker // Include standard files...
3462*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "// Include necessary files...\n");
3463*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "#include <font.defs>\n");
3464*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "#include <media.defs>\n");
3465*5e7646d2SAndroid Build Coastguard Worker
3466*5e7646d2SAndroid Build Coastguard Worker memset(dtused, 0, sizeof(dtused));
3467*5e7646d2SAndroid Build Coastguard Worker
3468*5e7646d2SAndroid Build Coastguard Worker for (d = (ppdcDriver *)drivers->first(); d; d = (ppdcDriver *)drivers->next())
3469*5e7646d2SAndroid Build Coastguard Worker if (d->type > PPDC_DRIVER_PS && !dtused[d->type])
3470*5e7646d2SAndroid Build Coastguard Worker {
3471*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, "#include <%s.h>\n", driver_types[d->type]);
3472*5e7646d2SAndroid Build Coastguard Worker dtused[d->type] = 1;
3473*5e7646d2SAndroid Build Coastguard Worker }
3474*5e7646d2SAndroid Build Coastguard Worker
3475*5e7646d2SAndroid Build Coastguard Worker // Output each driver...
3476*5e7646d2SAndroid Build Coastguard Worker for (d = (ppdcDriver *)drivers->first(); d; d = (ppdcDriver *)drivers->next())
3477*5e7646d2SAndroid Build Coastguard Worker {
3478*5e7646d2SAndroid Build Coastguard Worker // Start the driver...
3479*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, "\n// %s %s\n", d->manufacturer->value,
3480*5e7646d2SAndroid Build Coastguard Worker d->model_name->value);
3481*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "{\n");
3482*5e7646d2SAndroid Build Coastguard Worker
3483*5e7646d2SAndroid Build Coastguard Worker // Write the copyright stings...
3484*5e7646d2SAndroid Build Coastguard Worker for (st = (ppdcString *)d->copyright->first();
3485*5e7646d2SAndroid Build Coastguard Worker st;
3486*5e7646d2SAndroid Build Coastguard Worker st = (ppdcString *)d->copyright->next())
3487*5e7646d2SAndroid Build Coastguard Worker quotef(fp, " Copyright \"%s\"\n", st->value);
3488*5e7646d2SAndroid Build Coastguard Worker
3489*5e7646d2SAndroid Build Coastguard Worker // Write other strings and values...
3490*5e7646d2SAndroid Build Coastguard Worker if (d->manufacturer && d->manufacturer->value)
3491*5e7646d2SAndroid Build Coastguard Worker quotef(fp, " Manufacturer \"%s\"\n", d->manufacturer->value);
3492*5e7646d2SAndroid Build Coastguard Worker if (d->model_name->value)
3493*5e7646d2SAndroid Build Coastguard Worker quotef(fp, " ModelName \"%s\"\n", d->model_name->value);
3494*5e7646d2SAndroid Build Coastguard Worker if (d->file_name && d->file_name->value)
3495*5e7646d2SAndroid Build Coastguard Worker quotef(fp, " FileName \"%s\"\n", d->file_name->value);
3496*5e7646d2SAndroid Build Coastguard Worker if (d->pc_file_name && d->pc_file_name->value)
3497*5e7646d2SAndroid Build Coastguard Worker quotef(fp, " PCFileName \"%s\"\n", d->pc_file_name->value);
3498*5e7646d2SAndroid Build Coastguard Worker if (d->version && d->version->value)
3499*5e7646d2SAndroid Build Coastguard Worker quotef(fp, " Version \"%s\"\n", d->version->value);
3500*5e7646d2SAndroid Build Coastguard Worker
3501*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, " DriverType %s\n", driver_types[d->type]);
3502*5e7646d2SAndroid Build Coastguard Worker
3503*5e7646d2SAndroid Build Coastguard Worker if (d->model_number)
3504*5e7646d2SAndroid Build Coastguard Worker {
3505*5e7646d2SAndroid Build Coastguard Worker switch (d->type)
3506*5e7646d2SAndroid Build Coastguard Worker {
3507*5e7646d2SAndroid Build Coastguard Worker case PPDC_DRIVER_LABEL :
3508*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, " ModelNumber ");
3509*5e7646d2SAndroid Build Coastguard Worker
3510*5e7646d2SAndroid Build Coastguard Worker switch (d->model_number)
3511*5e7646d2SAndroid Build Coastguard Worker {
3512*5e7646d2SAndroid Build Coastguard Worker case DYMO_3x0 :
3513*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "$DYMO_3x0\n");
3514*5e7646d2SAndroid Build Coastguard Worker break;
3515*5e7646d2SAndroid Build Coastguard Worker
3516*5e7646d2SAndroid Build Coastguard Worker case ZEBRA_EPL_LINE :
3517*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "$ZEBRA_EPL_LINE\n");
3518*5e7646d2SAndroid Build Coastguard Worker break;
3519*5e7646d2SAndroid Build Coastguard Worker
3520*5e7646d2SAndroid Build Coastguard Worker case ZEBRA_EPL_PAGE :
3521*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "$ZEBRA_EPL_PAGE\n");
3522*5e7646d2SAndroid Build Coastguard Worker break;
3523*5e7646d2SAndroid Build Coastguard Worker
3524*5e7646d2SAndroid Build Coastguard Worker case ZEBRA_ZPL :
3525*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "$ZEBRA_ZPL\n");
3526*5e7646d2SAndroid Build Coastguard Worker break;
3527*5e7646d2SAndroid Build Coastguard Worker
3528*5e7646d2SAndroid Build Coastguard Worker case ZEBRA_CPCL :
3529*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "$ZEBRA_CPCL\n");
3530*5e7646d2SAndroid Build Coastguard Worker break;
3531*5e7646d2SAndroid Build Coastguard Worker
3532*5e7646d2SAndroid Build Coastguard Worker case INTELLITECH_PCL :
3533*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "$INTELLITECH_PCL\n");
3534*5e7646d2SAndroid Build Coastguard Worker break;
3535*5e7646d2SAndroid Build Coastguard Worker
3536*5e7646d2SAndroid Build Coastguard Worker default :
3537*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, "%d\n", d->model_number);
3538*5e7646d2SAndroid Build Coastguard Worker break;
3539*5e7646d2SAndroid Build Coastguard Worker }
3540*5e7646d2SAndroid Build Coastguard Worker break;
3541*5e7646d2SAndroid Build Coastguard Worker
3542*5e7646d2SAndroid Build Coastguard Worker case PPDC_DRIVER_EPSON :
3543*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, " ModelNumber ");
3544*5e7646d2SAndroid Build Coastguard Worker
3545*5e7646d2SAndroid Build Coastguard Worker switch (d->model_number)
3546*5e7646d2SAndroid Build Coastguard Worker {
3547*5e7646d2SAndroid Build Coastguard Worker case EPSON_9PIN :
3548*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "$EPSON_9PIN\n");
3549*5e7646d2SAndroid Build Coastguard Worker break;
3550*5e7646d2SAndroid Build Coastguard Worker
3551*5e7646d2SAndroid Build Coastguard Worker case EPSON_24PIN :
3552*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "$EPSON_24PIN\n");
3553*5e7646d2SAndroid Build Coastguard Worker break;
3554*5e7646d2SAndroid Build Coastguard Worker
3555*5e7646d2SAndroid Build Coastguard Worker case EPSON_COLOR :
3556*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "$EPSON_COLOR\n");
3557*5e7646d2SAndroid Build Coastguard Worker break;
3558*5e7646d2SAndroid Build Coastguard Worker
3559*5e7646d2SAndroid Build Coastguard Worker case EPSON_PHOTO :
3560*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "$EPSON_PHOTO\n");
3561*5e7646d2SAndroid Build Coastguard Worker break;
3562*5e7646d2SAndroid Build Coastguard Worker
3563*5e7646d2SAndroid Build Coastguard Worker case EPSON_ICOLOR :
3564*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "$EPSON_ICOLOR\n");
3565*5e7646d2SAndroid Build Coastguard Worker break;
3566*5e7646d2SAndroid Build Coastguard Worker
3567*5e7646d2SAndroid Build Coastguard Worker case EPSON_IPHOTO :
3568*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "$EPSON_IPHOTO\n");
3569*5e7646d2SAndroid Build Coastguard Worker break;
3570*5e7646d2SAndroid Build Coastguard Worker
3571*5e7646d2SAndroid Build Coastguard Worker default :
3572*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, "%d\n", d->model_number);
3573*5e7646d2SAndroid Build Coastguard Worker break;
3574*5e7646d2SAndroid Build Coastguard Worker }
3575*5e7646d2SAndroid Build Coastguard Worker break;
3576*5e7646d2SAndroid Build Coastguard Worker
3577*5e7646d2SAndroid Build Coastguard Worker case PPDC_DRIVER_HP :
3578*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, " ModelNumber ");
3579*5e7646d2SAndroid Build Coastguard Worker switch (d->model_number)
3580*5e7646d2SAndroid Build Coastguard Worker {
3581*5e7646d2SAndroid Build Coastguard Worker case HP_LASERJET :
3582*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "$HP_LASERJET\n");
3583*5e7646d2SAndroid Build Coastguard Worker break;
3584*5e7646d2SAndroid Build Coastguard Worker
3585*5e7646d2SAndroid Build Coastguard Worker case HP_DESKJET :
3586*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "$HP_DESKJET\n");
3587*5e7646d2SAndroid Build Coastguard Worker break;
3588*5e7646d2SAndroid Build Coastguard Worker
3589*5e7646d2SAndroid Build Coastguard Worker case HP_DESKJET2 :
3590*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "$HP_DESKJET2\n");
3591*5e7646d2SAndroid Build Coastguard Worker break;
3592*5e7646d2SAndroid Build Coastguard Worker
3593*5e7646d2SAndroid Build Coastguard Worker default :
3594*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, "%d\n", d->model_number);
3595*5e7646d2SAndroid Build Coastguard Worker break;
3596*5e7646d2SAndroid Build Coastguard Worker }
3597*5e7646d2SAndroid Build Coastguard Worker
3598*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, ")\n");
3599*5e7646d2SAndroid Build Coastguard Worker break;
3600*5e7646d2SAndroid Build Coastguard Worker
3601*5e7646d2SAndroid Build Coastguard Worker default :
3602*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, " ModelNumber %d\n", d->model_number);
3603*5e7646d2SAndroid Build Coastguard Worker break;
3604*5e7646d2SAndroid Build Coastguard Worker }
3605*5e7646d2SAndroid Build Coastguard Worker }
3606*5e7646d2SAndroid Build Coastguard Worker
3607*5e7646d2SAndroid Build Coastguard Worker if (d->manual_copies)
3608*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, " ManualCopies Yes\n");
3609*5e7646d2SAndroid Build Coastguard Worker
3610*5e7646d2SAndroid Build Coastguard Worker if (d->color_device)
3611*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, " ColorDevice Yes\n");
3612*5e7646d2SAndroid Build Coastguard Worker
3613*5e7646d2SAndroid Build Coastguard Worker if (d->throughput)
3614*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, " Throughput %d\n", d->throughput);
3615*5e7646d2SAndroid Build Coastguard Worker
3616*5e7646d2SAndroid Build Coastguard Worker // Output all of the attributes...
3617*5e7646d2SAndroid Build Coastguard Worker for (a = (ppdcAttr *)d->attrs->first();
3618*5e7646d2SAndroid Build Coastguard Worker a;
3619*5e7646d2SAndroid Build Coastguard Worker a = (ppdcAttr *)d->attrs->next())
3620*5e7646d2SAndroid Build Coastguard Worker if (a->text->value && a->text->value[0])
3621*5e7646d2SAndroid Build Coastguard Worker quotef(fp, " Attribute \"%s\" \"%s/%s\" \"%s\"\n",
3622*5e7646d2SAndroid Build Coastguard Worker a->name->value, a->selector->value ? a->selector->value : "",
3623*5e7646d2SAndroid Build Coastguard Worker a->text->value, a->value->value ? a->value->value : "");
3624*5e7646d2SAndroid Build Coastguard Worker else
3625*5e7646d2SAndroid Build Coastguard Worker quotef(fp, " Attribute \"%s\" \"%s\" \"%s\"\n",
3626*5e7646d2SAndroid Build Coastguard Worker a->name->value, a->selector->value ? a->selector->value : "",
3627*5e7646d2SAndroid Build Coastguard Worker a->value->value ? a->value->value : "");
3628*5e7646d2SAndroid Build Coastguard Worker
3629*5e7646d2SAndroid Build Coastguard Worker // Output all of the constraints...
3630*5e7646d2SAndroid Build Coastguard Worker for (co = (ppdcConstraint *)d->constraints->first();
3631*5e7646d2SAndroid Build Coastguard Worker co;
3632*5e7646d2SAndroid Build Coastguard Worker co = (ppdcConstraint *)d->constraints->next())
3633*5e7646d2SAndroid Build Coastguard Worker {
3634*5e7646d2SAndroid Build Coastguard Worker if (co->option1->value[0] == '*')
3635*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, " UIConstraints \"%s %s", co->option1->value,
3636*5e7646d2SAndroid Build Coastguard Worker co->choice1->value ? co->choice1->value : "");
3637*5e7646d2SAndroid Build Coastguard Worker else
3638*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, " UIConstraints \"*%s %s", co->option1->value,
3639*5e7646d2SAndroid Build Coastguard Worker co->choice1->value ? co->choice1->value : "");
3640*5e7646d2SAndroid Build Coastguard Worker
3641*5e7646d2SAndroid Build Coastguard Worker if (co->option2->value[0] == '*')
3642*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, " %s %s\"\n", co->option2->value,
3643*5e7646d2SAndroid Build Coastguard Worker co->choice2->value ? co->choice2->value : "");
3644*5e7646d2SAndroid Build Coastguard Worker else
3645*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, " *%s %s\"\n", co->option2->value,
3646*5e7646d2SAndroid Build Coastguard Worker co->choice2->value ? co->choice2->value : "");
3647*5e7646d2SAndroid Build Coastguard Worker }
3648*5e7646d2SAndroid Build Coastguard Worker
3649*5e7646d2SAndroid Build Coastguard Worker // Output all of the filters...
3650*5e7646d2SAndroid Build Coastguard Worker for (fi = (ppdcFilter *)d->filters->first();
3651*5e7646d2SAndroid Build Coastguard Worker fi;
3652*5e7646d2SAndroid Build Coastguard Worker fi = (ppdcFilter *)d->filters->next())
3653*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, " Filter \"%s %d %s\"\n",
3654*5e7646d2SAndroid Build Coastguard Worker fi->mime_type->value, fi->cost, fi->program->value);
3655*5e7646d2SAndroid Build Coastguard Worker
3656*5e7646d2SAndroid Build Coastguard Worker // Output all of the fonts...
3657*5e7646d2SAndroid Build Coastguard Worker for (fo = (ppdcFont *)d->fonts->first();
3658*5e7646d2SAndroid Build Coastguard Worker fo;
3659*5e7646d2SAndroid Build Coastguard Worker fo = (ppdcFont *)d->fonts->next())
3660*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(fo->name->value, "*"))
3661*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, " Font *\n");
3662*5e7646d2SAndroid Build Coastguard Worker else
3663*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, " Font \"%s\" \"%s\" \"%s\" \"%s\" %s\n",
3664*5e7646d2SAndroid Build Coastguard Worker fo->name->value, fo->encoding->value,
3665*5e7646d2SAndroid Build Coastguard Worker fo->version->value, fo->charset->value,
3666*5e7646d2SAndroid Build Coastguard Worker fo->status == PPDC_FONT_ROM ? "ROM" : "Disk");
3667*5e7646d2SAndroid Build Coastguard Worker
3668*5e7646d2SAndroid Build Coastguard Worker // Output all options...
3669*5e7646d2SAndroid Build Coastguard Worker for (g = (ppdcGroup *)d->groups->first();
3670*5e7646d2SAndroid Build Coastguard Worker g;
3671*5e7646d2SAndroid Build Coastguard Worker g = (ppdcGroup *)d->groups->next())
3672*5e7646d2SAndroid Build Coastguard Worker {
3673*5e7646d2SAndroid Build Coastguard Worker if (g->options->count == 0)
3674*5e7646d2SAndroid Build Coastguard Worker continue;
3675*5e7646d2SAndroid Build Coastguard Worker
3676*5e7646d2SAndroid Build Coastguard Worker if (g->text->value && g->text->value[0])
3677*5e7646d2SAndroid Build Coastguard Worker quotef(fp, " Group \"%s/%s\"\n", g->name->value, g->text->value);
3678*5e7646d2SAndroid Build Coastguard Worker else
3679*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, " Group \"%s\"\n", g->name->value);
3680*5e7646d2SAndroid Build Coastguard Worker
3681*5e7646d2SAndroid Build Coastguard Worker for (o = (ppdcOption *)g->options->first();
3682*5e7646d2SAndroid Build Coastguard Worker o;
3683*5e7646d2SAndroid Build Coastguard Worker o = (ppdcOption *)g->options->next())
3684*5e7646d2SAndroid Build Coastguard Worker {
3685*5e7646d2SAndroid Build Coastguard Worker if (o->choices->count == 0)
3686*5e7646d2SAndroid Build Coastguard Worker continue;
3687*5e7646d2SAndroid Build Coastguard Worker
3688*5e7646d2SAndroid Build Coastguard Worker if (o->text->value && o->text->value[0])
3689*5e7646d2SAndroid Build Coastguard Worker quotef(fp, " Option \"%s/%s\"", o->name->value, o->text->value);
3690*5e7646d2SAndroid Build Coastguard Worker else
3691*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, " Option \"%s\"", o->name->value);
3692*5e7646d2SAndroid Build Coastguard Worker
3693*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, " %s %s %.1f\n",
3694*5e7646d2SAndroid Build Coastguard Worker o->type == PPDC_BOOLEAN ? "Boolean" :
3695*5e7646d2SAndroid Build Coastguard Worker o->type == PPDC_PICKONE ? "PickOne" : "PickMany",
3696*5e7646d2SAndroid Build Coastguard Worker o->section == PPDC_SECTION_ANY ? "AnySetup" :
3697*5e7646d2SAndroid Build Coastguard Worker o->section == PPDC_SECTION_DOCUMENT ? "DocumentSetup" :
3698*5e7646d2SAndroid Build Coastguard Worker o->section == PPDC_SECTION_EXIT ? "ExitServer" :
3699*5e7646d2SAndroid Build Coastguard Worker o->section == PPDC_SECTION_JCL ? "JCLSetup" :
3700*5e7646d2SAndroid Build Coastguard Worker o->section == PPDC_SECTION_PAGE ? "PageSetup" :
3701*5e7646d2SAndroid Build Coastguard Worker "Prolog",
3702*5e7646d2SAndroid Build Coastguard Worker o->order);
3703*5e7646d2SAndroid Build Coastguard Worker
3704*5e7646d2SAndroid Build Coastguard Worker for (ch = (ppdcChoice *)o->choices->first();
3705*5e7646d2SAndroid Build Coastguard Worker ch;
3706*5e7646d2SAndroid Build Coastguard Worker ch = (ppdcChoice *)o->choices->next())
3707*5e7646d2SAndroid Build Coastguard Worker {
3708*5e7646d2SAndroid Build Coastguard Worker if (ch->text->value && ch->text->value[0])
3709*5e7646d2SAndroid Build Coastguard Worker quotef(fp, " %sChoice \"%s/%s\" \"%s\"\n",
3710*5e7646d2SAndroid Build Coastguard Worker o->defchoice == ch->name ? "*" : "",
3711*5e7646d2SAndroid Build Coastguard Worker ch->name->value, ch->text->value,
3712*5e7646d2SAndroid Build Coastguard Worker ch->code->value ? ch->code->value : "");
3713*5e7646d2SAndroid Build Coastguard Worker else
3714*5e7646d2SAndroid Build Coastguard Worker quotef(fp, " %sChoice \"%s\" \"%s\"\n",
3715*5e7646d2SAndroid Build Coastguard Worker o->defchoice == ch->name ? "*" : "",
3716*5e7646d2SAndroid Build Coastguard Worker ch->name->value,
3717*5e7646d2SAndroid Build Coastguard Worker ch->code->value ? ch->code->value : "");
3718*5e7646d2SAndroid Build Coastguard Worker }
3719*5e7646d2SAndroid Build Coastguard Worker }
3720*5e7646d2SAndroid Build Coastguard Worker }
3721*5e7646d2SAndroid Build Coastguard Worker
3722*5e7646d2SAndroid Build Coastguard Worker // Output all of the color profiles...
3723*5e7646d2SAndroid Build Coastguard Worker for (p = (ppdcProfile *)d->profiles->first();
3724*5e7646d2SAndroid Build Coastguard Worker p;
3725*5e7646d2SAndroid Build Coastguard Worker p = (ppdcProfile *)d->profiles->next())
3726*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, " ColorProfile \"%s/%s\" %.3f %.3f "
3727*5e7646d2SAndroid Build Coastguard Worker "%.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f\n",
3728*5e7646d2SAndroid Build Coastguard Worker p->resolution->value, p->media_type->value,
3729*5e7646d2SAndroid Build Coastguard Worker p->density, p->gamma,
3730*5e7646d2SAndroid Build Coastguard Worker p->profile[0], p->profile[1], p->profile[2],
3731*5e7646d2SAndroid Build Coastguard Worker p->profile[3], p->profile[4], p->profile[5],
3732*5e7646d2SAndroid Build Coastguard Worker p->profile[6], p->profile[7], p->profile[8]);
3733*5e7646d2SAndroid Build Coastguard Worker
3734*5e7646d2SAndroid Build Coastguard Worker // Output all of the media sizes...
3735*5e7646d2SAndroid Build Coastguard Worker left = 0.0;
3736*5e7646d2SAndroid Build Coastguard Worker bottom = 0.0;
3737*5e7646d2SAndroid Build Coastguard Worker right = 0.0;
3738*5e7646d2SAndroid Build Coastguard Worker top = 0.0;
3739*5e7646d2SAndroid Build Coastguard Worker
3740*5e7646d2SAndroid Build Coastguard Worker for (si = (ppdcMediaSize *)d->sizes->first();
3741*5e7646d2SAndroid Build Coastguard Worker si;
3742*5e7646d2SAndroid Build Coastguard Worker si = (ppdcMediaSize *)d->sizes->next())
3743*5e7646d2SAndroid Build Coastguard Worker if (si->size_code->value && si->region_code->value)
3744*5e7646d2SAndroid Build Coastguard Worker {
3745*5e7646d2SAndroid Build Coastguard Worker // Output a custom media size...
3746*5e7646d2SAndroid Build Coastguard Worker quotef(fp, " %sCustomMedia \"%s/%s\" %.2f %.2f %.2f %.2f %.2f %.2f \"%s\" \"%s\"\n",
3747*5e7646d2SAndroid Build Coastguard Worker si->name == d->default_size ? "*" : "", si->name->value,
3748*5e7646d2SAndroid Build Coastguard Worker si->text->value, si->width, si->length, si->left, si->bottom,
3749*5e7646d2SAndroid Build Coastguard Worker si->right, si->top, si->size_code->value,
3750*5e7646d2SAndroid Build Coastguard Worker si->region_code->value);
3751*5e7646d2SAndroid Build Coastguard Worker }
3752*5e7646d2SAndroid Build Coastguard Worker else
3753*5e7646d2SAndroid Build Coastguard Worker {
3754*5e7646d2SAndroid Build Coastguard Worker // Output a standard media size...
3755*5e7646d2SAndroid Build Coastguard Worker if (fabs(left - si->left) > 0.1 ||
3756*5e7646d2SAndroid Build Coastguard Worker fabs(bottom - si->bottom) > 0.1 ||
3757*5e7646d2SAndroid Build Coastguard Worker fabs(right - si->right) > 0.1 ||
3758*5e7646d2SAndroid Build Coastguard Worker fabs(top - si->top) > 0.1)
3759*5e7646d2SAndroid Build Coastguard Worker {
3760*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, " HWMargins %.2f %.2f %.2f %.2f\n",
3761*5e7646d2SAndroid Build Coastguard Worker si->left, si->bottom, si->right, si->top);
3762*5e7646d2SAndroid Build Coastguard Worker
3763*5e7646d2SAndroid Build Coastguard Worker left = si->left;
3764*5e7646d2SAndroid Build Coastguard Worker bottom = si->bottom;
3765*5e7646d2SAndroid Build Coastguard Worker right = si->right;
3766*5e7646d2SAndroid Build Coastguard Worker top = si->top;
3767*5e7646d2SAndroid Build Coastguard Worker }
3768*5e7646d2SAndroid Build Coastguard Worker
3769*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, " %sMediaSize %s\n",
3770*5e7646d2SAndroid Build Coastguard Worker si->name == d->default_size ? "*" : "",
3771*5e7646d2SAndroid Build Coastguard Worker si->name->value);
3772*5e7646d2SAndroid Build Coastguard Worker }
3773*5e7646d2SAndroid Build Coastguard Worker
3774*5e7646d2SAndroid Build Coastguard Worker if (d->variable_paper_size)
3775*5e7646d2SAndroid Build Coastguard Worker {
3776*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, " VariablePaperSize Yes\n");
3777*5e7646d2SAndroid Build Coastguard Worker
3778*5e7646d2SAndroid Build Coastguard Worker if (fabs(left - d->left_margin) > 0.1 ||
3779*5e7646d2SAndroid Build Coastguard Worker fabs(bottom - d->bottom_margin) > 0.1 ||
3780*5e7646d2SAndroid Build Coastguard Worker fabs(right - d->right_margin) > 0.1 ||
3781*5e7646d2SAndroid Build Coastguard Worker fabs(top - d->top_margin) > 0.1)
3782*5e7646d2SAndroid Build Coastguard Worker {
3783*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, " HWMargins %.2f %.2f %.2f %.2f\n",
3784*5e7646d2SAndroid Build Coastguard Worker d->left_margin, d->bottom_margin, d->right_margin,
3785*5e7646d2SAndroid Build Coastguard Worker d->top_margin);
3786*5e7646d2SAndroid Build Coastguard Worker }
3787*5e7646d2SAndroid Build Coastguard Worker
3788*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, " MinSize %.2f %.2f\n", d->min_width, d->min_length);
3789*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(fp, " MaxSize %.2f %.2f\n", d->max_width, d->max_length);
3790*5e7646d2SAndroid Build Coastguard Worker }
3791*5e7646d2SAndroid Build Coastguard Worker
3792*5e7646d2SAndroid Build Coastguard Worker // End the driver...
3793*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(fp, "}\n");
3794*5e7646d2SAndroid Build Coastguard Worker }
3795*5e7646d2SAndroid Build Coastguard Worker
3796*5e7646d2SAndroid Build Coastguard Worker // Close the file and return...
3797*5e7646d2SAndroid Build Coastguard Worker cupsFileClose(fp);
3798*5e7646d2SAndroid Build Coastguard Worker
3799*5e7646d2SAndroid Build Coastguard Worker return (0);
3800*5e7646d2SAndroid Build Coastguard Worker }
3801