xref: /aosp_15_r20/external/libcups/cups/testppd.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker  * PPD test program for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker  *
4*5e7646d2SAndroid Build Coastguard Worker  * Copyright © 2007-2018 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker  * Copyright © 1997-2006 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 #undef _CUPS_NO_DEPRECATED
16*5e7646d2SAndroid Build Coastguard Worker #include "cups-private.h"
17*5e7646d2SAndroid Build Coastguard Worker #include "ppd-private.h"
18*5e7646d2SAndroid Build Coastguard Worker #include "raster-private.h"
19*5e7646d2SAndroid Build Coastguard Worker #include <sys/stat.h>
20*5e7646d2SAndroid Build Coastguard Worker #ifdef _WIN32
21*5e7646d2SAndroid Build Coastguard Worker #  include <io.h>
22*5e7646d2SAndroid Build Coastguard Worker #else
23*5e7646d2SAndroid Build Coastguard Worker #  include <unistd.h>
24*5e7646d2SAndroid Build Coastguard Worker #  include <fcntl.h>
25*5e7646d2SAndroid Build Coastguard Worker #endif /* _WIN32 */
26*5e7646d2SAndroid Build Coastguard Worker #include <math.h>
27*5e7646d2SAndroid Build Coastguard Worker 
28*5e7646d2SAndroid Build Coastguard Worker 
29*5e7646d2SAndroid Build Coastguard Worker /*
30*5e7646d2SAndroid Build Coastguard Worker  * Local functions...
31*5e7646d2SAndroid Build Coastguard Worker  */
32*5e7646d2SAndroid Build Coastguard Worker 
33*5e7646d2SAndroid Build Coastguard Worker static int	do_ppd_tests(const char *filename, int num_options, cups_option_t *options);
34*5e7646d2SAndroid Build Coastguard Worker static int	do_ps_tests(void);
35*5e7646d2SAndroid Build Coastguard Worker static void	print_changes(cups_page_header2_t *header, cups_page_header2_t *expected);
36*5e7646d2SAndroid Build Coastguard Worker 
37*5e7646d2SAndroid Build Coastguard Worker 
38*5e7646d2SAndroid Build Coastguard Worker /*
39*5e7646d2SAndroid Build Coastguard Worker  * Test data...
40*5e7646d2SAndroid Build Coastguard Worker  */
41*5e7646d2SAndroid Build Coastguard Worker 
42*5e7646d2SAndroid Build Coastguard Worker static const char *dsc_code =
43*5e7646d2SAndroid Build Coastguard Worker "[{\n"
44*5e7646d2SAndroid Build Coastguard Worker "%%BeginFeature: *PageSize Tabloid\n"
45*5e7646d2SAndroid Build Coastguard Worker "<</PageSize[792 1224]>>setpagedevice\n"
46*5e7646d2SAndroid Build Coastguard Worker "%%EndFeature\n"
47*5e7646d2SAndroid Build Coastguard Worker "} stopped cleartomark\n";
48*5e7646d2SAndroid Build Coastguard Worker static const char *setpagedevice_code =
49*5e7646d2SAndroid Build Coastguard Worker "<<"
50*5e7646d2SAndroid Build Coastguard Worker "/MediaClass(Media Class)"
51*5e7646d2SAndroid Build Coastguard Worker "/MediaColor((Media Color))"
52*5e7646d2SAndroid Build Coastguard Worker "/MediaType(Media\\\\Type)"
53*5e7646d2SAndroid Build Coastguard Worker "/OutputType<416263>"
54*5e7646d2SAndroid Build Coastguard Worker "/AdvanceDistance 1000"
55*5e7646d2SAndroid Build Coastguard Worker "/AdvanceMedia 1"
56*5e7646d2SAndroid Build Coastguard Worker "/Collate false"
57*5e7646d2SAndroid Build Coastguard Worker "/CutMedia 2"
58*5e7646d2SAndroid Build Coastguard Worker "/Duplex true"
59*5e7646d2SAndroid Build Coastguard Worker "/HWResolution[100 200]"
60*5e7646d2SAndroid Build Coastguard Worker "/InsertSheet true"
61*5e7646d2SAndroid Build Coastguard Worker "/Jog 3"
62*5e7646d2SAndroid Build Coastguard Worker "/LeadingEdge 1"
63*5e7646d2SAndroid Build Coastguard Worker "/ManualFeed true"
64*5e7646d2SAndroid Build Coastguard Worker "/MediaPosition 8#777"
65*5e7646d2SAndroid Build Coastguard Worker "/MediaWeight 16#fe01"
66*5e7646d2SAndroid Build Coastguard Worker "/MirrorPrint true"
67*5e7646d2SAndroid Build Coastguard Worker "/NegativePrint true"
68*5e7646d2SAndroid Build Coastguard Worker "/NumCopies 1"
69*5e7646d2SAndroid Build Coastguard Worker "/Orientation 1"
70*5e7646d2SAndroid Build Coastguard Worker "/OutputFaceUp true"
71*5e7646d2SAndroid Build Coastguard Worker "/PageSize[612 792.1]"
72*5e7646d2SAndroid Build Coastguard Worker "/Separations true"
73*5e7646d2SAndroid Build Coastguard Worker "/TraySwitch true"
74*5e7646d2SAndroid Build Coastguard Worker "/Tumble true"
75*5e7646d2SAndroid Build Coastguard Worker "/cupsMediaType 2"
76*5e7646d2SAndroid Build Coastguard Worker "/cupsColorOrder 1"
77*5e7646d2SAndroid Build Coastguard Worker "/cupsColorSpace 1"
78*5e7646d2SAndroid Build Coastguard Worker "/cupsCompression 1"
79*5e7646d2SAndroid Build Coastguard Worker "/cupsRowCount 1"
80*5e7646d2SAndroid Build Coastguard Worker "/cupsRowFeed 1"
81*5e7646d2SAndroid Build Coastguard Worker "/cupsRowStep 1"
82*5e7646d2SAndroid Build Coastguard Worker "/cupsBorderlessScalingFactor 1.001"
83*5e7646d2SAndroid Build Coastguard Worker "/cupsInteger0 1"
84*5e7646d2SAndroid Build Coastguard Worker "/cupsInteger1 2"
85*5e7646d2SAndroid Build Coastguard Worker "/cupsInteger2 3"
86*5e7646d2SAndroid Build Coastguard Worker "/cupsInteger3 4"
87*5e7646d2SAndroid Build Coastguard Worker "/cupsInteger4 5"
88*5e7646d2SAndroid Build Coastguard Worker "/cupsInteger5 6"
89*5e7646d2SAndroid Build Coastguard Worker "/cupsInteger6 7"
90*5e7646d2SAndroid Build Coastguard Worker "/cupsInteger7 8"
91*5e7646d2SAndroid Build Coastguard Worker "/cupsInteger8 9"
92*5e7646d2SAndroid Build Coastguard Worker "/cupsInteger9 10"
93*5e7646d2SAndroid Build Coastguard Worker "/cupsInteger10 11"
94*5e7646d2SAndroid Build Coastguard Worker "/cupsInteger11 12"
95*5e7646d2SAndroid Build Coastguard Worker "/cupsInteger12 13"
96*5e7646d2SAndroid Build Coastguard Worker "/cupsInteger13 14"
97*5e7646d2SAndroid Build Coastguard Worker "/cupsInteger14 15"
98*5e7646d2SAndroid Build Coastguard Worker "/cupsInteger15 16"
99*5e7646d2SAndroid Build Coastguard Worker "/cupsReal0 1.1"
100*5e7646d2SAndroid Build Coastguard Worker "/cupsReal1 2.1"
101*5e7646d2SAndroid Build Coastguard Worker "/cupsReal2 3.1"
102*5e7646d2SAndroid Build Coastguard Worker "/cupsReal3 4.1"
103*5e7646d2SAndroid Build Coastguard Worker "/cupsReal4 5.1"
104*5e7646d2SAndroid Build Coastguard Worker "/cupsReal5 6.1"
105*5e7646d2SAndroid Build Coastguard Worker "/cupsReal6 7.1"
106*5e7646d2SAndroid Build Coastguard Worker "/cupsReal7 8.1"
107*5e7646d2SAndroid Build Coastguard Worker "/cupsReal8 9.1"
108*5e7646d2SAndroid Build Coastguard Worker "/cupsReal9 10.1"
109*5e7646d2SAndroid Build Coastguard Worker "/cupsReal10 11.1"
110*5e7646d2SAndroid Build Coastguard Worker "/cupsReal11 12.1"
111*5e7646d2SAndroid Build Coastguard Worker "/cupsReal12 13.1"
112*5e7646d2SAndroid Build Coastguard Worker "/cupsReal13 14.1"
113*5e7646d2SAndroid Build Coastguard Worker "/cupsReal14 15.1"
114*5e7646d2SAndroid Build Coastguard Worker "/cupsReal15 16.1"
115*5e7646d2SAndroid Build Coastguard Worker "/cupsString0(1)"
116*5e7646d2SAndroid Build Coastguard Worker "/cupsString1(2)"
117*5e7646d2SAndroid Build Coastguard Worker "/cupsString2(3)"
118*5e7646d2SAndroid Build Coastguard Worker "/cupsString3(4)"
119*5e7646d2SAndroid Build Coastguard Worker "/cupsString4(5)"
120*5e7646d2SAndroid Build Coastguard Worker "/cupsString5(6)"
121*5e7646d2SAndroid Build Coastguard Worker "/cupsString6(7)"
122*5e7646d2SAndroid Build Coastguard Worker "/cupsString7(8)"
123*5e7646d2SAndroid Build Coastguard Worker "/cupsString8(9)"
124*5e7646d2SAndroid Build Coastguard Worker "/cupsString9(10)"
125*5e7646d2SAndroid Build Coastguard Worker "/cupsString10(11)"
126*5e7646d2SAndroid Build Coastguard Worker "/cupsString11(12)"
127*5e7646d2SAndroid Build Coastguard Worker "/cupsString12(13)"
128*5e7646d2SAndroid Build Coastguard Worker "/cupsString13(14)"
129*5e7646d2SAndroid Build Coastguard Worker "/cupsString14(15)"
130*5e7646d2SAndroid Build Coastguard Worker "/cupsString15(16)"
131*5e7646d2SAndroid Build Coastguard Worker "/cupsMarkerType(Marker Type)"
132*5e7646d2SAndroid Build Coastguard Worker "/cupsRenderingIntent(Rendering Intent)"
133*5e7646d2SAndroid Build Coastguard Worker "/cupsPageSizeName(Letter)"
134*5e7646d2SAndroid Build Coastguard Worker "/cupsPreferredBitsPerColor 17"
135*5e7646d2SAndroid Build Coastguard Worker ">> setpagedevice";
136*5e7646d2SAndroid Build Coastguard Worker 
137*5e7646d2SAndroid Build Coastguard Worker static cups_page_header2_t setpagedevice_header =
138*5e7646d2SAndroid Build Coastguard Worker {
139*5e7646d2SAndroid Build Coastguard Worker   "Media Class",			/* MediaClass */
140*5e7646d2SAndroid Build Coastguard Worker   "(Media Color)",			/* MediaColor */
141*5e7646d2SAndroid Build Coastguard Worker   "Media\\Type",			/* MediaType */
142*5e7646d2SAndroid Build Coastguard Worker   "Abc",				/* OutputType */
143*5e7646d2SAndroid Build Coastguard Worker   1000,					/* AdvanceDistance */
144*5e7646d2SAndroid Build Coastguard Worker   CUPS_ADVANCE_FILE,			/* AdvanceMedia */
145*5e7646d2SAndroid Build Coastguard Worker   CUPS_FALSE,				/* Collate */
146*5e7646d2SAndroid Build Coastguard Worker   CUPS_CUT_JOB,				/* CutMedia */
147*5e7646d2SAndroid Build Coastguard Worker   CUPS_TRUE,				/* Duplex */
148*5e7646d2SAndroid Build Coastguard Worker   { 100, 200 },				/* HWResolution */
149*5e7646d2SAndroid Build Coastguard Worker   { 0, 0, 0, 0 },			/* ImagingBoundingBox */
150*5e7646d2SAndroid Build Coastguard Worker   CUPS_TRUE,				/* InsertSheet */
151*5e7646d2SAndroid Build Coastguard Worker   CUPS_JOG_SET,				/* Jog */
152*5e7646d2SAndroid Build Coastguard Worker   CUPS_EDGE_RIGHT,			/* LeadingEdge */
153*5e7646d2SAndroid Build Coastguard Worker   { 0, 0 },				/* Margins */
154*5e7646d2SAndroid Build Coastguard Worker   CUPS_TRUE,				/* ManualFeed */
155*5e7646d2SAndroid Build Coastguard Worker   0777,					/* MediaPosition */
156*5e7646d2SAndroid Build Coastguard Worker   0xfe01,				/* MediaWeight */
157*5e7646d2SAndroid Build Coastguard Worker   CUPS_TRUE,				/* MirrorPrint */
158*5e7646d2SAndroid Build Coastguard Worker   CUPS_TRUE,				/* NegativePrint */
159*5e7646d2SAndroid Build Coastguard Worker   1,					/* NumCopies */
160*5e7646d2SAndroid Build Coastguard Worker   CUPS_ORIENT_90,			/* Orientation */
161*5e7646d2SAndroid Build Coastguard Worker   CUPS_TRUE,				/* OutputFaceUp */
162*5e7646d2SAndroid Build Coastguard Worker   { 612, 792 },				/* PageSize */
163*5e7646d2SAndroid Build Coastguard Worker   CUPS_TRUE,				/* Separations */
164*5e7646d2SAndroid Build Coastguard Worker   CUPS_TRUE,				/* TraySwitch */
165*5e7646d2SAndroid Build Coastguard Worker   CUPS_TRUE,				/* Tumble */
166*5e7646d2SAndroid Build Coastguard Worker   0,					/* cupsWidth */
167*5e7646d2SAndroid Build Coastguard Worker   0,					/* cupsHeight */
168*5e7646d2SAndroid Build Coastguard Worker   2,					/* cupsMediaType */
169*5e7646d2SAndroid Build Coastguard Worker   0,					/* cupsBitsPerColor */
170*5e7646d2SAndroid Build Coastguard Worker   0,					/* cupsBitsPerPixel */
171*5e7646d2SAndroid Build Coastguard Worker   0,					/* cupsBytesPerLine */
172*5e7646d2SAndroid Build Coastguard Worker   CUPS_ORDER_BANDED,			/* cupsColorOrder */
173*5e7646d2SAndroid Build Coastguard Worker   CUPS_CSPACE_RGB,			/* cupsColorSpace */
174*5e7646d2SAndroid Build Coastguard Worker   1,					/* cupsCompression */
175*5e7646d2SAndroid Build Coastguard Worker   1,					/* cupsRowCount */
176*5e7646d2SAndroid Build Coastguard Worker   1,					/* cupsRowFeed */
177*5e7646d2SAndroid Build Coastguard Worker   1,					/* cupsRowStep */
178*5e7646d2SAndroid Build Coastguard Worker   0,					/* cupsNumColors */
179*5e7646d2SAndroid Build Coastguard Worker   1.001f,				/* cupsBorderlessScalingFactor */
180*5e7646d2SAndroid Build Coastguard Worker   { 612.0f, 792.1f },			/* cupsPageSize */
181*5e7646d2SAndroid Build Coastguard Worker   { 0.0f, 0.0f, 0.0f, 0.0f },		/* cupsImagingBBox */
182*5e7646d2SAndroid Build Coastguard Worker   { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 },
183*5e7646d2SAndroid Build Coastguard Worker 					/* cupsInteger[16] */
184*5e7646d2SAndroid Build Coastguard Worker   { 1.1f, 2.1f, 3.1f, 4.1f, 5.1f, 6.1f, 7.1f, 8.1f, 9.1f, 10.1f, 11.1f, 12.1f, 13.1f, 14.1f, 15.1f, 16.1f },			/* cupsReal[16] */
185*5e7646d2SAndroid Build Coastguard Worker   { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
186*5e7646d2SAndroid Build Coastguard Worker     "14", "15", "16" },			/* cupsString[16] */
187*5e7646d2SAndroid Build Coastguard Worker   "Marker Type",			/* cupsMarkerType */
188*5e7646d2SAndroid Build Coastguard Worker   "Rendering Intent",			/* cupsRenderingIntent */
189*5e7646d2SAndroid Build Coastguard Worker   "Letter"				/* cupsPageSizeName */
190*5e7646d2SAndroid Build Coastguard Worker };
191*5e7646d2SAndroid Build Coastguard Worker 
192*5e7646d2SAndroid Build Coastguard Worker static const char	*default_code =
193*5e7646d2SAndroid Build Coastguard Worker 			"[{\n"
194*5e7646d2SAndroid Build Coastguard Worker 			"%%BeginFeature: *InstalledDuplexer False\n"
195*5e7646d2SAndroid Build Coastguard Worker 			"%%EndFeature\n"
196*5e7646d2SAndroid Build Coastguard Worker 			"} stopped cleartomark\n"
197*5e7646d2SAndroid Build Coastguard Worker 			"[{\n"
198*5e7646d2SAndroid Build Coastguard Worker 			"%%BeginFeature: *PageRegion Letter\n"
199*5e7646d2SAndroid Build Coastguard Worker 			"PageRegion=Letter\n"
200*5e7646d2SAndroid Build Coastguard Worker 			"%%EndFeature\n"
201*5e7646d2SAndroid Build Coastguard Worker 			"} stopped cleartomark\n"
202*5e7646d2SAndroid Build Coastguard Worker 			"[{\n"
203*5e7646d2SAndroid Build Coastguard Worker 			"%%BeginFeature: *InputSlot Tray\n"
204*5e7646d2SAndroid Build Coastguard Worker 			"InputSlot=Tray\n"
205*5e7646d2SAndroid Build Coastguard Worker 			"%%EndFeature\n"
206*5e7646d2SAndroid Build Coastguard Worker 			"} stopped cleartomark\n"
207*5e7646d2SAndroid Build Coastguard Worker 			"[{\n"
208*5e7646d2SAndroid Build Coastguard Worker 			"%%BeginFeature: *OutputBin Tray1\n"
209*5e7646d2SAndroid Build Coastguard Worker 			"OutputBin=Tray1\n"
210*5e7646d2SAndroid Build Coastguard Worker 			"%%EndFeature\n"
211*5e7646d2SAndroid Build Coastguard Worker 			"} stopped cleartomark\n"
212*5e7646d2SAndroid Build Coastguard Worker 			"[{\n"
213*5e7646d2SAndroid Build Coastguard Worker 			"%%BeginFeature: *MediaType Plain\n"
214*5e7646d2SAndroid Build Coastguard Worker 			"MediaType=Plain\n"
215*5e7646d2SAndroid Build Coastguard Worker 			"%%EndFeature\n"
216*5e7646d2SAndroid Build Coastguard Worker 			"} stopped cleartomark\n"
217*5e7646d2SAndroid Build Coastguard Worker 			"[{\n"
218*5e7646d2SAndroid Build Coastguard Worker 			"%%BeginFeature: *IntOption None\n"
219*5e7646d2SAndroid Build Coastguard Worker 			"%%EndFeature\n"
220*5e7646d2SAndroid Build Coastguard Worker 			"} stopped cleartomark\n"
221*5e7646d2SAndroid Build Coastguard Worker 			"[{\n"
222*5e7646d2SAndroid Build Coastguard Worker 			"%%BeginFeature: *StringOption None\n"
223*5e7646d2SAndroid Build Coastguard Worker 			"%%EndFeature\n"
224*5e7646d2SAndroid Build Coastguard Worker 			"} stopped cleartomark\n";
225*5e7646d2SAndroid Build Coastguard Worker 
226*5e7646d2SAndroid Build Coastguard Worker static const char	*custom_code =
227*5e7646d2SAndroid Build Coastguard Worker 			"[{\n"
228*5e7646d2SAndroid Build Coastguard Worker 			"%%BeginFeature: *InstalledDuplexer False\n"
229*5e7646d2SAndroid Build Coastguard Worker 			"%%EndFeature\n"
230*5e7646d2SAndroid Build Coastguard Worker 			"} stopped cleartomark\n"
231*5e7646d2SAndroid Build Coastguard Worker 			"[{\n"
232*5e7646d2SAndroid Build Coastguard Worker 			"%%BeginFeature: *InputSlot Tray\n"
233*5e7646d2SAndroid Build Coastguard Worker 			"InputSlot=Tray\n"
234*5e7646d2SAndroid Build Coastguard Worker 			"%%EndFeature\n"
235*5e7646d2SAndroid Build Coastguard Worker 			"} stopped cleartomark\n"
236*5e7646d2SAndroid Build Coastguard Worker 			"[{\n"
237*5e7646d2SAndroid Build Coastguard Worker 			"%%BeginFeature: *MediaType Plain\n"
238*5e7646d2SAndroid Build Coastguard Worker 			"MediaType=Plain\n"
239*5e7646d2SAndroid Build Coastguard Worker 			"%%EndFeature\n"
240*5e7646d2SAndroid Build Coastguard Worker 			"} stopped cleartomark\n"
241*5e7646d2SAndroid Build Coastguard Worker 			"[{\n"
242*5e7646d2SAndroid Build Coastguard Worker 			"%%BeginFeature: *OutputBin Tray1\n"
243*5e7646d2SAndroid Build Coastguard Worker 			"OutputBin=Tray1\n"
244*5e7646d2SAndroid Build Coastguard Worker 			"%%EndFeature\n"
245*5e7646d2SAndroid Build Coastguard Worker 			"} stopped cleartomark\n"
246*5e7646d2SAndroid Build Coastguard Worker 			"[{\n"
247*5e7646d2SAndroid Build Coastguard Worker 			"%%BeginFeature: *IntOption None\n"
248*5e7646d2SAndroid Build Coastguard Worker 			"%%EndFeature\n"
249*5e7646d2SAndroid Build Coastguard Worker 			"} stopped cleartomark\n"
250*5e7646d2SAndroid Build Coastguard Worker 			"[{\n"
251*5e7646d2SAndroid Build Coastguard Worker 			"%%BeginFeature: *CustomStringOption True\n"
252*5e7646d2SAndroid Build Coastguard Worker 			"(value\\0502\\051)\n"
253*5e7646d2SAndroid Build Coastguard Worker 			"(value 1)\n"
254*5e7646d2SAndroid Build Coastguard Worker 			"StringOption=Custom\n"
255*5e7646d2SAndroid Build Coastguard Worker 			"%%EndFeature\n"
256*5e7646d2SAndroid Build Coastguard Worker 			"} stopped cleartomark\n"
257*5e7646d2SAndroid Build Coastguard Worker 			"[{\n"
258*5e7646d2SAndroid Build Coastguard Worker 			"%%BeginFeature: *CustomPageSize True\n"
259*5e7646d2SAndroid Build Coastguard Worker 			"400\n"
260*5e7646d2SAndroid Build Coastguard Worker 			"500\n"
261*5e7646d2SAndroid Build Coastguard Worker 			"0\n"
262*5e7646d2SAndroid Build Coastguard Worker 			"0\n"
263*5e7646d2SAndroid Build Coastguard Worker 			"0\n"
264*5e7646d2SAndroid Build Coastguard Worker 			"PageSize=Custom\n"
265*5e7646d2SAndroid Build Coastguard Worker 			"%%EndFeature\n"
266*5e7646d2SAndroid Build Coastguard Worker 			"} stopped cleartomark\n";
267*5e7646d2SAndroid Build Coastguard Worker 
268*5e7646d2SAndroid Build Coastguard Worker static const char	*default2_code =
269*5e7646d2SAndroid Build Coastguard Worker 			"[{\n"
270*5e7646d2SAndroid Build Coastguard Worker 			"%%BeginFeature: *InstalledDuplexer False\n"
271*5e7646d2SAndroid Build Coastguard Worker 			"%%EndFeature\n"
272*5e7646d2SAndroid Build Coastguard Worker 			"} stopped cleartomark\n"
273*5e7646d2SAndroid Build Coastguard Worker 			"[{\n"
274*5e7646d2SAndroid Build Coastguard Worker 			"%%BeginFeature: *InputSlot Tray\n"
275*5e7646d2SAndroid Build Coastguard Worker 			"InputSlot=Tray\n"
276*5e7646d2SAndroid Build Coastguard Worker 			"%%EndFeature\n"
277*5e7646d2SAndroid Build Coastguard Worker 			"} stopped cleartomark\n"
278*5e7646d2SAndroid Build Coastguard Worker 			"[{\n"
279*5e7646d2SAndroid Build Coastguard Worker 			"%%BeginFeature: *Quality Normal\n"
280*5e7646d2SAndroid Build Coastguard Worker 			"Quality=Normal\n"
281*5e7646d2SAndroid Build Coastguard Worker 			"%%EndFeature\n"
282*5e7646d2SAndroid Build Coastguard Worker 			"} stopped cleartomark\n"
283*5e7646d2SAndroid Build Coastguard Worker 			"[{\n"
284*5e7646d2SAndroid Build Coastguard Worker 			"%%BeginFeature: *IntOption None\n"
285*5e7646d2SAndroid Build Coastguard Worker 			"%%EndFeature\n"
286*5e7646d2SAndroid Build Coastguard Worker 			"} stopped cleartomark\n"
287*5e7646d2SAndroid Build Coastguard Worker 			"[{\n"
288*5e7646d2SAndroid Build Coastguard Worker 			"%%BeginFeature: *StringOption None\n"
289*5e7646d2SAndroid Build Coastguard Worker 			"%%EndFeature\n"
290*5e7646d2SAndroid Build Coastguard Worker 			"} stopped cleartomark\n";
291*5e7646d2SAndroid Build Coastguard Worker 
292*5e7646d2SAndroid Build Coastguard Worker 
293*5e7646d2SAndroid Build Coastguard Worker /*
294*5e7646d2SAndroid Build Coastguard Worker  * 'main()' - Main entry.
295*5e7646d2SAndroid Build Coastguard Worker  */
296*5e7646d2SAndroid Build Coastguard Worker 
297*5e7646d2SAndroid Build Coastguard Worker int					/* O - Exit status */
main(int argc,char * argv[])298*5e7646d2SAndroid Build Coastguard Worker main(int  argc,				/* I - Number of command-line arguments */
299*5e7646d2SAndroid Build Coastguard Worker      char *argv[])			/* I - Command-line arguments */
300*5e7646d2SAndroid Build Coastguard Worker {
301*5e7646d2SAndroid Build Coastguard Worker   int		i;			/* Looping var */
302*5e7646d2SAndroid Build Coastguard Worker   ppd_file_t	*ppd = NULL;		/* PPD file loaded from disk */
303*5e7646d2SAndroid Build Coastguard Worker   int		status;			/* Status of tests (0 = success, 1 = fail) */
304*5e7646d2SAndroid Build Coastguard Worker   int		conflicts;		/* Number of conflicts */
305*5e7646d2SAndroid Build Coastguard Worker   char		*s;			/* String */
306*5e7646d2SAndroid Build Coastguard Worker   char		buffer[8192];		/* String buffer */
307*5e7646d2SAndroid Build Coastguard Worker   const char	*text,			/* Localized text */
308*5e7646d2SAndroid Build Coastguard Worker 		*val;			/* Option value */
309*5e7646d2SAndroid Build Coastguard Worker   int		num_options;		/* Number of options */
310*5e7646d2SAndroid Build Coastguard Worker   cups_option_t	*options;		/* Options */
311*5e7646d2SAndroid Build Coastguard Worker   ppd_size_t	minsize,		/* Minimum size */
312*5e7646d2SAndroid Build Coastguard Worker 		maxsize,		/* Maximum size */
313*5e7646d2SAndroid Build Coastguard Worker 		*size;			/* Current size */
314*5e7646d2SAndroid Build Coastguard Worker   ppd_attr_t	*attr;			/* Current attribute */
315*5e7646d2SAndroid Build Coastguard Worker   _ppd_cache_t	*pc;			/* PPD cache */
316*5e7646d2SAndroid Build Coastguard Worker 
317*5e7646d2SAndroid Build Coastguard Worker 
318*5e7646d2SAndroid Build Coastguard Worker   status = 0;
319*5e7646d2SAndroid Build Coastguard Worker 
320*5e7646d2SAndroid Build Coastguard Worker   if (argc == 1)
321*5e7646d2SAndroid Build Coastguard Worker   {
322*5e7646d2SAndroid Build Coastguard Worker    /*
323*5e7646d2SAndroid Build Coastguard Worker     * Setup directories for locale stuff...
324*5e7646d2SAndroid Build Coastguard Worker     */
325*5e7646d2SAndroid Build Coastguard Worker 
326*5e7646d2SAndroid Build Coastguard Worker     if (access("locale", 0))
327*5e7646d2SAndroid Build Coastguard Worker     {
328*5e7646d2SAndroid Build Coastguard Worker       mkdir("locale", 0777);
329*5e7646d2SAndroid Build Coastguard Worker       mkdir("locale/fr", 0777);
330*5e7646d2SAndroid Build Coastguard Worker       symlink("../../../locale/cups_fr.po", "locale/fr/cups_fr.po");
331*5e7646d2SAndroid Build Coastguard Worker       mkdir("locale/zh_TW", 0777);
332*5e7646d2SAndroid Build Coastguard Worker       symlink("../../../locale/cups_zh_TW.po", "locale/zh_TW/cups_zh_TW.po");
333*5e7646d2SAndroid Build Coastguard Worker     }
334*5e7646d2SAndroid Build Coastguard Worker 
335*5e7646d2SAndroid Build Coastguard Worker     putenv("LOCALEDIR=locale");
336*5e7646d2SAndroid Build Coastguard Worker     putenv("SOFTWARE=CUPS");
337*5e7646d2SAndroid Build Coastguard Worker 
338*5e7646d2SAndroid Build Coastguard Worker    /*
339*5e7646d2SAndroid Build Coastguard Worker     * Do tests with test.ppd...
340*5e7646d2SAndroid Build Coastguard Worker     */
341*5e7646d2SAndroid Build Coastguard Worker 
342*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdOpenFile(test.ppd): ", stdout);
343*5e7646d2SAndroid Build Coastguard Worker 
344*5e7646d2SAndroid Build Coastguard Worker     if ((ppd = _ppdOpenFile("test.ppd", _PPD_LOCALIZATION_ALL)) != NULL)
345*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
346*5e7646d2SAndroid Build Coastguard Worker     else
347*5e7646d2SAndroid Build Coastguard Worker     {
348*5e7646d2SAndroid Build Coastguard Worker       ppd_status_t	err;		/* Last error in file */
349*5e7646d2SAndroid Build Coastguard Worker       int		line;		/* Line number in file */
350*5e7646d2SAndroid Build Coastguard Worker 
351*5e7646d2SAndroid Build Coastguard Worker 
352*5e7646d2SAndroid Build Coastguard Worker       status ++;
353*5e7646d2SAndroid Build Coastguard Worker       err = ppdLastError(&line);
354*5e7646d2SAndroid Build Coastguard Worker 
355*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s on line %d)\n", ppdErrorString(err), line);
356*5e7646d2SAndroid Build Coastguard Worker     }
357*5e7646d2SAndroid Build Coastguard Worker 
358*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdFindAttr(wildcard): ", stdout);
359*5e7646d2SAndroid Build Coastguard Worker     if ((attr = ppdFindAttr(ppd, "cupsTest", NULL)) == NULL)
360*5e7646d2SAndroid Build Coastguard Worker     {
361*5e7646d2SAndroid Build Coastguard Worker       status ++;
362*5e7646d2SAndroid Build Coastguard Worker       puts("FAIL (not found)");
363*5e7646d2SAndroid Build Coastguard Worker     }
364*5e7646d2SAndroid Build Coastguard Worker     else if (strcmp(attr->name, "cupsTest") || strcmp(attr->spec, "Foo"))
365*5e7646d2SAndroid Build Coastguard Worker     {
366*5e7646d2SAndroid Build Coastguard Worker       status ++;
367*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (got \"%s %s\")\n", attr->name, attr->spec);
368*5e7646d2SAndroid Build Coastguard Worker     }
369*5e7646d2SAndroid Build Coastguard Worker     else
370*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
371*5e7646d2SAndroid Build Coastguard Worker 
372*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdFindNextAttr(wildcard): ", stdout);
373*5e7646d2SAndroid Build Coastguard Worker     if ((attr = ppdFindNextAttr(ppd, "cupsTest", NULL)) == NULL)
374*5e7646d2SAndroid Build Coastguard Worker     {
375*5e7646d2SAndroid Build Coastguard Worker       status ++;
376*5e7646d2SAndroid Build Coastguard Worker       puts("FAIL (not found)");
377*5e7646d2SAndroid Build Coastguard Worker     }
378*5e7646d2SAndroid Build Coastguard Worker     else if (strcmp(attr->name, "cupsTest") || strcmp(attr->spec, "Bar"))
379*5e7646d2SAndroid Build Coastguard Worker     {
380*5e7646d2SAndroid Build Coastguard Worker       status ++;
381*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (got \"%s %s\")\n", attr->name, attr->spec);
382*5e7646d2SAndroid Build Coastguard Worker     }
383*5e7646d2SAndroid Build Coastguard Worker     else
384*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
385*5e7646d2SAndroid Build Coastguard Worker 
386*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdFindAttr(Foo): ", stdout);
387*5e7646d2SAndroid Build Coastguard Worker     if ((attr = ppdFindAttr(ppd, "cupsTest", "Foo")) == NULL)
388*5e7646d2SAndroid Build Coastguard Worker     {
389*5e7646d2SAndroid Build Coastguard Worker       status ++;
390*5e7646d2SAndroid Build Coastguard Worker       puts("FAIL (not found)");
391*5e7646d2SAndroid Build Coastguard Worker     }
392*5e7646d2SAndroid Build Coastguard Worker     else if (strcmp(attr->name, "cupsTest") || strcmp(attr->spec, "Foo"))
393*5e7646d2SAndroid Build Coastguard Worker     {
394*5e7646d2SAndroid Build Coastguard Worker       status ++;
395*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (got \"%s %s\")\n", attr->name, attr->spec);
396*5e7646d2SAndroid Build Coastguard Worker     }
397*5e7646d2SAndroid Build Coastguard Worker     else
398*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
399*5e7646d2SAndroid Build Coastguard Worker 
400*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdFindNextAttr(Foo): ", stdout);
401*5e7646d2SAndroid Build Coastguard Worker     if ((attr = ppdFindNextAttr(ppd, "cupsTest", "Foo")) != NULL)
402*5e7646d2SAndroid Build Coastguard Worker     {
403*5e7646d2SAndroid Build Coastguard Worker       status ++;
404*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (got \"%s %s\")\n", attr->name, attr->spec);
405*5e7646d2SAndroid Build Coastguard Worker     }
406*5e7646d2SAndroid Build Coastguard Worker     else
407*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
408*5e7646d2SAndroid Build Coastguard Worker 
409*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdMarkDefaults: ", stdout);
410*5e7646d2SAndroid Build Coastguard Worker     ppdMarkDefaults(ppd);
411*5e7646d2SAndroid Build Coastguard Worker 
412*5e7646d2SAndroid Build Coastguard Worker     if ((conflicts = ppdConflicts(ppd)) == 0)
413*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
414*5e7646d2SAndroid Build Coastguard Worker     else
415*5e7646d2SAndroid Build Coastguard Worker     {
416*5e7646d2SAndroid Build Coastguard Worker       status ++;
417*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%d conflicts)\n", conflicts);
418*5e7646d2SAndroid Build Coastguard Worker     }
419*5e7646d2SAndroid Build Coastguard Worker 
420*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdEmitString (defaults): ", stdout);
421*5e7646d2SAndroid Build Coastguard Worker     if ((s = ppdEmitString(ppd, PPD_ORDER_ANY, 0.0)) != NULL &&
422*5e7646d2SAndroid Build Coastguard Worker 	!strcmp(s, default_code))
423*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
424*5e7646d2SAndroid Build Coastguard Worker     else
425*5e7646d2SAndroid Build Coastguard Worker     {
426*5e7646d2SAndroid Build Coastguard Worker       status ++;
427*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%d bytes instead of %d)\n", s ? (int)strlen(s) : 0,
428*5e7646d2SAndroid Build Coastguard Worker 	     (int)strlen(default_code));
429*5e7646d2SAndroid Build Coastguard Worker 
430*5e7646d2SAndroid Build Coastguard Worker       if (s)
431*5e7646d2SAndroid Build Coastguard Worker 	puts(s);
432*5e7646d2SAndroid Build Coastguard Worker     }
433*5e7646d2SAndroid Build Coastguard Worker 
434*5e7646d2SAndroid Build Coastguard Worker     if (s)
435*5e7646d2SAndroid Build Coastguard Worker       free(s);
436*5e7646d2SAndroid Build Coastguard Worker 
437*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdEmitString (custom size and string): ", stdout);
438*5e7646d2SAndroid Build Coastguard Worker     ppdMarkOption(ppd, "PageSize", "Custom.400x500");
439*5e7646d2SAndroid Build Coastguard Worker     ppdMarkOption(ppd, "StringOption", "{String1=\"value 1\" String2=value(2)}");
440*5e7646d2SAndroid Build Coastguard Worker 
441*5e7646d2SAndroid Build Coastguard Worker     if ((s = ppdEmitString(ppd, PPD_ORDER_ANY, 0.0)) != NULL &&
442*5e7646d2SAndroid Build Coastguard Worker 	!strcmp(s, custom_code))
443*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
444*5e7646d2SAndroid Build Coastguard Worker     else
445*5e7646d2SAndroid Build Coastguard Worker     {
446*5e7646d2SAndroid Build Coastguard Worker       status ++;
447*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%d bytes instead of %d)\n", s ? (int)strlen(s) : 0,
448*5e7646d2SAndroid Build Coastguard Worker 	     (int)strlen(custom_code));
449*5e7646d2SAndroid Build Coastguard Worker 
450*5e7646d2SAndroid Build Coastguard Worker       if (s)
451*5e7646d2SAndroid Build Coastguard Worker 	puts(s);
452*5e7646d2SAndroid Build Coastguard Worker     }
453*5e7646d2SAndroid Build Coastguard Worker 
454*5e7646d2SAndroid Build Coastguard Worker     if (s)
455*5e7646d2SAndroid Build Coastguard Worker       free(s);
456*5e7646d2SAndroid Build Coastguard Worker 
457*5e7646d2SAndroid Build Coastguard Worker    /*
458*5e7646d2SAndroid Build Coastguard Worker     * Test constraints...
459*5e7646d2SAndroid Build Coastguard Worker     */
460*5e7646d2SAndroid Build Coastguard Worker 
461*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsGetConflicts(InputSlot=Envelope): ", stdout);
462*5e7646d2SAndroid Build Coastguard Worker     ppdMarkOption(ppd, "PageSize", "Letter");
463*5e7646d2SAndroid Build Coastguard Worker 
464*5e7646d2SAndroid Build Coastguard Worker     num_options = cupsGetConflicts(ppd, "InputSlot", "Envelope", &options);
465*5e7646d2SAndroid Build Coastguard Worker     if (num_options != 2 ||
466*5e7646d2SAndroid Build Coastguard Worker         (val = cupsGetOption("PageRegion", num_options, options)) == NULL ||
467*5e7646d2SAndroid Build Coastguard Worker 	_cups_strcasecmp(val, "Letter") ||
468*5e7646d2SAndroid Build Coastguard Worker 	(val = cupsGetOption("PageSize", num_options, options)) == NULL ||
469*5e7646d2SAndroid Build Coastguard Worker 	_cups_strcasecmp(val, "Letter"))
470*5e7646d2SAndroid Build Coastguard Worker     {
471*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%d options:", num_options);
472*5e7646d2SAndroid Build Coastguard Worker       for (i = 0; i < num_options; i ++)
473*5e7646d2SAndroid Build Coastguard Worker         printf(" %s=%s", options[i].name, options[i].value);
474*5e7646d2SAndroid Build Coastguard Worker       puts(")");
475*5e7646d2SAndroid Build Coastguard Worker       status ++;
476*5e7646d2SAndroid Build Coastguard Worker     }
477*5e7646d2SAndroid Build Coastguard Worker     else
478*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
479*5e7646d2SAndroid Build Coastguard Worker 
480*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdConflicts(): ", stdout);
481*5e7646d2SAndroid Build Coastguard Worker     ppdMarkOption(ppd, "InputSlot", "Envelope");
482*5e7646d2SAndroid Build Coastguard Worker 
483*5e7646d2SAndroid Build Coastguard Worker     if ((conflicts = ppdConflicts(ppd)) == 2)
484*5e7646d2SAndroid Build Coastguard Worker       puts("PASS (2)");
485*5e7646d2SAndroid Build Coastguard Worker     else
486*5e7646d2SAndroid Build Coastguard Worker     {
487*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%d)\n", conflicts);
488*5e7646d2SAndroid Build Coastguard Worker       status ++;
489*5e7646d2SAndroid Build Coastguard Worker     }
490*5e7646d2SAndroid Build Coastguard Worker 
491*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsResolveConflicts(InputSlot=Envelope): ", stdout);
492*5e7646d2SAndroid Build Coastguard Worker     num_options = 0;
493*5e7646d2SAndroid Build Coastguard Worker     options     = NULL;
494*5e7646d2SAndroid Build Coastguard Worker     if (!cupsResolveConflicts(ppd, "InputSlot", "Envelope", &num_options,
495*5e7646d2SAndroid Build Coastguard Worker                              &options))
496*5e7646d2SAndroid Build Coastguard Worker     {
497*5e7646d2SAndroid Build Coastguard Worker       puts("FAIL (Unable to resolve)");
498*5e7646d2SAndroid Build Coastguard Worker       status ++;
499*5e7646d2SAndroid Build Coastguard Worker     }
500*5e7646d2SAndroid Build Coastguard Worker     else if (num_options != 2 ||
501*5e7646d2SAndroid Build Coastguard Worker              !cupsGetOption("PageSize", num_options, options))
502*5e7646d2SAndroid Build Coastguard Worker     {
503*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%d options:", num_options);
504*5e7646d2SAndroid Build Coastguard Worker       for (i = 0; i < num_options; i ++)
505*5e7646d2SAndroid Build Coastguard Worker         printf(" %s=%s", options[i].name, options[i].value);
506*5e7646d2SAndroid Build Coastguard Worker       puts(")");
507*5e7646d2SAndroid Build Coastguard Worker       status ++;
508*5e7646d2SAndroid Build Coastguard Worker     }
509*5e7646d2SAndroid Build Coastguard Worker     else
510*5e7646d2SAndroid Build Coastguard Worker       puts("PASS (Resolved by changing PageSize)");
511*5e7646d2SAndroid Build Coastguard Worker 
512*5e7646d2SAndroid Build Coastguard Worker     cupsFreeOptions(num_options, options);
513*5e7646d2SAndroid Build Coastguard Worker 
514*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsResolveConflicts(No option/choice): ", stdout);
515*5e7646d2SAndroid Build Coastguard Worker     num_options = 0;
516*5e7646d2SAndroid Build Coastguard Worker     options     = NULL;
517*5e7646d2SAndroid Build Coastguard Worker     if (cupsResolveConflicts(ppd, NULL, NULL, &num_options, &options) &&
518*5e7646d2SAndroid Build Coastguard Worker         num_options == 1 && !_cups_strcasecmp(options[0].name, "InputSlot") &&
519*5e7646d2SAndroid Build Coastguard Worker 	!_cups_strcasecmp(options[0].value, "Tray"))
520*5e7646d2SAndroid Build Coastguard Worker       puts("PASS (Resolved by changing InputSlot)");
521*5e7646d2SAndroid Build Coastguard Worker     else if (num_options > 0)
522*5e7646d2SAndroid Build Coastguard Worker     {
523*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%d options:", num_options);
524*5e7646d2SAndroid Build Coastguard Worker       for (i = 0; i < num_options; i ++)
525*5e7646d2SAndroid Build Coastguard Worker         printf(" %s=%s", options[i].name, options[i].value);
526*5e7646d2SAndroid Build Coastguard Worker       puts(")");
527*5e7646d2SAndroid Build Coastguard Worker       status ++;
528*5e7646d2SAndroid Build Coastguard Worker     }
529*5e7646d2SAndroid Build Coastguard Worker     else
530*5e7646d2SAndroid Build Coastguard Worker     {
531*5e7646d2SAndroid Build Coastguard Worker       puts("FAIL (Unable to resolve)");
532*5e7646d2SAndroid Build Coastguard Worker       status ++;
533*5e7646d2SAndroid Build Coastguard Worker     }
534*5e7646d2SAndroid Build Coastguard Worker     cupsFreeOptions(num_options, options);
535*5e7646d2SAndroid Build Coastguard Worker 
536*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdInstallableConflict(): ", stdout);
537*5e7646d2SAndroid Build Coastguard Worker     if (ppdInstallableConflict(ppd, "Duplex", "DuplexNoTumble") &&
538*5e7646d2SAndroid Build Coastguard Worker         !ppdInstallableConflict(ppd, "Duplex", "None"))
539*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
540*5e7646d2SAndroid Build Coastguard Worker     else if (!ppdInstallableConflict(ppd, "Duplex", "DuplexNoTumble"))
541*5e7646d2SAndroid Build Coastguard Worker     {
542*5e7646d2SAndroid Build Coastguard Worker       puts("FAIL (Duplex=DuplexNoTumble did not conflict)");
543*5e7646d2SAndroid Build Coastguard Worker       status ++;
544*5e7646d2SAndroid Build Coastguard Worker     }
545*5e7646d2SAndroid Build Coastguard Worker     else
546*5e7646d2SAndroid Build Coastguard Worker     {
547*5e7646d2SAndroid Build Coastguard Worker       puts("FAIL (Duplex=None conflicted)");
548*5e7646d2SAndroid Build Coastguard Worker       status ++;
549*5e7646d2SAndroid Build Coastguard Worker     }
550*5e7646d2SAndroid Build Coastguard Worker 
551*5e7646d2SAndroid Build Coastguard Worker    /*
552*5e7646d2SAndroid Build Coastguard Worker     * ppdPageSizeLimits
553*5e7646d2SAndroid Build Coastguard Worker     */
554*5e7646d2SAndroid Build Coastguard Worker 
555*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdPageSizeLimits: ", stdout);
556*5e7646d2SAndroid Build Coastguard Worker     if (ppdPageSizeLimits(ppd, &minsize, &maxsize))
557*5e7646d2SAndroid Build Coastguard Worker     {
558*5e7646d2SAndroid Build Coastguard Worker       if (fabs(minsize.width - 36.0) > 0.001 || fabs(minsize.length - 36.0) > 0.001 ||
559*5e7646d2SAndroid Build Coastguard Worker           fabs(maxsize.width - 1080.0) > 0.001 || fabs(maxsize.length - 86400.0) > 0.001)
560*5e7646d2SAndroid Build Coastguard Worker       {
561*5e7646d2SAndroid Build Coastguard Worker         printf("FAIL (got min=%.3fx%.3f, max=%.3fx%.3f, "
562*5e7646d2SAndroid Build Coastguard Worker 	       "expected min=36x36, max=1080x86400)\n", minsize.width,
563*5e7646d2SAndroid Build Coastguard Worker 	       minsize.length, maxsize.width, maxsize.length);
564*5e7646d2SAndroid Build Coastguard Worker         status ++;
565*5e7646d2SAndroid Build Coastguard Worker       }
566*5e7646d2SAndroid Build Coastguard Worker       else
567*5e7646d2SAndroid Build Coastguard Worker         puts("PASS");
568*5e7646d2SAndroid Build Coastguard Worker     }
569*5e7646d2SAndroid Build Coastguard Worker     else
570*5e7646d2SAndroid Build Coastguard Worker     {
571*5e7646d2SAndroid Build Coastguard Worker       puts("FAIL (returned 0)");
572*5e7646d2SAndroid Build Coastguard Worker       status ++;
573*5e7646d2SAndroid Build Coastguard Worker     }
574*5e7646d2SAndroid Build Coastguard Worker 
575*5e7646d2SAndroid Build Coastguard Worker    /*
576*5e7646d2SAndroid Build Coastguard Worker     * cupsMarkOptions with PWG and IPP size names.
577*5e7646d2SAndroid Build Coastguard Worker     */
578*5e7646d2SAndroid Build Coastguard Worker 
579*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsMarkOptions(media=iso-a4): ", stdout);
580*5e7646d2SAndroid Build Coastguard Worker     num_options = cupsAddOption("media", "iso-a4", 0, &options);
581*5e7646d2SAndroid Build Coastguard Worker     cupsMarkOptions(ppd, num_options, options);
582*5e7646d2SAndroid Build Coastguard Worker     cupsFreeOptions(num_options, options);
583*5e7646d2SAndroid Build Coastguard Worker 
584*5e7646d2SAndroid Build Coastguard Worker     size = ppdPageSize(ppd, NULL);
585*5e7646d2SAndroid Build Coastguard Worker     if (!size || strcmp(size->name, "A4"))
586*5e7646d2SAndroid Build Coastguard Worker     {
587*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s)\n", size ? size->name : "unknown");
588*5e7646d2SAndroid Build Coastguard Worker       status ++;
589*5e7646d2SAndroid Build Coastguard Worker     }
590*5e7646d2SAndroid Build Coastguard Worker     else
591*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
592*5e7646d2SAndroid Build Coastguard Worker 
593*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsMarkOptions(media=na_letter_8.5x11in): ", stdout);
594*5e7646d2SAndroid Build Coastguard Worker     num_options = cupsAddOption("media", "na_letter_8.5x11in", 0, &options);
595*5e7646d2SAndroid Build Coastguard Worker     cupsMarkOptions(ppd, num_options, options);
596*5e7646d2SAndroid Build Coastguard Worker     cupsFreeOptions(num_options, options);
597*5e7646d2SAndroid Build Coastguard Worker 
598*5e7646d2SAndroid Build Coastguard Worker     size = ppdPageSize(ppd, NULL);
599*5e7646d2SAndroid Build Coastguard Worker     if (!size || strcmp(size->name, "Letter"))
600*5e7646d2SAndroid Build Coastguard Worker     {
601*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s)\n", size ? size->name : "unknown");
602*5e7646d2SAndroid Build Coastguard Worker       status ++;
603*5e7646d2SAndroid Build Coastguard Worker     }
604*5e7646d2SAndroid Build Coastguard Worker     else
605*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
606*5e7646d2SAndroid Build Coastguard Worker 
607*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsMarkOptions(media=oe_letter-fullbleed_8.5x11in): ", stdout);
608*5e7646d2SAndroid Build Coastguard Worker     num_options = cupsAddOption("media", "oe_letter-fullbleed_8.5x11in", 0,
609*5e7646d2SAndroid Build Coastguard Worker                                 &options);
610*5e7646d2SAndroid Build Coastguard Worker     cupsMarkOptions(ppd, num_options, options);
611*5e7646d2SAndroid Build Coastguard Worker     cupsFreeOptions(num_options, options);
612*5e7646d2SAndroid Build Coastguard Worker 
613*5e7646d2SAndroid Build Coastguard Worker     size = ppdPageSize(ppd, NULL);
614*5e7646d2SAndroid Build Coastguard Worker     if (!size || strcmp(size->name, "Letter.Fullbleed"))
615*5e7646d2SAndroid Build Coastguard Worker     {
616*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s)\n", size ? size->name : "unknown");
617*5e7646d2SAndroid Build Coastguard Worker       status ++;
618*5e7646d2SAndroid Build Coastguard Worker     }
619*5e7646d2SAndroid Build Coastguard Worker     else
620*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
621*5e7646d2SAndroid Build Coastguard Worker 
622*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsMarkOptions(media=A4): ", stdout);
623*5e7646d2SAndroid Build Coastguard Worker     num_options = cupsAddOption("media", "A4", 0, &options);
624*5e7646d2SAndroid Build Coastguard Worker     cupsMarkOptions(ppd, num_options, options);
625*5e7646d2SAndroid Build Coastguard Worker     cupsFreeOptions(num_options, options);
626*5e7646d2SAndroid Build Coastguard Worker 
627*5e7646d2SAndroid Build Coastguard Worker     size = ppdPageSize(ppd, NULL);
628*5e7646d2SAndroid Build Coastguard Worker     if (!size || strcmp(size->name, "A4"))
629*5e7646d2SAndroid Build Coastguard Worker     {
630*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s)\n", size ? size->name : "unknown");
631*5e7646d2SAndroid Build Coastguard Worker       status ++;
632*5e7646d2SAndroid Build Coastguard Worker     }
633*5e7646d2SAndroid Build Coastguard Worker     else
634*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
635*5e7646d2SAndroid Build Coastguard Worker 
636*5e7646d2SAndroid Build Coastguard Worker    /*
637*5e7646d2SAndroid Build Coastguard Worker     * Custom sizes...
638*5e7646d2SAndroid Build Coastguard Worker     */
639*5e7646d2SAndroid Build Coastguard Worker 
640*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsMarkOptions(media=Custom.8x10in): ", stdout);
641*5e7646d2SAndroid Build Coastguard Worker     num_options = cupsAddOption("media", "Custom.8x10in", 0, &options);
642*5e7646d2SAndroid Build Coastguard Worker     cupsMarkOptions(ppd, num_options, options);
643*5e7646d2SAndroid Build Coastguard Worker     cupsFreeOptions(num_options, options);
644*5e7646d2SAndroid Build Coastguard Worker 
645*5e7646d2SAndroid Build Coastguard Worker     size = ppdPageSize(ppd, NULL);
646*5e7646d2SAndroid Build Coastguard Worker     if (!size || strcmp(size->name, "Custom") ||
647*5e7646d2SAndroid Build Coastguard Worker         fabs(size->width - 576.0) > 0.001 ||
648*5e7646d2SAndroid Build Coastguard Worker         fabs(size->length - 720.0) > 0.001)
649*5e7646d2SAndroid Build Coastguard Worker     {
650*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s - %gx%g)\n", size ? size->name : "unknown",
651*5e7646d2SAndroid Build Coastguard Worker              size ? size->width : 0.0, size ? size->length : 0.0);
652*5e7646d2SAndroid Build Coastguard Worker       status ++;
653*5e7646d2SAndroid Build Coastguard Worker     }
654*5e7646d2SAndroid Build Coastguard Worker     else
655*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
656*5e7646d2SAndroid Build Coastguard Worker 
657*5e7646d2SAndroid Build Coastguard Worker    /*
658*5e7646d2SAndroid Build Coastguard Worker     * Test localization...
659*5e7646d2SAndroid Build Coastguard Worker     */
660*5e7646d2SAndroid Build Coastguard Worker 
661*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdLocalizeIPPReason(text): ", stdout);
662*5e7646d2SAndroid Build Coastguard Worker     if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) &&
663*5e7646d2SAndroid Build Coastguard Worker         !strcmp(buffer, "Foo Reason"))
664*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
665*5e7646d2SAndroid Build Coastguard Worker     else
666*5e7646d2SAndroid Build Coastguard Worker     {
667*5e7646d2SAndroid Build Coastguard Worker       status ++;
668*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (\"%s\" instead of \"Foo Reason\")\n", buffer);
669*5e7646d2SAndroid Build Coastguard Worker     }
670*5e7646d2SAndroid Build Coastguard Worker 
671*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdLocalizeIPPReason(http): ", stdout);
672*5e7646d2SAndroid Build Coastguard Worker     if (ppdLocalizeIPPReason(ppd, "foo", "http", buffer, sizeof(buffer)) &&
673*5e7646d2SAndroid Build Coastguard Worker         !strcmp(buffer, "http://foo/bar.html"))
674*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
675*5e7646d2SAndroid Build Coastguard Worker     else
676*5e7646d2SAndroid Build Coastguard Worker     {
677*5e7646d2SAndroid Build Coastguard Worker       status ++;
678*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (\"%s\" instead of \"http://foo/bar.html\")\n", buffer);
679*5e7646d2SAndroid Build Coastguard Worker     }
680*5e7646d2SAndroid Build Coastguard Worker 
681*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdLocalizeIPPReason(help): ", stdout);
682*5e7646d2SAndroid Build Coastguard Worker     if (ppdLocalizeIPPReason(ppd, "foo", "help", buffer, sizeof(buffer)) &&
683*5e7646d2SAndroid Build Coastguard Worker         !strcmp(buffer, "help:anchor='foo'%20bookID=Vendor%20Help"))
684*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
685*5e7646d2SAndroid Build Coastguard Worker     else
686*5e7646d2SAndroid Build Coastguard Worker     {
687*5e7646d2SAndroid Build Coastguard Worker       status ++;
688*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (\"%s\" instead of \"help:anchor='foo'%%20bookID=Vendor%%20Help\")\n", buffer);
689*5e7646d2SAndroid Build Coastguard Worker     }
690*5e7646d2SAndroid Build Coastguard Worker 
691*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdLocalizeIPPReason(file): ", stdout);
692*5e7646d2SAndroid Build Coastguard Worker     if (ppdLocalizeIPPReason(ppd, "foo", "file", buffer, sizeof(buffer)) &&
693*5e7646d2SAndroid Build Coastguard Worker         !strcmp(buffer, "/help/foo/bar.html"))
694*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
695*5e7646d2SAndroid Build Coastguard Worker     else
696*5e7646d2SAndroid Build Coastguard Worker     {
697*5e7646d2SAndroid Build Coastguard Worker       status ++;
698*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (\"%s\" instead of \"/help/foo/bar.html\")\n", buffer);
699*5e7646d2SAndroid Build Coastguard Worker     }
700*5e7646d2SAndroid Build Coastguard Worker 
701*5e7646d2SAndroid Build Coastguard Worker     putenv("LANG=fr");
702*5e7646d2SAndroid Build Coastguard Worker     putenv("LC_ALL=fr");
703*5e7646d2SAndroid Build Coastguard Worker     putenv("LC_CTYPE=fr");
704*5e7646d2SAndroid Build Coastguard Worker     putenv("LC_MESSAGES=fr");
705*5e7646d2SAndroid Build Coastguard Worker 
706*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdLocalizeIPPReason(fr text): ", stdout);
707*5e7646d2SAndroid Build Coastguard Worker     if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) &&
708*5e7646d2SAndroid Build Coastguard Worker         !strcmp(buffer, "La Long Foo Reason"))
709*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
710*5e7646d2SAndroid Build Coastguard Worker     else
711*5e7646d2SAndroid Build Coastguard Worker     {
712*5e7646d2SAndroid Build Coastguard Worker       status ++;
713*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (\"%s\" instead of \"La Long Foo Reason\")\n", buffer);
714*5e7646d2SAndroid Build Coastguard Worker     }
715*5e7646d2SAndroid Build Coastguard Worker 
716*5e7646d2SAndroid Build Coastguard Worker     putenv("LANG=zh_TW");
717*5e7646d2SAndroid Build Coastguard Worker     putenv("LC_ALL=zh_TW");
718*5e7646d2SAndroid Build Coastguard Worker     putenv("LC_CTYPE=zh_TW");
719*5e7646d2SAndroid Build Coastguard Worker     putenv("LC_MESSAGES=zh_TW");
720*5e7646d2SAndroid Build Coastguard Worker 
721*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdLocalizeIPPReason(zh_TW text): ", stdout);
722*5e7646d2SAndroid Build Coastguard Worker     if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) &&
723*5e7646d2SAndroid Build Coastguard Worker         !strcmp(buffer, "Number 1 Foo Reason"))
724*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
725*5e7646d2SAndroid Build Coastguard Worker     else
726*5e7646d2SAndroid Build Coastguard Worker     {
727*5e7646d2SAndroid Build Coastguard Worker       status ++;
728*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (\"%s\" instead of \"Number 1 Foo Reason\")\n", buffer);
729*5e7646d2SAndroid Build Coastguard Worker     }
730*5e7646d2SAndroid Build Coastguard Worker 
731*5e7646d2SAndroid Build Coastguard Worker    /*
732*5e7646d2SAndroid Build Coastguard Worker     * cupsMarkerName localization...
733*5e7646d2SAndroid Build Coastguard Worker     */
734*5e7646d2SAndroid Build Coastguard Worker 
735*5e7646d2SAndroid Build Coastguard Worker     putenv("LANG=en");
736*5e7646d2SAndroid Build Coastguard Worker     putenv("LC_ALL=en");
737*5e7646d2SAndroid Build Coastguard Worker     putenv("LC_CTYPE=en");
738*5e7646d2SAndroid Build Coastguard Worker     putenv("LC_MESSAGES=en");
739*5e7646d2SAndroid Build Coastguard Worker 
740*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdLocalizeMarkerName(bogus): ", stdout);
741*5e7646d2SAndroid Build Coastguard Worker 
742*5e7646d2SAndroid Build Coastguard Worker     if ((text = ppdLocalizeMarkerName(ppd, "bogus")) != NULL)
743*5e7646d2SAndroid Build Coastguard Worker     {
744*5e7646d2SAndroid Build Coastguard Worker       status ++;
745*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (\"%s\" instead of NULL)\n", text);
746*5e7646d2SAndroid Build Coastguard Worker     }
747*5e7646d2SAndroid Build Coastguard Worker     else
748*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
749*5e7646d2SAndroid Build Coastguard Worker 
750*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdLocalizeMarkerName(cyan): ", stdout);
751*5e7646d2SAndroid Build Coastguard Worker 
752*5e7646d2SAndroid Build Coastguard Worker     if ((text = ppdLocalizeMarkerName(ppd, "cyan")) != NULL &&
753*5e7646d2SAndroid Build Coastguard Worker         !strcmp(text, "Cyan Toner"))
754*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
755*5e7646d2SAndroid Build Coastguard Worker     else
756*5e7646d2SAndroid Build Coastguard Worker     {
757*5e7646d2SAndroid Build Coastguard Worker       status ++;
758*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (\"%s\" instead of \"Cyan Toner\")\n",
759*5e7646d2SAndroid Build Coastguard Worker              text ? text : "(null)");
760*5e7646d2SAndroid Build Coastguard Worker     }
761*5e7646d2SAndroid Build Coastguard Worker 
762*5e7646d2SAndroid Build Coastguard Worker     putenv("LANG=fr");
763*5e7646d2SAndroid Build Coastguard Worker     putenv("LC_ALL=fr");
764*5e7646d2SAndroid Build Coastguard Worker     putenv("LC_CTYPE=fr");
765*5e7646d2SAndroid Build Coastguard Worker     putenv("LC_MESSAGES=fr");
766*5e7646d2SAndroid Build Coastguard Worker 
767*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdLocalizeMarkerName(fr cyan): ", stdout);
768*5e7646d2SAndroid Build Coastguard Worker     if ((text = ppdLocalizeMarkerName(ppd, "cyan")) != NULL &&
769*5e7646d2SAndroid Build Coastguard Worker         !strcmp(text, "La Toner Cyan"))
770*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
771*5e7646d2SAndroid Build Coastguard Worker     else
772*5e7646d2SAndroid Build Coastguard Worker     {
773*5e7646d2SAndroid Build Coastguard Worker       status ++;
774*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (\"%s\" instead of \"La Toner Cyan\")\n",
775*5e7646d2SAndroid Build Coastguard Worker              text ? text : "(null)");
776*5e7646d2SAndroid Build Coastguard Worker     }
777*5e7646d2SAndroid Build Coastguard Worker 
778*5e7646d2SAndroid Build Coastguard Worker     putenv("LANG=zh_TW");
779*5e7646d2SAndroid Build Coastguard Worker     putenv("LC_ALL=zh_TW");
780*5e7646d2SAndroid Build Coastguard Worker     putenv("LC_CTYPE=zh_TW");
781*5e7646d2SAndroid Build Coastguard Worker     putenv("LC_MESSAGES=zh_TW");
782*5e7646d2SAndroid Build Coastguard Worker 
783*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdLocalizeMarkerName(zh_TW cyan): ", stdout);
784*5e7646d2SAndroid Build Coastguard Worker     if ((text = ppdLocalizeMarkerName(ppd, "cyan")) != NULL &&
785*5e7646d2SAndroid Build Coastguard Worker         !strcmp(text, "Number 1 Cyan Toner"))
786*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
787*5e7646d2SAndroid Build Coastguard Worker     else
788*5e7646d2SAndroid Build Coastguard Worker     {
789*5e7646d2SAndroid Build Coastguard Worker       status ++;
790*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (\"%s\" instead of \"Number 1 Cyan Toner\")\n",
791*5e7646d2SAndroid Build Coastguard Worker              text ? text : "(null)");
792*5e7646d2SAndroid Build Coastguard Worker     }
793*5e7646d2SAndroid Build Coastguard Worker 
794*5e7646d2SAndroid Build Coastguard Worker     ppdClose(ppd);
795*5e7646d2SAndroid Build Coastguard Worker 
796*5e7646d2SAndroid Build Coastguard Worker    /*
797*5e7646d2SAndroid Build Coastguard Worker     * Test new constraints...
798*5e7646d2SAndroid Build Coastguard Worker     */
799*5e7646d2SAndroid Build Coastguard Worker 
800*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdOpenFile(test2.ppd): ", stdout);
801*5e7646d2SAndroid Build Coastguard Worker 
802*5e7646d2SAndroid Build Coastguard Worker     if ((ppd = ppdOpenFile("test2.ppd")) != NULL)
803*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
804*5e7646d2SAndroid Build Coastguard Worker     else
805*5e7646d2SAndroid Build Coastguard Worker     {
806*5e7646d2SAndroid Build Coastguard Worker       ppd_status_t	err;		/* Last error in file */
807*5e7646d2SAndroid Build Coastguard Worker       int		line;		/* Line number in file */
808*5e7646d2SAndroid Build Coastguard Worker 
809*5e7646d2SAndroid Build Coastguard Worker 
810*5e7646d2SAndroid Build Coastguard Worker       status ++;
811*5e7646d2SAndroid Build Coastguard Worker       err = ppdLastError(&line);
812*5e7646d2SAndroid Build Coastguard Worker 
813*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%s on line %d)\n", ppdErrorString(err), line);
814*5e7646d2SAndroid Build Coastguard Worker     }
815*5e7646d2SAndroid Build Coastguard Worker 
816*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdMarkDefaults: ", stdout);
817*5e7646d2SAndroid Build Coastguard Worker     ppdMarkDefaults(ppd);
818*5e7646d2SAndroid Build Coastguard Worker 
819*5e7646d2SAndroid Build Coastguard Worker     if ((conflicts = ppdConflicts(ppd)) == 0)
820*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
821*5e7646d2SAndroid Build Coastguard Worker     else
822*5e7646d2SAndroid Build Coastguard Worker     {
823*5e7646d2SAndroid Build Coastguard Worker       status ++;
824*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%d conflicts)\n", conflicts);
825*5e7646d2SAndroid Build Coastguard Worker     }
826*5e7646d2SAndroid Build Coastguard Worker 
827*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdEmitString (defaults): ", stdout);
828*5e7646d2SAndroid Build Coastguard Worker     if ((s = ppdEmitString(ppd, PPD_ORDER_ANY, 0.0)) != NULL &&
829*5e7646d2SAndroid Build Coastguard Worker 	!strcmp(s, default2_code))
830*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
831*5e7646d2SAndroid Build Coastguard Worker     else
832*5e7646d2SAndroid Build Coastguard Worker     {
833*5e7646d2SAndroid Build Coastguard Worker       status ++;
834*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%d bytes instead of %d)\n", s ? (int)strlen(s) : 0,
835*5e7646d2SAndroid Build Coastguard Worker 	     (int)strlen(default2_code));
836*5e7646d2SAndroid Build Coastguard Worker 
837*5e7646d2SAndroid Build Coastguard Worker       if (s)
838*5e7646d2SAndroid Build Coastguard Worker 	puts(s);
839*5e7646d2SAndroid Build Coastguard Worker     }
840*5e7646d2SAndroid Build Coastguard Worker 
841*5e7646d2SAndroid Build Coastguard Worker     if (s)
842*5e7646d2SAndroid Build Coastguard Worker       free(s);
843*5e7646d2SAndroid Build Coastguard Worker 
844*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdConflicts(): ", stdout);
845*5e7646d2SAndroid Build Coastguard Worker     ppdMarkOption(ppd, "PageSize", "Env10");
846*5e7646d2SAndroid Build Coastguard Worker     ppdMarkOption(ppd, "InputSlot", "Envelope");
847*5e7646d2SAndroid Build Coastguard Worker     ppdMarkOption(ppd, "Quality", "Photo");
848*5e7646d2SAndroid Build Coastguard Worker 
849*5e7646d2SAndroid Build Coastguard Worker     if ((conflicts = ppdConflicts(ppd)) == 1)
850*5e7646d2SAndroid Build Coastguard Worker       puts("PASS (1)");
851*5e7646d2SAndroid Build Coastguard Worker     else
852*5e7646d2SAndroid Build Coastguard Worker     {
853*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%d)\n", conflicts);
854*5e7646d2SAndroid Build Coastguard Worker       status ++;
855*5e7646d2SAndroid Build Coastguard Worker     }
856*5e7646d2SAndroid Build Coastguard Worker 
857*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsResolveConflicts(Quality=Photo): ", stdout);
858*5e7646d2SAndroid Build Coastguard Worker     num_options = 0;
859*5e7646d2SAndroid Build Coastguard Worker     options     = NULL;
860*5e7646d2SAndroid Build Coastguard Worker     if (cupsResolveConflicts(ppd, "Quality", "Photo", &num_options,
861*5e7646d2SAndroid Build Coastguard Worker                              &options))
862*5e7646d2SAndroid Build Coastguard Worker     {
863*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%d options:", num_options);
864*5e7646d2SAndroid Build Coastguard Worker       for (i = 0; i < num_options; i ++)
865*5e7646d2SAndroid Build Coastguard Worker         printf(" %s=%s", options[i].name, options[i].value);
866*5e7646d2SAndroid Build Coastguard Worker       puts(")");
867*5e7646d2SAndroid Build Coastguard Worker       status ++;
868*5e7646d2SAndroid Build Coastguard Worker     }
869*5e7646d2SAndroid Build Coastguard Worker     else
870*5e7646d2SAndroid Build Coastguard Worker       puts("PASS (Unable to resolve)");
871*5e7646d2SAndroid Build Coastguard Worker     cupsFreeOptions(num_options, options);
872*5e7646d2SAndroid Build Coastguard Worker 
873*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsResolveConflicts(No option/choice): ", stdout);
874*5e7646d2SAndroid Build Coastguard Worker     num_options = 0;
875*5e7646d2SAndroid Build Coastguard Worker     options     = NULL;
876*5e7646d2SAndroid Build Coastguard Worker     if (cupsResolveConflicts(ppd, NULL, NULL, &num_options, &options) &&
877*5e7646d2SAndroid Build Coastguard Worker         num_options == 1 && !_cups_strcasecmp(options->name, "Quality") &&
878*5e7646d2SAndroid Build Coastguard Worker 	!_cups_strcasecmp(options->value, "Normal"))
879*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
880*5e7646d2SAndroid Build Coastguard Worker     else if (num_options > 0)
881*5e7646d2SAndroid Build Coastguard Worker     {
882*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%d options:", num_options);
883*5e7646d2SAndroid Build Coastguard Worker       for (i = 0; i < num_options; i ++)
884*5e7646d2SAndroid Build Coastguard Worker         printf(" %s=%s", options[i].name, options[i].value);
885*5e7646d2SAndroid Build Coastguard Worker       puts(")");
886*5e7646d2SAndroid Build Coastguard Worker       status ++;
887*5e7646d2SAndroid Build Coastguard Worker     }
888*5e7646d2SAndroid Build Coastguard Worker     else
889*5e7646d2SAndroid Build Coastguard Worker     {
890*5e7646d2SAndroid Build Coastguard Worker       puts("FAIL (Unable to resolve!)");
891*5e7646d2SAndroid Build Coastguard Worker       status ++;
892*5e7646d2SAndroid Build Coastguard Worker     }
893*5e7646d2SAndroid Build Coastguard Worker     cupsFreeOptions(num_options, options);
894*5e7646d2SAndroid Build Coastguard Worker 
895*5e7646d2SAndroid Build Coastguard Worker     fputs("cupsResolveConflicts(loop test): ", stdout);
896*5e7646d2SAndroid Build Coastguard Worker     ppdMarkOption(ppd, "PageSize", "A4");
897*5e7646d2SAndroid Build Coastguard Worker     ppdMarkOption(ppd, "InputSlot", "Tray");
898*5e7646d2SAndroid Build Coastguard Worker     ppdMarkOption(ppd, "Quality", "Photo");
899*5e7646d2SAndroid Build Coastguard Worker     num_options = 0;
900*5e7646d2SAndroid Build Coastguard Worker     options     = NULL;
901*5e7646d2SAndroid Build Coastguard Worker     if (!cupsResolveConflicts(ppd, NULL, NULL, &num_options, &options))
902*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
903*5e7646d2SAndroid Build Coastguard Worker     else if (num_options > 0)
904*5e7646d2SAndroid Build Coastguard Worker     {
905*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (%d options:", num_options);
906*5e7646d2SAndroid Build Coastguard Worker       for (i = 0; i < num_options; i ++)
907*5e7646d2SAndroid Build Coastguard Worker         printf(" %s=%s", options[i].name, options[i].value);
908*5e7646d2SAndroid Build Coastguard Worker       puts(")");
909*5e7646d2SAndroid Build Coastguard Worker     }
910*5e7646d2SAndroid Build Coastguard Worker     else
911*5e7646d2SAndroid Build Coastguard Worker       puts("FAIL (No conflicts!)");
912*5e7646d2SAndroid Build Coastguard Worker 
913*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdInstallableConflict(): ", stdout);
914*5e7646d2SAndroid Build Coastguard Worker     if (ppdInstallableConflict(ppd, "Duplex", "DuplexNoTumble") &&
915*5e7646d2SAndroid Build Coastguard Worker         !ppdInstallableConflict(ppd, "Duplex", "None"))
916*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
917*5e7646d2SAndroid Build Coastguard Worker     else if (!ppdInstallableConflict(ppd, "Duplex", "DuplexNoTumble"))
918*5e7646d2SAndroid Build Coastguard Worker     {
919*5e7646d2SAndroid Build Coastguard Worker       puts("FAIL (Duplex=DuplexNoTumble did not conflict)");
920*5e7646d2SAndroid Build Coastguard Worker       status ++;
921*5e7646d2SAndroid Build Coastguard Worker     }
922*5e7646d2SAndroid Build Coastguard Worker     else
923*5e7646d2SAndroid Build Coastguard Worker     {
924*5e7646d2SAndroid Build Coastguard Worker       puts("FAIL (Duplex=None conflicted)");
925*5e7646d2SAndroid Build Coastguard Worker       status ++;
926*5e7646d2SAndroid Build Coastguard Worker     }
927*5e7646d2SAndroid Build Coastguard Worker 
928*5e7646d2SAndroid Build Coastguard Worker    /*
929*5e7646d2SAndroid Build Coastguard Worker     * ppdPageSizeLimits
930*5e7646d2SAndroid Build Coastguard Worker     */
931*5e7646d2SAndroid Build Coastguard Worker 
932*5e7646d2SAndroid Build Coastguard Worker     ppdMarkDefaults(ppd);
933*5e7646d2SAndroid Build Coastguard Worker 
934*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdPageSizeLimits(default): ", stdout);
935*5e7646d2SAndroid Build Coastguard Worker     if (ppdPageSizeLimits(ppd, &minsize, &maxsize))
936*5e7646d2SAndroid Build Coastguard Worker     {
937*5e7646d2SAndroid Build Coastguard Worker       if (fabs(minsize.width - 36.0) > 0.001 || fabs(minsize.length - 36.0) > 0.001 ||
938*5e7646d2SAndroid Build Coastguard Worker           fabs(maxsize.width - 1080.0) > 0.001 || fabs(maxsize.length - 86400.0) > 0.001)
939*5e7646d2SAndroid Build Coastguard Worker       {
940*5e7646d2SAndroid Build Coastguard Worker         printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, "
941*5e7646d2SAndroid Build Coastguard Worker 	       "expected min=36x36, max=1080x86400)\n", minsize.width,
942*5e7646d2SAndroid Build Coastguard Worker 	       minsize.length, maxsize.width, maxsize.length);
943*5e7646d2SAndroid Build Coastguard Worker         status ++;
944*5e7646d2SAndroid Build Coastguard Worker       }
945*5e7646d2SAndroid Build Coastguard Worker       else
946*5e7646d2SAndroid Build Coastguard Worker         puts("PASS");
947*5e7646d2SAndroid Build Coastguard Worker     }
948*5e7646d2SAndroid Build Coastguard Worker     else
949*5e7646d2SAndroid Build Coastguard Worker     {
950*5e7646d2SAndroid Build Coastguard Worker       puts("FAIL (returned 0)");
951*5e7646d2SAndroid Build Coastguard Worker       status ++;
952*5e7646d2SAndroid Build Coastguard Worker     }
953*5e7646d2SAndroid Build Coastguard Worker 
954*5e7646d2SAndroid Build Coastguard Worker     ppdMarkOption(ppd, "InputSlot", "Manual");
955*5e7646d2SAndroid Build Coastguard Worker 
956*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdPageSizeLimits(InputSlot=Manual): ", stdout);
957*5e7646d2SAndroid Build Coastguard Worker     if (ppdPageSizeLimits(ppd, &minsize, &maxsize))
958*5e7646d2SAndroid Build Coastguard Worker     {
959*5e7646d2SAndroid Build Coastguard Worker       if (fabs(minsize.width - 100.0) > 0.001 || fabs(minsize.length - 100.0) > 0.001 ||
960*5e7646d2SAndroid Build Coastguard Worker           fabs(maxsize.width - 1000.0) > 0.001 || fabs(maxsize.length - 1000.0) > 0.001)
961*5e7646d2SAndroid Build Coastguard Worker       {
962*5e7646d2SAndroid Build Coastguard Worker         printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, "
963*5e7646d2SAndroid Build Coastguard Worker 	       "expected min=100x100, max=1000x1000)\n", minsize.width,
964*5e7646d2SAndroid Build Coastguard Worker 	       minsize.length, maxsize.width, maxsize.length);
965*5e7646d2SAndroid Build Coastguard Worker         status ++;
966*5e7646d2SAndroid Build Coastguard Worker       }
967*5e7646d2SAndroid Build Coastguard Worker       else
968*5e7646d2SAndroid Build Coastguard Worker         puts("PASS");
969*5e7646d2SAndroid Build Coastguard Worker     }
970*5e7646d2SAndroid Build Coastguard Worker     else
971*5e7646d2SAndroid Build Coastguard Worker     {
972*5e7646d2SAndroid Build Coastguard Worker       puts("FAIL (returned 0)");
973*5e7646d2SAndroid Build Coastguard Worker       status ++;
974*5e7646d2SAndroid Build Coastguard Worker     }
975*5e7646d2SAndroid Build Coastguard Worker 
976*5e7646d2SAndroid Build Coastguard Worker     ppdMarkOption(ppd, "Quality", "Photo");
977*5e7646d2SAndroid Build Coastguard Worker 
978*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdPageSizeLimits(Quality=Photo): ", stdout);
979*5e7646d2SAndroid Build Coastguard Worker     if (ppdPageSizeLimits(ppd, &minsize, &maxsize))
980*5e7646d2SAndroid Build Coastguard Worker     {
981*5e7646d2SAndroid Build Coastguard Worker       if (fabs(minsize.width - 200.0) > 0.001 || fabs(minsize.length - 200.0) > 0.001 ||
982*5e7646d2SAndroid Build Coastguard Worker           fabs(maxsize.width - 1000.0) > 0.001 || fabs(maxsize.length - 1000.0) > 0.001)
983*5e7646d2SAndroid Build Coastguard Worker       {
984*5e7646d2SAndroid Build Coastguard Worker         printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, "
985*5e7646d2SAndroid Build Coastguard Worker 	       "expected min=200x200, max=1000x1000)\n", minsize.width,
986*5e7646d2SAndroid Build Coastguard Worker 	       minsize.length, maxsize.width, maxsize.length);
987*5e7646d2SAndroid Build Coastguard Worker         status ++;
988*5e7646d2SAndroid Build Coastguard Worker       }
989*5e7646d2SAndroid Build Coastguard Worker       else
990*5e7646d2SAndroid Build Coastguard Worker         puts("PASS");
991*5e7646d2SAndroid Build Coastguard Worker     }
992*5e7646d2SAndroid Build Coastguard Worker     else
993*5e7646d2SAndroid Build Coastguard Worker     {
994*5e7646d2SAndroid Build Coastguard Worker       puts("FAIL (returned 0)");
995*5e7646d2SAndroid Build Coastguard Worker       status ++;
996*5e7646d2SAndroid Build Coastguard Worker     }
997*5e7646d2SAndroid Build Coastguard Worker 
998*5e7646d2SAndroid Build Coastguard Worker     ppdMarkOption(ppd, "InputSlot", "Tray");
999*5e7646d2SAndroid Build Coastguard Worker 
1000*5e7646d2SAndroid Build Coastguard Worker     fputs("ppdPageSizeLimits(Quality=Photo): ", stdout);
1001*5e7646d2SAndroid Build Coastguard Worker     if (ppdPageSizeLimits(ppd, &minsize, &maxsize))
1002*5e7646d2SAndroid Build Coastguard Worker     {
1003*5e7646d2SAndroid Build Coastguard Worker       if (fabs(minsize.width - 300.0) > 0.001 || fabs(minsize.length - 300.0) > 0.001 ||
1004*5e7646d2SAndroid Build Coastguard Worker           fabs(maxsize.width - 1080.0) > 0.001 || fabs(maxsize.length - 86400.0) > 0.001)
1005*5e7646d2SAndroid Build Coastguard Worker       {
1006*5e7646d2SAndroid Build Coastguard Worker         printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, "
1007*5e7646d2SAndroid Build Coastguard Worker 	       "expected min=300x300, max=1080x86400)\n", minsize.width,
1008*5e7646d2SAndroid Build Coastguard Worker 	       minsize.length, maxsize.width, maxsize.length);
1009*5e7646d2SAndroid Build Coastguard Worker         status ++;
1010*5e7646d2SAndroid Build Coastguard Worker       }
1011*5e7646d2SAndroid Build Coastguard Worker       else
1012*5e7646d2SAndroid Build Coastguard Worker         puts("PASS");
1013*5e7646d2SAndroid Build Coastguard Worker     }
1014*5e7646d2SAndroid Build Coastguard Worker     else
1015*5e7646d2SAndroid Build Coastguard Worker     {
1016*5e7646d2SAndroid Build Coastguard Worker       puts("FAIL (returned 0)");
1017*5e7646d2SAndroid Build Coastguard Worker       status ++;
1018*5e7646d2SAndroid Build Coastguard Worker     }
1019*5e7646d2SAndroid Build Coastguard Worker 
1020*5e7646d2SAndroid Build Coastguard Worker     status += do_ps_tests();
1021*5e7646d2SAndroid Build Coastguard Worker   }
1022*5e7646d2SAndroid Build Coastguard Worker   else if (!strcmp(argv[1], "--raster"))
1023*5e7646d2SAndroid Build Coastguard Worker   {
1024*5e7646d2SAndroid Build Coastguard Worker     for (status = 0, num_options = 0, options = NULL, i = 1; i < argc; i ++)
1025*5e7646d2SAndroid Build Coastguard Worker     {
1026*5e7646d2SAndroid Build Coastguard Worker       if (argv[i][0] == '-')
1027*5e7646d2SAndroid Build Coastguard Worker       {
1028*5e7646d2SAndroid Build Coastguard Worker         if (argv[i][1] == 'o')
1029*5e7646d2SAndroid Build Coastguard Worker         {
1030*5e7646d2SAndroid Build Coastguard Worker           if (argv[i][2])
1031*5e7646d2SAndroid Build Coastguard Worker             num_options = cupsParseOptions(argv[i] + 2, num_options, &options);
1032*5e7646d2SAndroid Build Coastguard Worker           else
1033*5e7646d2SAndroid Build Coastguard Worker           {
1034*5e7646d2SAndroid Build Coastguard Worker             i ++;
1035*5e7646d2SAndroid Build Coastguard Worker             if (i < argc)
1036*5e7646d2SAndroid Build Coastguard Worker               num_options = cupsParseOptions(argv[i], num_options, &options);
1037*5e7646d2SAndroid Build Coastguard Worker             else
1038*5e7646d2SAndroid Build Coastguard Worker             {
1039*5e7646d2SAndroid Build Coastguard Worker               puts("Usage: testppd --raster [-o name=value ...] [filename.ppd ...]");
1040*5e7646d2SAndroid Build Coastguard Worker               return (1);
1041*5e7646d2SAndroid Build Coastguard Worker             }
1042*5e7646d2SAndroid Build Coastguard Worker           }
1043*5e7646d2SAndroid Build Coastguard Worker         }
1044*5e7646d2SAndroid Build Coastguard Worker         else
1045*5e7646d2SAndroid Build Coastguard Worker         {
1046*5e7646d2SAndroid Build Coastguard Worker 	  puts("Usage: testppd --raster [-o name=value ...] [filename.ppd ...]");
1047*5e7646d2SAndroid Build Coastguard Worker 	  return (1);
1048*5e7646d2SAndroid Build Coastguard Worker         }
1049*5e7646d2SAndroid Build Coastguard Worker       }
1050*5e7646d2SAndroid Build Coastguard Worker       else
1051*5e7646d2SAndroid Build Coastguard Worker 	status += do_ppd_tests(argv[i], num_options, options);
1052*5e7646d2SAndroid Build Coastguard Worker     }
1053*5e7646d2SAndroid Build Coastguard Worker 
1054*5e7646d2SAndroid Build Coastguard Worker     cupsFreeOptions(num_options, options);
1055*5e7646d2SAndroid Build Coastguard Worker   }
1056*5e7646d2SAndroid Build Coastguard Worker   else if (!strncmp(argv[1], "ipp://", 6) || !strncmp(argv[1], "ipps://", 7))
1057*5e7646d2SAndroid Build Coastguard Worker   {
1058*5e7646d2SAndroid Build Coastguard Worker    /*
1059*5e7646d2SAndroid Build Coastguard Worker     * ipp://... or ipps://...
1060*5e7646d2SAndroid Build Coastguard Worker     */
1061*5e7646d2SAndroid Build Coastguard Worker 
1062*5e7646d2SAndroid Build Coastguard Worker     http_t	*http;			/* Connection to printer */
1063*5e7646d2SAndroid Build Coastguard Worker     ipp_t	*request,		/* Get-Printer-Attributes request */
1064*5e7646d2SAndroid Build Coastguard Worker 		*response;		/* Get-Printer-Attributes response */
1065*5e7646d2SAndroid Build Coastguard Worker     char	scheme[32],		/* URI scheme */
1066*5e7646d2SAndroid Build Coastguard Worker 		userpass[256],		/* Username:password */
1067*5e7646d2SAndroid Build Coastguard Worker 		host[256],		/* Hostname */
1068*5e7646d2SAndroid Build Coastguard Worker 		resource[256];		/* Resource path */
1069*5e7646d2SAndroid Build Coastguard Worker     int		port;			/* Port number */
1070*5e7646d2SAndroid Build Coastguard Worker     static const char * const pattrs[] =/* Requested printer attributes */
1071*5e7646d2SAndroid Build Coastguard Worker     {
1072*5e7646d2SAndroid Build Coastguard Worker       "job-template",
1073*5e7646d2SAndroid Build Coastguard Worker       "printer-defaults",
1074*5e7646d2SAndroid Build Coastguard Worker       "printer-description",
1075*5e7646d2SAndroid Build Coastguard Worker       "media-col-database"
1076*5e7646d2SAndroid Build Coastguard Worker     };
1077*5e7646d2SAndroid Build Coastguard Worker 
1078*5e7646d2SAndroid Build Coastguard Worker     if (httpSeparateURI(HTTP_URI_CODING_ALL, argv[1], scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK)
1079*5e7646d2SAndroid Build Coastguard Worker     {
1080*5e7646d2SAndroid Build Coastguard Worker       printf("Bad URI \"%s\".\n", argv[1]);
1081*5e7646d2SAndroid Build Coastguard Worker       return (1);
1082*5e7646d2SAndroid Build Coastguard Worker     }
1083*5e7646d2SAndroid Build Coastguard Worker 
1084*5e7646d2SAndroid Build Coastguard Worker     http = httpConnect2(host, port, NULL, AF_UNSPEC, !strcmp(scheme, "ipps") ? HTTP_ENCRYPTION_ALWAYS : HTTP_ENCRYPTION_IF_REQUESTED, 1, 30000, NULL);
1085*5e7646d2SAndroid Build Coastguard Worker     if (!http)
1086*5e7646d2SAndroid Build Coastguard Worker     {
1087*5e7646d2SAndroid Build Coastguard Worker       printf("Unable to connect to \"%s:%d\": %s\n", host, port, cupsLastErrorString());
1088*5e7646d2SAndroid Build Coastguard Worker       return (1);
1089*5e7646d2SAndroid Build Coastguard Worker     }
1090*5e7646d2SAndroid Build Coastguard Worker 
1091*5e7646d2SAndroid Build Coastguard Worker     request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
1092*5e7646d2SAndroid Build Coastguard Worker     ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, argv[1]);
1093*5e7646d2SAndroid Build Coastguard Worker     ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]), NULL, pattrs);
1094*5e7646d2SAndroid Build Coastguard Worker     response = cupsDoRequest(http, request, resource);
1095*5e7646d2SAndroid Build Coastguard Worker 
1096*5e7646d2SAndroid Build Coastguard Worker     if (_ppdCreateFromIPP(buffer, sizeof(buffer), response))
1097*5e7646d2SAndroid Build Coastguard Worker       printf("Created PPD: %s\n", buffer);
1098*5e7646d2SAndroid Build Coastguard Worker     else
1099*5e7646d2SAndroid Build Coastguard Worker       puts("Unable to create PPD.");
1100*5e7646d2SAndroid Build Coastguard Worker 
1101*5e7646d2SAndroid Build Coastguard Worker     ippDelete(response);
1102*5e7646d2SAndroid Build Coastguard Worker     httpClose(http);
1103*5e7646d2SAndroid Build Coastguard Worker     return (0);
1104*5e7646d2SAndroid Build Coastguard Worker   }
1105*5e7646d2SAndroid Build Coastguard Worker   else
1106*5e7646d2SAndroid Build Coastguard Worker   {
1107*5e7646d2SAndroid Build Coastguard Worker     const char	*filename;		/* PPD filename */
1108*5e7646d2SAndroid Build Coastguard Worker     struct stat	fileinfo;		/* File information */
1109*5e7646d2SAndroid Build Coastguard Worker 
1110*5e7646d2SAndroid Build Coastguard Worker 
1111*5e7646d2SAndroid Build Coastguard Worker     if (strchr(argv[1], ':'))
1112*5e7646d2SAndroid Build Coastguard Worker     {
1113*5e7646d2SAndroid Build Coastguard Worker      /*
1114*5e7646d2SAndroid Build Coastguard Worker       * Server PPD...
1115*5e7646d2SAndroid Build Coastguard Worker       */
1116*5e7646d2SAndroid Build Coastguard Worker 
1117*5e7646d2SAndroid Build Coastguard Worker       if ((filename = cupsGetServerPPD(CUPS_HTTP_DEFAULT, argv[1])) == NULL)
1118*5e7646d2SAndroid Build Coastguard Worker       {
1119*5e7646d2SAndroid Build Coastguard Worker         printf("%s: %s\n", argv[1], cupsLastErrorString());
1120*5e7646d2SAndroid Build Coastguard Worker         return (1);
1121*5e7646d2SAndroid Build Coastguard Worker       }
1122*5e7646d2SAndroid Build Coastguard Worker     }
1123*5e7646d2SAndroid Build Coastguard Worker     else if (!strncmp(argv[1], "-d", 2))
1124*5e7646d2SAndroid Build Coastguard Worker     {
1125*5e7646d2SAndroid Build Coastguard Worker       const char *printer;		/* Printer name */
1126*5e7646d2SAndroid Build Coastguard Worker 
1127*5e7646d2SAndroid Build Coastguard Worker       if (argv[1][2])
1128*5e7646d2SAndroid Build Coastguard Worker 	printer = argv[1] + 2;
1129*5e7646d2SAndroid Build Coastguard Worker       else if (argv[2])
1130*5e7646d2SAndroid Build Coastguard Worker 	printer = argv[2];
1131*5e7646d2SAndroid Build Coastguard Worker       else
1132*5e7646d2SAndroid Build Coastguard Worker       {
1133*5e7646d2SAndroid Build Coastguard Worker         puts("Usage: ./testppd -d printer");
1134*5e7646d2SAndroid Build Coastguard Worker 	return (1);
1135*5e7646d2SAndroid Build Coastguard Worker       }
1136*5e7646d2SAndroid Build Coastguard Worker 
1137*5e7646d2SAndroid Build Coastguard Worker       filename = cupsGetPPD(printer);
1138*5e7646d2SAndroid Build Coastguard Worker 
1139*5e7646d2SAndroid Build Coastguard Worker       if (!filename)
1140*5e7646d2SAndroid Build Coastguard Worker       {
1141*5e7646d2SAndroid Build Coastguard Worker         printf("%s: %s\n", printer, cupsLastErrorString());
1142*5e7646d2SAndroid Build Coastguard Worker         return (1);
1143*5e7646d2SAndroid Build Coastguard Worker       }
1144*5e7646d2SAndroid Build Coastguard Worker     }
1145*5e7646d2SAndroid Build Coastguard Worker     else
1146*5e7646d2SAndroid Build Coastguard Worker       filename = argv[1];
1147*5e7646d2SAndroid Build Coastguard Worker 
1148*5e7646d2SAndroid Build Coastguard Worker     if (lstat(filename, &fileinfo))
1149*5e7646d2SAndroid Build Coastguard Worker     {
1150*5e7646d2SAndroid Build Coastguard Worker       printf("%s: %s\n", filename, strerror(errno));
1151*5e7646d2SAndroid Build Coastguard Worker       return (1);
1152*5e7646d2SAndroid Build Coastguard Worker     }
1153*5e7646d2SAndroid Build Coastguard Worker 
1154*5e7646d2SAndroid Build Coastguard Worker     if (S_ISLNK(fileinfo.st_mode))
1155*5e7646d2SAndroid Build Coastguard Worker     {
1156*5e7646d2SAndroid Build Coastguard Worker       char	realfile[1024];		/* Real file path */
1157*5e7646d2SAndroid Build Coastguard Worker       ssize_t	realsize;		/* Size of real file path */
1158*5e7646d2SAndroid Build Coastguard Worker 
1159*5e7646d2SAndroid Build Coastguard Worker 
1160*5e7646d2SAndroid Build Coastguard Worker       if ((realsize = readlink(filename, realfile, sizeof(realfile) - 1)) < 0)
1161*5e7646d2SAndroid Build Coastguard Worker         strlcpy(realfile, "Unknown", sizeof(realfile));
1162*5e7646d2SAndroid Build Coastguard Worker       else
1163*5e7646d2SAndroid Build Coastguard Worker         realfile[realsize] = '\0';
1164*5e7646d2SAndroid Build Coastguard Worker 
1165*5e7646d2SAndroid Build Coastguard Worker       if (stat(realfile, &fileinfo))
1166*5e7646d2SAndroid Build Coastguard Worker 	printf("%s: symlink to \"%s\", %s\n", filename, realfile,
1167*5e7646d2SAndroid Build Coastguard Worker 	       strerror(errno));
1168*5e7646d2SAndroid Build Coastguard Worker       else
1169*5e7646d2SAndroid Build Coastguard Worker 	printf("%s: symlink to \"%s\", %ld bytes\n", filename, realfile,
1170*5e7646d2SAndroid Build Coastguard Worker 	       (long)fileinfo.st_size);
1171*5e7646d2SAndroid Build Coastguard Worker     }
1172*5e7646d2SAndroid Build Coastguard Worker     else
1173*5e7646d2SAndroid Build Coastguard Worker       printf("%s: regular file, %ld bytes\n", filename, (long)fileinfo.st_size);
1174*5e7646d2SAndroid Build Coastguard Worker 
1175*5e7646d2SAndroid Build Coastguard Worker     if ((ppd = ppdOpenFile(filename)) == NULL)
1176*5e7646d2SAndroid Build Coastguard Worker     {
1177*5e7646d2SAndroid Build Coastguard Worker       ppd_status_t	err;		/* Last error in file */
1178*5e7646d2SAndroid Build Coastguard Worker       int		line;		/* Line number in file */
1179*5e7646d2SAndroid Build Coastguard Worker 
1180*5e7646d2SAndroid Build Coastguard Worker 
1181*5e7646d2SAndroid Build Coastguard Worker       status ++;
1182*5e7646d2SAndroid Build Coastguard Worker       err = ppdLastError(&line);
1183*5e7646d2SAndroid Build Coastguard Worker 
1184*5e7646d2SAndroid Build Coastguard Worker       printf("%s: %s on line %d\n", argv[1], ppdErrorString(err), line);
1185*5e7646d2SAndroid Build Coastguard Worker     }
1186*5e7646d2SAndroid Build Coastguard Worker     else
1187*5e7646d2SAndroid Build Coastguard Worker     {
1188*5e7646d2SAndroid Build Coastguard Worker       int		j, k;		/* Looping vars */
1189*5e7646d2SAndroid Build Coastguard Worker       ppd_group_t	*group;		/* Option group */
1190*5e7646d2SAndroid Build Coastguard Worker       ppd_option_t	*option;	/* Option */
1191*5e7646d2SAndroid Build Coastguard Worker       ppd_coption_t	*coption;	/* Custom option */
1192*5e7646d2SAndroid Build Coastguard Worker       ppd_cparam_t	*cparam;	/* Custom parameter */
1193*5e7646d2SAndroid Build Coastguard Worker       ppd_const_t	*c;		/* UIConstraints */
1194*5e7646d2SAndroid Build Coastguard Worker       char		lang[255],	/* LANG environment variable */
1195*5e7646d2SAndroid Build Coastguard Worker 			lc_all[255],	/* LC_ALL environment variable */
1196*5e7646d2SAndroid Build Coastguard Worker 			lc_ctype[255],	/* LC_CTYPE environment variable */
1197*5e7646d2SAndroid Build Coastguard Worker 			lc_messages[255];/* LC_MESSAGES environment variable */
1198*5e7646d2SAndroid Build Coastguard Worker 
1199*5e7646d2SAndroid Build Coastguard Worker 
1200*5e7646d2SAndroid Build Coastguard Worker       if (argc > 2)
1201*5e7646d2SAndroid Build Coastguard Worker       {
1202*5e7646d2SAndroid Build Coastguard Worker         snprintf(lang, sizeof(lang), "LANG=%s", argv[2]);
1203*5e7646d2SAndroid Build Coastguard Worker 	putenv(lang);
1204*5e7646d2SAndroid Build Coastguard Worker         snprintf(lc_all, sizeof(lc_all), "LC_ALL=%s", argv[2]);
1205*5e7646d2SAndroid Build Coastguard Worker 	putenv(lc_all);
1206*5e7646d2SAndroid Build Coastguard Worker         snprintf(lc_ctype, sizeof(lc_ctype), "LC_CTYPE=%s", argv[2]);
1207*5e7646d2SAndroid Build Coastguard Worker 	putenv(lc_ctype);
1208*5e7646d2SAndroid Build Coastguard Worker         snprintf(lc_messages, sizeof(lc_messages), "LC_MESSAGES=%s", argv[2]);
1209*5e7646d2SAndroid Build Coastguard Worker 	putenv(lc_messages);
1210*5e7646d2SAndroid Build Coastguard Worker       }
1211*5e7646d2SAndroid Build Coastguard Worker 
1212*5e7646d2SAndroid Build Coastguard Worker       ppdLocalize(ppd);
1213*5e7646d2SAndroid Build Coastguard Worker       ppdMarkDefaults(ppd);
1214*5e7646d2SAndroid Build Coastguard Worker 
1215*5e7646d2SAndroid Build Coastguard Worker       if (argc > 3)
1216*5e7646d2SAndroid Build Coastguard Worker       {
1217*5e7646d2SAndroid Build Coastguard Worker         text = ppdLocalizeIPPReason(ppd, argv[3], NULL, buffer, sizeof(buffer));
1218*5e7646d2SAndroid Build Coastguard Worker 	printf("ppdLocalizeIPPReason(%s)=%s\n", argv[3],
1219*5e7646d2SAndroid Build Coastguard Worker 	       text ? text : "(null)");
1220*5e7646d2SAndroid Build Coastguard Worker 	return (text == NULL);
1221*5e7646d2SAndroid Build Coastguard Worker       }
1222*5e7646d2SAndroid Build Coastguard Worker 
1223*5e7646d2SAndroid Build Coastguard Worker       for (i = ppd->num_groups, group = ppd->groups;
1224*5e7646d2SAndroid Build Coastguard Worker 	   i > 0;
1225*5e7646d2SAndroid Build Coastguard Worker 	   i --, group ++)
1226*5e7646d2SAndroid Build Coastguard Worker       {
1227*5e7646d2SAndroid Build Coastguard Worker 	printf("%s (%s):\n", group->name, group->text);
1228*5e7646d2SAndroid Build Coastguard Worker 
1229*5e7646d2SAndroid Build Coastguard Worker 	for (j = group->num_options, option = group->options;
1230*5e7646d2SAndroid Build Coastguard Worker 	     j > 0;
1231*5e7646d2SAndroid Build Coastguard Worker 	     j --, option ++)
1232*5e7646d2SAndroid Build Coastguard Worker 	{
1233*5e7646d2SAndroid Build Coastguard Worker 	  printf("    %s (%s):\n", option->keyword, option->text);
1234*5e7646d2SAndroid Build Coastguard Worker 
1235*5e7646d2SAndroid Build Coastguard Worker 	  for (k = 0; k < option->num_choices; k ++)
1236*5e7646d2SAndroid Build Coastguard Worker 	    printf("        - %s%s (%s)\n",
1237*5e7646d2SAndroid Build Coastguard Worker 	           option->choices[k].marked ? "*" : "",
1238*5e7646d2SAndroid Build Coastguard Worker 		   option->choices[k].choice, option->choices[k].text);
1239*5e7646d2SAndroid Build Coastguard Worker 
1240*5e7646d2SAndroid Build Coastguard Worker           if ((coption = ppdFindCustomOption(ppd, option->keyword)) != NULL)
1241*5e7646d2SAndroid Build Coastguard Worker 	  {
1242*5e7646d2SAndroid Build Coastguard Worker 	    for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params);
1243*5e7646d2SAndroid Build Coastguard Worker 	         cparam;
1244*5e7646d2SAndroid Build Coastguard Worker 		 cparam = (ppd_cparam_t *)cupsArrayNext(coption->params))
1245*5e7646d2SAndroid Build Coastguard Worker             {
1246*5e7646d2SAndroid Build Coastguard Worker 	      switch (cparam->type)
1247*5e7646d2SAndroid Build Coastguard Worker 	      {
1248*5e7646d2SAndroid Build Coastguard Worker 	        case PPD_CUSTOM_UNKNOWN :
1249*5e7646d2SAndroid Build Coastguard Worker 		    printf("              %s(%s): PPD_CUSTOM_UNKNOWN (error)\n", cparam->name, cparam->text);
1250*5e7646d2SAndroid Build Coastguard Worker 	            break;
1251*5e7646d2SAndroid Build Coastguard Worker 
1252*5e7646d2SAndroid Build Coastguard Worker 	        case PPD_CUSTOM_CURVE :
1253*5e7646d2SAndroid Build Coastguard Worker 		    printf("              %s(%s): PPD_CUSTOM_CURVE (%g to %g)\n",
1254*5e7646d2SAndroid Build Coastguard Worker 		           cparam->name, cparam->text,
1255*5e7646d2SAndroid Build Coastguard Worker 			   cparam->minimum.custom_curve,
1256*5e7646d2SAndroid Build Coastguard Worker 			   cparam->maximum.custom_curve);
1257*5e7646d2SAndroid Build Coastguard Worker 		    break;
1258*5e7646d2SAndroid Build Coastguard Worker 
1259*5e7646d2SAndroid Build Coastguard Worker 	        case PPD_CUSTOM_INT :
1260*5e7646d2SAndroid Build Coastguard Worker 		    printf("              %s(%s): PPD_CUSTOM_INT (%d to %d)\n",
1261*5e7646d2SAndroid Build Coastguard Worker 		           cparam->name, cparam->text,
1262*5e7646d2SAndroid Build Coastguard Worker 			   cparam->minimum.custom_int,
1263*5e7646d2SAndroid Build Coastguard Worker 			   cparam->maximum.custom_int);
1264*5e7646d2SAndroid Build Coastguard Worker 		    break;
1265*5e7646d2SAndroid Build Coastguard Worker 
1266*5e7646d2SAndroid Build Coastguard Worker 	        case PPD_CUSTOM_INVCURVE :
1267*5e7646d2SAndroid Build Coastguard Worker 		    printf("              %s(%s): PPD_CUSTOM_INVCURVE (%g to %g)\n",
1268*5e7646d2SAndroid Build Coastguard Worker 		           cparam->name, cparam->text,
1269*5e7646d2SAndroid Build Coastguard Worker 			   cparam->minimum.custom_invcurve,
1270*5e7646d2SAndroid Build Coastguard Worker 			   cparam->maximum.custom_invcurve);
1271*5e7646d2SAndroid Build Coastguard Worker 		    break;
1272*5e7646d2SAndroid Build Coastguard Worker 
1273*5e7646d2SAndroid Build Coastguard Worker 	        case PPD_CUSTOM_PASSCODE :
1274*5e7646d2SAndroid Build Coastguard Worker 		    printf("              %s(%s): PPD_CUSTOM_PASSCODE (%d to %d)\n",
1275*5e7646d2SAndroid Build Coastguard Worker 		           cparam->name, cparam->text,
1276*5e7646d2SAndroid Build Coastguard Worker 			   cparam->minimum.custom_passcode,
1277*5e7646d2SAndroid Build Coastguard Worker 			   cparam->maximum.custom_passcode);
1278*5e7646d2SAndroid Build Coastguard Worker 		    break;
1279*5e7646d2SAndroid Build Coastguard Worker 
1280*5e7646d2SAndroid Build Coastguard Worker 	        case PPD_CUSTOM_PASSWORD :
1281*5e7646d2SAndroid Build Coastguard Worker 		    printf("              %s(%s): PPD_CUSTOM_PASSWORD (%d to %d)\n",
1282*5e7646d2SAndroid Build Coastguard Worker 		           cparam->name, cparam->text,
1283*5e7646d2SAndroid Build Coastguard Worker 			   cparam->minimum.custom_password,
1284*5e7646d2SAndroid Build Coastguard Worker 			   cparam->maximum.custom_password);
1285*5e7646d2SAndroid Build Coastguard Worker 		    break;
1286*5e7646d2SAndroid Build Coastguard Worker 
1287*5e7646d2SAndroid Build Coastguard Worker 	        case PPD_CUSTOM_POINTS :
1288*5e7646d2SAndroid Build Coastguard Worker 		    printf("              %s(%s): PPD_CUSTOM_POINTS (%g to %g)\n",
1289*5e7646d2SAndroid Build Coastguard Worker 		           cparam->name, cparam->text,
1290*5e7646d2SAndroid Build Coastguard Worker 			   cparam->minimum.custom_points,
1291*5e7646d2SAndroid Build Coastguard Worker 			   cparam->maximum.custom_points);
1292*5e7646d2SAndroid Build Coastguard Worker 		    break;
1293*5e7646d2SAndroid Build Coastguard Worker 
1294*5e7646d2SAndroid Build Coastguard Worker 	        case PPD_CUSTOM_REAL :
1295*5e7646d2SAndroid Build Coastguard Worker 		    printf("              %s(%s): PPD_CUSTOM_REAL (%g to %g)\n",
1296*5e7646d2SAndroid Build Coastguard Worker 		           cparam->name, cparam->text,
1297*5e7646d2SAndroid Build Coastguard Worker 			   cparam->minimum.custom_real,
1298*5e7646d2SAndroid Build Coastguard Worker 			   cparam->maximum.custom_real);
1299*5e7646d2SAndroid Build Coastguard Worker 		    break;
1300*5e7646d2SAndroid Build Coastguard Worker 
1301*5e7646d2SAndroid Build Coastguard Worker 	        case PPD_CUSTOM_STRING :
1302*5e7646d2SAndroid Build Coastguard Worker 		    printf("              %s(%s): PPD_CUSTOM_STRING (%d to %d)\n",
1303*5e7646d2SAndroid Build Coastguard Worker 		           cparam->name, cparam->text,
1304*5e7646d2SAndroid Build Coastguard Worker 			   cparam->minimum.custom_string,
1305*5e7646d2SAndroid Build Coastguard Worker 			   cparam->maximum.custom_string);
1306*5e7646d2SAndroid Build Coastguard Worker 		    break;
1307*5e7646d2SAndroid Build Coastguard Worker 	      }
1308*5e7646d2SAndroid Build Coastguard Worker 	    }
1309*5e7646d2SAndroid Build Coastguard Worker 	  }
1310*5e7646d2SAndroid Build Coastguard Worker 	}
1311*5e7646d2SAndroid Build Coastguard Worker       }
1312*5e7646d2SAndroid Build Coastguard Worker 
1313*5e7646d2SAndroid Build Coastguard Worker       puts("\nSizes:");
1314*5e7646d2SAndroid Build Coastguard Worker       for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++)
1315*5e7646d2SAndroid Build Coastguard Worker         printf("    %s = %gx%g, [%g %g %g %g]\n", size->name, size->width,
1316*5e7646d2SAndroid Build Coastguard Worker 	       size->length, size->left, size->bottom, size->right, size->top);
1317*5e7646d2SAndroid Build Coastguard Worker 
1318*5e7646d2SAndroid Build Coastguard Worker       puts("\nConstraints:");
1319*5e7646d2SAndroid Build Coastguard Worker 
1320*5e7646d2SAndroid Build Coastguard Worker       for (i = ppd->num_consts, c = ppd->consts; i > 0; i --, c ++)
1321*5e7646d2SAndroid Build Coastguard Worker         printf("    *UIConstraints: *%s %s *%s %s\n", c->option1, c->choice1,
1322*5e7646d2SAndroid Build Coastguard Worker 	       c->option2, c->choice2);
1323*5e7646d2SAndroid Build Coastguard Worker       if (ppd->num_consts == 0)
1324*5e7646d2SAndroid Build Coastguard Worker         puts("    NO CONSTRAINTS");
1325*5e7646d2SAndroid Build Coastguard Worker 
1326*5e7646d2SAndroid Build Coastguard Worker       puts("\nFilters:");
1327*5e7646d2SAndroid Build Coastguard Worker 
1328*5e7646d2SAndroid Build Coastguard Worker       for (i = 0; i < ppd->num_filters; i ++)
1329*5e7646d2SAndroid Build Coastguard Worker         printf("    %s\n", ppd->filters[i]);
1330*5e7646d2SAndroid Build Coastguard Worker 
1331*5e7646d2SAndroid Build Coastguard Worker       if (ppd->num_filters == 0)
1332*5e7646d2SAndroid Build Coastguard Worker         puts("    NO FILTERS");
1333*5e7646d2SAndroid Build Coastguard Worker 
1334*5e7646d2SAndroid Build Coastguard Worker       puts("\nAttributes:");
1335*5e7646d2SAndroid Build Coastguard Worker 
1336*5e7646d2SAndroid Build Coastguard Worker       for (attr = (ppd_attr_t *)cupsArrayFirst(ppd->sorted_attrs);
1337*5e7646d2SAndroid Build Coastguard Worker            attr;
1338*5e7646d2SAndroid Build Coastguard Worker 	   attr = (ppd_attr_t *)cupsArrayNext(ppd->sorted_attrs))
1339*5e7646d2SAndroid Build Coastguard Worker         printf("    *%s %s/%s: \"%s\"\n", attr->name, attr->spec,
1340*5e7646d2SAndroid Build Coastguard Worker 	       attr->text, attr->value ? attr->value : "");
1341*5e7646d2SAndroid Build Coastguard Worker 
1342*5e7646d2SAndroid Build Coastguard Worker       puts("\nPPD Cache:");
1343*5e7646d2SAndroid Build Coastguard Worker       if ((pc = _ppdCacheCreateWithPPD(ppd)) == NULL)
1344*5e7646d2SAndroid Build Coastguard Worker         printf("    Unable to create: %s\n", cupsLastErrorString());
1345*5e7646d2SAndroid Build Coastguard Worker       else
1346*5e7646d2SAndroid Build Coastguard Worker       {
1347*5e7646d2SAndroid Build Coastguard Worker         _ppdCacheWriteFile(pc, "t.cache", NULL);
1348*5e7646d2SAndroid Build Coastguard Worker         puts("    Wrote t.cache.");
1349*5e7646d2SAndroid Build Coastguard Worker       }
1350*5e7646d2SAndroid Build Coastguard Worker     }
1351*5e7646d2SAndroid Build Coastguard Worker 
1352*5e7646d2SAndroid Build Coastguard Worker     if (!strncmp(argv[1], "-d", 2))
1353*5e7646d2SAndroid Build Coastguard Worker       unlink(filename);
1354*5e7646d2SAndroid Build Coastguard Worker   }
1355*5e7646d2SAndroid Build Coastguard Worker 
1356*5e7646d2SAndroid Build Coastguard Worker #ifdef __APPLE__
1357*5e7646d2SAndroid Build Coastguard Worker   if (getenv("MallocStackLogging") && getenv("MallocStackLoggingNoCompact"))
1358*5e7646d2SAndroid Build Coastguard Worker   {
1359*5e7646d2SAndroid Build Coastguard Worker     char	command[1024];		/* malloc_history command */
1360*5e7646d2SAndroid Build Coastguard Worker 
1361*5e7646d2SAndroid Build Coastguard Worker     snprintf(command, sizeof(command), "malloc_history %d -all_by_size",
1362*5e7646d2SAndroid Build Coastguard Worker 	     getpid());
1363*5e7646d2SAndroid Build Coastguard Worker     fflush(stdout);
1364*5e7646d2SAndroid Build Coastguard Worker     system(command);
1365*5e7646d2SAndroid Build Coastguard Worker   }
1366*5e7646d2SAndroid Build Coastguard Worker #endif /* __APPLE__ */
1367*5e7646d2SAndroid Build Coastguard Worker 
1368*5e7646d2SAndroid Build Coastguard Worker   ppdClose(ppd);
1369*5e7646d2SAndroid Build Coastguard Worker 
1370*5e7646d2SAndroid Build Coastguard Worker   return (status);
1371*5e7646d2SAndroid Build Coastguard Worker }
1372*5e7646d2SAndroid Build Coastguard Worker 
1373*5e7646d2SAndroid Build Coastguard Worker 
1374*5e7646d2SAndroid Build Coastguard Worker /*
1375*5e7646d2SAndroid Build Coastguard Worker  * 'do_ppd_tests()' - Test the default option commands in a PPD file.
1376*5e7646d2SAndroid Build Coastguard Worker  */
1377*5e7646d2SAndroid Build Coastguard Worker 
1378*5e7646d2SAndroid Build Coastguard Worker static int				/* O - Number of errors */
do_ppd_tests(const char * filename,int num_options,cups_option_t * options)1379*5e7646d2SAndroid Build Coastguard Worker do_ppd_tests(const char    *filename,	/* I - PPD file */
1380*5e7646d2SAndroid Build Coastguard Worker              int           num_options,	/* I - Number of options */
1381*5e7646d2SAndroid Build Coastguard Worker              cups_option_t *options)	/* I - Options */
1382*5e7646d2SAndroid Build Coastguard Worker {
1383*5e7646d2SAndroid Build Coastguard Worker   ppd_file_t		*ppd;		/* PPD file data */
1384*5e7646d2SAndroid Build Coastguard Worker   cups_page_header2_t	header;		/* Page header */
1385*5e7646d2SAndroid Build Coastguard Worker 
1386*5e7646d2SAndroid Build Coastguard Worker 
1387*5e7646d2SAndroid Build Coastguard Worker   printf("\"%s\": ", filename);
1388*5e7646d2SAndroid Build Coastguard Worker   fflush(stdout);
1389*5e7646d2SAndroid Build Coastguard Worker 
1390*5e7646d2SAndroid Build Coastguard Worker   if ((ppd = ppdOpenFile(filename)) == NULL)
1391*5e7646d2SAndroid Build Coastguard Worker   {
1392*5e7646d2SAndroid Build Coastguard Worker     ppd_status_t	status;		/* Status from PPD loader */
1393*5e7646d2SAndroid Build Coastguard Worker     int			line;		/* Line number containing error */
1394*5e7646d2SAndroid Build Coastguard Worker 
1395*5e7646d2SAndroid Build Coastguard Worker 
1396*5e7646d2SAndroid Build Coastguard Worker     status = ppdLastError(&line);
1397*5e7646d2SAndroid Build Coastguard Worker 
1398*5e7646d2SAndroid Build Coastguard Worker     puts("FAIL (bad PPD file)");
1399*5e7646d2SAndroid Build Coastguard Worker     printf("    %s on line %d\n", ppdErrorString(status), line);
1400*5e7646d2SAndroid Build Coastguard Worker 
1401*5e7646d2SAndroid Build Coastguard Worker     return (1);
1402*5e7646d2SAndroid Build Coastguard Worker   }
1403*5e7646d2SAndroid Build Coastguard Worker 
1404*5e7646d2SAndroid Build Coastguard Worker   ppdMarkDefaults(ppd);
1405*5e7646d2SAndroid Build Coastguard Worker   cupsMarkOptions(ppd, num_options, options);
1406*5e7646d2SAndroid Build Coastguard Worker 
1407*5e7646d2SAndroid Build Coastguard Worker   if (cupsRasterInterpretPPD(&header, ppd, 0, NULL, NULL))
1408*5e7646d2SAndroid Build Coastguard Worker   {
1409*5e7646d2SAndroid Build Coastguard Worker     puts("FAIL (error from function)");
1410*5e7646d2SAndroid Build Coastguard Worker     puts(cupsRasterErrorString());
1411*5e7646d2SAndroid Build Coastguard Worker 
1412*5e7646d2SAndroid Build Coastguard Worker     return (1);
1413*5e7646d2SAndroid Build Coastguard Worker   }
1414*5e7646d2SAndroid Build Coastguard Worker   else
1415*5e7646d2SAndroid Build Coastguard Worker   {
1416*5e7646d2SAndroid Build Coastguard Worker     puts("PASS");
1417*5e7646d2SAndroid Build Coastguard Worker 
1418*5e7646d2SAndroid Build Coastguard Worker     return (0);
1419*5e7646d2SAndroid Build Coastguard Worker   }
1420*5e7646d2SAndroid Build Coastguard Worker }
1421*5e7646d2SAndroid Build Coastguard Worker 
1422*5e7646d2SAndroid Build Coastguard Worker 
1423*5e7646d2SAndroid Build Coastguard Worker /*
1424*5e7646d2SAndroid Build Coastguard Worker  * 'do_ps_tests()' - Test standard PostScript commands.
1425*5e7646d2SAndroid Build Coastguard Worker  */
1426*5e7646d2SAndroid Build Coastguard Worker 
1427*5e7646d2SAndroid Build Coastguard Worker static int
do_ps_tests(void)1428*5e7646d2SAndroid Build Coastguard Worker do_ps_tests(void)
1429*5e7646d2SAndroid Build Coastguard Worker {
1430*5e7646d2SAndroid Build Coastguard Worker   cups_page_header2_t	header;		/* Page header */
1431*5e7646d2SAndroid Build Coastguard Worker   int			preferred_bits;	/* Preferred bits */
1432*5e7646d2SAndroid Build Coastguard Worker   int			errors = 0;	/* Number of errors */
1433*5e7646d2SAndroid Build Coastguard Worker 
1434*5e7646d2SAndroid Build Coastguard Worker 
1435*5e7646d2SAndroid Build Coastguard Worker  /*
1436*5e7646d2SAndroid Build Coastguard Worker   * Test PS exec code...
1437*5e7646d2SAndroid Build Coastguard Worker   */
1438*5e7646d2SAndroid Build Coastguard Worker 
1439*5e7646d2SAndroid Build Coastguard Worker   fputs("_cupsRasterExecPS(\"setpagedevice\"): ", stdout);
1440*5e7646d2SAndroid Build Coastguard Worker   fflush(stdout);
1441*5e7646d2SAndroid Build Coastguard Worker 
1442*5e7646d2SAndroid Build Coastguard Worker   memset(&header, 0, sizeof(header));
1443*5e7646d2SAndroid Build Coastguard Worker   header.Collate = CUPS_TRUE;
1444*5e7646d2SAndroid Build Coastguard Worker   preferred_bits = 0;
1445*5e7646d2SAndroid Build Coastguard Worker 
1446*5e7646d2SAndroid Build Coastguard Worker   if (_cupsRasterExecPS(&header, &preferred_bits, setpagedevice_code))
1447*5e7646d2SAndroid Build Coastguard Worker   {
1448*5e7646d2SAndroid Build Coastguard Worker     puts("FAIL (error from function)");
1449*5e7646d2SAndroid Build Coastguard Worker     puts(cupsRasterErrorString());
1450*5e7646d2SAndroid Build Coastguard Worker     errors ++;
1451*5e7646d2SAndroid Build Coastguard Worker   }
1452*5e7646d2SAndroid Build Coastguard Worker   else if (preferred_bits != 17 ||
1453*5e7646d2SAndroid Build Coastguard Worker            memcmp(&header, &setpagedevice_header, sizeof(header)))
1454*5e7646d2SAndroid Build Coastguard Worker   {
1455*5e7646d2SAndroid Build Coastguard Worker     puts("FAIL (bad header)");
1456*5e7646d2SAndroid Build Coastguard Worker 
1457*5e7646d2SAndroid Build Coastguard Worker     if (preferred_bits != 17)
1458*5e7646d2SAndroid Build Coastguard Worker       printf("    cupsPreferredBitsPerColor %d, expected 17\n",
1459*5e7646d2SAndroid Build Coastguard Worker              preferred_bits);
1460*5e7646d2SAndroid Build Coastguard Worker 
1461*5e7646d2SAndroid Build Coastguard Worker     print_changes(&setpagedevice_header, &header);
1462*5e7646d2SAndroid Build Coastguard Worker     errors ++;
1463*5e7646d2SAndroid Build Coastguard Worker   }
1464*5e7646d2SAndroid Build Coastguard Worker   else
1465*5e7646d2SAndroid Build Coastguard Worker     puts("PASS");
1466*5e7646d2SAndroid Build Coastguard Worker 
1467*5e7646d2SAndroid Build Coastguard Worker   fputs("_cupsRasterExecPS(\"roll\"): ", stdout);
1468*5e7646d2SAndroid Build Coastguard Worker   fflush(stdout);
1469*5e7646d2SAndroid Build Coastguard Worker 
1470*5e7646d2SAndroid Build Coastguard Worker   if (_cupsRasterExecPS(&header, &preferred_bits,
1471*5e7646d2SAndroid Build Coastguard Worker                         "792 612 0 0 0\n"
1472*5e7646d2SAndroid Build Coastguard Worker 			"pop pop pop\n"
1473*5e7646d2SAndroid Build Coastguard Worker 			"<</PageSize[5 -2 roll]/ImagingBBox null>>"
1474*5e7646d2SAndroid Build Coastguard Worker 			"setpagedevice\n"))
1475*5e7646d2SAndroid Build Coastguard Worker   {
1476*5e7646d2SAndroid Build Coastguard Worker     puts("FAIL (error from function)");
1477*5e7646d2SAndroid Build Coastguard Worker     puts(cupsRasterErrorString());
1478*5e7646d2SAndroid Build Coastguard Worker     errors ++;
1479*5e7646d2SAndroid Build Coastguard Worker   }
1480*5e7646d2SAndroid Build Coastguard Worker   else if (header.PageSize[0] != 792 || header.PageSize[1] != 612)
1481*5e7646d2SAndroid Build Coastguard Worker   {
1482*5e7646d2SAndroid Build Coastguard Worker     printf("FAIL (PageSize [%d %d], expected [792 612])\n", header.PageSize[0],
1483*5e7646d2SAndroid Build Coastguard Worker            header.PageSize[1]);
1484*5e7646d2SAndroid Build Coastguard Worker     errors ++;
1485*5e7646d2SAndroid Build Coastguard Worker   }
1486*5e7646d2SAndroid Build Coastguard Worker   else
1487*5e7646d2SAndroid Build Coastguard Worker     puts("PASS");
1488*5e7646d2SAndroid Build Coastguard Worker 
1489*5e7646d2SAndroid Build Coastguard Worker   fputs("_cupsRasterExecPS(\"dup index\"): ", stdout);
1490*5e7646d2SAndroid Build Coastguard Worker   fflush(stdout);
1491*5e7646d2SAndroid Build Coastguard Worker 
1492*5e7646d2SAndroid Build Coastguard Worker   if (_cupsRasterExecPS(&header, &preferred_bits,
1493*5e7646d2SAndroid Build Coastguard Worker                         "true false dup\n"
1494*5e7646d2SAndroid Build Coastguard Worker 			"<</Collate 4 index"
1495*5e7646d2SAndroid Build Coastguard Worker 			"/Duplex 5 index"
1496*5e7646d2SAndroid Build Coastguard Worker 			"/Tumble 6 index>>setpagedevice\n"
1497*5e7646d2SAndroid Build Coastguard Worker 			"pop pop pop"))
1498*5e7646d2SAndroid Build Coastguard Worker   {
1499*5e7646d2SAndroid Build Coastguard Worker     puts("FAIL (error from function)");
1500*5e7646d2SAndroid Build Coastguard Worker     puts(cupsRasterErrorString());
1501*5e7646d2SAndroid Build Coastguard Worker     errors ++;
1502*5e7646d2SAndroid Build Coastguard Worker   }
1503*5e7646d2SAndroid Build Coastguard Worker   else
1504*5e7646d2SAndroid Build Coastguard Worker   {
1505*5e7646d2SAndroid Build Coastguard Worker     if (!header.Collate)
1506*5e7646d2SAndroid Build Coastguard Worker     {
1507*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (Collate false, expected true)\n");
1508*5e7646d2SAndroid Build Coastguard Worker       errors ++;
1509*5e7646d2SAndroid Build Coastguard Worker     }
1510*5e7646d2SAndroid Build Coastguard Worker 
1511*5e7646d2SAndroid Build Coastguard Worker     if (header.Duplex)
1512*5e7646d2SAndroid Build Coastguard Worker     {
1513*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (Duplex true, expected false)\n");
1514*5e7646d2SAndroid Build Coastguard Worker       errors ++;
1515*5e7646d2SAndroid Build Coastguard Worker     }
1516*5e7646d2SAndroid Build Coastguard Worker 
1517*5e7646d2SAndroid Build Coastguard Worker     if (header.Tumble)
1518*5e7646d2SAndroid Build Coastguard Worker     {
1519*5e7646d2SAndroid Build Coastguard Worker       printf("FAIL (Tumble true, expected false)\n");
1520*5e7646d2SAndroid Build Coastguard Worker       errors ++;
1521*5e7646d2SAndroid Build Coastguard Worker     }
1522*5e7646d2SAndroid Build Coastguard Worker 
1523*5e7646d2SAndroid Build Coastguard Worker     if(header.Collate && !header.Duplex && !header.Tumble)
1524*5e7646d2SAndroid Build Coastguard Worker       puts("PASS");
1525*5e7646d2SAndroid Build Coastguard Worker   }
1526*5e7646d2SAndroid Build Coastguard Worker 
1527*5e7646d2SAndroid Build Coastguard Worker   fputs("_cupsRasterExecPS(\"%%Begin/EndFeature code\"): ", stdout);
1528*5e7646d2SAndroid Build Coastguard Worker   fflush(stdout);
1529*5e7646d2SAndroid Build Coastguard Worker 
1530*5e7646d2SAndroid Build Coastguard Worker   if (_cupsRasterExecPS(&header, &preferred_bits, dsc_code))
1531*5e7646d2SAndroid Build Coastguard Worker   {
1532*5e7646d2SAndroid Build Coastguard Worker     puts("FAIL (error from function)");
1533*5e7646d2SAndroid Build Coastguard Worker     puts(cupsRasterErrorString());
1534*5e7646d2SAndroid Build Coastguard Worker     errors ++;
1535*5e7646d2SAndroid Build Coastguard Worker   }
1536*5e7646d2SAndroid Build Coastguard Worker   else if (header.PageSize[0] != 792 || header.PageSize[1] != 1224)
1537*5e7646d2SAndroid Build Coastguard Worker   {
1538*5e7646d2SAndroid Build Coastguard Worker     printf("FAIL (bad PageSize [%d %d], expected [792 1224])\n",
1539*5e7646d2SAndroid Build Coastguard Worker            header.PageSize[0], header.PageSize[1]);
1540*5e7646d2SAndroid Build Coastguard Worker     errors ++;
1541*5e7646d2SAndroid Build Coastguard Worker   }
1542*5e7646d2SAndroid Build Coastguard Worker   else
1543*5e7646d2SAndroid Build Coastguard Worker     puts("PASS");
1544*5e7646d2SAndroid Build Coastguard Worker 
1545*5e7646d2SAndroid Build Coastguard Worker   return (errors);
1546*5e7646d2SAndroid Build Coastguard Worker }
1547*5e7646d2SAndroid Build Coastguard Worker 
1548*5e7646d2SAndroid Build Coastguard Worker 
1549*5e7646d2SAndroid Build Coastguard Worker 
1550*5e7646d2SAndroid Build Coastguard Worker 
1551*5e7646d2SAndroid Build Coastguard Worker /*
1552*5e7646d2SAndroid Build Coastguard Worker  * 'print_changes()' - Print differences in the page header.
1553*5e7646d2SAndroid Build Coastguard Worker  */
1554*5e7646d2SAndroid Build Coastguard Worker 
1555*5e7646d2SAndroid Build Coastguard Worker static void
print_changes(cups_page_header2_t * header,cups_page_header2_t * expected)1556*5e7646d2SAndroid Build Coastguard Worker print_changes(
1557*5e7646d2SAndroid Build Coastguard Worker     cups_page_header2_t *header,	/* I - Actual page header */
1558*5e7646d2SAndroid Build Coastguard Worker     cups_page_header2_t *expected)	/* I - Expected page header */
1559*5e7646d2SAndroid Build Coastguard Worker {
1560*5e7646d2SAndroid Build Coastguard Worker   int	i;				/* Looping var */
1561*5e7646d2SAndroid Build Coastguard Worker 
1562*5e7646d2SAndroid Build Coastguard Worker 
1563*5e7646d2SAndroid Build Coastguard Worker   if (strcmp(header->MediaClass, expected->MediaClass))
1564*5e7646d2SAndroid Build Coastguard Worker     printf("    MediaClass (%s), expected (%s)\n", header->MediaClass,
1565*5e7646d2SAndroid Build Coastguard Worker            expected->MediaClass);
1566*5e7646d2SAndroid Build Coastguard Worker 
1567*5e7646d2SAndroid Build Coastguard Worker   if (strcmp(header->MediaColor, expected->MediaColor))
1568*5e7646d2SAndroid Build Coastguard Worker     printf("    MediaColor (%s), expected (%s)\n", header->MediaColor,
1569*5e7646d2SAndroid Build Coastguard Worker            expected->MediaColor);
1570*5e7646d2SAndroid Build Coastguard Worker 
1571*5e7646d2SAndroid Build Coastguard Worker   if (strcmp(header->MediaType, expected->MediaType))
1572*5e7646d2SAndroid Build Coastguard Worker     printf("    MediaType (%s), expected (%s)\n", header->MediaType,
1573*5e7646d2SAndroid Build Coastguard Worker            expected->MediaType);
1574*5e7646d2SAndroid Build Coastguard Worker 
1575*5e7646d2SAndroid Build Coastguard Worker   if (strcmp(header->OutputType, expected->OutputType))
1576*5e7646d2SAndroid Build Coastguard Worker     printf("    OutputType (%s), expected (%s)\n", header->OutputType,
1577*5e7646d2SAndroid Build Coastguard Worker            expected->OutputType);
1578*5e7646d2SAndroid Build Coastguard Worker 
1579*5e7646d2SAndroid Build Coastguard Worker   if (header->AdvanceDistance != expected->AdvanceDistance)
1580*5e7646d2SAndroid Build Coastguard Worker     printf("    AdvanceDistance %d, expected %d\n", header->AdvanceDistance,
1581*5e7646d2SAndroid Build Coastguard Worker            expected->AdvanceDistance);
1582*5e7646d2SAndroid Build Coastguard Worker 
1583*5e7646d2SAndroid Build Coastguard Worker   if (header->AdvanceMedia != expected->AdvanceMedia)
1584*5e7646d2SAndroid Build Coastguard Worker     printf("    AdvanceMedia %d, expected %d\n", header->AdvanceMedia,
1585*5e7646d2SAndroid Build Coastguard Worker            expected->AdvanceMedia);
1586*5e7646d2SAndroid Build Coastguard Worker 
1587*5e7646d2SAndroid Build Coastguard Worker   if (header->Collate != expected->Collate)
1588*5e7646d2SAndroid Build Coastguard Worker     printf("    Collate %d, expected %d\n", header->Collate,
1589*5e7646d2SAndroid Build Coastguard Worker            expected->Collate);
1590*5e7646d2SAndroid Build Coastguard Worker 
1591*5e7646d2SAndroid Build Coastguard Worker   if (header->CutMedia != expected->CutMedia)
1592*5e7646d2SAndroid Build Coastguard Worker     printf("    CutMedia %d, expected %d\n", header->CutMedia,
1593*5e7646d2SAndroid Build Coastguard Worker            expected->CutMedia);
1594*5e7646d2SAndroid Build Coastguard Worker 
1595*5e7646d2SAndroid Build Coastguard Worker   if (header->Duplex != expected->Duplex)
1596*5e7646d2SAndroid Build Coastguard Worker     printf("    Duplex %d, expected %d\n", header->Duplex,
1597*5e7646d2SAndroid Build Coastguard Worker            expected->Duplex);
1598*5e7646d2SAndroid Build Coastguard Worker 
1599*5e7646d2SAndroid Build Coastguard Worker   if (header->HWResolution[0] != expected->HWResolution[0] ||
1600*5e7646d2SAndroid Build Coastguard Worker       header->HWResolution[1] != expected->HWResolution[1])
1601*5e7646d2SAndroid Build Coastguard Worker     printf("    HWResolution [%d %d], expected [%d %d]\n",
1602*5e7646d2SAndroid Build Coastguard Worker            header->HWResolution[0], header->HWResolution[1],
1603*5e7646d2SAndroid Build Coastguard Worker            expected->HWResolution[0], expected->HWResolution[1]);
1604*5e7646d2SAndroid Build Coastguard Worker 
1605*5e7646d2SAndroid Build Coastguard Worker   if (memcmp(header->ImagingBoundingBox, expected->ImagingBoundingBox,
1606*5e7646d2SAndroid Build Coastguard Worker              sizeof(header->ImagingBoundingBox)))
1607*5e7646d2SAndroid Build Coastguard Worker     printf("    ImagingBoundingBox [%d %d %d %d], expected [%d %d %d %d]\n",
1608*5e7646d2SAndroid Build Coastguard Worker            header->ImagingBoundingBox[0],
1609*5e7646d2SAndroid Build Coastguard Worker            header->ImagingBoundingBox[1],
1610*5e7646d2SAndroid Build Coastguard Worker            header->ImagingBoundingBox[2],
1611*5e7646d2SAndroid Build Coastguard Worker            header->ImagingBoundingBox[3],
1612*5e7646d2SAndroid Build Coastguard Worker            expected->ImagingBoundingBox[0],
1613*5e7646d2SAndroid Build Coastguard Worker            expected->ImagingBoundingBox[1],
1614*5e7646d2SAndroid Build Coastguard Worker            expected->ImagingBoundingBox[2],
1615*5e7646d2SAndroid Build Coastguard Worker            expected->ImagingBoundingBox[3]);
1616*5e7646d2SAndroid Build Coastguard Worker 
1617*5e7646d2SAndroid Build Coastguard Worker   if (header->InsertSheet != expected->InsertSheet)
1618*5e7646d2SAndroid Build Coastguard Worker     printf("    InsertSheet %d, expected %d\n", header->InsertSheet,
1619*5e7646d2SAndroid Build Coastguard Worker            expected->InsertSheet);
1620*5e7646d2SAndroid Build Coastguard Worker 
1621*5e7646d2SAndroid Build Coastguard Worker   if (header->Jog != expected->Jog)
1622*5e7646d2SAndroid Build Coastguard Worker     printf("    Jog %d, expected %d\n", header->Jog,
1623*5e7646d2SAndroid Build Coastguard Worker            expected->Jog);
1624*5e7646d2SAndroid Build Coastguard Worker 
1625*5e7646d2SAndroid Build Coastguard Worker   if (header->LeadingEdge != expected->LeadingEdge)
1626*5e7646d2SAndroid Build Coastguard Worker     printf("    LeadingEdge %d, expected %d\n", header->LeadingEdge,
1627*5e7646d2SAndroid Build Coastguard Worker            expected->LeadingEdge);
1628*5e7646d2SAndroid Build Coastguard Worker 
1629*5e7646d2SAndroid Build Coastguard Worker   if (header->Margins[0] != expected->Margins[0] ||
1630*5e7646d2SAndroid Build Coastguard Worker       header->Margins[1] != expected->Margins[1])
1631*5e7646d2SAndroid Build Coastguard Worker     printf("    Margins [%d %d], expected [%d %d]\n",
1632*5e7646d2SAndroid Build Coastguard Worker            header->Margins[0], header->Margins[1],
1633*5e7646d2SAndroid Build Coastguard Worker            expected->Margins[0], expected->Margins[1]);
1634*5e7646d2SAndroid Build Coastguard Worker 
1635*5e7646d2SAndroid Build Coastguard Worker   if (header->ManualFeed != expected->ManualFeed)
1636*5e7646d2SAndroid Build Coastguard Worker     printf("    ManualFeed %d, expected %d\n", header->ManualFeed,
1637*5e7646d2SAndroid Build Coastguard Worker            expected->ManualFeed);
1638*5e7646d2SAndroid Build Coastguard Worker 
1639*5e7646d2SAndroid Build Coastguard Worker   if (header->MediaPosition != expected->MediaPosition)
1640*5e7646d2SAndroid Build Coastguard Worker     printf("    MediaPosition %d, expected %d\n", header->MediaPosition,
1641*5e7646d2SAndroid Build Coastguard Worker            expected->MediaPosition);
1642*5e7646d2SAndroid Build Coastguard Worker 
1643*5e7646d2SAndroid Build Coastguard Worker   if (header->MediaWeight != expected->MediaWeight)
1644*5e7646d2SAndroid Build Coastguard Worker     printf("    MediaWeight %d, expected %d\n", header->MediaWeight,
1645*5e7646d2SAndroid Build Coastguard Worker            expected->MediaWeight);
1646*5e7646d2SAndroid Build Coastguard Worker 
1647*5e7646d2SAndroid Build Coastguard Worker   if (header->MirrorPrint != expected->MirrorPrint)
1648*5e7646d2SAndroid Build Coastguard Worker     printf("    MirrorPrint %d, expected %d\n", header->MirrorPrint,
1649*5e7646d2SAndroid Build Coastguard Worker            expected->MirrorPrint);
1650*5e7646d2SAndroid Build Coastguard Worker 
1651*5e7646d2SAndroid Build Coastguard Worker   if (header->NegativePrint != expected->NegativePrint)
1652*5e7646d2SAndroid Build Coastguard Worker     printf("    NegativePrint %d, expected %d\n", header->NegativePrint,
1653*5e7646d2SAndroid Build Coastguard Worker            expected->NegativePrint);
1654*5e7646d2SAndroid Build Coastguard Worker 
1655*5e7646d2SAndroid Build Coastguard Worker   if (header->NumCopies != expected->NumCopies)
1656*5e7646d2SAndroid Build Coastguard Worker     printf("    NumCopies %d, expected %d\n", header->NumCopies,
1657*5e7646d2SAndroid Build Coastguard Worker            expected->NumCopies);
1658*5e7646d2SAndroid Build Coastguard Worker 
1659*5e7646d2SAndroid Build Coastguard Worker   if (header->Orientation != expected->Orientation)
1660*5e7646d2SAndroid Build Coastguard Worker     printf("    Orientation %d, expected %d\n", header->Orientation,
1661*5e7646d2SAndroid Build Coastguard Worker            expected->Orientation);
1662*5e7646d2SAndroid Build Coastguard Worker 
1663*5e7646d2SAndroid Build Coastguard Worker   if (header->OutputFaceUp != expected->OutputFaceUp)
1664*5e7646d2SAndroid Build Coastguard Worker     printf("    OutputFaceUp %d, expected %d\n", header->OutputFaceUp,
1665*5e7646d2SAndroid Build Coastguard Worker            expected->OutputFaceUp);
1666*5e7646d2SAndroid Build Coastguard Worker 
1667*5e7646d2SAndroid Build Coastguard Worker   if (header->PageSize[0] != expected->PageSize[0] ||
1668*5e7646d2SAndroid Build Coastguard Worker       header->PageSize[1] != expected->PageSize[1])
1669*5e7646d2SAndroid Build Coastguard Worker     printf("    PageSize [%d %d], expected [%d %d]\n",
1670*5e7646d2SAndroid Build Coastguard Worker            header->PageSize[0], header->PageSize[1],
1671*5e7646d2SAndroid Build Coastguard Worker            expected->PageSize[0], expected->PageSize[1]);
1672*5e7646d2SAndroid Build Coastguard Worker 
1673*5e7646d2SAndroid Build Coastguard Worker   if (header->Separations != expected->Separations)
1674*5e7646d2SAndroid Build Coastguard Worker     printf("    Separations %d, expected %d\n", header->Separations,
1675*5e7646d2SAndroid Build Coastguard Worker            expected->Separations);
1676*5e7646d2SAndroid Build Coastguard Worker 
1677*5e7646d2SAndroid Build Coastguard Worker   if (header->TraySwitch != expected->TraySwitch)
1678*5e7646d2SAndroid Build Coastguard Worker     printf("    TraySwitch %d, expected %d\n", header->TraySwitch,
1679*5e7646d2SAndroid Build Coastguard Worker            expected->TraySwitch);
1680*5e7646d2SAndroid Build Coastguard Worker 
1681*5e7646d2SAndroid Build Coastguard Worker   if (header->Tumble != expected->Tumble)
1682*5e7646d2SAndroid Build Coastguard Worker     printf("    Tumble %d, expected %d\n", header->Tumble,
1683*5e7646d2SAndroid Build Coastguard Worker            expected->Tumble);
1684*5e7646d2SAndroid Build Coastguard Worker 
1685*5e7646d2SAndroid Build Coastguard Worker   if (header->cupsWidth != expected->cupsWidth)
1686*5e7646d2SAndroid Build Coastguard Worker     printf("    cupsWidth %d, expected %d\n", header->cupsWidth,
1687*5e7646d2SAndroid Build Coastguard Worker            expected->cupsWidth);
1688*5e7646d2SAndroid Build Coastguard Worker 
1689*5e7646d2SAndroid Build Coastguard Worker   if (header->cupsHeight != expected->cupsHeight)
1690*5e7646d2SAndroid Build Coastguard Worker     printf("    cupsHeight %d, expected %d\n", header->cupsHeight,
1691*5e7646d2SAndroid Build Coastguard Worker            expected->cupsHeight);
1692*5e7646d2SAndroid Build Coastguard Worker 
1693*5e7646d2SAndroid Build Coastguard Worker   if (header->cupsMediaType != expected->cupsMediaType)
1694*5e7646d2SAndroid Build Coastguard Worker     printf("    cupsMediaType %d, expected %d\n", header->cupsMediaType,
1695*5e7646d2SAndroid Build Coastguard Worker            expected->cupsMediaType);
1696*5e7646d2SAndroid Build Coastguard Worker 
1697*5e7646d2SAndroid Build Coastguard Worker   if (header->cupsBitsPerColor != expected->cupsBitsPerColor)
1698*5e7646d2SAndroid Build Coastguard Worker     printf("    cupsBitsPerColor %d, expected %d\n", header->cupsBitsPerColor,
1699*5e7646d2SAndroid Build Coastguard Worker            expected->cupsBitsPerColor);
1700*5e7646d2SAndroid Build Coastguard Worker 
1701*5e7646d2SAndroid Build Coastguard Worker   if (header->cupsBitsPerPixel != expected->cupsBitsPerPixel)
1702*5e7646d2SAndroid Build Coastguard Worker     printf("    cupsBitsPerPixel %d, expected %d\n", header->cupsBitsPerPixel,
1703*5e7646d2SAndroid Build Coastguard Worker            expected->cupsBitsPerPixel);
1704*5e7646d2SAndroid Build Coastguard Worker 
1705*5e7646d2SAndroid Build Coastguard Worker   if (header->cupsBytesPerLine != expected->cupsBytesPerLine)
1706*5e7646d2SAndroid Build Coastguard Worker     printf("    cupsBytesPerLine %d, expected %d\n", header->cupsBytesPerLine,
1707*5e7646d2SAndroid Build Coastguard Worker            expected->cupsBytesPerLine);
1708*5e7646d2SAndroid Build Coastguard Worker 
1709*5e7646d2SAndroid Build Coastguard Worker   if (header->cupsColorOrder != expected->cupsColorOrder)
1710*5e7646d2SAndroid Build Coastguard Worker     printf("    cupsColorOrder %d, expected %d\n", header->cupsColorOrder,
1711*5e7646d2SAndroid Build Coastguard Worker            expected->cupsColorOrder);
1712*5e7646d2SAndroid Build Coastguard Worker 
1713*5e7646d2SAndroid Build Coastguard Worker   if (header->cupsColorSpace != expected->cupsColorSpace)
1714*5e7646d2SAndroid Build Coastguard Worker     printf("    cupsColorSpace %s, expected %s\n", _cupsRasterColorSpaceString(header->cupsColorSpace),
1715*5e7646d2SAndroid Build Coastguard Worker            _cupsRasterColorSpaceString(expected->cupsColorSpace));
1716*5e7646d2SAndroid Build Coastguard Worker 
1717*5e7646d2SAndroid Build Coastguard Worker   if (header->cupsCompression != expected->cupsCompression)
1718*5e7646d2SAndroid Build Coastguard Worker     printf("    cupsCompression %d, expected %d\n", header->cupsCompression,
1719*5e7646d2SAndroid Build Coastguard Worker            expected->cupsCompression);
1720*5e7646d2SAndroid Build Coastguard Worker 
1721*5e7646d2SAndroid Build Coastguard Worker   if (header->cupsRowCount != expected->cupsRowCount)
1722*5e7646d2SAndroid Build Coastguard Worker     printf("    cupsRowCount %d, expected %d\n", header->cupsRowCount,
1723*5e7646d2SAndroid Build Coastguard Worker            expected->cupsRowCount);
1724*5e7646d2SAndroid Build Coastguard Worker 
1725*5e7646d2SAndroid Build Coastguard Worker   if (header->cupsRowFeed != expected->cupsRowFeed)
1726*5e7646d2SAndroid Build Coastguard Worker     printf("    cupsRowFeed %d, expected %d\n", header->cupsRowFeed,
1727*5e7646d2SAndroid Build Coastguard Worker            expected->cupsRowFeed);
1728*5e7646d2SAndroid Build Coastguard Worker 
1729*5e7646d2SAndroid Build Coastguard Worker   if (header->cupsRowStep != expected->cupsRowStep)
1730*5e7646d2SAndroid Build Coastguard Worker     printf("    cupsRowStep %d, expected %d\n", header->cupsRowStep,
1731*5e7646d2SAndroid Build Coastguard Worker            expected->cupsRowStep);
1732*5e7646d2SAndroid Build Coastguard Worker 
1733*5e7646d2SAndroid Build Coastguard Worker   if (header->cupsNumColors != expected->cupsNumColors)
1734*5e7646d2SAndroid Build Coastguard Worker     printf("    cupsNumColors %d, expected %d\n", header->cupsNumColors,
1735*5e7646d2SAndroid Build Coastguard Worker            expected->cupsNumColors);
1736*5e7646d2SAndroid Build Coastguard Worker 
1737*5e7646d2SAndroid Build Coastguard Worker   if (fabs(header->cupsBorderlessScalingFactor - expected->cupsBorderlessScalingFactor) > 0.001)
1738*5e7646d2SAndroid Build Coastguard Worker     printf("    cupsBorderlessScalingFactor %g, expected %g\n",
1739*5e7646d2SAndroid Build Coastguard Worker            header->cupsBorderlessScalingFactor,
1740*5e7646d2SAndroid Build Coastguard Worker            expected->cupsBorderlessScalingFactor);
1741*5e7646d2SAndroid Build Coastguard Worker 
1742*5e7646d2SAndroid Build Coastguard Worker   if (fabs(header->cupsPageSize[0] - expected->cupsPageSize[0]) > 0.001 ||
1743*5e7646d2SAndroid Build Coastguard Worker       fabs(header->cupsPageSize[1] - expected->cupsPageSize[1]) > 0.001)
1744*5e7646d2SAndroid Build Coastguard Worker     printf("    cupsPageSize [%g %g], expected [%g %g]\n",
1745*5e7646d2SAndroid Build Coastguard Worker            header->cupsPageSize[0], header->cupsPageSize[1],
1746*5e7646d2SAndroid Build Coastguard Worker            expected->cupsPageSize[0], expected->cupsPageSize[1]);
1747*5e7646d2SAndroid Build Coastguard Worker 
1748*5e7646d2SAndroid Build Coastguard Worker   if (fabs(header->cupsImagingBBox[0] - expected->cupsImagingBBox[0]) > 0.001 ||
1749*5e7646d2SAndroid Build Coastguard Worker       fabs(header->cupsImagingBBox[1] - expected->cupsImagingBBox[1]) > 0.001 ||
1750*5e7646d2SAndroid Build Coastguard Worker       fabs(header->cupsImagingBBox[2] - expected->cupsImagingBBox[2]) > 0.001 ||
1751*5e7646d2SAndroid Build Coastguard Worker       fabs(header->cupsImagingBBox[3] - expected->cupsImagingBBox[3]) > 0.001)
1752*5e7646d2SAndroid Build Coastguard Worker     printf("    cupsImagingBBox [%g %g %g %g], expected [%g %g %g %g]\n",
1753*5e7646d2SAndroid Build Coastguard Worker            header->cupsImagingBBox[0], header->cupsImagingBBox[1],
1754*5e7646d2SAndroid Build Coastguard Worker            header->cupsImagingBBox[2], header->cupsImagingBBox[3],
1755*5e7646d2SAndroid Build Coastguard Worker            expected->cupsImagingBBox[0], expected->cupsImagingBBox[1],
1756*5e7646d2SAndroid Build Coastguard Worker            expected->cupsImagingBBox[2], expected->cupsImagingBBox[3]);
1757*5e7646d2SAndroid Build Coastguard Worker 
1758*5e7646d2SAndroid Build Coastguard Worker   for (i = 0; i < 16; i ++)
1759*5e7646d2SAndroid Build Coastguard Worker     if (header->cupsInteger[i] != expected->cupsInteger[i])
1760*5e7646d2SAndroid Build Coastguard Worker       printf("    cupsInteger%d %d, expected %d\n", i, header->cupsInteger[i],
1761*5e7646d2SAndroid Build Coastguard Worker              expected->cupsInteger[i]);
1762*5e7646d2SAndroid Build Coastguard Worker 
1763*5e7646d2SAndroid Build Coastguard Worker   for (i = 0; i < 16; i ++)
1764*5e7646d2SAndroid Build Coastguard Worker     if (fabs(header->cupsReal[i] - expected->cupsReal[i]) > 0.001)
1765*5e7646d2SAndroid Build Coastguard Worker       printf("    cupsReal%d %g, expected %g\n", i, header->cupsReal[i],
1766*5e7646d2SAndroid Build Coastguard Worker              expected->cupsReal[i]);
1767*5e7646d2SAndroid Build Coastguard Worker 
1768*5e7646d2SAndroid Build Coastguard Worker   for (i = 0; i < 16; i ++)
1769*5e7646d2SAndroid Build Coastguard Worker     if (strcmp(header->cupsString[i], expected->cupsString[i]))
1770*5e7646d2SAndroid Build Coastguard Worker       printf("    cupsString%d (%s), expected (%s)\n", i,
1771*5e7646d2SAndroid Build Coastguard Worker 	     header->cupsString[i], expected->cupsString[i]);
1772*5e7646d2SAndroid Build Coastguard Worker 
1773*5e7646d2SAndroid Build Coastguard Worker   if (strcmp(header->cupsMarkerType, expected->cupsMarkerType))
1774*5e7646d2SAndroid Build Coastguard Worker     printf("    cupsMarkerType (%s), expected (%s)\n", header->cupsMarkerType,
1775*5e7646d2SAndroid Build Coastguard Worker            expected->cupsMarkerType);
1776*5e7646d2SAndroid Build Coastguard Worker 
1777*5e7646d2SAndroid Build Coastguard Worker   if (strcmp(header->cupsRenderingIntent, expected->cupsRenderingIntent))
1778*5e7646d2SAndroid Build Coastguard Worker     printf("    cupsRenderingIntent (%s), expected (%s)\n",
1779*5e7646d2SAndroid Build Coastguard Worker            header->cupsRenderingIntent,
1780*5e7646d2SAndroid Build Coastguard Worker            expected->cupsRenderingIntent);
1781*5e7646d2SAndroid Build Coastguard Worker 
1782*5e7646d2SAndroid Build Coastguard Worker   if (strcmp(header->cupsPageSizeName, expected->cupsPageSizeName))
1783*5e7646d2SAndroid Build Coastguard Worker     printf("    cupsPageSizeName (%s), expected (%s)\n",
1784*5e7646d2SAndroid Build Coastguard Worker            header->cupsPageSizeName,
1785*5e7646d2SAndroid Build Coastguard Worker            expected->cupsPageSizeName);
1786*5e7646d2SAndroid Build Coastguard Worker }
1787