]> git.ipfire.org Git - thirdparty/cups.git/blob - cups/testppd.c
Merge changes from CUPS 1.3.1.
[thirdparty/cups.git] / cups / testppd.c
1 /*
2 * "$Id: testppd.c 6799 2007-08-15 19:33:36Z 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 putenv("LANG=zh_TW");
228
229 fputs("ppdLocalizeIPPReason(zh_TW text): ", stdout);
230 if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) &&
231 !strcmp(buffer, "Number 1 Foo Reason"))
232 puts("PASS");
233 else
234 {
235 status ++;
236 printf("FAIL (\"%s\" instead of \"Number 1 Foo Reason\")\n", buffer);
237 }
238
239 ppdClose(ppd);
240 }
241 else
242 {
243 if ((ppd = ppdOpenFile(argv[1])) == NULL)
244 {
245 ppd_status_t err; /* Last error in file */
246 int line; /* Line number in file */
247
248
249 status ++;
250 err = ppdLastError(&line);
251
252 printf("%s: %s on line %d\n", argv[1], ppdErrorString(err), line);
253 }
254 else
255 {
256 int i, j, k; /* Looping vars */
257 ppd_attr_t *attr; /* Current attribute */
258 ppd_group_t *group; /* Option group */
259 ppd_option_t *option; /* Option */
260 ppd_coption_t *coption; /* Custom option */
261 ppd_cparam_t *cparam; /* Custom parameter */
262 char lang[255]; /* LANG environment variable */
263
264
265 if (argc > 2)
266 {
267 snprintf(lang, sizeof(lang), "LANG=%s", argv[2]);
268 putenv(lang);
269 }
270
271 ppdLocalize(ppd);
272
273 for (i = ppd->num_groups, group = ppd->groups;
274 i > 0;
275 i --, group ++)
276 {
277 printf("%s (%s):\n", group->name, group->text);
278
279 for (j = group->num_options, option = group->options;
280 j > 0;
281 j --, option ++)
282 {
283 printf(" %s (%s):\n", option->keyword, option->text);
284
285 for (k = 0; k < option->num_choices; k ++)
286 printf(" - %s (%s)\n", option->choices[k].choice,
287 option->choices[k].text);
288
289 if ((coption = ppdFindCustomOption(ppd, option->keyword)) != NULL)
290 {
291 for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params);
292 cparam;
293 cparam = (ppd_cparam_t *)cupsArrayNext(coption->params))
294 {
295 switch (cparam->type)
296 {
297 case PPD_CUSTOM_CURVE :
298 printf(" %s(%s): PPD_CUSTOM_CURVE (%g to %g)\n",
299 cparam->name, cparam->text,
300 cparam->minimum.custom_curve,
301 cparam->maximum.custom_curve);
302 break;
303
304 case PPD_CUSTOM_INT :
305 printf(" %s(%s): PPD_CUSTOM_INT (%d to %d)\n",
306 cparam->name, cparam->text,
307 cparam->minimum.custom_int,
308 cparam->maximum.custom_int);
309 break;
310
311 case PPD_CUSTOM_INVCURVE :
312 printf(" %s(%s): PPD_CUSTOM_INVCURVE (%g to %g)\n",
313 cparam->name, cparam->text,
314 cparam->minimum.custom_invcurve,
315 cparam->maximum.custom_invcurve);
316 break;
317
318 case PPD_CUSTOM_PASSCODE :
319 printf(" %s(%s): PPD_CUSTOM_PASSCODE (%d to %d)\n",
320 cparam->name, cparam->text,
321 cparam->minimum.custom_passcode,
322 cparam->maximum.custom_passcode);
323 break;
324
325 case PPD_CUSTOM_PASSWORD :
326 printf(" %s(%s): PPD_CUSTOM_PASSWORD (%d to %d)\n",
327 cparam->name, cparam->text,
328 cparam->minimum.custom_password,
329 cparam->maximum.custom_password);
330 break;
331
332 case PPD_CUSTOM_POINTS :
333 printf(" %s(%s): PPD_CUSTOM_POINTS (%g to %g)\n",
334 cparam->name, cparam->text,
335 cparam->minimum.custom_points,
336 cparam->maximum.custom_points);
337 break;
338
339 case PPD_CUSTOM_REAL :
340 printf(" %s(%s): PPD_CUSTOM_REAL (%g to %g)\n",
341 cparam->name, cparam->text,
342 cparam->minimum.custom_real,
343 cparam->maximum.custom_real);
344 break;
345
346 case PPD_CUSTOM_STRING :
347 printf(" %s(%s): PPD_CUSTOM_STRING (%d to %d)\n",
348 cparam->name, cparam->text,
349 cparam->minimum.custom_string,
350 cparam->maximum.custom_string);
351 break;
352 }
353 }
354 }
355 }
356 }
357
358 puts("Attributes:");
359
360 for (attr = (ppd_attr_t *)cupsArrayFirst(ppd->sorted_attrs);
361 attr;
362 attr = (ppd_attr_t *)cupsArrayNext(ppd->sorted_attrs))
363 printf(" *%s %s/%s: \"%s\"\n", attr->name, attr->spec,
364 attr->text, attr->value ? attr->value : "");
365
366 ppdClose(ppd);
367 }
368 }
369
370 return (status);
371 }
372
373
374 /*
375 * End of "$Id: testppd.c 6799 2007-08-15 19:33:36Z mike $".
376 */