xref: /aosp_15_r20/external/libcups/cups/raster-interpret.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker  * PPD command interpreter for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker  *
4*5e7646d2SAndroid Build Coastguard Worker  * Copyright © 2007-2018 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker  * Copyright © 1993-2007 by Easy Software Products.
6*5e7646d2SAndroid Build Coastguard Worker  *
7*5e7646d2SAndroid Build Coastguard Worker  * Licensed under Apache License v2.0.  See the file "LICENSE" for more
8*5e7646d2SAndroid Build Coastguard Worker  * information.
9*5e7646d2SAndroid Build Coastguard Worker  */
10*5e7646d2SAndroid Build Coastguard Worker 
11*5e7646d2SAndroid Build Coastguard Worker /*
12*5e7646d2SAndroid Build Coastguard Worker  * Include necessary headers...
13*5e7646d2SAndroid Build Coastguard Worker  */
14*5e7646d2SAndroid Build Coastguard Worker 
15*5e7646d2SAndroid Build Coastguard Worker #include <cups/raster-private.h>
16*5e7646d2SAndroid Build Coastguard Worker #include <cups/ppd-private.h>
17*5e7646d2SAndroid Build Coastguard Worker #include "debug-internal.h"
18*5e7646d2SAndroid Build Coastguard Worker 
19*5e7646d2SAndroid Build Coastguard Worker 
20*5e7646d2SAndroid Build Coastguard Worker /*
21*5e7646d2SAndroid Build Coastguard Worker  * Stack values for the PostScript mini-interpreter...
22*5e7646d2SAndroid Build Coastguard Worker  */
23*5e7646d2SAndroid Build Coastguard Worker 
24*5e7646d2SAndroid Build Coastguard Worker typedef enum
25*5e7646d2SAndroid Build Coastguard Worker {
26*5e7646d2SAndroid Build Coastguard Worker   CUPS_PS_NAME,
27*5e7646d2SAndroid Build Coastguard Worker   CUPS_PS_NUMBER,
28*5e7646d2SAndroid Build Coastguard Worker   CUPS_PS_STRING,
29*5e7646d2SAndroid Build Coastguard Worker   CUPS_PS_BOOLEAN,
30*5e7646d2SAndroid Build Coastguard Worker   CUPS_PS_NULL,
31*5e7646d2SAndroid Build Coastguard Worker   CUPS_PS_START_ARRAY,
32*5e7646d2SAndroid Build Coastguard Worker   CUPS_PS_END_ARRAY,
33*5e7646d2SAndroid Build Coastguard Worker   CUPS_PS_START_DICT,
34*5e7646d2SAndroid Build Coastguard Worker   CUPS_PS_END_DICT,
35*5e7646d2SAndroid Build Coastguard Worker   CUPS_PS_START_PROC,
36*5e7646d2SAndroid Build Coastguard Worker   CUPS_PS_END_PROC,
37*5e7646d2SAndroid Build Coastguard Worker   CUPS_PS_CLEARTOMARK,
38*5e7646d2SAndroid Build Coastguard Worker   CUPS_PS_COPY,
39*5e7646d2SAndroid Build Coastguard Worker   CUPS_PS_DUP,
40*5e7646d2SAndroid Build Coastguard Worker   CUPS_PS_INDEX,
41*5e7646d2SAndroid Build Coastguard Worker   CUPS_PS_POP,
42*5e7646d2SAndroid Build Coastguard Worker   CUPS_PS_ROLL,
43*5e7646d2SAndroid Build Coastguard Worker   CUPS_PS_SETPAGEDEVICE,
44*5e7646d2SAndroid Build Coastguard Worker   CUPS_PS_STOPPED,
45*5e7646d2SAndroid Build Coastguard Worker   CUPS_PS_OTHER
46*5e7646d2SAndroid Build Coastguard Worker } _cups_ps_type_t;
47*5e7646d2SAndroid Build Coastguard Worker 
48*5e7646d2SAndroid Build Coastguard Worker typedef struct
49*5e7646d2SAndroid Build Coastguard Worker {
50*5e7646d2SAndroid Build Coastguard Worker   _cups_ps_type_t	type;		/* Object type */
51*5e7646d2SAndroid Build Coastguard Worker   union
52*5e7646d2SAndroid Build Coastguard Worker   {
53*5e7646d2SAndroid Build Coastguard Worker     int		boolean;		/* Boolean value */
54*5e7646d2SAndroid Build Coastguard Worker     char	name[64];		/* Name value */
55*5e7646d2SAndroid Build Coastguard Worker     double	number;			/* Number value */
56*5e7646d2SAndroid Build Coastguard Worker     char	other[64];		/* Other operator */
57*5e7646d2SAndroid Build Coastguard Worker     char	string[64];		/* Sring value */
58*5e7646d2SAndroid Build Coastguard Worker   }			value;		/* Value */
59*5e7646d2SAndroid Build Coastguard Worker } _cups_ps_obj_t;
60*5e7646d2SAndroid Build Coastguard Worker 
61*5e7646d2SAndroid Build Coastguard Worker typedef struct
62*5e7646d2SAndroid Build Coastguard Worker {
63*5e7646d2SAndroid Build Coastguard Worker   int			num_objs,	/* Number of objects on stack */
64*5e7646d2SAndroid Build Coastguard Worker 			alloc_objs;	/* Number of allocated objects */
65*5e7646d2SAndroid Build Coastguard Worker   _cups_ps_obj_t	*objs;		/* Objects in stack */
66*5e7646d2SAndroid Build Coastguard Worker } _cups_ps_stack_t;
67*5e7646d2SAndroid Build Coastguard Worker 
68*5e7646d2SAndroid Build Coastguard Worker 
69*5e7646d2SAndroid Build Coastguard Worker /*
70*5e7646d2SAndroid Build Coastguard Worker  * Local functions...
71*5e7646d2SAndroid Build Coastguard Worker  */
72*5e7646d2SAndroid Build Coastguard Worker 
73*5e7646d2SAndroid Build Coastguard Worker static int		cleartomark_stack(_cups_ps_stack_t *st);
74*5e7646d2SAndroid Build Coastguard Worker static int		copy_stack(_cups_ps_stack_t *st, int count);
75*5e7646d2SAndroid Build Coastguard Worker static void		delete_stack(_cups_ps_stack_t *st);
76*5e7646d2SAndroid Build Coastguard Worker static void		error_object(_cups_ps_obj_t *obj);
77*5e7646d2SAndroid Build Coastguard Worker static void		error_stack(_cups_ps_stack_t *st, const char *title);
78*5e7646d2SAndroid Build Coastguard Worker static _cups_ps_obj_t	*index_stack(_cups_ps_stack_t *st, int n);
79*5e7646d2SAndroid Build Coastguard Worker static _cups_ps_stack_t	*new_stack(void);
80*5e7646d2SAndroid Build Coastguard Worker static _cups_ps_obj_t	*pop_stack(_cups_ps_stack_t *st);
81*5e7646d2SAndroid Build Coastguard Worker static _cups_ps_obj_t	*push_stack(_cups_ps_stack_t *st,
82*5e7646d2SAndroid Build Coastguard Worker 			            _cups_ps_obj_t *obj);
83*5e7646d2SAndroid Build Coastguard Worker static int		roll_stack(_cups_ps_stack_t *st, int c, int s);
84*5e7646d2SAndroid Build Coastguard Worker static _cups_ps_obj_t	*scan_ps(_cups_ps_stack_t *st, char **ptr);
85*5e7646d2SAndroid Build Coastguard Worker static int		setpagedevice(_cups_ps_stack_t *st,
86*5e7646d2SAndroid Build Coastguard Worker 			                cups_page_header2_t *h,
87*5e7646d2SAndroid Build Coastguard Worker 			                int *preferred_bits);
88*5e7646d2SAndroid Build Coastguard Worker #ifdef DEBUG
89*5e7646d2SAndroid Build Coastguard Worker static void		DEBUG_object(const char *prefix, _cups_ps_obj_t *obj);
90*5e7646d2SAndroid Build Coastguard Worker static void		DEBUG_stack(const char *prefix, _cups_ps_stack_t *st);
91*5e7646d2SAndroid Build Coastguard Worker #endif /* DEBUG */
92*5e7646d2SAndroid Build Coastguard Worker 
93*5e7646d2SAndroid Build Coastguard Worker 
94*5e7646d2SAndroid Build Coastguard Worker /*
95*5e7646d2SAndroid Build Coastguard Worker  * '_cupsRasterInterpretPPD()' - Interpret PPD commands to create a page header.
96*5e7646d2SAndroid Build Coastguard Worker  *
97*5e7646d2SAndroid Build Coastguard Worker  * This function is used by raster image processing (RIP) filters like
98*5e7646d2SAndroid Build Coastguard Worker  * cgpdftoraster and imagetoraster when writing CUPS raster data for a page.
99*5e7646d2SAndroid Build Coastguard Worker  * It is not used by raster printer driver filters which only read CUPS
100*5e7646d2SAndroid Build Coastguard Worker  * raster data.
101*5e7646d2SAndroid Build Coastguard Worker  *
102*5e7646d2SAndroid Build Coastguard Worker  *
103*5e7646d2SAndroid Build Coastguard Worker  * @code cupsRasterInterpretPPD@ does not mark the options in the PPD using
104*5e7646d2SAndroid Build Coastguard Worker  * the "num_options" and "options" arguments.  Instead, mark the options with
105*5e7646d2SAndroid Build Coastguard Worker  * @code cupsMarkOptions@ and @code ppdMarkOption@ prior to calling it -
106*5e7646d2SAndroid Build Coastguard Worker  * this allows for per-page options without manipulating the options array.
107*5e7646d2SAndroid Build Coastguard Worker  *
108*5e7646d2SAndroid Build Coastguard Worker  * The "func" argument specifies an optional callback function that is
109*5e7646d2SAndroid Build Coastguard Worker  * called prior to the computation of the final raster data.  The function
110*5e7646d2SAndroid Build Coastguard Worker  * can make changes to the @link cups_page_header2_t@ data as needed to use a
111*5e7646d2SAndroid Build Coastguard Worker  * supported raster format and then returns 0 on success and -1 if the
112*5e7646d2SAndroid Build Coastguard Worker  * requested attributes cannot be supported.
113*5e7646d2SAndroid Build Coastguard Worker  *
114*5e7646d2SAndroid Build Coastguard Worker  *
115*5e7646d2SAndroid Build Coastguard Worker  * @code cupsRasterInterpretPPD@ supports a subset of the PostScript language.
116*5e7646d2SAndroid Build Coastguard Worker  * Currently only the @code [@, @code ]@, @code <<@, @code >>@, @code {@,
117*5e7646d2SAndroid Build Coastguard Worker  * @code }@, @code cleartomark@, @code copy@, @code dup@, @code index@,
118*5e7646d2SAndroid Build Coastguard Worker  * @code pop@, @code roll@, @code setpagedevice@, and @code stopped@ operators
119*5e7646d2SAndroid Build Coastguard Worker  * are supported.
120*5e7646d2SAndroid Build Coastguard Worker  *
121*5e7646d2SAndroid Build Coastguard Worker  * @since CUPS 1.2/macOS 10.5@
122*5e7646d2SAndroid Build Coastguard Worker  */
123*5e7646d2SAndroid Build Coastguard Worker 
124*5e7646d2SAndroid Build Coastguard Worker int					/* O - 0 on success, -1 on failure */
_cupsRasterInterpretPPD(cups_page_header2_t * h,ppd_file_t * ppd,int num_options,cups_option_t * options,cups_interpret_cb_t func)125*5e7646d2SAndroid Build Coastguard Worker _cupsRasterInterpretPPD(
126*5e7646d2SAndroid Build Coastguard Worker     cups_page_header2_t *h,		/* O - Page header to create */
127*5e7646d2SAndroid Build Coastguard Worker     ppd_file_t          *ppd,		/* I - PPD file */
128*5e7646d2SAndroid Build Coastguard Worker     int                 num_options,	/* I - Number of options */
129*5e7646d2SAndroid Build Coastguard Worker     cups_option_t       *options,	/* I - Options */
130*5e7646d2SAndroid Build Coastguard Worker     cups_interpret_cb_t func)		/* I - Optional page header callback (@code NULL@ for none) */
131*5e7646d2SAndroid Build Coastguard Worker {
132*5e7646d2SAndroid Build Coastguard Worker   int		status;			/* Cummulative status */
133*5e7646d2SAndroid Build Coastguard Worker   char		*code;			/* Code to run */
134*5e7646d2SAndroid Build Coastguard Worker   const char	*val;			/* Option value */
135*5e7646d2SAndroid Build Coastguard Worker   ppd_size_t	*size;			/* Current size */
136*5e7646d2SAndroid Build Coastguard Worker   float		left,			/* Left position */
137*5e7646d2SAndroid Build Coastguard Worker 		bottom,			/* Bottom position */
138*5e7646d2SAndroid Build Coastguard Worker 		right,			/* Right position */
139*5e7646d2SAndroid Build Coastguard Worker 		top,			/* Top position */
140*5e7646d2SAndroid Build Coastguard Worker 		temp1, temp2;		/* Temporary variables for swapping */
141*5e7646d2SAndroid Build Coastguard Worker   int		preferred_bits;		/* Preferred bits per color */
142*5e7646d2SAndroid Build Coastguard Worker 
143*5e7646d2SAndroid Build Coastguard Worker 
144*5e7646d2SAndroid Build Coastguard Worker  /*
145*5e7646d2SAndroid Build Coastguard Worker   * Range check input...
146*5e7646d2SAndroid Build Coastguard Worker   */
147*5e7646d2SAndroid Build Coastguard Worker 
148*5e7646d2SAndroid Build Coastguard Worker   _cupsRasterClearError();
149*5e7646d2SAndroid Build Coastguard Worker 
150*5e7646d2SAndroid Build Coastguard Worker   if (!h)
151*5e7646d2SAndroid Build Coastguard Worker   {
152*5e7646d2SAndroid Build Coastguard Worker     _cupsRasterAddError("Page header cannot be NULL!\n");
153*5e7646d2SAndroid Build Coastguard Worker     return (-1);
154*5e7646d2SAndroid Build Coastguard Worker   }
155*5e7646d2SAndroid Build Coastguard Worker 
156*5e7646d2SAndroid Build Coastguard Worker  /*
157*5e7646d2SAndroid Build Coastguard Worker   * Reset the page header to the defaults...
158*5e7646d2SAndroid Build Coastguard Worker   */
159*5e7646d2SAndroid Build Coastguard Worker 
160*5e7646d2SAndroid Build Coastguard Worker   memset(h, 0, sizeof(cups_page_header2_t));
161*5e7646d2SAndroid Build Coastguard Worker 
162*5e7646d2SAndroid Build Coastguard Worker   h->NumCopies                   = 1;
163*5e7646d2SAndroid Build Coastguard Worker   h->PageSize[0]                 = 612;
164*5e7646d2SAndroid Build Coastguard Worker   h->PageSize[1]                 = 792;
165*5e7646d2SAndroid Build Coastguard Worker   h->HWResolution[0]             = 100;
166*5e7646d2SAndroid Build Coastguard Worker   h->HWResolution[1]             = 100;
167*5e7646d2SAndroid Build Coastguard Worker   h->cupsBitsPerColor            = 1;
168*5e7646d2SAndroid Build Coastguard Worker   h->cupsColorOrder              = CUPS_ORDER_CHUNKED;
169*5e7646d2SAndroid Build Coastguard Worker   h->cupsColorSpace              = CUPS_CSPACE_K;
170*5e7646d2SAndroid Build Coastguard Worker   h->cupsBorderlessScalingFactor = 1.0f;
171*5e7646d2SAndroid Build Coastguard Worker   h->cupsPageSize[0]             = 612.0f;
172*5e7646d2SAndroid Build Coastguard Worker   h->cupsPageSize[1]             = 792.0f;
173*5e7646d2SAndroid Build Coastguard Worker   h->cupsImagingBBox[0]          = 0.0f;
174*5e7646d2SAndroid Build Coastguard Worker   h->cupsImagingBBox[1]          = 0.0f;
175*5e7646d2SAndroid Build Coastguard Worker   h->cupsImagingBBox[2]          = 612.0f;
176*5e7646d2SAndroid Build Coastguard Worker   h->cupsImagingBBox[3]          = 792.0f;
177*5e7646d2SAndroid Build Coastguard Worker 
178*5e7646d2SAndroid Build Coastguard Worker   strlcpy(h->cupsPageSizeName, "Letter", sizeof(h->cupsPageSizeName));
179*5e7646d2SAndroid Build Coastguard Worker 
180*5e7646d2SAndroid Build Coastguard Worker #ifdef __APPLE__
181*5e7646d2SAndroid Build Coastguard Worker  /*
182*5e7646d2SAndroid Build Coastguard Worker   * cupsInteger0 is also used for the total page count on macOS; set an
183*5e7646d2SAndroid Build Coastguard Worker   * uncommon default value so we can tell if the driver is using cupsInteger0.
184*5e7646d2SAndroid Build Coastguard Worker   */
185*5e7646d2SAndroid Build Coastguard Worker 
186*5e7646d2SAndroid Build Coastguard Worker   h->cupsInteger[0] = 0x80000000;
187*5e7646d2SAndroid Build Coastguard Worker #endif /* __APPLE__ */
188*5e7646d2SAndroid Build Coastguard Worker 
189*5e7646d2SAndroid Build Coastguard Worker  /*
190*5e7646d2SAndroid Build Coastguard Worker   * Apply patches and options to the page header...
191*5e7646d2SAndroid Build Coastguard Worker   */
192*5e7646d2SAndroid Build Coastguard Worker 
193*5e7646d2SAndroid Build Coastguard Worker   status         = 0;
194*5e7646d2SAndroid Build Coastguard Worker   preferred_bits = 0;
195*5e7646d2SAndroid Build Coastguard Worker 
196*5e7646d2SAndroid Build Coastguard Worker   if (ppd)
197*5e7646d2SAndroid Build Coastguard Worker   {
198*5e7646d2SAndroid Build Coastguard Worker    /*
199*5e7646d2SAndroid Build Coastguard Worker     * Apply any patch code (used to override the defaults...)
200*5e7646d2SAndroid Build Coastguard Worker     */
201*5e7646d2SAndroid Build Coastguard Worker 
202*5e7646d2SAndroid Build Coastguard Worker     if (ppd->patches)
203*5e7646d2SAndroid Build Coastguard Worker       status |= _cupsRasterExecPS(h, &preferred_bits, ppd->patches);
204*5e7646d2SAndroid Build Coastguard Worker 
205*5e7646d2SAndroid Build Coastguard Worker    /*
206*5e7646d2SAndroid Build Coastguard Worker     * Then apply printer options in the proper order...
207*5e7646d2SAndroid Build Coastguard Worker     */
208*5e7646d2SAndroid Build Coastguard Worker 
209*5e7646d2SAndroid Build Coastguard Worker     if ((code = ppdEmitString(ppd, PPD_ORDER_DOCUMENT, 0.0)) != NULL)
210*5e7646d2SAndroid Build Coastguard Worker     {
211*5e7646d2SAndroid Build Coastguard Worker       status |= _cupsRasterExecPS(h, &preferred_bits, code);
212*5e7646d2SAndroid Build Coastguard Worker       free(code);
213*5e7646d2SAndroid Build Coastguard Worker     }
214*5e7646d2SAndroid Build Coastguard Worker 
215*5e7646d2SAndroid Build Coastguard Worker     if ((code = ppdEmitString(ppd, PPD_ORDER_ANY, 0.0)) != NULL)
216*5e7646d2SAndroid Build Coastguard Worker     {
217*5e7646d2SAndroid Build Coastguard Worker       status |= _cupsRasterExecPS(h, &preferred_bits, code);
218*5e7646d2SAndroid Build Coastguard Worker       free(code);
219*5e7646d2SAndroid Build Coastguard Worker     }
220*5e7646d2SAndroid Build Coastguard Worker 
221*5e7646d2SAndroid Build Coastguard Worker     if ((code = ppdEmitString(ppd, PPD_ORDER_PROLOG, 0.0)) != NULL)
222*5e7646d2SAndroid Build Coastguard Worker     {
223*5e7646d2SAndroid Build Coastguard Worker       status |= _cupsRasterExecPS(h, &preferred_bits, code);
224*5e7646d2SAndroid Build Coastguard Worker       free(code);
225*5e7646d2SAndroid Build Coastguard Worker     }
226*5e7646d2SAndroid Build Coastguard Worker 
227*5e7646d2SAndroid Build Coastguard Worker     if ((code = ppdEmitString(ppd, PPD_ORDER_PAGE, 0.0)) != NULL)
228*5e7646d2SAndroid Build Coastguard Worker     {
229*5e7646d2SAndroid Build Coastguard Worker       status |= _cupsRasterExecPS(h, &preferred_bits, code);
230*5e7646d2SAndroid Build Coastguard Worker       free(code);
231*5e7646d2SAndroid Build Coastguard Worker     }
232*5e7646d2SAndroid Build Coastguard Worker   }
233*5e7646d2SAndroid Build Coastguard Worker 
234*5e7646d2SAndroid Build Coastguard Worker  /*
235*5e7646d2SAndroid Build Coastguard Worker   * Allow option override for page scaling...
236*5e7646d2SAndroid Build Coastguard Worker   */
237*5e7646d2SAndroid Build Coastguard Worker 
238*5e7646d2SAndroid Build Coastguard Worker   if ((val = cupsGetOption("cupsBorderlessScalingFactor", num_options,
239*5e7646d2SAndroid Build Coastguard Worker                            options)) != NULL)
240*5e7646d2SAndroid Build Coastguard Worker   {
241*5e7646d2SAndroid Build Coastguard Worker     double sc = atof(val);		/* Scale factor */
242*5e7646d2SAndroid Build Coastguard Worker 
243*5e7646d2SAndroid Build Coastguard Worker     if (sc >= 0.1 && sc <= 2.0)
244*5e7646d2SAndroid Build Coastguard Worker       h->cupsBorderlessScalingFactor = (float)sc;
245*5e7646d2SAndroid Build Coastguard Worker   }
246*5e7646d2SAndroid Build Coastguard Worker 
247*5e7646d2SAndroid Build Coastguard Worker  /*
248*5e7646d2SAndroid Build Coastguard Worker   * Get the margins for the current size...
249*5e7646d2SAndroid Build Coastguard Worker   */
250*5e7646d2SAndroid Build Coastguard Worker 
251*5e7646d2SAndroid Build Coastguard Worker   if ((size = ppdPageSize(ppd, NULL)) != NULL)
252*5e7646d2SAndroid Build Coastguard Worker   {
253*5e7646d2SAndroid Build Coastguard Worker    /*
254*5e7646d2SAndroid Build Coastguard Worker     * Use the margins from the PPD file...
255*5e7646d2SAndroid Build Coastguard Worker     */
256*5e7646d2SAndroid Build Coastguard Worker 
257*5e7646d2SAndroid Build Coastguard Worker     left   = size->left;
258*5e7646d2SAndroid Build Coastguard Worker     bottom = size->bottom;
259*5e7646d2SAndroid Build Coastguard Worker     right  = size->right;
260*5e7646d2SAndroid Build Coastguard Worker     top    = size->top;
261*5e7646d2SAndroid Build Coastguard Worker 
262*5e7646d2SAndroid Build Coastguard Worker     strlcpy(h->cupsPageSizeName, size->name, sizeof(h->cupsPageSizeName));
263*5e7646d2SAndroid Build Coastguard Worker 
264*5e7646d2SAndroid Build Coastguard Worker     h->cupsPageSize[0] = size->width;
265*5e7646d2SAndroid Build Coastguard Worker     h->cupsPageSize[1] = size->length;
266*5e7646d2SAndroid Build Coastguard Worker   }
267*5e7646d2SAndroid Build Coastguard Worker   else
268*5e7646d2SAndroid Build Coastguard Worker   {
269*5e7646d2SAndroid Build Coastguard Worker    /*
270*5e7646d2SAndroid Build Coastguard Worker     * Use the default margins...
271*5e7646d2SAndroid Build Coastguard Worker     */
272*5e7646d2SAndroid Build Coastguard Worker 
273*5e7646d2SAndroid Build Coastguard Worker     left   = 0.0f;
274*5e7646d2SAndroid Build Coastguard Worker     bottom = 0.0f;
275*5e7646d2SAndroid Build Coastguard Worker     right  = 612.0f;
276*5e7646d2SAndroid Build Coastguard Worker     top    = 792.0f;
277*5e7646d2SAndroid Build Coastguard Worker   }
278*5e7646d2SAndroid Build Coastguard Worker 
279*5e7646d2SAndroid Build Coastguard Worker  /*
280*5e7646d2SAndroid Build Coastguard Worker   * Handle orientation...
281*5e7646d2SAndroid Build Coastguard Worker   */
282*5e7646d2SAndroid Build Coastguard Worker 
283*5e7646d2SAndroid Build Coastguard Worker   switch (h->Orientation)
284*5e7646d2SAndroid Build Coastguard Worker   {
285*5e7646d2SAndroid Build Coastguard Worker     case CUPS_ORIENT_0 :
286*5e7646d2SAndroid Build Coastguard Worker     default :
287*5e7646d2SAndroid Build Coastguard Worker         /* Do nothing */
288*5e7646d2SAndroid Build Coastguard Worker         break;
289*5e7646d2SAndroid Build Coastguard Worker 
290*5e7646d2SAndroid Build Coastguard Worker     case CUPS_ORIENT_90 :
291*5e7646d2SAndroid Build Coastguard Worker         temp1              = h->cupsPageSize[0];
292*5e7646d2SAndroid Build Coastguard Worker         h->cupsPageSize[0] = h->cupsPageSize[1];
293*5e7646d2SAndroid Build Coastguard Worker         h->cupsPageSize[1] = temp1;
294*5e7646d2SAndroid Build Coastguard Worker 
295*5e7646d2SAndroid Build Coastguard Worker         temp1  = left;
296*5e7646d2SAndroid Build Coastguard Worker         temp2  = right;
297*5e7646d2SAndroid Build Coastguard Worker         left   = h->cupsPageSize[0] - top;
298*5e7646d2SAndroid Build Coastguard Worker         right  = h->cupsPageSize[0] - bottom;
299*5e7646d2SAndroid Build Coastguard Worker         bottom = h->cupsPageSize[1] - temp1;
300*5e7646d2SAndroid Build Coastguard Worker         top    = h->cupsPageSize[1] - temp2;
301*5e7646d2SAndroid Build Coastguard Worker         break;
302*5e7646d2SAndroid Build Coastguard Worker 
303*5e7646d2SAndroid Build Coastguard Worker     case CUPS_ORIENT_180 :
304*5e7646d2SAndroid Build Coastguard Worker         temp1  = left;
305*5e7646d2SAndroid Build Coastguard Worker         temp2  = bottom;
306*5e7646d2SAndroid Build Coastguard Worker         left   = h->cupsPageSize[0] - right;
307*5e7646d2SAndroid Build Coastguard Worker         right  = h->cupsPageSize[0] - temp1;
308*5e7646d2SAndroid Build Coastguard Worker         bottom = h->cupsPageSize[1] - top;
309*5e7646d2SAndroid Build Coastguard Worker         top    = h->cupsPageSize[1] - temp2;
310*5e7646d2SAndroid Build Coastguard Worker         break;
311*5e7646d2SAndroid Build Coastguard Worker 
312*5e7646d2SAndroid Build Coastguard Worker     case CUPS_ORIENT_270 :
313*5e7646d2SAndroid Build Coastguard Worker         temp1              = h->cupsPageSize[0];
314*5e7646d2SAndroid Build Coastguard Worker         h->cupsPageSize[0] = h->cupsPageSize[1];
315*5e7646d2SAndroid Build Coastguard Worker         h->cupsPageSize[1] = temp1;
316*5e7646d2SAndroid Build Coastguard Worker 
317*5e7646d2SAndroid Build Coastguard Worker         temp1  = left;
318*5e7646d2SAndroid Build Coastguard Worker         temp2  = right;
319*5e7646d2SAndroid Build Coastguard Worker         left   = bottom;
320*5e7646d2SAndroid Build Coastguard Worker         right  = top;
321*5e7646d2SAndroid Build Coastguard Worker         bottom = h->cupsPageSize[1] - temp2;
322*5e7646d2SAndroid Build Coastguard Worker         top    = h->cupsPageSize[1] - temp1;
323*5e7646d2SAndroid Build Coastguard Worker         break;
324*5e7646d2SAndroid Build Coastguard Worker   }
325*5e7646d2SAndroid Build Coastguard Worker 
326*5e7646d2SAndroid Build Coastguard Worker   if (left > right)
327*5e7646d2SAndroid Build Coastguard Worker   {
328*5e7646d2SAndroid Build Coastguard Worker     temp1 = left;
329*5e7646d2SAndroid Build Coastguard Worker     left  = right;
330*5e7646d2SAndroid Build Coastguard Worker     right = temp1;
331*5e7646d2SAndroid Build Coastguard Worker   }
332*5e7646d2SAndroid Build Coastguard Worker 
333*5e7646d2SAndroid Build Coastguard Worker   if (bottom > top)
334*5e7646d2SAndroid Build Coastguard Worker   {
335*5e7646d2SAndroid Build Coastguard Worker     temp1  = bottom;
336*5e7646d2SAndroid Build Coastguard Worker     bottom = top;
337*5e7646d2SAndroid Build Coastguard Worker     top    = temp1;
338*5e7646d2SAndroid Build Coastguard Worker   }
339*5e7646d2SAndroid Build Coastguard Worker 
340*5e7646d2SAndroid Build Coastguard Worker   h->PageSize[0]           = (unsigned)(h->cupsPageSize[0] *
341*5e7646d2SAndroid Build Coastguard Worker                                         h->cupsBorderlessScalingFactor);
342*5e7646d2SAndroid Build Coastguard Worker   h->PageSize[1]           = (unsigned)(h->cupsPageSize[1] *
343*5e7646d2SAndroid Build Coastguard Worker                                         h->cupsBorderlessScalingFactor);
344*5e7646d2SAndroid Build Coastguard Worker   h->Margins[0]            = (unsigned)(left *
345*5e7646d2SAndroid Build Coastguard Worker                                         h->cupsBorderlessScalingFactor);
346*5e7646d2SAndroid Build Coastguard Worker   h->Margins[1]            = (unsigned)(bottom *
347*5e7646d2SAndroid Build Coastguard Worker                                         h->cupsBorderlessScalingFactor);
348*5e7646d2SAndroid Build Coastguard Worker   h->ImagingBoundingBox[0] = (unsigned)(left *
349*5e7646d2SAndroid Build Coastguard Worker                                         h->cupsBorderlessScalingFactor);
350*5e7646d2SAndroid Build Coastguard Worker   h->ImagingBoundingBox[1] = (unsigned)(bottom *
351*5e7646d2SAndroid Build Coastguard Worker                                         h->cupsBorderlessScalingFactor);
352*5e7646d2SAndroid Build Coastguard Worker   h->ImagingBoundingBox[2] = (unsigned)(right *
353*5e7646d2SAndroid Build Coastguard Worker                                         h->cupsBorderlessScalingFactor);
354*5e7646d2SAndroid Build Coastguard Worker   h->ImagingBoundingBox[3] = (unsigned)(top *
355*5e7646d2SAndroid Build Coastguard Worker                                         h->cupsBorderlessScalingFactor);
356*5e7646d2SAndroid Build Coastguard Worker   h->cupsImagingBBox[0]    = (float)left;
357*5e7646d2SAndroid Build Coastguard Worker   h->cupsImagingBBox[1]    = (float)bottom;
358*5e7646d2SAndroid Build Coastguard Worker   h->cupsImagingBBox[2]    = (float)right;
359*5e7646d2SAndroid Build Coastguard Worker   h->cupsImagingBBox[3]    = (float)top;
360*5e7646d2SAndroid Build Coastguard Worker 
361*5e7646d2SAndroid Build Coastguard Worker  /*
362*5e7646d2SAndroid Build Coastguard Worker   * Use the callback to validate the page header...
363*5e7646d2SAndroid Build Coastguard Worker   */
364*5e7646d2SAndroid Build Coastguard Worker 
365*5e7646d2SAndroid Build Coastguard Worker   if (func && (*func)(h, preferred_bits))
366*5e7646d2SAndroid Build Coastguard Worker   {
367*5e7646d2SAndroid Build Coastguard Worker     _cupsRasterAddError("Page header callback returned error.\n");
368*5e7646d2SAndroid Build Coastguard Worker     return (-1);
369*5e7646d2SAndroid Build Coastguard Worker   }
370*5e7646d2SAndroid Build Coastguard Worker 
371*5e7646d2SAndroid Build Coastguard Worker  /*
372*5e7646d2SAndroid Build Coastguard Worker   * Check parameters...
373*5e7646d2SAndroid Build Coastguard Worker   */
374*5e7646d2SAndroid Build Coastguard Worker 
375*5e7646d2SAndroid Build Coastguard Worker   if (!h->HWResolution[0] || !h->HWResolution[1] ||
376*5e7646d2SAndroid Build Coastguard Worker       !h->PageSize[0] || !h->PageSize[1] ||
377*5e7646d2SAndroid Build Coastguard Worker       (h->cupsBitsPerColor != 1 && h->cupsBitsPerColor != 2 &&
378*5e7646d2SAndroid Build Coastguard Worker        h->cupsBitsPerColor != 4 && h->cupsBitsPerColor != 8 &&
379*5e7646d2SAndroid Build Coastguard Worker        h->cupsBitsPerColor != 16) ||
380*5e7646d2SAndroid Build Coastguard Worker       h->cupsBorderlessScalingFactor < 0.1 ||
381*5e7646d2SAndroid Build Coastguard Worker       h->cupsBorderlessScalingFactor > 2.0)
382*5e7646d2SAndroid Build Coastguard Worker   {
383*5e7646d2SAndroid Build Coastguard Worker     _cupsRasterAddError("Page header uses unsupported values.\n");
384*5e7646d2SAndroid Build Coastguard Worker     return (-1);
385*5e7646d2SAndroid Build Coastguard Worker   }
386*5e7646d2SAndroid Build Coastguard Worker 
387*5e7646d2SAndroid Build Coastguard Worker  /*
388*5e7646d2SAndroid Build Coastguard Worker   * Compute the bitmap parameters...
389*5e7646d2SAndroid Build Coastguard Worker   */
390*5e7646d2SAndroid Build Coastguard Worker 
391*5e7646d2SAndroid Build Coastguard Worker   h->cupsWidth  = (unsigned)((right - left) * h->cupsBorderlessScalingFactor *
392*5e7646d2SAndroid Build Coastguard Worker                         h->HWResolution[0] / 72.0f + 0.5f);
393*5e7646d2SAndroid Build Coastguard Worker   h->cupsHeight = (unsigned)((top - bottom) * h->cupsBorderlessScalingFactor *
394*5e7646d2SAndroid Build Coastguard Worker                         h->HWResolution[1] / 72.0f + 0.5f);
395*5e7646d2SAndroid Build Coastguard Worker 
396*5e7646d2SAndroid Build Coastguard Worker   switch (h->cupsColorSpace)
397*5e7646d2SAndroid Build Coastguard Worker   {
398*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_W :
399*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_K :
400*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_WHITE :
401*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_GOLD :
402*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_SILVER :
403*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_SW :
404*5e7646d2SAndroid Build Coastguard Worker         h->cupsNumColors    = 1;
405*5e7646d2SAndroid Build Coastguard Worker         h->cupsBitsPerPixel = h->cupsBitsPerColor;
406*5e7646d2SAndroid Build Coastguard Worker 	break;
407*5e7646d2SAndroid Build Coastguard Worker 
408*5e7646d2SAndroid Build Coastguard Worker     default :
409*5e7646d2SAndroid Build Coastguard Worker        /*
410*5e7646d2SAndroid Build Coastguard Worker         * Ensure that colorimetric colorspaces use at least 8 bits per
411*5e7646d2SAndroid Build Coastguard Worker 	* component...
412*5e7646d2SAndroid Build Coastguard Worker 	*/
413*5e7646d2SAndroid Build Coastguard Worker 
414*5e7646d2SAndroid Build Coastguard Worker         if (h->cupsColorSpace >= CUPS_CSPACE_CIEXYZ &&
415*5e7646d2SAndroid Build Coastguard Worker 	    h->cupsBitsPerColor < 8)
416*5e7646d2SAndroid Build Coastguard Worker 	  h->cupsBitsPerColor = 8;
417*5e7646d2SAndroid Build Coastguard Worker 
418*5e7646d2SAndroid Build Coastguard Worker        /*
419*5e7646d2SAndroid Build Coastguard Worker         * Figure out the number of bits per pixel...
420*5e7646d2SAndroid Build Coastguard Worker 	*/
421*5e7646d2SAndroid Build Coastguard Worker 
422*5e7646d2SAndroid Build Coastguard Worker 	if (h->cupsColorOrder == CUPS_ORDER_CHUNKED)
423*5e7646d2SAndroid Build Coastguard Worker 	{
424*5e7646d2SAndroid Build Coastguard Worker 	  if (h->cupsBitsPerColor >= 8)
425*5e7646d2SAndroid Build Coastguard Worker             h->cupsBitsPerPixel = h->cupsBitsPerColor * 3;
426*5e7646d2SAndroid Build Coastguard Worker 	  else
427*5e7646d2SAndroid Build Coastguard Worker             h->cupsBitsPerPixel = h->cupsBitsPerColor * 4;
428*5e7646d2SAndroid Build Coastguard Worker 	}
429*5e7646d2SAndroid Build Coastguard Worker 	else
430*5e7646d2SAndroid Build Coastguard Worker 	  h->cupsBitsPerPixel = h->cupsBitsPerColor;
431*5e7646d2SAndroid Build Coastguard Worker 
432*5e7646d2SAndroid Build Coastguard Worker         h->cupsNumColors = 3;
433*5e7646d2SAndroid Build Coastguard Worker 	break;
434*5e7646d2SAndroid Build Coastguard Worker 
435*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_KCMYcm :
436*5e7646d2SAndroid Build Coastguard Worker 	if (h->cupsBitsPerColor == 1)
437*5e7646d2SAndroid Build Coastguard Worker 	{
438*5e7646d2SAndroid Build Coastguard Worker 	  if (h->cupsColorOrder == CUPS_ORDER_CHUNKED)
439*5e7646d2SAndroid Build Coastguard Worker 	    h->cupsBitsPerPixel = 8;
440*5e7646d2SAndroid Build Coastguard Worker 	  else
441*5e7646d2SAndroid Build Coastguard Worker 	    h->cupsBitsPerPixel = 1;
442*5e7646d2SAndroid Build Coastguard Worker 
443*5e7646d2SAndroid Build Coastguard Worker           h->cupsNumColors = 6;
444*5e7646d2SAndroid Build Coastguard Worker           break;
445*5e7646d2SAndroid Build Coastguard Worker 	}
446*5e7646d2SAndroid Build Coastguard Worker 
447*5e7646d2SAndroid Build Coastguard Worker        /*
448*5e7646d2SAndroid Build Coastguard Worker 	* Fall through to CMYK code...
449*5e7646d2SAndroid Build Coastguard Worker 	*/
450*5e7646d2SAndroid Build Coastguard Worker 
451*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_RGBA :
452*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_RGBW :
453*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_CMYK :
454*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_YMCK :
455*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_KCMY :
456*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_GMCK :
457*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_GMCS :
458*5e7646d2SAndroid Build Coastguard Worker 	if (h->cupsColorOrder == CUPS_ORDER_CHUNKED)
459*5e7646d2SAndroid Build Coastguard Worker           h->cupsBitsPerPixel = h->cupsBitsPerColor * 4;
460*5e7646d2SAndroid Build Coastguard Worker 	else
461*5e7646d2SAndroid Build Coastguard Worker 	  h->cupsBitsPerPixel = h->cupsBitsPerColor;
462*5e7646d2SAndroid Build Coastguard Worker 
463*5e7646d2SAndroid Build Coastguard Worker         h->cupsNumColors = 4;
464*5e7646d2SAndroid Build Coastguard Worker 	break;
465*5e7646d2SAndroid Build Coastguard Worker 
466*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_DEVICE1 :
467*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_DEVICE2 :
468*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_DEVICE3 :
469*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_DEVICE4 :
470*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_DEVICE5 :
471*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_DEVICE6 :
472*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_DEVICE7 :
473*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_DEVICE8 :
474*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_DEVICE9 :
475*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_DEVICEA :
476*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_DEVICEB :
477*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_DEVICEC :
478*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_DEVICED :
479*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_DEVICEE :
480*5e7646d2SAndroid Build Coastguard Worker     case CUPS_CSPACE_DEVICEF :
481*5e7646d2SAndroid Build Coastguard Worker         h->cupsNumColors = h->cupsColorSpace - CUPS_CSPACE_DEVICE1 + 1;
482*5e7646d2SAndroid Build Coastguard Worker 
483*5e7646d2SAndroid Build Coastguard Worker         if (h->cupsColorOrder == CUPS_ORDER_CHUNKED)
484*5e7646d2SAndroid Build Coastguard Worker           h->cupsBitsPerPixel = h->cupsBitsPerColor * h->cupsNumColors;
485*5e7646d2SAndroid Build Coastguard Worker 	else
486*5e7646d2SAndroid Build Coastguard Worker 	  h->cupsBitsPerPixel = h->cupsBitsPerColor;
487*5e7646d2SAndroid Build Coastguard Worker 	break;
488*5e7646d2SAndroid Build Coastguard Worker   }
489*5e7646d2SAndroid Build Coastguard Worker 
490*5e7646d2SAndroid Build Coastguard Worker   h->cupsBytesPerLine = (h->cupsBitsPerPixel * h->cupsWidth + 7) / 8;
491*5e7646d2SAndroid Build Coastguard Worker 
492*5e7646d2SAndroid Build Coastguard Worker   if (h->cupsColorOrder == CUPS_ORDER_BANDED)
493*5e7646d2SAndroid Build Coastguard Worker     h->cupsBytesPerLine *= h->cupsNumColors;
494*5e7646d2SAndroid Build Coastguard Worker 
495*5e7646d2SAndroid Build Coastguard Worker   return (status);
496*5e7646d2SAndroid Build Coastguard Worker }
497*5e7646d2SAndroid Build Coastguard Worker 
498*5e7646d2SAndroid Build Coastguard Worker 
499*5e7646d2SAndroid Build Coastguard Worker /*
500*5e7646d2SAndroid Build Coastguard Worker  * '_cupsRasterExecPS()' - Execute PostScript code to initialize a page header.
501*5e7646d2SAndroid Build Coastguard Worker  */
502*5e7646d2SAndroid Build Coastguard Worker 
503*5e7646d2SAndroid Build Coastguard Worker int					/* O - 0 on success, -1 on error */
_cupsRasterExecPS(cups_page_header2_t * h,int * preferred_bits,const char * code)504*5e7646d2SAndroid Build Coastguard Worker _cupsRasterExecPS(
505*5e7646d2SAndroid Build Coastguard Worker     cups_page_header2_t *h,		/* O - Page header */
506*5e7646d2SAndroid Build Coastguard Worker     int                 *preferred_bits,/* O - Preferred bits per color */
507*5e7646d2SAndroid Build Coastguard Worker     const char          *code)		/* I - PS code to execute */
508*5e7646d2SAndroid Build Coastguard Worker {
509*5e7646d2SAndroid Build Coastguard Worker   int			error = 0;	/* Error condition? */
510*5e7646d2SAndroid Build Coastguard Worker   _cups_ps_stack_t	*st;		/* PostScript value stack */
511*5e7646d2SAndroid Build Coastguard Worker   _cups_ps_obj_t	*obj;		/* Object from top of stack */
512*5e7646d2SAndroid Build Coastguard Worker   char			*codecopy,	/* Copy of code */
513*5e7646d2SAndroid Build Coastguard Worker 			*codeptr;	/* Pointer into copy of code */
514*5e7646d2SAndroid Build Coastguard Worker 
515*5e7646d2SAndroid Build Coastguard Worker 
516*5e7646d2SAndroid Build Coastguard Worker   DEBUG_printf(("_cupsRasterExecPS(h=%p, preferred_bits=%p, code=\"%s\")\n",
517*5e7646d2SAndroid Build Coastguard Worker                 h, preferred_bits, code));
518*5e7646d2SAndroid Build Coastguard Worker 
519*5e7646d2SAndroid Build Coastguard Worker  /*
520*5e7646d2SAndroid Build Coastguard Worker   * Copy the PostScript code and create a stack...
521*5e7646d2SAndroid Build Coastguard Worker   */
522*5e7646d2SAndroid Build Coastguard Worker 
523*5e7646d2SAndroid Build Coastguard Worker   if ((codecopy = strdup(code)) == NULL)
524*5e7646d2SAndroid Build Coastguard Worker   {
525*5e7646d2SAndroid Build Coastguard Worker     _cupsRasterAddError("Unable to duplicate code string.\n");
526*5e7646d2SAndroid Build Coastguard Worker     return (-1);
527*5e7646d2SAndroid Build Coastguard Worker   }
528*5e7646d2SAndroid Build Coastguard Worker 
529*5e7646d2SAndroid Build Coastguard Worker   if ((st = new_stack()) == NULL)
530*5e7646d2SAndroid Build Coastguard Worker   {
531*5e7646d2SAndroid Build Coastguard Worker     _cupsRasterAddError("Unable to create stack.\n");
532*5e7646d2SAndroid Build Coastguard Worker     free(codecopy);
533*5e7646d2SAndroid Build Coastguard Worker     return (-1);
534*5e7646d2SAndroid Build Coastguard Worker   }
535*5e7646d2SAndroid Build Coastguard Worker 
536*5e7646d2SAndroid Build Coastguard Worker  /*
537*5e7646d2SAndroid Build Coastguard Worker   * Parse the PS string until we run out of data...
538*5e7646d2SAndroid Build Coastguard Worker   */
539*5e7646d2SAndroid Build Coastguard Worker 
540*5e7646d2SAndroid Build Coastguard Worker   codeptr = codecopy;
541*5e7646d2SAndroid Build Coastguard Worker 
542*5e7646d2SAndroid Build Coastguard Worker   while ((obj = scan_ps(st, &codeptr)) != NULL)
543*5e7646d2SAndroid Build Coastguard Worker   {
544*5e7646d2SAndroid Build Coastguard Worker #ifdef DEBUG
545*5e7646d2SAndroid Build Coastguard Worker     DEBUG_printf(("_cupsRasterExecPS: Stack (%d objects)", st->num_objs));
546*5e7646d2SAndroid Build Coastguard Worker     DEBUG_object("_cupsRasterExecPS", obj);
547*5e7646d2SAndroid Build Coastguard Worker #endif /* DEBUG */
548*5e7646d2SAndroid Build Coastguard Worker 
549*5e7646d2SAndroid Build Coastguard Worker     switch (obj->type)
550*5e7646d2SAndroid Build Coastguard Worker     {
551*5e7646d2SAndroid Build Coastguard Worker       default :
552*5e7646d2SAndroid Build Coastguard Worker           /* Do nothing for regular values */
553*5e7646d2SAndroid Build Coastguard Worker 	  break;
554*5e7646d2SAndroid Build Coastguard Worker 
555*5e7646d2SAndroid Build Coastguard Worker       case CUPS_PS_CLEARTOMARK :
556*5e7646d2SAndroid Build Coastguard Worker           pop_stack(st);
557*5e7646d2SAndroid Build Coastguard Worker 
558*5e7646d2SAndroid Build Coastguard Worker 	  if (cleartomark_stack(st))
559*5e7646d2SAndroid Build Coastguard Worker 	    _cupsRasterAddError("cleartomark: Stack underflow.\n");
560*5e7646d2SAndroid Build Coastguard Worker 
561*5e7646d2SAndroid Build Coastguard Worker #ifdef DEBUG
562*5e7646d2SAndroid Build Coastguard Worker           DEBUG_puts("1_cupsRasterExecPS:    dup");
563*5e7646d2SAndroid Build Coastguard Worker 	  DEBUG_stack("_cupsRasterExecPS", st);
564*5e7646d2SAndroid Build Coastguard Worker #endif /* DEBUG */
565*5e7646d2SAndroid Build Coastguard Worker           break;
566*5e7646d2SAndroid Build Coastguard Worker 
567*5e7646d2SAndroid Build Coastguard Worker       case CUPS_PS_COPY :
568*5e7646d2SAndroid Build Coastguard Worker           pop_stack(st);
569*5e7646d2SAndroid Build Coastguard Worker 	  if ((obj = pop_stack(st)) != NULL)
570*5e7646d2SAndroid Build Coastguard Worker 	  {
571*5e7646d2SAndroid Build Coastguard Worker 	    copy_stack(st, (int)obj->value.number);
572*5e7646d2SAndroid Build Coastguard Worker 
573*5e7646d2SAndroid Build Coastguard Worker #ifdef DEBUG
574*5e7646d2SAndroid Build Coastguard Worker             DEBUG_puts("_cupsRasterExecPS: copy");
575*5e7646d2SAndroid Build Coastguard Worker 	    DEBUG_stack("_cupsRasterExecPS", st);
576*5e7646d2SAndroid Build Coastguard Worker #endif /* DEBUG */
577*5e7646d2SAndroid Build Coastguard Worker           }
578*5e7646d2SAndroid Build Coastguard Worker           break;
579*5e7646d2SAndroid Build Coastguard Worker 
580*5e7646d2SAndroid Build Coastguard Worker       case CUPS_PS_DUP :
581*5e7646d2SAndroid Build Coastguard Worker           pop_stack(st);
582*5e7646d2SAndroid Build Coastguard Worker 	  copy_stack(st, 1);
583*5e7646d2SAndroid Build Coastguard Worker 
584*5e7646d2SAndroid Build Coastguard Worker #ifdef DEBUG
585*5e7646d2SAndroid Build Coastguard Worker           DEBUG_puts("_cupsRasterExecPS: dup");
586*5e7646d2SAndroid Build Coastguard Worker 	  DEBUG_stack("_cupsRasterExecPS", st);
587*5e7646d2SAndroid Build Coastguard Worker #endif /* DEBUG */
588*5e7646d2SAndroid Build Coastguard Worker           break;
589*5e7646d2SAndroid Build Coastguard Worker 
590*5e7646d2SAndroid Build Coastguard Worker       case CUPS_PS_INDEX :
591*5e7646d2SAndroid Build Coastguard Worker           pop_stack(st);
592*5e7646d2SAndroid Build Coastguard Worker 	  if ((obj = pop_stack(st)) != NULL)
593*5e7646d2SAndroid Build Coastguard Worker 	  {
594*5e7646d2SAndroid Build Coastguard Worker 	    index_stack(st, (int)obj->value.number);
595*5e7646d2SAndroid Build Coastguard Worker 
596*5e7646d2SAndroid Build Coastguard Worker #ifdef DEBUG
597*5e7646d2SAndroid Build Coastguard Worker             DEBUG_puts("_cupsRasterExecPS: index");
598*5e7646d2SAndroid Build Coastguard Worker 	    DEBUG_stack("_cupsRasterExecPS", st);
599*5e7646d2SAndroid Build Coastguard Worker #endif /* DEBUG */
600*5e7646d2SAndroid Build Coastguard Worker           }
601*5e7646d2SAndroid Build Coastguard Worker           break;
602*5e7646d2SAndroid Build Coastguard Worker 
603*5e7646d2SAndroid Build Coastguard Worker       case CUPS_PS_POP :
604*5e7646d2SAndroid Build Coastguard Worker           pop_stack(st);
605*5e7646d2SAndroid Build Coastguard Worker           pop_stack(st);
606*5e7646d2SAndroid Build Coastguard Worker 
607*5e7646d2SAndroid Build Coastguard Worker #ifdef DEBUG
608*5e7646d2SAndroid Build Coastguard Worker           DEBUG_puts("_cupsRasterExecPS: pop");
609*5e7646d2SAndroid Build Coastguard Worker 	  DEBUG_stack("_cupsRasterExecPS", st);
610*5e7646d2SAndroid Build Coastguard Worker #endif /* DEBUG */
611*5e7646d2SAndroid Build Coastguard Worker           break;
612*5e7646d2SAndroid Build Coastguard Worker 
613*5e7646d2SAndroid Build Coastguard Worker       case CUPS_PS_ROLL :
614*5e7646d2SAndroid Build Coastguard Worker           pop_stack(st);
615*5e7646d2SAndroid Build Coastguard Worker 	  if ((obj = pop_stack(st)) != NULL)
616*5e7646d2SAndroid Build Coastguard Worker 	  {
617*5e7646d2SAndroid Build Coastguard Worker             int		c;		/* Count */
618*5e7646d2SAndroid Build Coastguard Worker 
619*5e7646d2SAndroid Build Coastguard Worker 
620*5e7646d2SAndroid Build Coastguard Worker             c = (int)obj->value.number;
621*5e7646d2SAndroid Build Coastguard Worker 
622*5e7646d2SAndroid Build Coastguard Worker 	    if ((obj = pop_stack(st)) != NULL)
623*5e7646d2SAndroid Build Coastguard Worker 	    {
624*5e7646d2SAndroid Build Coastguard Worker 	      roll_stack(st, (int)obj->value.number, c);
625*5e7646d2SAndroid Build Coastguard Worker 
626*5e7646d2SAndroid Build Coastguard Worker #ifdef DEBUG
627*5e7646d2SAndroid Build Coastguard Worker               DEBUG_puts("_cupsRasterExecPS: roll");
628*5e7646d2SAndroid Build Coastguard Worker 	      DEBUG_stack("_cupsRasterExecPS", st);
629*5e7646d2SAndroid Build Coastguard Worker #endif /* DEBUG */
630*5e7646d2SAndroid Build Coastguard Worker             }
631*5e7646d2SAndroid Build Coastguard Worker 	  }
632*5e7646d2SAndroid Build Coastguard Worker           break;
633*5e7646d2SAndroid Build Coastguard Worker 
634*5e7646d2SAndroid Build Coastguard Worker       case CUPS_PS_SETPAGEDEVICE :
635*5e7646d2SAndroid Build Coastguard Worker           pop_stack(st);
636*5e7646d2SAndroid Build Coastguard Worker 	  setpagedevice(st, h, preferred_bits);
637*5e7646d2SAndroid Build Coastguard Worker 
638*5e7646d2SAndroid Build Coastguard Worker #ifdef DEBUG
639*5e7646d2SAndroid Build Coastguard Worker           DEBUG_puts("_cupsRasterExecPS: setpagedevice");
640*5e7646d2SAndroid Build Coastguard Worker 	  DEBUG_stack("_cupsRasterExecPS", st);
641*5e7646d2SAndroid Build Coastguard Worker #endif /* DEBUG */
642*5e7646d2SAndroid Build Coastguard Worker           break;
643*5e7646d2SAndroid Build Coastguard Worker 
644*5e7646d2SAndroid Build Coastguard Worker       case CUPS_PS_START_PROC :
645*5e7646d2SAndroid Build Coastguard Worker       case CUPS_PS_END_PROC :
646*5e7646d2SAndroid Build Coastguard Worker       case CUPS_PS_STOPPED :
647*5e7646d2SAndroid Build Coastguard Worker           pop_stack(st);
648*5e7646d2SAndroid Build Coastguard Worker 	  break;
649*5e7646d2SAndroid Build Coastguard Worker 
650*5e7646d2SAndroid Build Coastguard Worker       case CUPS_PS_OTHER :
651*5e7646d2SAndroid Build Coastguard Worker           _cupsRasterAddError("Unknown operator \"%s\".\n", obj->value.other);
652*5e7646d2SAndroid Build Coastguard Worker 	  error = 1;
653*5e7646d2SAndroid Build Coastguard Worker           DEBUG_printf(("_cupsRasterExecPS: Unknown operator \"%s\".", obj->value.other));
654*5e7646d2SAndroid Build Coastguard Worker           break;
655*5e7646d2SAndroid Build Coastguard Worker     }
656*5e7646d2SAndroid Build Coastguard Worker 
657*5e7646d2SAndroid Build Coastguard Worker     if (error)
658*5e7646d2SAndroid Build Coastguard Worker       break;
659*5e7646d2SAndroid Build Coastguard Worker   }
660*5e7646d2SAndroid Build Coastguard Worker 
661*5e7646d2SAndroid Build Coastguard Worker  /*
662*5e7646d2SAndroid Build Coastguard Worker   * Cleanup...
663*5e7646d2SAndroid Build Coastguard Worker   */
664*5e7646d2SAndroid Build Coastguard Worker 
665*5e7646d2SAndroid Build Coastguard Worker   free(codecopy);
666*5e7646d2SAndroid Build Coastguard Worker 
667*5e7646d2SAndroid Build Coastguard Worker   if (st->num_objs > 0)
668*5e7646d2SAndroid Build Coastguard Worker   {
669*5e7646d2SAndroid Build Coastguard Worker     error_stack(st, "Stack not empty:");
670*5e7646d2SAndroid Build Coastguard Worker 
671*5e7646d2SAndroid Build Coastguard Worker #ifdef DEBUG
672*5e7646d2SAndroid Build Coastguard Worker     DEBUG_puts("_cupsRasterExecPS: Stack not empty");
673*5e7646d2SAndroid Build Coastguard Worker     DEBUG_stack("_cupsRasterExecPS", st);
674*5e7646d2SAndroid Build Coastguard Worker #endif /* DEBUG */
675*5e7646d2SAndroid Build Coastguard Worker 
676*5e7646d2SAndroid Build Coastguard Worker     delete_stack(st);
677*5e7646d2SAndroid Build Coastguard Worker 
678*5e7646d2SAndroid Build Coastguard Worker     return (-1);
679*5e7646d2SAndroid Build Coastguard Worker   }
680*5e7646d2SAndroid Build Coastguard Worker 
681*5e7646d2SAndroid Build Coastguard Worker   delete_stack(st);
682*5e7646d2SAndroid Build Coastguard Worker 
683*5e7646d2SAndroid Build Coastguard Worker  /*
684*5e7646d2SAndroid Build Coastguard Worker   * Return success...
685*5e7646d2SAndroid Build Coastguard Worker   */
686*5e7646d2SAndroid Build Coastguard Worker 
687*5e7646d2SAndroid Build Coastguard Worker   return (0);
688*5e7646d2SAndroid Build Coastguard Worker }
689*5e7646d2SAndroid Build Coastguard Worker 
690*5e7646d2SAndroid Build Coastguard Worker 
691*5e7646d2SAndroid Build Coastguard Worker /*
692*5e7646d2SAndroid Build Coastguard Worker  * 'cleartomark_stack()' - Clear to the last mark ([) on the stack.
693*5e7646d2SAndroid Build Coastguard Worker  */
694*5e7646d2SAndroid Build Coastguard Worker 
695*5e7646d2SAndroid Build Coastguard Worker static int				/* O - 0 on success, -1 on error */
cleartomark_stack(_cups_ps_stack_t * st)696*5e7646d2SAndroid Build Coastguard Worker cleartomark_stack(_cups_ps_stack_t *st)	/* I - Stack */
697*5e7646d2SAndroid Build Coastguard Worker {
698*5e7646d2SAndroid Build Coastguard Worker   _cups_ps_obj_t	*obj;		/* Current object on stack */
699*5e7646d2SAndroid Build Coastguard Worker 
700*5e7646d2SAndroid Build Coastguard Worker 
701*5e7646d2SAndroid Build Coastguard Worker   while ((obj = pop_stack(st)) != NULL)
702*5e7646d2SAndroid Build Coastguard Worker     if (obj->type == CUPS_PS_START_ARRAY)
703*5e7646d2SAndroid Build Coastguard Worker       break;
704*5e7646d2SAndroid Build Coastguard Worker 
705*5e7646d2SAndroid Build Coastguard Worker   return (obj ? 0 : -1);
706*5e7646d2SAndroid Build Coastguard Worker }
707*5e7646d2SAndroid Build Coastguard Worker 
708*5e7646d2SAndroid Build Coastguard Worker 
709*5e7646d2SAndroid Build Coastguard Worker /*
710*5e7646d2SAndroid Build Coastguard Worker  * 'copy_stack()' - Copy the top N stack objects.
711*5e7646d2SAndroid Build Coastguard Worker  */
712*5e7646d2SAndroid Build Coastguard Worker 
713*5e7646d2SAndroid Build Coastguard Worker static int				/* O - 0 on success, -1 on error */
copy_stack(_cups_ps_stack_t * st,int c)714*5e7646d2SAndroid Build Coastguard Worker copy_stack(_cups_ps_stack_t *st,	/* I - Stack */
715*5e7646d2SAndroid Build Coastguard Worker            int              c)		/* I - Number of objects to copy */
716*5e7646d2SAndroid Build Coastguard Worker {
717*5e7646d2SAndroid Build Coastguard Worker   int	n;				/* Index */
718*5e7646d2SAndroid Build Coastguard Worker 
719*5e7646d2SAndroid Build Coastguard Worker 
720*5e7646d2SAndroid Build Coastguard Worker   if (c < 0)
721*5e7646d2SAndroid Build Coastguard Worker     return (-1);
722*5e7646d2SAndroid Build Coastguard Worker   else if (c == 0)
723*5e7646d2SAndroid Build Coastguard Worker     return (0);
724*5e7646d2SAndroid Build Coastguard Worker 
725*5e7646d2SAndroid Build Coastguard Worker   if ((n = st->num_objs - c) < 0)
726*5e7646d2SAndroid Build Coastguard Worker     return (-1);
727*5e7646d2SAndroid Build Coastguard Worker 
728*5e7646d2SAndroid Build Coastguard Worker   while (c > 0)
729*5e7646d2SAndroid Build Coastguard Worker   {
730*5e7646d2SAndroid Build Coastguard Worker     if (!push_stack(st, st->objs + n))
731*5e7646d2SAndroid Build Coastguard Worker       return (-1);
732*5e7646d2SAndroid Build Coastguard Worker 
733*5e7646d2SAndroid Build Coastguard Worker     n ++;
734*5e7646d2SAndroid Build Coastguard Worker     c --;
735*5e7646d2SAndroid Build Coastguard Worker   }
736*5e7646d2SAndroid Build Coastguard Worker 
737*5e7646d2SAndroid Build Coastguard Worker   return (0);
738*5e7646d2SAndroid Build Coastguard Worker }
739*5e7646d2SAndroid Build Coastguard Worker 
740*5e7646d2SAndroid Build Coastguard Worker 
741*5e7646d2SAndroid Build Coastguard Worker /*
742*5e7646d2SAndroid Build Coastguard Worker  * 'delete_stack()' - Free memory used by a stack.
743*5e7646d2SAndroid Build Coastguard Worker  */
744*5e7646d2SAndroid Build Coastguard Worker 
745*5e7646d2SAndroid Build Coastguard Worker static void
delete_stack(_cups_ps_stack_t * st)746*5e7646d2SAndroid Build Coastguard Worker delete_stack(_cups_ps_stack_t *st)	/* I - Stack */
747*5e7646d2SAndroid Build Coastguard Worker {
748*5e7646d2SAndroid Build Coastguard Worker   free(st->objs);
749*5e7646d2SAndroid Build Coastguard Worker   free(st);
750*5e7646d2SAndroid Build Coastguard Worker }
751*5e7646d2SAndroid Build Coastguard Worker 
752*5e7646d2SAndroid Build Coastguard Worker 
753*5e7646d2SAndroid Build Coastguard Worker /*
754*5e7646d2SAndroid Build Coastguard Worker  * 'error_object()' - Add an object's value to the current error message.
755*5e7646d2SAndroid Build Coastguard Worker  */
756*5e7646d2SAndroid Build Coastguard Worker 
757*5e7646d2SAndroid Build Coastguard Worker static void
error_object(_cups_ps_obj_t * obj)758*5e7646d2SAndroid Build Coastguard Worker error_object(_cups_ps_obj_t *obj)	/* I - Object to add */
759*5e7646d2SAndroid Build Coastguard Worker {
760*5e7646d2SAndroid Build Coastguard Worker   switch (obj->type)
761*5e7646d2SAndroid Build Coastguard Worker   {
762*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_NAME :
763*5e7646d2SAndroid Build Coastguard Worker 	_cupsRasterAddError(" /%s", obj->value.name);
764*5e7646d2SAndroid Build Coastguard Worker 	break;
765*5e7646d2SAndroid Build Coastguard Worker 
766*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_NUMBER :
767*5e7646d2SAndroid Build Coastguard Worker 	_cupsRasterAddError(" %g", obj->value.number);
768*5e7646d2SAndroid Build Coastguard Worker 	break;
769*5e7646d2SAndroid Build Coastguard Worker 
770*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_STRING :
771*5e7646d2SAndroid Build Coastguard Worker 	_cupsRasterAddError(" (%s)", obj->value.string);
772*5e7646d2SAndroid Build Coastguard Worker 	break;
773*5e7646d2SAndroid Build Coastguard Worker 
774*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_BOOLEAN :
775*5e7646d2SAndroid Build Coastguard Worker 	if (obj->value.boolean)
776*5e7646d2SAndroid Build Coastguard Worker 	  _cupsRasterAddError(" true");
777*5e7646d2SAndroid Build Coastguard Worker 	else
778*5e7646d2SAndroid Build Coastguard Worker 	  _cupsRasterAddError(" false");
779*5e7646d2SAndroid Build Coastguard Worker 	break;
780*5e7646d2SAndroid Build Coastguard Worker 
781*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_NULL :
782*5e7646d2SAndroid Build Coastguard Worker 	_cupsRasterAddError(" null");
783*5e7646d2SAndroid Build Coastguard Worker 	break;
784*5e7646d2SAndroid Build Coastguard Worker 
785*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_START_ARRAY :
786*5e7646d2SAndroid Build Coastguard Worker 	_cupsRasterAddError(" [");
787*5e7646d2SAndroid Build Coastguard Worker 	break;
788*5e7646d2SAndroid Build Coastguard Worker 
789*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_END_ARRAY :
790*5e7646d2SAndroid Build Coastguard Worker 	_cupsRasterAddError(" ]");
791*5e7646d2SAndroid Build Coastguard Worker 	break;
792*5e7646d2SAndroid Build Coastguard Worker 
793*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_START_DICT :
794*5e7646d2SAndroid Build Coastguard Worker 	_cupsRasterAddError(" <<");
795*5e7646d2SAndroid Build Coastguard Worker 	break;
796*5e7646d2SAndroid Build Coastguard Worker 
797*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_END_DICT :
798*5e7646d2SAndroid Build Coastguard Worker 	_cupsRasterAddError(" >>");
799*5e7646d2SAndroid Build Coastguard Worker 	break;
800*5e7646d2SAndroid Build Coastguard Worker 
801*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_START_PROC :
802*5e7646d2SAndroid Build Coastguard Worker 	_cupsRasterAddError(" {");
803*5e7646d2SAndroid Build Coastguard Worker 	break;
804*5e7646d2SAndroid Build Coastguard Worker 
805*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_END_PROC :
806*5e7646d2SAndroid Build Coastguard Worker 	_cupsRasterAddError(" }");
807*5e7646d2SAndroid Build Coastguard Worker 	break;
808*5e7646d2SAndroid Build Coastguard Worker 
809*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_COPY :
810*5e7646d2SAndroid Build Coastguard Worker 	_cupsRasterAddError(" --copy--");
811*5e7646d2SAndroid Build Coastguard Worker         break;
812*5e7646d2SAndroid Build Coastguard Worker 
813*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_CLEARTOMARK :
814*5e7646d2SAndroid Build Coastguard Worker 	_cupsRasterAddError(" --cleartomark--");
815*5e7646d2SAndroid Build Coastguard Worker         break;
816*5e7646d2SAndroid Build Coastguard Worker 
817*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_DUP :
818*5e7646d2SAndroid Build Coastguard Worker 	_cupsRasterAddError(" --dup--");
819*5e7646d2SAndroid Build Coastguard Worker         break;
820*5e7646d2SAndroid Build Coastguard Worker 
821*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_INDEX :
822*5e7646d2SAndroid Build Coastguard Worker 	_cupsRasterAddError(" --index--");
823*5e7646d2SAndroid Build Coastguard Worker         break;
824*5e7646d2SAndroid Build Coastguard Worker 
825*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_POP :
826*5e7646d2SAndroid Build Coastguard Worker 	_cupsRasterAddError(" --pop--");
827*5e7646d2SAndroid Build Coastguard Worker         break;
828*5e7646d2SAndroid Build Coastguard Worker 
829*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_ROLL :
830*5e7646d2SAndroid Build Coastguard Worker 	_cupsRasterAddError(" --roll--");
831*5e7646d2SAndroid Build Coastguard Worker         break;
832*5e7646d2SAndroid Build Coastguard Worker 
833*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_SETPAGEDEVICE :
834*5e7646d2SAndroid Build Coastguard Worker 	_cupsRasterAddError(" --setpagedevice--");
835*5e7646d2SAndroid Build Coastguard Worker         break;
836*5e7646d2SAndroid Build Coastguard Worker 
837*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_STOPPED :
838*5e7646d2SAndroid Build Coastguard Worker 	_cupsRasterAddError(" --stopped--");
839*5e7646d2SAndroid Build Coastguard Worker         break;
840*5e7646d2SAndroid Build Coastguard Worker 
841*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_OTHER :
842*5e7646d2SAndroid Build Coastguard Worker 	_cupsRasterAddError(" --%s--", obj->value.other);
843*5e7646d2SAndroid Build Coastguard Worker 	break;
844*5e7646d2SAndroid Build Coastguard Worker   }
845*5e7646d2SAndroid Build Coastguard Worker }
846*5e7646d2SAndroid Build Coastguard Worker 
847*5e7646d2SAndroid Build Coastguard Worker 
848*5e7646d2SAndroid Build Coastguard Worker /*
849*5e7646d2SAndroid Build Coastguard Worker  * 'error_stack()' - Add a stack to the current error message...
850*5e7646d2SAndroid Build Coastguard Worker  */
851*5e7646d2SAndroid Build Coastguard Worker 
852*5e7646d2SAndroid Build Coastguard Worker static void
error_stack(_cups_ps_stack_t * st,const char * title)853*5e7646d2SAndroid Build Coastguard Worker error_stack(_cups_ps_stack_t *st,	/* I - Stack */
854*5e7646d2SAndroid Build Coastguard Worker             const char       *title)	/* I - Title string */
855*5e7646d2SAndroid Build Coastguard Worker {
856*5e7646d2SAndroid Build Coastguard Worker   int			c;		/* Looping var */
857*5e7646d2SAndroid Build Coastguard Worker   _cups_ps_obj_t	*obj;		/* Current object on stack */
858*5e7646d2SAndroid Build Coastguard Worker 
859*5e7646d2SAndroid Build Coastguard Worker 
860*5e7646d2SAndroid Build Coastguard Worker   _cupsRasterAddError("%s", title);
861*5e7646d2SAndroid Build Coastguard Worker 
862*5e7646d2SAndroid Build Coastguard Worker   for (obj = st->objs, c = st->num_objs; c > 0; c --, obj ++)
863*5e7646d2SAndroid Build Coastguard Worker     error_object(obj);
864*5e7646d2SAndroid Build Coastguard Worker 
865*5e7646d2SAndroid Build Coastguard Worker   _cupsRasterAddError("\n");
866*5e7646d2SAndroid Build Coastguard Worker }
867*5e7646d2SAndroid Build Coastguard Worker 
868*5e7646d2SAndroid Build Coastguard Worker 
869*5e7646d2SAndroid Build Coastguard Worker /*
870*5e7646d2SAndroid Build Coastguard Worker  * 'index_stack()' - Copy the Nth value on the stack.
871*5e7646d2SAndroid Build Coastguard Worker  */
872*5e7646d2SAndroid Build Coastguard Worker 
873*5e7646d2SAndroid Build Coastguard Worker static _cups_ps_obj_t	*		/* O - New object */
index_stack(_cups_ps_stack_t * st,int n)874*5e7646d2SAndroid Build Coastguard Worker index_stack(_cups_ps_stack_t *st,	/* I - Stack */
875*5e7646d2SAndroid Build Coastguard Worker             int              n)		/* I - Object index */
876*5e7646d2SAndroid Build Coastguard Worker {
877*5e7646d2SAndroid Build Coastguard Worker   if (n < 0 || (n = st->num_objs - n - 1) < 0)
878*5e7646d2SAndroid Build Coastguard Worker     return (NULL);
879*5e7646d2SAndroid Build Coastguard Worker 
880*5e7646d2SAndroid Build Coastguard Worker   return (push_stack(st, st->objs + n));
881*5e7646d2SAndroid Build Coastguard Worker }
882*5e7646d2SAndroid Build Coastguard Worker 
883*5e7646d2SAndroid Build Coastguard Worker 
884*5e7646d2SAndroid Build Coastguard Worker /*
885*5e7646d2SAndroid Build Coastguard Worker  * 'new_stack()' - Create a new stack.
886*5e7646d2SAndroid Build Coastguard Worker  */
887*5e7646d2SAndroid Build Coastguard Worker 
888*5e7646d2SAndroid Build Coastguard Worker static _cups_ps_stack_t	*		/* O - New stack */
new_stack(void)889*5e7646d2SAndroid Build Coastguard Worker new_stack(void)
890*5e7646d2SAndroid Build Coastguard Worker {
891*5e7646d2SAndroid Build Coastguard Worker   _cups_ps_stack_t	*st;		/* New stack */
892*5e7646d2SAndroid Build Coastguard Worker 
893*5e7646d2SAndroid Build Coastguard Worker 
894*5e7646d2SAndroid Build Coastguard Worker   if ((st = calloc(1, sizeof(_cups_ps_stack_t))) == NULL)
895*5e7646d2SAndroid Build Coastguard Worker     return (NULL);
896*5e7646d2SAndroid Build Coastguard Worker 
897*5e7646d2SAndroid Build Coastguard Worker   st->alloc_objs = 32;
898*5e7646d2SAndroid Build Coastguard Worker 
899*5e7646d2SAndroid Build Coastguard Worker   if ((st->objs = calloc(32, sizeof(_cups_ps_obj_t))) == NULL)
900*5e7646d2SAndroid Build Coastguard Worker   {
901*5e7646d2SAndroid Build Coastguard Worker     free(st);
902*5e7646d2SAndroid Build Coastguard Worker     return (NULL);
903*5e7646d2SAndroid Build Coastguard Worker   }
904*5e7646d2SAndroid Build Coastguard Worker   else
905*5e7646d2SAndroid Build Coastguard Worker     return (st);
906*5e7646d2SAndroid Build Coastguard Worker }
907*5e7646d2SAndroid Build Coastguard Worker 
908*5e7646d2SAndroid Build Coastguard Worker 
909*5e7646d2SAndroid Build Coastguard Worker /*
910*5e7646d2SAndroid Build Coastguard Worker  * 'pop_stock()' - Pop the top object off the stack.
911*5e7646d2SAndroid Build Coastguard Worker  */
912*5e7646d2SAndroid Build Coastguard Worker 
913*5e7646d2SAndroid Build Coastguard Worker static _cups_ps_obj_t	*		/* O - Object */
pop_stack(_cups_ps_stack_t * st)914*5e7646d2SAndroid Build Coastguard Worker pop_stack(_cups_ps_stack_t *st)		/* I - Stack */
915*5e7646d2SAndroid Build Coastguard Worker {
916*5e7646d2SAndroid Build Coastguard Worker   if (st->num_objs > 0)
917*5e7646d2SAndroid Build Coastguard Worker   {
918*5e7646d2SAndroid Build Coastguard Worker     st->num_objs --;
919*5e7646d2SAndroid Build Coastguard Worker 
920*5e7646d2SAndroid Build Coastguard Worker     return (st->objs + st->num_objs);
921*5e7646d2SAndroid Build Coastguard Worker   }
922*5e7646d2SAndroid Build Coastguard Worker   else
923*5e7646d2SAndroid Build Coastguard Worker     return (NULL);
924*5e7646d2SAndroid Build Coastguard Worker }
925*5e7646d2SAndroid Build Coastguard Worker 
926*5e7646d2SAndroid Build Coastguard Worker 
927*5e7646d2SAndroid Build Coastguard Worker /*
928*5e7646d2SAndroid Build Coastguard Worker  * 'push_stack()' - Push an object on the stack.
929*5e7646d2SAndroid Build Coastguard Worker  */
930*5e7646d2SAndroid Build Coastguard Worker 
931*5e7646d2SAndroid Build Coastguard Worker static _cups_ps_obj_t	*		/* O - New object */
push_stack(_cups_ps_stack_t * st,_cups_ps_obj_t * obj)932*5e7646d2SAndroid Build Coastguard Worker push_stack(_cups_ps_stack_t *st,	/* I - Stack */
933*5e7646d2SAndroid Build Coastguard Worker            _cups_ps_obj_t   *obj)	/* I - Object */
934*5e7646d2SAndroid Build Coastguard Worker {
935*5e7646d2SAndroid Build Coastguard Worker   _cups_ps_obj_t	*temp;		/* New object */
936*5e7646d2SAndroid Build Coastguard Worker 
937*5e7646d2SAndroid Build Coastguard Worker 
938*5e7646d2SAndroid Build Coastguard Worker   if (st->num_objs >= st->alloc_objs)
939*5e7646d2SAndroid Build Coastguard Worker   {
940*5e7646d2SAndroid Build Coastguard Worker 
941*5e7646d2SAndroid Build Coastguard Worker 
942*5e7646d2SAndroid Build Coastguard Worker     st->alloc_objs += 32;
943*5e7646d2SAndroid Build Coastguard Worker 
944*5e7646d2SAndroid Build Coastguard Worker     if ((temp = realloc(st->objs, (size_t)st->alloc_objs *
945*5e7646d2SAndroid Build Coastguard Worker                                   sizeof(_cups_ps_obj_t))) == NULL)
946*5e7646d2SAndroid Build Coastguard Worker       return (NULL);
947*5e7646d2SAndroid Build Coastguard Worker 
948*5e7646d2SAndroid Build Coastguard Worker     st->objs = temp;
949*5e7646d2SAndroid Build Coastguard Worker     memset(temp + st->num_objs, 0, 32 * sizeof(_cups_ps_obj_t));
950*5e7646d2SAndroid Build Coastguard Worker   }
951*5e7646d2SAndroid Build Coastguard Worker 
952*5e7646d2SAndroid Build Coastguard Worker   temp = st->objs + st->num_objs;
953*5e7646d2SAndroid Build Coastguard Worker   st->num_objs ++;
954*5e7646d2SAndroid Build Coastguard Worker 
955*5e7646d2SAndroid Build Coastguard Worker   memcpy(temp, obj, sizeof(_cups_ps_obj_t));
956*5e7646d2SAndroid Build Coastguard Worker 
957*5e7646d2SAndroid Build Coastguard Worker   return (temp);
958*5e7646d2SAndroid Build Coastguard Worker }
959*5e7646d2SAndroid Build Coastguard Worker 
960*5e7646d2SAndroid Build Coastguard Worker 
961*5e7646d2SAndroid Build Coastguard Worker /*
962*5e7646d2SAndroid Build Coastguard Worker  * 'roll_stack()' - Rotate stack objects.
963*5e7646d2SAndroid Build Coastguard Worker  */
964*5e7646d2SAndroid Build Coastguard Worker 
965*5e7646d2SAndroid Build Coastguard Worker static int				/* O - 0 on success, -1 on error */
roll_stack(_cups_ps_stack_t * st,int c,int s)966*5e7646d2SAndroid Build Coastguard Worker roll_stack(_cups_ps_stack_t *st,	/* I - Stack */
967*5e7646d2SAndroid Build Coastguard Worker 	   int              c,		/* I - Number of objects */
968*5e7646d2SAndroid Build Coastguard Worker            int              s)		/* I - Amount to shift */
969*5e7646d2SAndroid Build Coastguard Worker {
970*5e7646d2SAndroid Build Coastguard Worker   _cups_ps_obj_t	*temp;		/* Temporary array of objects */
971*5e7646d2SAndroid Build Coastguard Worker   int			n;		/* Index into array */
972*5e7646d2SAndroid Build Coastguard Worker 
973*5e7646d2SAndroid Build Coastguard Worker 
974*5e7646d2SAndroid Build Coastguard Worker   DEBUG_printf(("3roll_stack(st=%p, s=%d, c=%d)", st, s, c));
975*5e7646d2SAndroid Build Coastguard Worker 
976*5e7646d2SAndroid Build Coastguard Worker  /*
977*5e7646d2SAndroid Build Coastguard Worker   * Range check input...
978*5e7646d2SAndroid Build Coastguard Worker   */
979*5e7646d2SAndroid Build Coastguard Worker 
980*5e7646d2SAndroid Build Coastguard Worker   if (c < 0)
981*5e7646d2SAndroid Build Coastguard Worker     return (-1);
982*5e7646d2SAndroid Build Coastguard Worker   else if (c == 0)
983*5e7646d2SAndroid Build Coastguard Worker     return (0);
984*5e7646d2SAndroid Build Coastguard Worker 
985*5e7646d2SAndroid Build Coastguard Worker   if ((n = st->num_objs - c) < 0)
986*5e7646d2SAndroid Build Coastguard Worker     return (-1);
987*5e7646d2SAndroid Build Coastguard Worker 
988*5e7646d2SAndroid Build Coastguard Worker   s %= c;
989*5e7646d2SAndroid Build Coastguard Worker 
990*5e7646d2SAndroid Build Coastguard Worker   if (s == 0)
991*5e7646d2SAndroid Build Coastguard Worker     return (0);
992*5e7646d2SAndroid Build Coastguard Worker 
993*5e7646d2SAndroid Build Coastguard Worker  /*
994*5e7646d2SAndroid Build Coastguard Worker   * Copy N objects and move things around...
995*5e7646d2SAndroid Build Coastguard Worker   */
996*5e7646d2SAndroid Build Coastguard Worker 
997*5e7646d2SAndroid Build Coastguard Worker   if (s < 0)
998*5e7646d2SAndroid Build Coastguard Worker   {
999*5e7646d2SAndroid Build Coastguard Worker    /*
1000*5e7646d2SAndroid Build Coastguard Worker     * Shift down...
1001*5e7646d2SAndroid Build Coastguard Worker     */
1002*5e7646d2SAndroid Build Coastguard Worker 
1003*5e7646d2SAndroid Build Coastguard Worker     s = -s;
1004*5e7646d2SAndroid Build Coastguard Worker 
1005*5e7646d2SAndroid Build Coastguard Worker     if ((temp = calloc((size_t)s, sizeof(_cups_ps_obj_t))) == NULL)
1006*5e7646d2SAndroid Build Coastguard Worker       return (-1);
1007*5e7646d2SAndroid Build Coastguard Worker 
1008*5e7646d2SAndroid Build Coastguard Worker     memcpy(temp, st->objs + n, (size_t)s * sizeof(_cups_ps_obj_t));
1009*5e7646d2SAndroid Build Coastguard Worker     memmove(st->objs + n, st->objs + n + s, (size_t)(c - s) * sizeof(_cups_ps_obj_t));
1010*5e7646d2SAndroid Build Coastguard Worker     memcpy(st->objs + n + c - s, temp, (size_t)s * sizeof(_cups_ps_obj_t));
1011*5e7646d2SAndroid Build Coastguard Worker   }
1012*5e7646d2SAndroid Build Coastguard Worker   else
1013*5e7646d2SAndroid Build Coastguard Worker   {
1014*5e7646d2SAndroid Build Coastguard Worker    /*
1015*5e7646d2SAndroid Build Coastguard Worker     * Shift up...
1016*5e7646d2SAndroid Build Coastguard Worker     */
1017*5e7646d2SAndroid Build Coastguard Worker 
1018*5e7646d2SAndroid Build Coastguard Worker     if ((temp = calloc((size_t)s, sizeof(_cups_ps_obj_t))) == NULL)
1019*5e7646d2SAndroid Build Coastguard Worker       return (-1);
1020*5e7646d2SAndroid Build Coastguard Worker 
1021*5e7646d2SAndroid Build Coastguard Worker     memcpy(temp, st->objs + n + c - s, (size_t)s * sizeof(_cups_ps_obj_t));
1022*5e7646d2SAndroid Build Coastguard Worker     memmove(st->objs + n + s, st->objs + n, (size_t)(c - s) * sizeof(_cups_ps_obj_t));
1023*5e7646d2SAndroid Build Coastguard Worker     memcpy(st->objs + n, temp, (size_t)s * sizeof(_cups_ps_obj_t));
1024*5e7646d2SAndroid Build Coastguard Worker   }
1025*5e7646d2SAndroid Build Coastguard Worker 
1026*5e7646d2SAndroid Build Coastguard Worker   free(temp);
1027*5e7646d2SAndroid Build Coastguard Worker 
1028*5e7646d2SAndroid Build Coastguard Worker   return (0);
1029*5e7646d2SAndroid Build Coastguard Worker }
1030*5e7646d2SAndroid Build Coastguard Worker 
1031*5e7646d2SAndroid Build Coastguard Worker 
1032*5e7646d2SAndroid Build Coastguard Worker /*
1033*5e7646d2SAndroid Build Coastguard Worker  * 'scan_ps()' - Scan a string for the next PS object.
1034*5e7646d2SAndroid Build Coastguard Worker  */
1035*5e7646d2SAndroid Build Coastguard Worker 
1036*5e7646d2SAndroid Build Coastguard Worker static _cups_ps_obj_t	*		/* O  - New object or NULL on EOF */
scan_ps(_cups_ps_stack_t * st,char ** ptr)1037*5e7646d2SAndroid Build Coastguard Worker scan_ps(_cups_ps_stack_t *st,		/* I  - Stack */
1038*5e7646d2SAndroid Build Coastguard Worker         char             **ptr)		/* IO - String pointer */
1039*5e7646d2SAndroid Build Coastguard Worker {
1040*5e7646d2SAndroid Build Coastguard Worker   _cups_ps_obj_t	obj;		/* Current object */
1041*5e7646d2SAndroid Build Coastguard Worker   char			*start,		/* Start of object */
1042*5e7646d2SAndroid Build Coastguard Worker 			*cur,		/* Current position */
1043*5e7646d2SAndroid Build Coastguard Worker 			*valptr,	/* Pointer into value string */
1044*5e7646d2SAndroid Build Coastguard Worker 			*valend;	/* End of value string */
1045*5e7646d2SAndroid Build Coastguard Worker   int			parens;		/* Parenthesis nesting level */
1046*5e7646d2SAndroid Build Coastguard Worker 
1047*5e7646d2SAndroid Build Coastguard Worker 
1048*5e7646d2SAndroid Build Coastguard Worker  /*
1049*5e7646d2SAndroid Build Coastguard Worker   * Skip leading whitespace...
1050*5e7646d2SAndroid Build Coastguard Worker   */
1051*5e7646d2SAndroid Build Coastguard Worker 
1052*5e7646d2SAndroid Build Coastguard Worker   for (cur = *ptr; *cur; cur ++)
1053*5e7646d2SAndroid Build Coastguard Worker   {
1054*5e7646d2SAndroid Build Coastguard Worker     if (*cur == '%')
1055*5e7646d2SAndroid Build Coastguard Worker     {
1056*5e7646d2SAndroid Build Coastguard Worker      /*
1057*5e7646d2SAndroid Build Coastguard Worker       * Comment, skip to end of line...
1058*5e7646d2SAndroid Build Coastguard Worker       */
1059*5e7646d2SAndroid Build Coastguard Worker 
1060*5e7646d2SAndroid Build Coastguard Worker       for (cur ++; *cur && *cur != '\n' && *cur != '\r'; cur ++);
1061*5e7646d2SAndroid Build Coastguard Worker 
1062*5e7646d2SAndroid Build Coastguard Worker       if (!*cur)
1063*5e7646d2SAndroid Build Coastguard Worker         cur --;
1064*5e7646d2SAndroid Build Coastguard Worker     }
1065*5e7646d2SAndroid Build Coastguard Worker     else if (!isspace(*cur & 255))
1066*5e7646d2SAndroid Build Coastguard Worker       break;
1067*5e7646d2SAndroid Build Coastguard Worker   }
1068*5e7646d2SAndroid Build Coastguard Worker 
1069*5e7646d2SAndroid Build Coastguard Worker   if (!*cur)
1070*5e7646d2SAndroid Build Coastguard Worker   {
1071*5e7646d2SAndroid Build Coastguard Worker     *ptr = NULL;
1072*5e7646d2SAndroid Build Coastguard Worker 
1073*5e7646d2SAndroid Build Coastguard Worker     return (NULL);
1074*5e7646d2SAndroid Build Coastguard Worker   }
1075*5e7646d2SAndroid Build Coastguard Worker 
1076*5e7646d2SAndroid Build Coastguard Worker  /*
1077*5e7646d2SAndroid Build Coastguard Worker   * See what we have...
1078*5e7646d2SAndroid Build Coastguard Worker   */
1079*5e7646d2SAndroid Build Coastguard Worker 
1080*5e7646d2SAndroid Build Coastguard Worker   memset(&obj, 0, sizeof(obj));
1081*5e7646d2SAndroid Build Coastguard Worker 
1082*5e7646d2SAndroid Build Coastguard Worker   switch (*cur)
1083*5e7646d2SAndroid Build Coastguard Worker   {
1084*5e7646d2SAndroid Build Coastguard Worker     case '(' :				/* (string) */
1085*5e7646d2SAndroid Build Coastguard Worker         obj.type = CUPS_PS_STRING;
1086*5e7646d2SAndroid Build Coastguard Worker 	start    = cur;
1087*5e7646d2SAndroid Build Coastguard Worker 
1088*5e7646d2SAndroid Build Coastguard Worker 	for (cur ++, parens = 1, valptr = obj.value.string,
1089*5e7646d2SAndroid Build Coastguard Worker 	         valend = obj.value.string + sizeof(obj.value.string) - 1;
1090*5e7646d2SAndroid Build Coastguard Worker              *cur;
1091*5e7646d2SAndroid Build Coastguard Worker 	     cur ++)
1092*5e7646d2SAndroid Build Coastguard Worker 	{
1093*5e7646d2SAndroid Build Coastguard Worker 	  if (*cur == ')' && parens == 1)
1094*5e7646d2SAndroid Build Coastguard Worker 	    break;
1095*5e7646d2SAndroid Build Coastguard Worker 
1096*5e7646d2SAndroid Build Coastguard Worker           if (*cur == '(')
1097*5e7646d2SAndroid Build Coastguard Worker 	    parens ++;
1098*5e7646d2SAndroid Build Coastguard Worker 	  else if (*cur == ')')
1099*5e7646d2SAndroid Build Coastguard Worker 	    parens --;
1100*5e7646d2SAndroid Build Coastguard Worker 
1101*5e7646d2SAndroid Build Coastguard Worker           if (valptr >= valend)
1102*5e7646d2SAndroid Build Coastguard Worker 	  {
1103*5e7646d2SAndroid Build Coastguard Worker 	    *ptr = start;
1104*5e7646d2SAndroid Build Coastguard Worker 
1105*5e7646d2SAndroid Build Coastguard Worker 	    return (NULL);
1106*5e7646d2SAndroid Build Coastguard Worker 	  }
1107*5e7646d2SAndroid Build Coastguard Worker 
1108*5e7646d2SAndroid Build Coastguard Worker 	  if (*cur == '\\')
1109*5e7646d2SAndroid Build Coastguard Worker 	  {
1110*5e7646d2SAndroid Build Coastguard Worker 	   /*
1111*5e7646d2SAndroid Build Coastguard Worker 	    * Decode escaped character...
1112*5e7646d2SAndroid Build Coastguard Worker 	    */
1113*5e7646d2SAndroid Build Coastguard Worker 
1114*5e7646d2SAndroid Build Coastguard Worker 	    cur ++;
1115*5e7646d2SAndroid Build Coastguard Worker 
1116*5e7646d2SAndroid Build Coastguard Worker             if (*cur == 'b')
1117*5e7646d2SAndroid Build Coastguard Worker 	      *valptr++ = '\b';
1118*5e7646d2SAndroid Build Coastguard Worker 	    else if (*cur == 'f')
1119*5e7646d2SAndroid Build Coastguard Worker 	      *valptr++ = '\f';
1120*5e7646d2SAndroid Build Coastguard Worker 	    else if (*cur == 'n')
1121*5e7646d2SAndroid Build Coastguard Worker 	      *valptr++ = '\n';
1122*5e7646d2SAndroid Build Coastguard Worker 	    else if (*cur == 'r')
1123*5e7646d2SAndroid Build Coastguard Worker 	      *valptr++ = '\r';
1124*5e7646d2SAndroid Build Coastguard Worker 	    else if (*cur == 't')
1125*5e7646d2SAndroid Build Coastguard Worker 	      *valptr++ = '\t';
1126*5e7646d2SAndroid Build Coastguard Worker 	    else if (*cur >= '0' && *cur <= '7')
1127*5e7646d2SAndroid Build Coastguard Worker 	    {
1128*5e7646d2SAndroid Build Coastguard Worker 	      int ch = *cur - '0';
1129*5e7646d2SAndroid Build Coastguard Worker 
1130*5e7646d2SAndroid Build Coastguard Worker               if (cur[1] >= '0' && cur[1] <= '7')
1131*5e7646d2SAndroid Build Coastguard Worker 	      {
1132*5e7646d2SAndroid Build Coastguard Worker 	        cur ++;
1133*5e7646d2SAndroid Build Coastguard Worker 		ch = (ch << 3) + *cur - '0';
1134*5e7646d2SAndroid Build Coastguard Worker 	      }
1135*5e7646d2SAndroid Build Coastguard Worker 
1136*5e7646d2SAndroid Build Coastguard Worker               if (cur[1] >= '0' && cur[1] <= '7')
1137*5e7646d2SAndroid Build Coastguard Worker 	      {
1138*5e7646d2SAndroid Build Coastguard Worker 	        cur ++;
1139*5e7646d2SAndroid Build Coastguard Worker 		ch = (ch << 3) + *cur - '0';
1140*5e7646d2SAndroid Build Coastguard Worker 	      }
1141*5e7646d2SAndroid Build Coastguard Worker 
1142*5e7646d2SAndroid Build Coastguard Worker 	      *valptr++ = (char)ch;
1143*5e7646d2SAndroid Build Coastguard Worker 	    }
1144*5e7646d2SAndroid Build Coastguard Worker 	    else if (*cur == '\r')
1145*5e7646d2SAndroid Build Coastguard Worker 	    {
1146*5e7646d2SAndroid Build Coastguard Worker 	      if (cur[1] == '\n')
1147*5e7646d2SAndroid Build Coastguard Worker 	        cur ++;
1148*5e7646d2SAndroid Build Coastguard Worker 	    }
1149*5e7646d2SAndroid Build Coastguard Worker 	    else if (*cur != '\n')
1150*5e7646d2SAndroid Build Coastguard Worker 	      *valptr++ = *cur;
1151*5e7646d2SAndroid Build Coastguard Worker 	  }
1152*5e7646d2SAndroid Build Coastguard Worker 	  else
1153*5e7646d2SAndroid Build Coastguard Worker 	    *valptr++ = *cur;
1154*5e7646d2SAndroid Build Coastguard Worker 	}
1155*5e7646d2SAndroid Build Coastguard Worker 
1156*5e7646d2SAndroid Build Coastguard Worker 	if (*cur != ')')
1157*5e7646d2SAndroid Build Coastguard Worker 	{
1158*5e7646d2SAndroid Build Coastguard Worker 	  *ptr = start;
1159*5e7646d2SAndroid Build Coastguard Worker 
1160*5e7646d2SAndroid Build Coastguard Worker 	  return (NULL);
1161*5e7646d2SAndroid Build Coastguard Worker 	}
1162*5e7646d2SAndroid Build Coastguard Worker 
1163*5e7646d2SAndroid Build Coastguard Worker 	cur ++;
1164*5e7646d2SAndroid Build Coastguard Worker         break;
1165*5e7646d2SAndroid Build Coastguard Worker 
1166*5e7646d2SAndroid Build Coastguard Worker     case '[' :				/* Start array */
1167*5e7646d2SAndroid Build Coastguard Worker         obj.type = CUPS_PS_START_ARRAY;
1168*5e7646d2SAndroid Build Coastguard Worker 	cur ++;
1169*5e7646d2SAndroid Build Coastguard Worker         break;
1170*5e7646d2SAndroid Build Coastguard Worker 
1171*5e7646d2SAndroid Build Coastguard Worker     case ']' :				/* End array */
1172*5e7646d2SAndroid Build Coastguard Worker         obj.type = CUPS_PS_END_ARRAY;
1173*5e7646d2SAndroid Build Coastguard Worker 	cur ++;
1174*5e7646d2SAndroid Build Coastguard Worker         break;
1175*5e7646d2SAndroid Build Coastguard Worker 
1176*5e7646d2SAndroid Build Coastguard Worker     case '<' :				/* Start dictionary or hex string */
1177*5e7646d2SAndroid Build Coastguard Worker         if (cur[1] == '<')
1178*5e7646d2SAndroid Build Coastguard Worker 	{
1179*5e7646d2SAndroid Build Coastguard Worker 	  obj.type = CUPS_PS_START_DICT;
1180*5e7646d2SAndroid Build Coastguard Worker 	  cur += 2;
1181*5e7646d2SAndroid Build Coastguard Worker 	}
1182*5e7646d2SAndroid Build Coastguard Worker 	else
1183*5e7646d2SAndroid Build Coastguard Worker 	{
1184*5e7646d2SAndroid Build Coastguard Worker           obj.type = CUPS_PS_STRING;
1185*5e7646d2SAndroid Build Coastguard Worker 	  start    = cur;
1186*5e7646d2SAndroid Build Coastguard Worker 
1187*5e7646d2SAndroid Build Coastguard Worker 	  for (cur ++, valptr = obj.value.string,
1188*5e7646d2SAndroid Build Coastguard Worker 	           valend = obj.value.string + sizeof(obj.value.string) - 1;
1189*5e7646d2SAndroid Build Coastguard Worker                *cur;
1190*5e7646d2SAndroid Build Coastguard Worker 	       cur ++)
1191*5e7646d2SAndroid Build Coastguard Worker 	  {
1192*5e7646d2SAndroid Build Coastguard Worker 	    int	ch;			/* Current character */
1193*5e7646d2SAndroid Build Coastguard Worker 
1194*5e7646d2SAndroid Build Coastguard Worker 
1195*5e7646d2SAndroid Build Coastguard Worker 
1196*5e7646d2SAndroid Build Coastguard Worker             if (*cur == '>')
1197*5e7646d2SAndroid Build Coastguard Worker 	      break;
1198*5e7646d2SAndroid Build Coastguard Worker 	    else if (valptr >= valend || !isxdigit(*cur & 255))
1199*5e7646d2SAndroid Build Coastguard Worker 	    {
1200*5e7646d2SAndroid Build Coastguard Worker 	      *ptr = start;
1201*5e7646d2SAndroid Build Coastguard Worker 	      return (NULL);
1202*5e7646d2SAndroid Build Coastguard Worker 	    }
1203*5e7646d2SAndroid Build Coastguard Worker 
1204*5e7646d2SAndroid Build Coastguard Worker             if (*cur >= '0' && *cur <= '9')
1205*5e7646d2SAndroid Build Coastguard Worker 	      ch = (*cur - '0') << 4;
1206*5e7646d2SAndroid Build Coastguard Worker 	    else
1207*5e7646d2SAndroid Build Coastguard Worker 	      ch = (tolower(*cur) - 'a' + 10) << 4;
1208*5e7646d2SAndroid Build Coastguard Worker 
1209*5e7646d2SAndroid Build Coastguard Worker 	    if (isxdigit(cur[1] & 255))
1210*5e7646d2SAndroid Build Coastguard Worker 	    {
1211*5e7646d2SAndroid Build Coastguard Worker 	      cur ++;
1212*5e7646d2SAndroid Build Coastguard Worker 
1213*5e7646d2SAndroid Build Coastguard Worker               if (*cur >= '0' && *cur <= '9')
1214*5e7646d2SAndroid Build Coastguard Worker 		ch |= *cur - '0';
1215*5e7646d2SAndroid Build Coastguard Worker 	      else
1216*5e7646d2SAndroid Build Coastguard Worker 		ch |= tolower(*cur) - 'a' + 10;
1217*5e7646d2SAndroid Build Coastguard Worker             }
1218*5e7646d2SAndroid Build Coastguard Worker 
1219*5e7646d2SAndroid Build Coastguard Worker 	    *valptr++ = (char)ch;
1220*5e7646d2SAndroid Build Coastguard Worker           }
1221*5e7646d2SAndroid Build Coastguard Worker 
1222*5e7646d2SAndroid Build Coastguard Worker           if (*cur != '>')
1223*5e7646d2SAndroid Build Coastguard Worker 	  {
1224*5e7646d2SAndroid Build Coastguard Worker 	    *ptr = start;
1225*5e7646d2SAndroid Build Coastguard Worker 	    return (NULL);
1226*5e7646d2SAndroid Build Coastguard Worker 	  }
1227*5e7646d2SAndroid Build Coastguard Worker 
1228*5e7646d2SAndroid Build Coastguard Worker 	  cur ++;
1229*5e7646d2SAndroid Build Coastguard Worker 	}
1230*5e7646d2SAndroid Build Coastguard Worker         break;
1231*5e7646d2SAndroid Build Coastguard Worker 
1232*5e7646d2SAndroid Build Coastguard Worker     case '>' :				/* End dictionary? */
1233*5e7646d2SAndroid Build Coastguard Worker         if (cur[1] == '>')
1234*5e7646d2SAndroid Build Coastguard Worker 	{
1235*5e7646d2SAndroid Build Coastguard Worker 	  obj.type = CUPS_PS_END_DICT;
1236*5e7646d2SAndroid Build Coastguard Worker 	  cur += 2;
1237*5e7646d2SAndroid Build Coastguard Worker 	}
1238*5e7646d2SAndroid Build Coastguard Worker 	else
1239*5e7646d2SAndroid Build Coastguard Worker 	{
1240*5e7646d2SAndroid Build Coastguard Worker 	  obj.type           = CUPS_PS_OTHER;
1241*5e7646d2SAndroid Build Coastguard Worker 	  obj.value.other[0] = *cur;
1242*5e7646d2SAndroid Build Coastguard Worker 
1243*5e7646d2SAndroid Build Coastguard Worker 	  cur ++;
1244*5e7646d2SAndroid Build Coastguard Worker 	}
1245*5e7646d2SAndroid Build Coastguard Worker         break;
1246*5e7646d2SAndroid Build Coastguard Worker 
1247*5e7646d2SAndroid Build Coastguard Worker     case '{' :				/* Start procedure */
1248*5e7646d2SAndroid Build Coastguard Worker         obj.type = CUPS_PS_START_PROC;
1249*5e7646d2SAndroid Build Coastguard Worker 	cur ++;
1250*5e7646d2SAndroid Build Coastguard Worker         break;
1251*5e7646d2SAndroid Build Coastguard Worker 
1252*5e7646d2SAndroid Build Coastguard Worker     case '}' :				/* End procedure */
1253*5e7646d2SAndroid Build Coastguard Worker         obj.type = CUPS_PS_END_PROC;
1254*5e7646d2SAndroid Build Coastguard Worker 	cur ++;
1255*5e7646d2SAndroid Build Coastguard Worker         break;
1256*5e7646d2SAndroid Build Coastguard Worker 
1257*5e7646d2SAndroid Build Coastguard Worker     case '-' :				/* Possible number */
1258*5e7646d2SAndroid Build Coastguard Worker     case '+' :
1259*5e7646d2SAndroid Build Coastguard Worker         if (!isdigit(cur[1] & 255) && cur[1] != '.')
1260*5e7646d2SAndroid Build Coastguard Worker 	{
1261*5e7646d2SAndroid Build Coastguard Worker 	  obj.type           = CUPS_PS_OTHER;
1262*5e7646d2SAndroid Build Coastguard Worker 	  obj.value.other[0] = *cur;
1263*5e7646d2SAndroid Build Coastguard Worker 
1264*5e7646d2SAndroid Build Coastguard Worker 	  cur ++;
1265*5e7646d2SAndroid Build Coastguard Worker 	  break;
1266*5e7646d2SAndroid Build Coastguard Worker 	}
1267*5e7646d2SAndroid Build Coastguard Worker 
1268*5e7646d2SAndroid Build Coastguard Worker     case '0' :				/* Number */
1269*5e7646d2SAndroid Build Coastguard Worker     case '1' :
1270*5e7646d2SAndroid Build Coastguard Worker     case '2' :
1271*5e7646d2SAndroid Build Coastguard Worker     case '3' :
1272*5e7646d2SAndroid Build Coastguard Worker     case '4' :
1273*5e7646d2SAndroid Build Coastguard Worker     case '5' :
1274*5e7646d2SAndroid Build Coastguard Worker     case '6' :
1275*5e7646d2SAndroid Build Coastguard Worker     case '7' :
1276*5e7646d2SAndroid Build Coastguard Worker     case '8' :
1277*5e7646d2SAndroid Build Coastguard Worker     case '9' :
1278*5e7646d2SAndroid Build Coastguard Worker     case '.' :
1279*5e7646d2SAndroid Build Coastguard Worker         obj.type = CUPS_PS_NUMBER;
1280*5e7646d2SAndroid Build Coastguard Worker 
1281*5e7646d2SAndroid Build Coastguard Worker         start = cur;
1282*5e7646d2SAndroid Build Coastguard Worker 	for (cur ++; *cur; cur ++)
1283*5e7646d2SAndroid Build Coastguard Worker 	  if (!isdigit(*cur & 255))
1284*5e7646d2SAndroid Build Coastguard Worker 	    break;
1285*5e7646d2SAndroid Build Coastguard Worker 
1286*5e7646d2SAndroid Build Coastguard Worker         if (*cur == '#')
1287*5e7646d2SAndroid Build Coastguard Worker 	{
1288*5e7646d2SAndroid Build Coastguard Worker 	 /*
1289*5e7646d2SAndroid Build Coastguard Worker 	  * Integer with radix...
1290*5e7646d2SAndroid Build Coastguard Worker 	  */
1291*5e7646d2SAndroid Build Coastguard Worker 
1292*5e7646d2SAndroid Build Coastguard Worker           obj.value.number = strtol(cur + 1, &cur, atoi(start));
1293*5e7646d2SAndroid Build Coastguard Worker 	  break;
1294*5e7646d2SAndroid Build Coastguard Worker 	}
1295*5e7646d2SAndroid Build Coastguard Worker 	else if (strchr(".Ee()<>[]{}/%", *cur) || isspace(*cur & 255))
1296*5e7646d2SAndroid Build Coastguard Worker 	{
1297*5e7646d2SAndroid Build Coastguard Worker 	 /*
1298*5e7646d2SAndroid Build Coastguard Worker 	  * Integer or real number...
1299*5e7646d2SAndroid Build Coastguard Worker 	  */
1300*5e7646d2SAndroid Build Coastguard Worker 
1301*5e7646d2SAndroid Build Coastguard Worker 	  obj.value.number = _cupsStrScand(start, &cur, localeconv());
1302*5e7646d2SAndroid Build Coastguard Worker           break;
1303*5e7646d2SAndroid Build Coastguard Worker 	}
1304*5e7646d2SAndroid Build Coastguard Worker 	else
1305*5e7646d2SAndroid Build Coastguard Worker 	  cur = start;
1306*5e7646d2SAndroid Build Coastguard Worker 
1307*5e7646d2SAndroid Build Coastguard Worker     default :				/* Operator/variable name */
1308*5e7646d2SAndroid Build Coastguard Worker         start = cur;
1309*5e7646d2SAndroid Build Coastguard Worker 
1310*5e7646d2SAndroid Build Coastguard Worker 	if (*cur == '/')
1311*5e7646d2SAndroid Build Coastguard Worker 	{
1312*5e7646d2SAndroid Build Coastguard Worker 	  obj.type = CUPS_PS_NAME;
1313*5e7646d2SAndroid Build Coastguard Worker           valptr   = obj.value.name;
1314*5e7646d2SAndroid Build Coastguard Worker           valend   = obj.value.name + sizeof(obj.value.name) - 1;
1315*5e7646d2SAndroid Build Coastguard Worker 	  cur ++;
1316*5e7646d2SAndroid Build Coastguard Worker 	}
1317*5e7646d2SAndroid Build Coastguard Worker 	else
1318*5e7646d2SAndroid Build Coastguard Worker 	{
1319*5e7646d2SAndroid Build Coastguard Worker 	  obj.type = CUPS_PS_OTHER;
1320*5e7646d2SAndroid Build Coastguard Worker           valptr   = obj.value.other;
1321*5e7646d2SAndroid Build Coastguard Worker           valend   = obj.value.other + sizeof(obj.value.other) - 1;
1322*5e7646d2SAndroid Build Coastguard Worker 	}
1323*5e7646d2SAndroid Build Coastguard Worker 
1324*5e7646d2SAndroid Build Coastguard Worker 	while (*cur)
1325*5e7646d2SAndroid Build Coastguard Worker 	{
1326*5e7646d2SAndroid Build Coastguard Worker 	  if (strchr("()<>[]{}/%", *cur) || isspace(*cur & 255))
1327*5e7646d2SAndroid Build Coastguard Worker 	    break;
1328*5e7646d2SAndroid Build Coastguard Worker 	  else if (valptr < valend)
1329*5e7646d2SAndroid Build Coastguard Worker 	    *valptr++ = *cur++;
1330*5e7646d2SAndroid Build Coastguard Worker 	  else
1331*5e7646d2SAndroid Build Coastguard Worker 	  {
1332*5e7646d2SAndroid Build Coastguard Worker 	    *ptr = start;
1333*5e7646d2SAndroid Build Coastguard Worker 	    return (NULL);
1334*5e7646d2SAndroid Build Coastguard Worker 	  }
1335*5e7646d2SAndroid Build Coastguard Worker 	}
1336*5e7646d2SAndroid Build Coastguard Worker 
1337*5e7646d2SAndroid Build Coastguard Worker         if (obj.type == CUPS_PS_OTHER)
1338*5e7646d2SAndroid Build Coastguard Worker 	{
1339*5e7646d2SAndroid Build Coastguard Worker           if (!strcmp(obj.value.other, "true"))
1340*5e7646d2SAndroid Build Coastguard Worker 	  {
1341*5e7646d2SAndroid Build Coastguard Worker 	    obj.type          = CUPS_PS_BOOLEAN;
1342*5e7646d2SAndroid Build Coastguard Worker 	    obj.value.boolean = 1;
1343*5e7646d2SAndroid Build Coastguard Worker 	  }
1344*5e7646d2SAndroid Build Coastguard Worker 	  else if (!strcmp(obj.value.other, "false"))
1345*5e7646d2SAndroid Build Coastguard Worker 	  {
1346*5e7646d2SAndroid Build Coastguard Worker 	    obj.type          = CUPS_PS_BOOLEAN;
1347*5e7646d2SAndroid Build Coastguard Worker 	    obj.value.boolean = 0;
1348*5e7646d2SAndroid Build Coastguard Worker 	  }
1349*5e7646d2SAndroid Build Coastguard Worker 	  else if (!strcmp(obj.value.other, "null"))
1350*5e7646d2SAndroid Build Coastguard Worker 	    obj.type = CUPS_PS_NULL;
1351*5e7646d2SAndroid Build Coastguard Worker 	  else if (!strcmp(obj.value.other, "cleartomark"))
1352*5e7646d2SAndroid Build Coastguard Worker 	    obj.type = CUPS_PS_CLEARTOMARK;
1353*5e7646d2SAndroid Build Coastguard Worker 	  else if (!strcmp(obj.value.other, "copy"))
1354*5e7646d2SAndroid Build Coastguard Worker 	    obj.type = CUPS_PS_COPY;
1355*5e7646d2SAndroid Build Coastguard Worker 	  else if (!strcmp(obj.value.other, "dup"))
1356*5e7646d2SAndroid Build Coastguard Worker 	    obj.type = CUPS_PS_DUP;
1357*5e7646d2SAndroid Build Coastguard Worker 	  else if (!strcmp(obj.value.other, "index"))
1358*5e7646d2SAndroid Build Coastguard Worker 	    obj.type = CUPS_PS_INDEX;
1359*5e7646d2SAndroid Build Coastguard Worker 	  else if (!strcmp(obj.value.other, "pop"))
1360*5e7646d2SAndroid Build Coastguard Worker 	    obj.type = CUPS_PS_POP;
1361*5e7646d2SAndroid Build Coastguard Worker 	  else if (!strcmp(obj.value.other, "roll"))
1362*5e7646d2SAndroid Build Coastguard Worker 	    obj.type = CUPS_PS_ROLL;
1363*5e7646d2SAndroid Build Coastguard Worker 	  else if (!strcmp(obj.value.other, "setpagedevice"))
1364*5e7646d2SAndroid Build Coastguard Worker 	    obj.type = CUPS_PS_SETPAGEDEVICE;
1365*5e7646d2SAndroid Build Coastguard Worker 	  else if (!strcmp(obj.value.other, "stopped"))
1366*5e7646d2SAndroid Build Coastguard Worker 	    obj.type = CUPS_PS_STOPPED;
1367*5e7646d2SAndroid Build Coastguard Worker 	}
1368*5e7646d2SAndroid Build Coastguard Worker 	break;
1369*5e7646d2SAndroid Build Coastguard Worker   }
1370*5e7646d2SAndroid Build Coastguard Worker 
1371*5e7646d2SAndroid Build Coastguard Worker  /*
1372*5e7646d2SAndroid Build Coastguard Worker   * Save the current position in the string and return the new object...
1373*5e7646d2SAndroid Build Coastguard Worker   */
1374*5e7646d2SAndroid Build Coastguard Worker 
1375*5e7646d2SAndroid Build Coastguard Worker   *ptr = cur;
1376*5e7646d2SAndroid Build Coastguard Worker 
1377*5e7646d2SAndroid Build Coastguard Worker   return (push_stack(st, &obj));
1378*5e7646d2SAndroid Build Coastguard Worker }
1379*5e7646d2SAndroid Build Coastguard Worker 
1380*5e7646d2SAndroid Build Coastguard Worker 
1381*5e7646d2SAndroid Build Coastguard Worker /*
1382*5e7646d2SAndroid Build Coastguard Worker  * 'setpagedevice()' - Simulate the PostScript setpagedevice operator.
1383*5e7646d2SAndroid Build Coastguard Worker  */
1384*5e7646d2SAndroid Build Coastguard Worker 
1385*5e7646d2SAndroid Build Coastguard Worker static int				/* O - 0 on success, -1 on error */
setpagedevice(_cups_ps_stack_t * st,cups_page_header2_t * h,int * preferred_bits)1386*5e7646d2SAndroid Build Coastguard Worker setpagedevice(
1387*5e7646d2SAndroid Build Coastguard Worker     _cups_ps_stack_t    *st,		/* I - Stack */
1388*5e7646d2SAndroid Build Coastguard Worker     cups_page_header2_t *h,		/* O - Page header */
1389*5e7646d2SAndroid Build Coastguard Worker     int                 *preferred_bits)/* O - Preferred bits per color */
1390*5e7646d2SAndroid Build Coastguard Worker {
1391*5e7646d2SAndroid Build Coastguard Worker   int			i;		/* Index into array */
1392*5e7646d2SAndroid Build Coastguard Worker   _cups_ps_obj_t	*obj,		/* Current object */
1393*5e7646d2SAndroid Build Coastguard Worker 			*end;		/* End of dictionary */
1394*5e7646d2SAndroid Build Coastguard Worker   const char		*name;		/* Attribute name */
1395*5e7646d2SAndroid Build Coastguard Worker 
1396*5e7646d2SAndroid Build Coastguard Worker 
1397*5e7646d2SAndroid Build Coastguard Worker  /*
1398*5e7646d2SAndroid Build Coastguard Worker   * Make sure we have a dictionary on the stack...
1399*5e7646d2SAndroid Build Coastguard Worker   */
1400*5e7646d2SAndroid Build Coastguard Worker 
1401*5e7646d2SAndroid Build Coastguard Worker   if (st->num_objs == 0)
1402*5e7646d2SAndroid Build Coastguard Worker     return (-1);
1403*5e7646d2SAndroid Build Coastguard Worker 
1404*5e7646d2SAndroid Build Coastguard Worker   obj = end = st->objs + st->num_objs - 1;
1405*5e7646d2SAndroid Build Coastguard Worker 
1406*5e7646d2SAndroid Build Coastguard Worker   if (obj->type != CUPS_PS_END_DICT)
1407*5e7646d2SAndroid Build Coastguard Worker     return (-1);
1408*5e7646d2SAndroid Build Coastguard Worker 
1409*5e7646d2SAndroid Build Coastguard Worker   obj --;
1410*5e7646d2SAndroid Build Coastguard Worker 
1411*5e7646d2SAndroid Build Coastguard Worker   while (obj > st->objs)
1412*5e7646d2SAndroid Build Coastguard Worker   {
1413*5e7646d2SAndroid Build Coastguard Worker     if (obj->type == CUPS_PS_START_DICT)
1414*5e7646d2SAndroid Build Coastguard Worker       break;
1415*5e7646d2SAndroid Build Coastguard Worker 
1416*5e7646d2SAndroid Build Coastguard Worker     obj --;
1417*5e7646d2SAndroid Build Coastguard Worker   }
1418*5e7646d2SAndroid Build Coastguard Worker 
1419*5e7646d2SAndroid Build Coastguard Worker   if (obj < st->objs)
1420*5e7646d2SAndroid Build Coastguard Worker     return (-1);
1421*5e7646d2SAndroid Build Coastguard Worker 
1422*5e7646d2SAndroid Build Coastguard Worker  /*
1423*5e7646d2SAndroid Build Coastguard Worker   * Found the start of the dictionary, empty the stack to this point...
1424*5e7646d2SAndroid Build Coastguard Worker   */
1425*5e7646d2SAndroid Build Coastguard Worker 
1426*5e7646d2SAndroid Build Coastguard Worker   st->num_objs = (int)(obj - st->objs);
1427*5e7646d2SAndroid Build Coastguard Worker 
1428*5e7646d2SAndroid Build Coastguard Worker  /*
1429*5e7646d2SAndroid Build Coastguard Worker   * Now pull /name and value pairs from the dictionary...
1430*5e7646d2SAndroid Build Coastguard Worker   */
1431*5e7646d2SAndroid Build Coastguard Worker 
1432*5e7646d2SAndroid Build Coastguard Worker   DEBUG_puts("3setpagedevice: Dictionary:");
1433*5e7646d2SAndroid Build Coastguard Worker 
1434*5e7646d2SAndroid Build Coastguard Worker   for (obj ++; obj < end; obj ++)
1435*5e7646d2SAndroid Build Coastguard Worker   {
1436*5e7646d2SAndroid Build Coastguard Worker    /*
1437*5e7646d2SAndroid Build Coastguard Worker     * Grab the name...
1438*5e7646d2SAndroid Build Coastguard Worker     */
1439*5e7646d2SAndroid Build Coastguard Worker 
1440*5e7646d2SAndroid Build Coastguard Worker     if (obj->type != CUPS_PS_NAME)
1441*5e7646d2SAndroid Build Coastguard Worker       return (-1);
1442*5e7646d2SAndroid Build Coastguard Worker 
1443*5e7646d2SAndroid Build Coastguard Worker     name = obj->value.name;
1444*5e7646d2SAndroid Build Coastguard Worker     obj ++;
1445*5e7646d2SAndroid Build Coastguard Worker 
1446*5e7646d2SAndroid Build Coastguard Worker #ifdef DEBUG
1447*5e7646d2SAndroid Build Coastguard Worker     DEBUG_printf(("4setpagedevice: /%s ", name));
1448*5e7646d2SAndroid Build Coastguard Worker     DEBUG_object("setpagedevice", obj);
1449*5e7646d2SAndroid Build Coastguard Worker #endif /* DEBUG */
1450*5e7646d2SAndroid Build Coastguard Worker 
1451*5e7646d2SAndroid Build Coastguard Worker    /*
1452*5e7646d2SAndroid Build Coastguard Worker     * Then grab the value...
1453*5e7646d2SAndroid Build Coastguard Worker     */
1454*5e7646d2SAndroid Build Coastguard Worker 
1455*5e7646d2SAndroid Build Coastguard Worker     if (!strcmp(name, "MediaClass") && obj->type == CUPS_PS_STRING)
1456*5e7646d2SAndroid Build Coastguard Worker       strlcpy(h->MediaClass, obj->value.string, sizeof(h->MediaClass));
1457*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "MediaColor") && obj->type == CUPS_PS_STRING)
1458*5e7646d2SAndroid Build Coastguard Worker       strlcpy(h->MediaColor, obj->value.string, sizeof(h->MediaColor));
1459*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "MediaType") && obj->type == CUPS_PS_STRING)
1460*5e7646d2SAndroid Build Coastguard Worker       strlcpy(h->MediaType, obj->value.string, sizeof(h->MediaType));
1461*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "OutputType") && obj->type == CUPS_PS_STRING)
1462*5e7646d2SAndroid Build Coastguard Worker       strlcpy(h->OutputType, obj->value.string, sizeof(h->OutputType));
1463*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "AdvanceDistance") && obj->type == CUPS_PS_NUMBER)
1464*5e7646d2SAndroid Build Coastguard Worker       h->AdvanceDistance = (unsigned)obj->value.number;
1465*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "AdvanceMedia") && obj->type == CUPS_PS_NUMBER)
1466*5e7646d2SAndroid Build Coastguard Worker       h->AdvanceMedia = (unsigned)obj->value.number;
1467*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "Collate") && obj->type == CUPS_PS_BOOLEAN)
1468*5e7646d2SAndroid Build Coastguard Worker       h->Collate = (unsigned)obj->value.boolean;
1469*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "CutMedia") && obj->type == CUPS_PS_NUMBER)
1470*5e7646d2SAndroid Build Coastguard Worker       h->CutMedia = (cups_cut_t)(unsigned)obj->value.number;
1471*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "Duplex") && obj->type == CUPS_PS_BOOLEAN)
1472*5e7646d2SAndroid Build Coastguard Worker       h->Duplex = (unsigned)obj->value.boolean;
1473*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "HWResolution") && obj->type == CUPS_PS_START_ARRAY)
1474*5e7646d2SAndroid Build Coastguard Worker     {
1475*5e7646d2SAndroid Build Coastguard Worker       if (obj[1].type == CUPS_PS_NUMBER && obj[2].type == CUPS_PS_NUMBER &&
1476*5e7646d2SAndroid Build Coastguard Worker           obj[3].type == CUPS_PS_END_ARRAY)
1477*5e7646d2SAndroid Build Coastguard Worker       {
1478*5e7646d2SAndroid Build Coastguard Worker         h->HWResolution[0] = (unsigned)obj[1].value.number;
1479*5e7646d2SAndroid Build Coastguard Worker 	h->HWResolution[1] = (unsigned)obj[2].value.number;
1480*5e7646d2SAndroid Build Coastguard Worker 	obj += 3;
1481*5e7646d2SAndroid Build Coastguard Worker       }
1482*5e7646d2SAndroid Build Coastguard Worker       else
1483*5e7646d2SAndroid Build Coastguard Worker         return (-1);
1484*5e7646d2SAndroid Build Coastguard Worker     }
1485*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "InsertSheet") && obj->type == CUPS_PS_BOOLEAN)
1486*5e7646d2SAndroid Build Coastguard Worker       h->InsertSheet = (unsigned)obj->value.boolean;
1487*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "Jog") && obj->type == CUPS_PS_NUMBER)
1488*5e7646d2SAndroid Build Coastguard Worker       h->Jog = (unsigned)obj->value.number;
1489*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "LeadingEdge") && obj->type == CUPS_PS_NUMBER)
1490*5e7646d2SAndroid Build Coastguard Worker       h->LeadingEdge = (unsigned)obj->value.number;
1491*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "ManualFeed") && obj->type == CUPS_PS_BOOLEAN)
1492*5e7646d2SAndroid Build Coastguard Worker       h->ManualFeed = (unsigned)obj->value.boolean;
1493*5e7646d2SAndroid Build Coastguard Worker     else if ((!strcmp(name, "cupsMediaPosition") ||
1494*5e7646d2SAndroid Build Coastguard Worker               !strcmp(name, "MediaPosition")) && obj->type == CUPS_PS_NUMBER)
1495*5e7646d2SAndroid Build Coastguard Worker     {
1496*5e7646d2SAndroid Build Coastguard Worker      /*
1497*5e7646d2SAndroid Build Coastguard Worker       * cupsMediaPosition is supported for backwards compatibility only.
1498*5e7646d2SAndroid Build Coastguard Worker       * We added it back in the Ghostscript 5.50 days to work around a
1499*5e7646d2SAndroid Build Coastguard Worker       * bug in Ghostscript WRT handling of MediaPosition and setpagedevice.
1500*5e7646d2SAndroid Build Coastguard Worker       *
1501*5e7646d2SAndroid Build Coastguard Worker       * All new development should set MediaPosition...
1502*5e7646d2SAndroid Build Coastguard Worker       */
1503*5e7646d2SAndroid Build Coastguard Worker 
1504*5e7646d2SAndroid Build Coastguard Worker       h->MediaPosition = (unsigned)obj->value.number;
1505*5e7646d2SAndroid Build Coastguard Worker     }
1506*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "MediaWeight") && obj->type == CUPS_PS_NUMBER)
1507*5e7646d2SAndroid Build Coastguard Worker       h->MediaWeight = (unsigned)obj->value.number;
1508*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "MirrorPrint") && obj->type == CUPS_PS_BOOLEAN)
1509*5e7646d2SAndroid Build Coastguard Worker       h->MirrorPrint = (unsigned)obj->value.boolean;
1510*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "NegativePrint") && obj->type == CUPS_PS_BOOLEAN)
1511*5e7646d2SAndroid Build Coastguard Worker       h->NegativePrint = (unsigned)obj->value.boolean;
1512*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "NumCopies") && obj->type == CUPS_PS_NUMBER)
1513*5e7646d2SAndroid Build Coastguard Worker       h->NumCopies = (unsigned)obj->value.number;
1514*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "Orientation") && obj->type == CUPS_PS_NUMBER)
1515*5e7646d2SAndroid Build Coastguard Worker       h->Orientation = (unsigned)obj->value.number;
1516*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "OutputFaceUp") && obj->type == CUPS_PS_BOOLEAN)
1517*5e7646d2SAndroid Build Coastguard Worker       h->OutputFaceUp = (unsigned)obj->value.boolean;
1518*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "PageSize") && obj->type == CUPS_PS_START_ARRAY)
1519*5e7646d2SAndroid Build Coastguard Worker     {
1520*5e7646d2SAndroid Build Coastguard Worker       if (obj[1].type == CUPS_PS_NUMBER && obj[2].type == CUPS_PS_NUMBER &&
1521*5e7646d2SAndroid Build Coastguard Worker           obj[3].type == CUPS_PS_END_ARRAY)
1522*5e7646d2SAndroid Build Coastguard Worker       {
1523*5e7646d2SAndroid Build Coastguard Worker         h->cupsPageSize[0] = (float)obj[1].value.number;
1524*5e7646d2SAndroid Build Coastguard Worker 	h->cupsPageSize[1] = (float)obj[2].value.number;
1525*5e7646d2SAndroid Build Coastguard Worker 
1526*5e7646d2SAndroid Build Coastguard Worker         h->PageSize[0] = (unsigned)obj[1].value.number;
1527*5e7646d2SAndroid Build Coastguard Worker 	h->PageSize[1] = (unsigned)obj[2].value.number;
1528*5e7646d2SAndroid Build Coastguard Worker 
1529*5e7646d2SAndroid Build Coastguard Worker 	obj += 3;
1530*5e7646d2SAndroid Build Coastguard Worker       }
1531*5e7646d2SAndroid Build Coastguard Worker       else
1532*5e7646d2SAndroid Build Coastguard Worker         return (-1);
1533*5e7646d2SAndroid Build Coastguard Worker     }
1534*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "Separations") && obj->type == CUPS_PS_BOOLEAN)
1535*5e7646d2SAndroid Build Coastguard Worker       h->Separations = (unsigned)obj->value.boolean;
1536*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "TraySwitch") && obj->type == CUPS_PS_BOOLEAN)
1537*5e7646d2SAndroid Build Coastguard Worker       h->TraySwitch = (unsigned)obj->value.boolean;
1538*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "Tumble") && obj->type == CUPS_PS_BOOLEAN)
1539*5e7646d2SAndroid Build Coastguard Worker       h->Tumble = (unsigned)obj->value.boolean;
1540*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "cupsMediaType") && obj->type == CUPS_PS_NUMBER)
1541*5e7646d2SAndroid Build Coastguard Worker       h->cupsMediaType = (unsigned)obj->value.number;
1542*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "cupsBitsPerColor") && obj->type == CUPS_PS_NUMBER)
1543*5e7646d2SAndroid Build Coastguard Worker       h->cupsBitsPerColor = (unsigned)obj->value.number;
1544*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "cupsPreferredBitsPerColor") &&
1545*5e7646d2SAndroid Build Coastguard Worker              obj->type == CUPS_PS_NUMBER)
1546*5e7646d2SAndroid Build Coastguard Worker       *preferred_bits = (int)obj->value.number;
1547*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "cupsColorOrder") && obj->type == CUPS_PS_NUMBER)
1548*5e7646d2SAndroid Build Coastguard Worker       h->cupsColorOrder = (cups_order_t)(unsigned)obj->value.number;
1549*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "cupsColorSpace") && obj->type == CUPS_PS_NUMBER)
1550*5e7646d2SAndroid Build Coastguard Worker       h->cupsColorSpace = (cups_cspace_t)(unsigned)obj->value.number;
1551*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "cupsCompression") && obj->type == CUPS_PS_NUMBER)
1552*5e7646d2SAndroid Build Coastguard Worker       h->cupsCompression = (unsigned)obj->value.number;
1553*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "cupsRowCount") && obj->type == CUPS_PS_NUMBER)
1554*5e7646d2SAndroid Build Coastguard Worker       h->cupsRowCount = (unsigned)obj->value.number;
1555*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "cupsRowFeed") && obj->type == CUPS_PS_NUMBER)
1556*5e7646d2SAndroid Build Coastguard Worker       h->cupsRowFeed = (unsigned)obj->value.number;
1557*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "cupsRowStep") && obj->type == CUPS_PS_NUMBER)
1558*5e7646d2SAndroid Build Coastguard Worker       h->cupsRowStep = (unsigned)obj->value.number;
1559*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "cupsBorderlessScalingFactor") &&
1560*5e7646d2SAndroid Build Coastguard Worker              obj->type == CUPS_PS_NUMBER)
1561*5e7646d2SAndroid Build Coastguard Worker       h->cupsBorderlessScalingFactor = (float)obj->value.number;
1562*5e7646d2SAndroid Build Coastguard Worker     else if (!strncmp(name, "cupsInteger", 11) && obj->type == CUPS_PS_NUMBER)
1563*5e7646d2SAndroid Build Coastguard Worker     {
1564*5e7646d2SAndroid Build Coastguard Worker       if ((i = atoi(name + 11)) < 0 || i > 15)
1565*5e7646d2SAndroid Build Coastguard Worker         return (-1);
1566*5e7646d2SAndroid Build Coastguard Worker 
1567*5e7646d2SAndroid Build Coastguard Worker       h->cupsInteger[i] = (unsigned)obj->value.number;
1568*5e7646d2SAndroid Build Coastguard Worker     }
1569*5e7646d2SAndroid Build Coastguard Worker     else if (!strncmp(name, "cupsReal", 8) && obj->type == CUPS_PS_NUMBER)
1570*5e7646d2SAndroid Build Coastguard Worker     {
1571*5e7646d2SAndroid Build Coastguard Worker       if ((i = atoi(name + 8)) < 0 || i > 15)
1572*5e7646d2SAndroid Build Coastguard Worker         return (-1);
1573*5e7646d2SAndroid Build Coastguard Worker 
1574*5e7646d2SAndroid Build Coastguard Worker       h->cupsReal[i] = (float)obj->value.number;
1575*5e7646d2SAndroid Build Coastguard Worker     }
1576*5e7646d2SAndroid Build Coastguard Worker     else if (!strncmp(name, "cupsString", 10) && obj->type == CUPS_PS_STRING)
1577*5e7646d2SAndroid Build Coastguard Worker     {
1578*5e7646d2SAndroid Build Coastguard Worker       if ((i = atoi(name + 10)) < 0 || i > 15)
1579*5e7646d2SAndroid Build Coastguard Worker         return (-1);
1580*5e7646d2SAndroid Build Coastguard Worker 
1581*5e7646d2SAndroid Build Coastguard Worker       strlcpy(h->cupsString[i], obj->value.string, sizeof(h->cupsString[i]));
1582*5e7646d2SAndroid Build Coastguard Worker     }
1583*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "cupsMarkerType") && obj->type == CUPS_PS_STRING)
1584*5e7646d2SAndroid Build Coastguard Worker       strlcpy(h->cupsMarkerType, obj->value.string, sizeof(h->cupsMarkerType));
1585*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "cupsPageSizeName") && obj->type == CUPS_PS_STRING)
1586*5e7646d2SAndroid Build Coastguard Worker       strlcpy(h->cupsPageSizeName, obj->value.string,
1587*5e7646d2SAndroid Build Coastguard Worker               sizeof(h->cupsPageSizeName));
1588*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(name, "cupsRenderingIntent") &&
1589*5e7646d2SAndroid Build Coastguard Worker              obj->type == CUPS_PS_STRING)
1590*5e7646d2SAndroid Build Coastguard Worker       strlcpy(h->cupsRenderingIntent, obj->value.string,
1591*5e7646d2SAndroid Build Coastguard Worker               sizeof(h->cupsRenderingIntent));
1592*5e7646d2SAndroid Build Coastguard Worker     else
1593*5e7646d2SAndroid Build Coastguard Worker     {
1594*5e7646d2SAndroid Build Coastguard Worker      /*
1595*5e7646d2SAndroid Build Coastguard Worker       * Ignore unknown name+value...
1596*5e7646d2SAndroid Build Coastguard Worker       */
1597*5e7646d2SAndroid Build Coastguard Worker 
1598*5e7646d2SAndroid Build Coastguard Worker       DEBUG_printf(("4setpagedevice: Unknown name (\"%s\") or value...\n", name));
1599*5e7646d2SAndroid Build Coastguard Worker 
1600*5e7646d2SAndroid Build Coastguard Worker       while (obj[1].type != CUPS_PS_NAME && obj < end)
1601*5e7646d2SAndroid Build Coastguard Worker         obj ++;
1602*5e7646d2SAndroid Build Coastguard Worker     }
1603*5e7646d2SAndroid Build Coastguard Worker   }
1604*5e7646d2SAndroid Build Coastguard Worker 
1605*5e7646d2SAndroid Build Coastguard Worker   return (0);
1606*5e7646d2SAndroid Build Coastguard Worker }
1607*5e7646d2SAndroid Build Coastguard Worker 
1608*5e7646d2SAndroid Build Coastguard Worker 
1609*5e7646d2SAndroid Build Coastguard Worker #ifdef DEBUG
1610*5e7646d2SAndroid Build Coastguard Worker /*
1611*5e7646d2SAndroid Build Coastguard Worker  * 'DEBUG_object()' - Print an object's value...
1612*5e7646d2SAndroid Build Coastguard Worker  */
1613*5e7646d2SAndroid Build Coastguard Worker 
1614*5e7646d2SAndroid Build Coastguard Worker static void
DEBUG_object(const char * prefix,_cups_ps_obj_t * obj)1615*5e7646d2SAndroid Build Coastguard Worker DEBUG_object(const char *prefix,	/* I - Prefix string */
1616*5e7646d2SAndroid Build Coastguard Worker              _cups_ps_obj_t *obj)	/* I - Object to print */
1617*5e7646d2SAndroid Build Coastguard Worker {
1618*5e7646d2SAndroid Build Coastguard Worker   switch (obj->type)
1619*5e7646d2SAndroid Build Coastguard Worker   {
1620*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_NAME :
1621*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_printf(("4%s: /%s\n", prefix, obj->value.name));
1622*5e7646d2SAndroid Build Coastguard Worker 	break;
1623*5e7646d2SAndroid Build Coastguard Worker 
1624*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_NUMBER :
1625*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_printf(("4%s: %g\n", prefix, obj->value.number));
1626*5e7646d2SAndroid Build Coastguard Worker 	break;
1627*5e7646d2SAndroid Build Coastguard Worker 
1628*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_STRING :
1629*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_printf(("4%s: (%s)\n", prefix, obj->value.string));
1630*5e7646d2SAndroid Build Coastguard Worker 	break;
1631*5e7646d2SAndroid Build Coastguard Worker 
1632*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_BOOLEAN :
1633*5e7646d2SAndroid Build Coastguard Worker 	if (obj->value.boolean)
1634*5e7646d2SAndroid Build Coastguard Worker 	  DEBUG_printf(("4%s: true", prefix));
1635*5e7646d2SAndroid Build Coastguard Worker 	else
1636*5e7646d2SAndroid Build Coastguard Worker 	  DEBUG_printf(("4%s: false", prefix));
1637*5e7646d2SAndroid Build Coastguard Worker 	break;
1638*5e7646d2SAndroid Build Coastguard Worker 
1639*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_NULL :
1640*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_printf(("4%s: null", prefix));
1641*5e7646d2SAndroid Build Coastguard Worker 	break;
1642*5e7646d2SAndroid Build Coastguard Worker 
1643*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_START_ARRAY :
1644*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_printf(("4%s: [", prefix));
1645*5e7646d2SAndroid Build Coastguard Worker 	break;
1646*5e7646d2SAndroid Build Coastguard Worker 
1647*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_END_ARRAY :
1648*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_printf(("4%s: ]", prefix));
1649*5e7646d2SAndroid Build Coastguard Worker 	break;
1650*5e7646d2SAndroid Build Coastguard Worker 
1651*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_START_DICT :
1652*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_printf(("4%s: <<", prefix));
1653*5e7646d2SAndroid Build Coastguard Worker 	break;
1654*5e7646d2SAndroid Build Coastguard Worker 
1655*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_END_DICT :
1656*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_printf(("4%s: >>", prefix));
1657*5e7646d2SAndroid Build Coastguard Worker 	break;
1658*5e7646d2SAndroid Build Coastguard Worker 
1659*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_START_PROC :
1660*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_printf(("4%s: {", prefix));
1661*5e7646d2SAndroid Build Coastguard Worker 	break;
1662*5e7646d2SAndroid Build Coastguard Worker 
1663*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_END_PROC :
1664*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_printf(("4%s: }", prefix));
1665*5e7646d2SAndroid Build Coastguard Worker 	break;
1666*5e7646d2SAndroid Build Coastguard Worker 
1667*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_CLEARTOMARK :
1668*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_printf(("4%s: --cleartomark--", prefix));
1669*5e7646d2SAndroid Build Coastguard Worker         break;
1670*5e7646d2SAndroid Build Coastguard Worker 
1671*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_COPY :
1672*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_printf(("4%s: --copy--", prefix));
1673*5e7646d2SAndroid Build Coastguard Worker         break;
1674*5e7646d2SAndroid Build Coastguard Worker 
1675*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_DUP :
1676*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_printf(("4%s: --dup--", prefix));
1677*5e7646d2SAndroid Build Coastguard Worker         break;
1678*5e7646d2SAndroid Build Coastguard Worker 
1679*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_INDEX :
1680*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_printf(("4%s: --index--", prefix));
1681*5e7646d2SAndroid Build Coastguard Worker         break;
1682*5e7646d2SAndroid Build Coastguard Worker 
1683*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_POP :
1684*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_printf(("4%s: --pop--", prefix));
1685*5e7646d2SAndroid Build Coastguard Worker         break;
1686*5e7646d2SAndroid Build Coastguard Worker 
1687*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_ROLL :
1688*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_printf(("4%s: --roll--", prefix));
1689*5e7646d2SAndroid Build Coastguard Worker         break;
1690*5e7646d2SAndroid Build Coastguard Worker 
1691*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_SETPAGEDEVICE :
1692*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_printf(("4%s: --setpagedevice--", prefix));
1693*5e7646d2SAndroid Build Coastguard Worker         break;
1694*5e7646d2SAndroid Build Coastguard Worker 
1695*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_STOPPED :
1696*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_printf(("4%s: --stopped--", prefix));
1697*5e7646d2SAndroid Build Coastguard Worker         break;
1698*5e7646d2SAndroid Build Coastguard Worker 
1699*5e7646d2SAndroid Build Coastguard Worker     case CUPS_PS_OTHER :
1700*5e7646d2SAndroid Build Coastguard Worker 	DEBUG_printf(("4%s: --%s--", prefix, obj->value.other));
1701*5e7646d2SAndroid Build Coastguard Worker 	break;
1702*5e7646d2SAndroid Build Coastguard Worker   }
1703*5e7646d2SAndroid Build Coastguard Worker }
1704*5e7646d2SAndroid Build Coastguard Worker 
1705*5e7646d2SAndroid Build Coastguard Worker 
1706*5e7646d2SAndroid Build Coastguard Worker /*
1707*5e7646d2SAndroid Build Coastguard Worker  * 'DEBUG_stack()' - Print a stack...
1708*5e7646d2SAndroid Build Coastguard Worker  */
1709*5e7646d2SAndroid Build Coastguard Worker 
1710*5e7646d2SAndroid Build Coastguard Worker static void
DEBUG_stack(const char * prefix,_cups_ps_stack_t * st)1711*5e7646d2SAndroid Build Coastguard Worker DEBUG_stack(const char       *prefix,	/* I - Prefix string */
1712*5e7646d2SAndroid Build Coastguard Worker             _cups_ps_stack_t *st)	/* I - Stack */
1713*5e7646d2SAndroid Build Coastguard Worker {
1714*5e7646d2SAndroid Build Coastguard Worker   int			c;		/* Looping var */
1715*5e7646d2SAndroid Build Coastguard Worker   _cups_ps_obj_t	*obj;		/* Current object on stack */
1716*5e7646d2SAndroid Build Coastguard Worker 
1717*5e7646d2SAndroid Build Coastguard Worker 
1718*5e7646d2SAndroid Build Coastguard Worker   for (obj = st->objs, c = st->num_objs; c > 0; c --, obj ++)
1719*5e7646d2SAndroid Build Coastguard Worker     DEBUG_object(prefix, obj);
1720*5e7646d2SAndroid Build Coastguard Worker }
1721*5e7646d2SAndroid Build Coastguard Worker #endif /* DEBUG */
1722