]> git.ipfire.org Git - thirdparty/cups.git/blame - cups/testppd.c
Merge changes from r6781 to r6792 (CUPS 1.3.0)
[thirdparty/cups.git] / cups / testppd.c
CommitLineData
fa73b229 1/*
bc44d920 2 * "$Id: testppd.c 6676 2007-07-16 17:09:09Z mike $"
fa73b229 3 *
4 * PPD test program for the Common UNIX Printing System (CUPS).
5 *
bc44d920 6 * Copyright 2007 by Apple Inc.
fa73b229 7 * Copyright 1997-2006 by Easy Software Products.
8 *
9 * These coded instructions, statements, and computer programs are the
bc44d920 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/".
fa73b229 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
e1d6a774 39/*
40 * Test data...
41 */
42
43static 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"
8ca02f3c 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
63static 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"
e1d6a774 86 "} stopped cleartomark\n";
87
88
fa73b229 89/*
90 * 'main()' - Main entry.
91 */
92
93int /* O - Exit status */
94main(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) */
e1d6a774 99 int conflicts; /* Number of conflicts */
100 char *s; /* String */
bc44d920 101 char buffer[8192]; /* String buffer */
fa73b229 102
103
104 status = 0;
105
a74454a7 106 if (argc == 1)
fa73b229 107 {
a74454a7 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
8ca02f3c 135 fputs("ppdEmitString (defaults): ", stdout);
a74454a7 136 if ((s = ppdEmitString(ppd, PPD_ORDER_ANY, 0.0)) != NULL &&
137 !strcmp(s, default_code))
138 puts("PASS");
139 else
140 {
bc44d920 141 status ++;
a74454a7 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);
ed486911 147 }
148
8ca02f3c 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 {
bc44d920 160 status ++;
8ca02f3c 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
a74454a7 168 if (s)
169 free(s);
e1d6a774 170
bc44d920 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
a74454a7 227 ppdClose(ppd);
e1d6a774 228 }
e1d6a774 229 else
230 {
a74454a7 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 */
d09495fa 245 ppd_attr_t *attr; /* Current attribute */
a74454a7 246 ppd_group_t *group; /* Option group */
247 ppd_option_t *option; /* Option */
b86bc4cf 248 ppd_coption_t *coption; /* Custom option */
249 ppd_cparam_t *cparam; /* Custom parameter */
d09495fa 250 char lang[255]; /* LANG environment variable */
a74454a7 251
252
d09495fa 253 if (argc > 2)
254 {
255 snprintf(lang, sizeof(lang), "LANG=%s", argv[2]);
256 putenv(lang);
257 }
258
a74454a7 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);
d09495fa 266
a74454a7 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);
b86bc4cf 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 }
a74454a7 343 }
344 }
d09495fa 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 : "");
09a101d6 353
354 ppdClose(ppd);
a74454a7 355 }
e1d6a774 356 }
357
fa73b229 358 return (status);
359}
360
361
362/*
bc44d920 363 * End of "$Id: testppd.c 6676 2007-07-16 17:09:09Z mike $".
fa73b229 364 */