]> git.ipfire.org Git - thirdparty/cups.git/blob - cups/testppd.c
Load cups into easysw/current.
[thirdparty/cups.git] / cups / testppd.c
1 /*
2 * "$Id: testppd.c 6676 2007-07-16 17:09:09Z mike $"
3 *
4 * PPD test program for the Common UNIX Printing System (CUPS).
5 *
6 * Copyright 2007 by Apple Inc.
7 * Copyright 1997-2006 by Easy Software Products.
8 *
9 * These coded instructions, statements, and computer programs are the
10 * property of Apple Inc. and are protected by Federal copyright
11 * law. Distribution and use rights are outlined in the file "LICENSE.txt"
12 * which should have been included with this file. If this file is
13 * file is missing or damaged, see the license at "http://www.cups.org/".
14 *
15 * This file is subject to the Apple OS-Developed Software exception.
16 *
17 * Contents:
18 *
19 * main() - Main entry.
20 */
21
22 /*
23 * Include necessary headers...
24 */
25
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <cups/string.h>
29 #include <errno.h>
30 #include "ppd.h"
31 #ifdef WIN32
32 # include <io.h>
33 #else
34 # include <unistd.h>
35 # include <fcntl.h>
36 #endif /* WIN32 */
37
38
39 /*
40 * Test data...
41 */
42
43 static const char *default_code =
44 "[{\n"
45 "%%BeginFeature: *PageRegion Letter\n"
46 "PageRegion=Letter\n"
47 "%%EndFeature\n"
48 "} stopped cleartomark\n"
49 "[{\n"
50 "%%BeginFeature: *InputSlot Tray\n"
51 "InputSlot=Tray\n"
52 "%%EndFeature\n"
53 "} stopped cleartomark\n"
54 "[{\n"
55 "%%BeginFeature: *IntOption None\n"
56 "%%EndFeature\n"
57 "} stopped cleartomark\n"
58 "[{\n"
59 "%%BeginFeature: *StringOption None\n"
60 "%%EndFeature\n"
61 "} stopped cleartomark\n";
62
63 static const char *custom_code =
64 "[{\n"
65 "%%BeginFeature: *CustomPageSize True\n"
66 "400\n"
67 "500\n"
68 "0\n"
69 "0\n"
70 "0\n"
71 "PageSize=Custom\n"
72 "%%EndFeature\n"
73 "} stopped cleartomark\n"
74 "[{\n"
75 "%%BeginFeature: *InputSlot Tray\n"
76 "InputSlot=Tray\n"
77 "%%EndFeature\n"
78 "} stopped cleartomark\n"
79 "[{\n"
80 "%%BeginFeature: *IntOption None\n"
81 "%%EndFeature\n"
82 "} stopped cleartomark\n"
83 "[{\n"
84 "%%BeginFeature: *StringOption None\n"
85 "%%EndFeature\n"
86 "} stopped cleartomark\n";
87
88
89 /*
90 * 'main()' - Main entry.
91 */
92
93 int /* O - Exit status */
94 main(int argc, /* I - Number of command-line arguments */
95 char *argv[]) /* I - Command-line arguments */
96 {
97 ppd_file_t *ppd; /* PPD file loaded from disk */
98 int status; /* Status of tests (0 = success, 1 = fail) */
99 int conflicts; /* Number of conflicts */
100 char *s; /* String */
101 char buffer[8192]; /* String buffer */
102
103
104 status = 0;
105
106 if (argc == 1)
107 {
108 fputs("ppdOpenFile: ", stdout);
109
110 if ((ppd = ppdOpenFile("test.ppd")) != NULL)
111 puts("PASS");
112 else
113 {
114 ppd_status_t err; /* Last error in file */
115 int line; /* Line number in file */
116
117
118 status ++;
119 err = ppdLastError(&line);
120
121 printf("FAIL (%s on line %d)\n", ppdErrorString(err), line);
122 }
123
124 fputs("ppdMarkDefaults: ", stdout);
125 ppdMarkDefaults(ppd);
126
127 if ((conflicts = ppdConflicts(ppd)) == 0)
128 puts("PASS");
129 else
130 {
131 status ++;
132 printf("FAIL (%d conflicts)\n", conflicts);
133 }
134
135 fputs("ppdEmitString (defaults): ", stdout);
136 if ((s = ppdEmitString(ppd, PPD_ORDER_ANY, 0.0)) != NULL &&
137 !strcmp(s, default_code))
138 puts("PASS");
139 else
140 {
141 status ++;
142 printf("FAIL (%d bytes instead of %d)\n", s ? (int)strlen(s) : 0,
143 (int)strlen(default_code));
144
145 if (s)
146 puts(s);
147 }
148
149 if (s)
150 free(s);
151
152 fputs("ppdEmitString (custom size): ", stdout);
153 ppdMarkOption(ppd, "PageSize", "Custom.400x500");
154
155 if ((s = ppdEmitString(ppd, PPD_ORDER_ANY, 0.0)) != NULL &&
156 !strcmp(s, custom_code))
157 puts("PASS");
158 else
159 {
160 status ++;
161 printf("FAIL (%d bytes instead of %d)\n", s ? (int)strlen(s) : 0,
162 (int)strlen(custom_code));
163
164 if (s)
165 puts(s);
166 }
167
168 if (s)
169 free(s);
170
171 /*
172 * Test localization...
173 */
174
175 fputs("ppdLocalizeIPPReason(text): ", stdout);
176 if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) &&
177 !strcmp(buffer, "Foo Reason"))
178 puts("PASS");
179 else
180 {
181 status ++;
182 printf("FAIL (\"%s\" instead of \"Foo Reason\")\n", buffer);
183 }
184
185 fputs("ppdLocalizeIPPReason(http): ", stdout);
186 if (ppdLocalizeIPPReason(ppd, "foo", "http", buffer, sizeof(buffer)) &&
187 !strcmp(buffer, "http://foo/bar.html"))
188 puts("PASS");
189 else
190 {
191 status ++;
192 printf("FAIL (\"%s\" instead of \"http://foo/bar.html\")\n", buffer);
193 }
194
195 fputs("ppdLocalizeIPPReason(help): ", stdout);
196 if (ppdLocalizeIPPReason(ppd, "foo", "help", buffer, sizeof(buffer)) &&
197 !strcmp(buffer, "help:anchor='foo'%20bookID=Vendor%20Help"))
198 puts("PASS");
199 else
200 {
201 status ++;
202 printf("FAIL (\"%s\" instead of \"help:anchor='foo'%%20bookID=Vendor%%20Help\")\n", buffer);
203 }
204
205 fputs("ppdLocalizeIPPReason(file): ", stdout);
206 if (ppdLocalizeIPPReason(ppd, "foo", "file", buffer, sizeof(buffer)) &&
207 !strcmp(buffer, "/help/foo/bar.html"))
208 puts("PASS");
209 else
210 {
211 status ++;
212 printf("FAIL (\"%s\" instead of \"/help/foo/bar.html\")\n", buffer);
213 }
214
215 putenv("LANG=fr");
216
217 fputs("ppdLocalizeIPPReason(fr text): ", stdout);
218 if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) &&
219 !strcmp(buffer, "La Long Foo Reason"))
220 puts("PASS");
221 else
222 {
223 status ++;
224 printf("FAIL (\"%s\" instead of \"La Long Foo Reason\")\n", buffer);
225 }
226
227 ppdClose(ppd);
228 }
229 else
230 {
231 if ((ppd = ppdOpenFile(argv[1])) == NULL)
232 {
233 ppd_status_t err; /* Last error in file */
234 int line; /* Line number in file */
235
236
237 status ++;
238 err = ppdLastError(&line);
239
240 printf("%s: %s on line %d\n", argv[1], ppdErrorString(err), line);
241 }
242 else
243 {
244 int i, j, k; /* Looping vars */
245 ppd_attr_t *attr; /* Current attribute */
246 ppd_group_t *group; /* Option group */
247 ppd_option_t *option; /* Option */
248 ppd_coption_t *coption; /* Custom option */
249 ppd_cparam_t *cparam; /* Custom parameter */
250 char lang[255]; /* LANG environment variable */
251
252
253 if (argc > 2)
254 {
255 snprintf(lang, sizeof(lang), "LANG=%s", argv[2]);
256 putenv(lang);
257 }
258
259 ppdLocalize(ppd);
260
261 for (i = ppd->num_groups, group = ppd->groups;
262 i > 0;
263 i --, group ++)
264 {
265 printf("%s (%s):\n", group->name, group->text);
266
267 for (j = group->num_options, option = group->options;
268 j > 0;
269 j --, option ++)
270 {
271 printf(" %s (%s):\n", option->keyword, option->text);
272
273 for (k = 0; k < option->num_choices; k ++)
274 printf(" - %s (%s)\n", option->choices[k].choice,
275 option->choices[k].text);
276
277 if ((coption = ppdFindCustomOption(ppd, option->keyword)) != NULL)
278 {
279 for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params);
280 cparam;
281 cparam = (ppd_cparam_t *)cupsArrayNext(coption->params))
282 {
283 switch (cparam->type)
284 {
285 case PPD_CUSTOM_CURVE :
286 printf(" %s(%s): PPD_CUSTOM_CURVE (%g to %g)\n",
287 cparam->name, cparam->text,
288 cparam->minimum.custom_curve,
289 cparam->maximum.custom_curve);
290 break;
291
292 case PPD_CUSTOM_INT :
293 printf(" %s(%s): PPD_CUSTOM_INT (%d to %d)\n",
294 cparam->name, cparam->text,
295 cparam->minimum.custom_int,
296 cparam->maximum.custom_int);
297 break;
298
299 case PPD_CUSTOM_INVCURVE :
300 printf(" %s(%s): PPD_CUSTOM_INVCURVE (%g to %g)\n",
301 cparam->name, cparam->text,
302 cparam->minimum.custom_invcurve,
303 cparam->maximum.custom_invcurve);
304 break;
305
306 case PPD_CUSTOM_PASSCODE :
307 printf(" %s(%s): PPD_CUSTOM_PASSCODE (%d to %d)\n",
308 cparam->name, cparam->text,
309 cparam->minimum.custom_passcode,
310 cparam->maximum.custom_passcode);
311 break;
312
313 case PPD_CUSTOM_PASSWORD :
314 printf(" %s(%s): PPD_CUSTOM_PASSWORD (%d to %d)\n",
315 cparam->name, cparam->text,
316 cparam->minimum.custom_password,
317 cparam->maximum.custom_password);
318 break;
319
320 case PPD_CUSTOM_POINTS :
321 printf(" %s(%s): PPD_CUSTOM_POINTS (%g to %g)\n",
322 cparam->name, cparam->text,
323 cparam->minimum.custom_points,
324 cparam->maximum.custom_points);
325 break;
326
327 case PPD_CUSTOM_REAL :
328 printf(" %s(%s): PPD_CUSTOM_REAL (%g to %g)\n",
329 cparam->name, cparam->text,
330 cparam->minimum.custom_real,
331 cparam->maximum.custom_real);
332 break;
333
334 case PPD_CUSTOM_STRING :
335 printf(" %s(%s): PPD_CUSTOM_STRING (%d to %d)\n",
336 cparam->name, cparam->text,
337 cparam->minimum.custom_string,
338 cparam->maximum.custom_string);
339 break;
340 }
341 }
342 }
343 }
344 }
345
346 puts("Attributes:");
347
348 for (attr = (ppd_attr_t *)cupsArrayFirst(ppd->sorted_attrs);
349 attr;
350 attr = (ppd_attr_t *)cupsArrayNext(ppd->sorted_attrs))
351 printf(" *%s %s/%s: \"%s\"\n", attr->name, attr->spec,
352 attr->text, attr->value ? attr->value : "");
353
354 ppdClose(ppd);
355 }
356 }
357
358 return (status);
359 }
360
361
362 /*
363 * End of "$Id: testppd.c 6676 2007-07-16 17:09:09Z mike $".
364 */