]>
git.ipfire.org Git - thirdparty/cups.git/blob - cups/testppd.c
2 * "$Id: testppd.c 7897 2008-09-02 19:33:19Z mike $"
4 * PPD test program for CUPS.
6 * Copyright 2007-2010 by Apple Inc.
7 * Copyright 1997-2006 by Easy Software Products.
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/".
15 * This file is subject to the Apple OS-Developed Software exception.
19 * main() - Main entry.
23 * Include necessary headers...
26 #include "cups-private.h"
40 static const char *default_code
=
42 "%%BeginFeature: *InstalledDuplexer False\n"
44 "} stopped cleartomark\n"
46 "%%BeginFeature: *PageRegion Letter\n"
49 "} stopped cleartomark\n"
51 "%%BeginFeature: *InputSlot Tray\n"
54 "} stopped cleartomark\n"
56 "%%BeginFeature: *MediaType Plain\n"
59 "} stopped cleartomark\n"
61 "%%BeginFeature: *IntOption None\n"
63 "} stopped cleartomark\n"
65 "%%BeginFeature: *StringOption None\n"
67 "} stopped cleartomark\n";
69 static const char *custom_code
=
71 "%%BeginFeature: *InstalledDuplexer False\n"
73 "} stopped cleartomark\n"
75 "%%BeginFeature: *InputSlot Tray\n"
78 "} stopped cleartomark\n"
80 "%%BeginFeature: *MediaType Plain\n"
83 "} stopped cleartomark\n"
85 "%%BeginFeature: *IntOption None\n"
87 "} stopped cleartomark\n"
89 "%%BeginFeature: *CustomStringOption True\n"
90 "(value\\0502\\051)\n"
92 "StringOption=Custom\n"
94 "} stopped cleartomark\n"
96 "%%BeginFeature: *CustomPageSize True\n"
104 "} stopped cleartomark\n";
106 static const char *default2_code
=
108 "%%BeginFeature: *InstalledDuplexer False\n"
110 "} stopped cleartomark\n"
112 "%%BeginFeature: *InputSlot Tray\n"
115 "} stopped cleartomark\n"
117 "%%BeginFeature: *Quality Normal\n"
120 "} stopped cleartomark\n"
122 "%%BeginFeature: *IntOption None\n"
124 "} stopped cleartomark\n"
126 "%%BeginFeature: *StringOption None\n"
128 "} stopped cleartomark\n";
132 * 'main()' - Main entry.
135 int /* O - Exit status */
136 main(int argc
, /* I - Number of command-line arguments */
137 char *argv
[]) /* I - Command-line arguments */
139 int i
; /* Looping var */
140 ppd_file_t
*ppd
; /* PPD file loaded from disk */
141 int status
; /* Status of tests (0 = success, 1 = fail) */
142 int conflicts
; /* Number of conflicts */
143 char *s
; /* String */
144 char buffer
[8192]; /* String buffer */
145 const char *text
, /* Localized text */
146 *val
; /* Option value */
147 int num_options
; /* Number of options */
148 cups_option_t
*options
; /* Options */
149 ppd_size_t minsize
, /* Minimum size */
150 maxsize
, /* Maximum size */
151 *size
; /* Current size */
152 ppd_attr_t
*attr
; /* Current attribute */
160 * Setup directories for locale stuff...
163 if (access("locale", 0))
165 mkdir("locale", 0777);
166 mkdir("locale/fr", 0777);
167 symlink("../../../locale/cups_fr.po", "locale/fr/cups_fr.po");
168 mkdir("locale/zh_TW", 0777);
169 symlink("../../../locale/cups_zh_TW.po", "locale/zh_TW/cups_zh_TW.po");
172 putenv("LOCALEDIR=locale");
173 putenv("SOFTWARE=CUPS");
176 * Do tests with test.ppd...
179 fputs("ppdOpenFile(test.ppd): ", stdout
);
181 if ((ppd
= ppdOpenFile("test.ppd")) != NULL
)
185 ppd_status_t err
; /* Last error in file */
186 int line
; /* Line number in file */
190 err
= ppdLastError(&line
);
192 printf("FAIL (%s on line %d)\n", ppdErrorString(err
), line
);
195 fputs("ppdFindAttr(wildcard): ", stdout
);
196 if ((attr
= ppdFindAttr(ppd
, "cupsTest", NULL
)) == NULL
)
199 puts("FAIL (not found)");
201 else if (strcmp(attr
->name
, "cupsTest") || strcmp(attr
->spec
, "Foo"))
204 printf("FAIL (got \"%s %s\")\n", attr
->name
, attr
->spec
);
209 fputs("ppdFindNextAttr(wildcard): ", stdout
);
210 if ((attr
= ppdFindNextAttr(ppd
, "cupsTest", NULL
)) == NULL
)
213 puts("FAIL (not found)");
215 else if (strcmp(attr
->name
, "cupsTest") || strcmp(attr
->spec
, "Bar"))
218 printf("FAIL (got \"%s %s\")\n", attr
->name
, attr
->spec
);
223 fputs("ppdFindAttr(Foo): ", stdout
);
224 if ((attr
= ppdFindAttr(ppd
, "cupsTest", "Foo")) == NULL
)
227 puts("FAIL (not found)");
229 else if (strcmp(attr
->name
, "cupsTest") || strcmp(attr
->spec
, "Foo"))
232 printf("FAIL (got \"%s %s\")\n", attr
->name
, attr
->spec
);
237 fputs("ppdFindNextAttr(Foo): ", stdout
);
238 if ((attr
= ppdFindNextAttr(ppd
, "cupsTest", "Foo")) != NULL
)
241 printf("FAIL (got \"%s %s\")\n", attr
->name
, attr
->spec
);
246 fputs("ppdMarkDefaults: ", stdout
);
247 ppdMarkDefaults(ppd
);
249 if ((conflicts
= ppdConflicts(ppd
)) == 0)
254 printf("FAIL (%d conflicts)\n", conflicts
);
257 fputs("ppdEmitString (defaults): ", stdout
);
258 if ((s
= ppdEmitString(ppd
, PPD_ORDER_ANY
, 0.0)) != NULL
&&
259 !strcmp(s
, default_code
))
264 printf("FAIL (%d bytes instead of %d)\n", s
? (int)strlen(s
) : 0,
265 (int)strlen(default_code
));
274 fputs("ppdEmitString (custom size and string): ", stdout
);
275 ppdMarkOption(ppd
, "PageSize", "Custom.400x500");
276 ppdMarkOption(ppd
, "StringOption", "{String1=\"value 1\" String2=value(2)}");
278 if ((s
= ppdEmitString(ppd
, PPD_ORDER_ANY
, 0.0)) != NULL
&&
279 !strcmp(s
, custom_code
))
284 printf("FAIL (%d bytes instead of %d)\n", s
? (int)strlen(s
) : 0,
285 (int)strlen(custom_code
));
295 * Test constraints...
298 fputs("cupsGetConflicts(InputSlot=Envelope): ", stdout
);
299 ppdMarkOption(ppd
, "PageSize", "Letter");
301 num_options
= cupsGetConflicts(ppd
, "InputSlot", "Envelope", &options
);
302 if (num_options
!= 2 ||
303 (val
= cupsGetOption("PageRegion", num_options
, options
)) == NULL
||
304 strcasecmp(val
, "Letter") ||
305 (val
= cupsGetOption("PageSize", num_options
, options
)) == NULL
||
306 strcasecmp(val
, "Letter"))
308 printf("FAIL (%d options:", num_options
);
309 for (i
= 0; i
< num_options
; i
++)
310 printf(" %s=%s", options
[i
].name
, options
[i
].value
);
317 fputs("ppdConflicts(): ", stdout
);
318 ppdMarkOption(ppd
, "InputSlot", "Envelope");
320 if ((conflicts
= ppdConflicts(ppd
)) == 2)
324 printf("FAIL (%d)\n", conflicts
);
328 fputs("cupsResolveConflicts(InputSlot=Envelope): ", stdout
);
331 if (!cupsResolveConflicts(ppd
, "InputSlot", "Envelope", &num_options
,
334 puts("FAIL (Unable to resolve)");
337 else if (num_options
!= 2 ||
338 !cupsGetOption("PageSize", num_options
, options
))
340 printf("FAIL (%d options:", num_options
);
341 for (i
= 0; i
< num_options
; i
++)
342 printf(" %s=%s", options
[i
].name
, options
[i
].value
);
347 puts("PASS (Resolved by changing PageSize)");
349 cupsFreeOptions(num_options
, options
);
351 fputs("cupsResolveConflicts(No option/choice): ", stdout
);
354 if (cupsResolveConflicts(ppd
, NULL
, NULL
, &num_options
, &options
) &&
355 num_options
== 1 && !strcasecmp(options
[0].name
, "InputSlot") &&
356 !strcasecmp(options
[0].value
, "Tray"))
357 puts("PASS (Resolved by changing InputSlot)");
358 else if (num_options
> 0)
360 printf("FAIL (%d options:", num_options
);
361 for (i
= 0; i
< num_options
; i
++)
362 printf(" %s=%s", options
[i
].name
, options
[i
].value
);
368 puts("FAIL (Unable to resolve)");
371 cupsFreeOptions(num_options
, options
);
373 fputs("ppdInstallableConflict(): ", stdout
);
374 if (ppdInstallableConflict(ppd
, "Duplex", "DuplexNoTumble") &&
375 !ppdInstallableConflict(ppd
, "Duplex", "None"))
377 else if (!ppdInstallableConflict(ppd
, "Duplex", "DuplexNoTumble"))
379 puts("FAIL (Duplex=DuplexNoTumble did not conflict)");
384 puts("FAIL (Duplex=None conflicted)");
392 fputs("ppdPageSizeLimits: ", stdout
);
393 if (ppdPageSizeLimits(ppd
, &minsize
, &maxsize
))
395 if (minsize
.width
!= 36 || minsize
.length
!= 36 ||
396 maxsize
.width
!= 1080 || maxsize
.length
!= 86400)
398 printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, "
399 "expected min=36x36, max=1080x86400)\n", minsize
.width
,
400 minsize
.length
, maxsize
.width
, maxsize
.length
);
408 puts("FAIL (returned 0)");
413 * cupsMarkOptions with PWG and IPP size names.
416 fputs("cupsMarkOptions(media=iso-a4): ", stdout
);
417 num_options
= cupsAddOption("media", "iso-a4", 0, &options
);
418 cupsMarkOptions(ppd
, num_options
, options
);
419 cupsFreeOptions(num_options
, options
);
421 size
= ppdPageSize(ppd
, NULL
);
422 if (!size
|| strcmp(size
->name
, "A4"))
424 printf("FAIL (%s)\n", size
? size
->name
: "unknown");
430 fputs("cupsMarkOptions(media=na_letter_8.5x11in): ", stdout
);
431 num_options
= cupsAddOption("media", "na_letter_8.5x11in", 0, &options
);
432 cupsMarkOptions(ppd
, num_options
, options
);
433 cupsFreeOptions(num_options
, options
);
435 size
= ppdPageSize(ppd
, NULL
);
436 if (!size
|| strcmp(size
->name
, "Letter"))
438 printf("FAIL (%s)\n", size
? size
->name
: "unknown");
444 fputs("cupsMarkOptions(media=A4): ", stdout
);
445 num_options
= cupsAddOption("media", "A4", 0, &options
);
446 cupsMarkOptions(ppd
, num_options
, options
);
447 cupsFreeOptions(num_options
, options
);
449 size
= ppdPageSize(ppd
, NULL
);
450 if (!size
|| strcmp(size
->name
, "A4"))
452 printf("FAIL (%s)\n", size
? size
->name
: "unknown");
459 * Test localization...
462 fputs("ppdLocalizeIPPReason(text): ", stdout
);
463 if (ppdLocalizeIPPReason(ppd
, "foo", NULL
, buffer
, sizeof(buffer
)) &&
464 !strcmp(buffer
, "Foo Reason"))
469 printf("FAIL (\"%s\" instead of \"Foo Reason\")\n", buffer
);
472 fputs("ppdLocalizeIPPReason(http): ", stdout
);
473 if (ppdLocalizeIPPReason(ppd
, "foo", "http", buffer
, sizeof(buffer
)) &&
474 !strcmp(buffer
, "http://foo/bar.html"))
479 printf("FAIL (\"%s\" instead of \"http://foo/bar.html\")\n", buffer
);
482 fputs("ppdLocalizeIPPReason(help): ", stdout
);
483 if (ppdLocalizeIPPReason(ppd
, "foo", "help", buffer
, sizeof(buffer
)) &&
484 !strcmp(buffer
, "help:anchor='foo'%20bookID=Vendor%20Help"))
489 printf("FAIL (\"%s\" instead of \"help:anchor='foo'%%20bookID=Vendor%%20Help\")\n", buffer
);
492 fputs("ppdLocalizeIPPReason(file): ", stdout
);
493 if (ppdLocalizeIPPReason(ppd
, "foo", "file", buffer
, sizeof(buffer
)) &&
494 !strcmp(buffer
, "/help/foo/bar.html"))
499 printf("FAIL (\"%s\" instead of \"/help/foo/bar.html\")\n", buffer
);
504 putenv("LC_CTYPE=fr");
505 putenv("LC_MESSAGES=fr");
507 fputs("ppdLocalizeIPPReason(fr text): ", stdout
);
508 if (ppdLocalizeIPPReason(ppd
, "foo", NULL
, buffer
, sizeof(buffer
)) &&
509 !strcmp(buffer
, "La Long Foo Reason"))
514 printf("FAIL (\"%s\" instead of \"La Long Foo Reason\")\n", buffer
);
517 putenv("LANG=zh_TW");
518 putenv("LC_ALL=zh_TW");
519 putenv("LC_CTYPE=zh_TW");
520 putenv("LC_MESSAGES=zh_TW");
522 fputs("ppdLocalizeIPPReason(zh_TW text): ", stdout
);
523 if (ppdLocalizeIPPReason(ppd
, "foo", NULL
, buffer
, sizeof(buffer
)) &&
524 !strcmp(buffer
, "Number 1 Foo Reason"))
529 printf("FAIL (\"%s\" instead of \"Number 1 Foo Reason\")\n", buffer
);
533 * cupsMarkerName localization...
538 putenv("LC_CTYPE=en");
539 putenv("LC_MESSAGES=en");
541 fputs("ppdLocalizeMarkerName(bogus): ", stdout
);
543 if ((text
= ppdLocalizeMarkerName(ppd
, "bogus")) != NULL
)
546 printf("FAIL (\"%s\" instead of NULL)\n", text
);
551 fputs("ppdLocalizeMarkerName(cyan): ", stdout
);
553 if ((text
= ppdLocalizeMarkerName(ppd
, "cyan")) != NULL
&&
554 !strcmp(text
, "Cyan Toner"))
559 printf("FAIL (\"%s\" instead of \"Cyan Toner\")\n",
560 text
? text
: "(null)");
565 putenv("LC_CTYPE=fr");
566 putenv("LC_MESSAGES=fr");
568 fputs("ppdLocalizeMarkerName(fr cyan): ", stdout
);
569 if ((text
= ppdLocalizeMarkerName(ppd
, "cyan")) != NULL
&&
570 !strcmp(text
, "La Toner Cyan"))
575 printf("FAIL (\"%s\" instead of \"La Toner Cyan\")\n",
576 text
? text
: "(null)");
579 putenv("LANG=zh_TW");
580 putenv("LC_ALL=zh_TW");
581 putenv("LC_CTYPE=zh_TW");
582 putenv("LC_MESSAGES=zh_TW");
584 fputs("ppdLocalizeMarkerName(zh_TW cyan): ", stdout
);
585 if ((text
= ppdLocalizeMarkerName(ppd
, "cyan")) != NULL
&&
586 !strcmp(text
, "Number 1 Cyan Toner"))
591 printf("FAIL (\"%s\" instead of \"Number 1 Cyan Toner\")\n",
592 text
? text
: "(null)");
598 * Test new constraints...
601 fputs("ppdOpenFile(test2.ppd): ", stdout
);
603 if ((ppd
= ppdOpenFile("test2.ppd")) != NULL
)
607 ppd_status_t err
; /* Last error in file */
608 int line
; /* Line number in file */
612 err
= ppdLastError(&line
);
614 printf("FAIL (%s on line %d)\n", ppdErrorString(err
), line
);
617 fputs("ppdMarkDefaults: ", stdout
);
618 ppdMarkDefaults(ppd
);
620 if ((conflicts
= ppdConflicts(ppd
)) == 0)
625 printf("FAIL (%d conflicts)\n", conflicts
);
628 fputs("ppdEmitString (defaults): ", stdout
);
629 if ((s
= ppdEmitString(ppd
, PPD_ORDER_ANY
, 0.0)) != NULL
&&
630 !strcmp(s
, default2_code
))
635 printf("FAIL (%d bytes instead of %d)\n", s
? (int)strlen(s
) : 0,
636 (int)strlen(default2_code
));
645 fputs("ppdConflicts(): ", stdout
);
646 ppdMarkOption(ppd
, "PageSize", "Env10");
647 ppdMarkOption(ppd
, "InputSlot", "Envelope");
648 ppdMarkOption(ppd
, "Quality", "Photo");
650 if ((conflicts
= ppdConflicts(ppd
)) == 1)
654 printf("FAIL (%d)\n", conflicts
);
658 fputs("cupsResolveConflicts(Quality=Photo): ", stdout
);
661 if (cupsResolveConflicts(ppd
, "Quality", "Photo", &num_options
,
664 printf("FAIL (%d options:", num_options
);
665 for (i
= 0; i
< num_options
; i
++)
666 printf(" %s=%s", options
[i
].name
, options
[i
].value
);
671 puts("PASS (Unable to resolve)");
672 cupsFreeOptions(num_options
, options
);
674 fputs("cupsResolveConflicts(No option/choice): ", stdout
);
677 if (cupsResolveConflicts(ppd
, NULL
, NULL
, &num_options
, &options
) &&
678 num_options
== 1 && !strcasecmp(options
->name
, "Quality") &&
679 !strcasecmp(options
->value
, "Normal"))
681 else if (num_options
> 0)
683 printf("FAIL (%d options:", num_options
);
684 for (i
= 0; i
< num_options
; i
++)
685 printf(" %s=%s", options
[i
].name
, options
[i
].value
);
691 puts("FAIL (Unable to resolve!)");
694 cupsFreeOptions(num_options
, options
);
696 fputs("cupsResolveConflicts(loop test): ", stdout
);
697 ppdMarkOption(ppd
, "PageSize", "A4");
698 ppdMarkOption(ppd
, "InputSlot", "Tray");
699 ppdMarkOption(ppd
, "Quality", "Photo");
702 if (!cupsResolveConflicts(ppd
, NULL
, NULL
, &num_options
, &options
))
704 else if (num_options
> 0)
706 printf("FAIL (%d options:", num_options
);
707 for (i
= 0; i
< num_options
; i
++)
708 printf(" %s=%s", options
[i
].name
, options
[i
].value
);
712 puts("FAIL (No conflicts!)");
714 fputs("ppdInstallableConflict(): ", stdout
);
715 if (ppdInstallableConflict(ppd
, "Duplex", "DuplexNoTumble") &&
716 !ppdInstallableConflict(ppd
, "Duplex", "None"))
718 else if (!ppdInstallableConflict(ppd
, "Duplex", "DuplexNoTumble"))
720 puts("FAIL (Duplex=DuplexNoTumble did not conflict)");
725 puts("FAIL (Duplex=None conflicted)");
733 ppdMarkDefaults(ppd
);
735 fputs("ppdPageSizeLimits(default): ", stdout
);
736 if (ppdPageSizeLimits(ppd
, &minsize
, &maxsize
))
738 if (minsize
.width
!= 36 || minsize
.length
!= 36 ||
739 maxsize
.width
!= 1080 || maxsize
.length
!= 86400)
741 printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, "
742 "expected min=36x36, max=1080x86400)\n", minsize
.width
,
743 minsize
.length
, maxsize
.width
, maxsize
.length
);
751 puts("FAIL (returned 0)");
755 ppdMarkOption(ppd
, "InputSlot", "Manual");
757 fputs("ppdPageSizeLimits(InputSlot=Manual): ", stdout
);
758 if (ppdPageSizeLimits(ppd
, &minsize
, &maxsize
))
760 if (minsize
.width
!= 100 || minsize
.length
!= 100 ||
761 maxsize
.width
!= 1000 || maxsize
.length
!= 1000)
763 printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, "
764 "expected min=100x100, max=1000x1000)\n", minsize
.width
,
765 minsize
.length
, maxsize
.width
, maxsize
.length
);
773 puts("FAIL (returned 0)");
777 ppdMarkOption(ppd
, "Quality", "Photo");
779 fputs("ppdPageSizeLimits(Quality=Photo): ", stdout
);
780 if (ppdPageSizeLimits(ppd
, &minsize
, &maxsize
))
782 if (minsize
.width
!= 200 || minsize
.length
!= 200 ||
783 maxsize
.width
!= 1000 || maxsize
.length
!= 1000)
785 printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, "
786 "expected min=200x200, max=1000x1000)\n", minsize
.width
,
787 minsize
.length
, maxsize
.width
, maxsize
.length
);
795 puts("FAIL (returned 0)");
799 ppdMarkOption(ppd
, "InputSlot", "Tray");
801 fputs("ppdPageSizeLimits(Quality=Photo): ", stdout
);
802 if (ppdPageSizeLimits(ppd
, &minsize
, &maxsize
))
804 if (minsize
.width
!= 300 || minsize
.length
!= 300 ||
805 maxsize
.width
!= 1080 || maxsize
.length
!= 86400)
807 printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, "
808 "expected min=300x300, max=1080x86400)\n", minsize
.width
,
809 minsize
.length
, maxsize
.width
, maxsize
.length
);
817 puts("FAIL (returned 0)");
823 const char *filename
; /* PPD filename */
824 struct stat fileinfo
; /* File information */
827 if (!strncmp(argv
[1], "-d", 2))
829 const char *printer
; /* Printer name */
832 printer
= argv
[1] + 2;
837 puts("Usage: ./testppd -d printer");
841 filename
= cupsGetPPD(printer
);
845 printf("%s: %s\n", printer
, cupsLastErrorString());
852 if (lstat(filename
, &fileinfo
))
854 printf("%s: %s\n", filename
, strerror(errno
));
858 if (S_ISLNK(fileinfo
.st_mode
))
860 char realfile
[1024]; /* Real file path */
861 ssize_t realsize
; /* Size of real file path */
864 if ((realsize
= readlink(filename
, realfile
, sizeof(realfile
) - 1)) < 0)
865 strcpy(realfile
, "Unknown");
867 realfile
[realsize
] = '\0';
869 if (stat(realfile
, &fileinfo
))
870 printf("%s: symlink to \"%s\", %s\n", filename
, realfile
,
873 printf("%s: symlink to \"%s\", %ld bytes\n", filename
, realfile
,
874 (long)fileinfo
.st_size
);
877 printf("%s: regular file, %ld bytes\n", filename
, (long)fileinfo
.st_size
);
879 if ((ppd
= ppdOpenFile(filename
)) == NULL
)
881 ppd_status_t err
; /* Last error in file */
882 int line
; /* Line number in file */
886 err
= ppdLastError(&line
);
888 printf("%s: %s on line %d\n", argv
[1], ppdErrorString(err
), line
);
892 int j
, k
; /* Looping vars */
893 ppd_group_t
*group
; /* Option group */
894 ppd_option_t
*option
; /* Option */
895 ppd_coption_t
*coption
; /* Custom option */
896 ppd_cparam_t
*cparam
; /* Custom parameter */
897 ppd_const_t
*c
; /* UIConstraints */
898 char lang
[255], /* LANG environment variable */
899 lc_all
[255], /* LC_ALL environment variable */
900 lc_ctype
[255], /* LC_CTYPE environment variable */
901 lc_messages
[255];/* LC_MESSAGES environment variable */
906 snprintf(lang
, sizeof(lang
), "LANG=%s", argv
[2]);
908 snprintf(lc_all
, sizeof(lc_all
), "LC_ALL=%s", argv
[2]);
910 snprintf(lc_ctype
, sizeof(lc_ctype
), "LC_CTYPE=%s", argv
[2]);
912 snprintf(lc_messages
, sizeof(lc_messages
), "LC_MESSAGES=%s", argv
[2]);
917 ppdMarkDefaults(ppd
);
921 text
= ppdLocalizeIPPReason(ppd
, argv
[3], NULL
, buffer
, sizeof(buffer
));
922 printf("ppdLocalizeIPPReason(%s)=%s\n", argv
[3],
923 text
? text
: "(null)");
924 return (text
== NULL
);
927 for (i
= ppd
->num_groups
, group
= ppd
->groups
;
931 printf("%s (%s):\n", group
->name
, group
->text
);
933 for (j
= group
->num_options
, option
= group
->options
;
937 printf(" %s (%s):\n", option
->keyword
, option
->text
);
939 for (k
= 0; k
< option
->num_choices
; k
++)
940 printf(" - %s%s (%s)\n",
941 option
->choices
[k
].marked
? "*" : "",
942 option
->choices
[k
].choice
, option
->choices
[k
].text
);
944 if ((coption
= ppdFindCustomOption(ppd
, option
->keyword
)) != NULL
)
946 for (cparam
= (ppd_cparam_t
*)cupsArrayFirst(coption
->params
);
948 cparam
= (ppd_cparam_t
*)cupsArrayNext(coption
->params
))
950 switch (cparam
->type
)
952 case PPD_CUSTOM_CURVE
:
953 printf(" %s(%s): PPD_CUSTOM_CURVE (%g to %g)\n",
954 cparam
->name
, cparam
->text
,
955 cparam
->minimum
.custom_curve
,
956 cparam
->maximum
.custom_curve
);
959 case PPD_CUSTOM_INT
:
960 printf(" %s(%s): PPD_CUSTOM_INT (%d to %d)\n",
961 cparam
->name
, cparam
->text
,
962 cparam
->minimum
.custom_int
,
963 cparam
->maximum
.custom_int
);
966 case PPD_CUSTOM_INVCURVE
:
967 printf(" %s(%s): PPD_CUSTOM_INVCURVE (%g to %g)\n",
968 cparam
->name
, cparam
->text
,
969 cparam
->minimum
.custom_invcurve
,
970 cparam
->maximum
.custom_invcurve
);
973 case PPD_CUSTOM_PASSCODE
:
974 printf(" %s(%s): PPD_CUSTOM_PASSCODE (%d to %d)\n",
975 cparam
->name
, cparam
->text
,
976 cparam
->minimum
.custom_passcode
,
977 cparam
->maximum
.custom_passcode
);
980 case PPD_CUSTOM_PASSWORD
:
981 printf(" %s(%s): PPD_CUSTOM_PASSWORD (%d to %d)\n",
982 cparam
->name
, cparam
->text
,
983 cparam
->minimum
.custom_password
,
984 cparam
->maximum
.custom_password
);
987 case PPD_CUSTOM_POINTS
:
988 printf(" %s(%s): PPD_CUSTOM_POINTS (%g to %g)\n",
989 cparam
->name
, cparam
->text
,
990 cparam
->minimum
.custom_points
,
991 cparam
->maximum
.custom_points
);
994 case PPD_CUSTOM_REAL
:
995 printf(" %s(%s): PPD_CUSTOM_REAL (%g to %g)\n",
996 cparam
->name
, cparam
->text
,
997 cparam
->minimum
.custom_real
,
998 cparam
->maximum
.custom_real
);
1001 case PPD_CUSTOM_STRING
:
1002 printf(" %s(%s): PPD_CUSTOM_STRING (%d to %d)\n",
1003 cparam
->name
, cparam
->text
,
1004 cparam
->minimum
.custom_string
,
1005 cparam
->maximum
.custom_string
);
1014 for (i
= ppd
->num_sizes
, size
= ppd
->sizes
; i
> 0; i
--, size
++)
1015 printf(" %s = %gx%g, [%g %g %g %g]\n", size
->name
, size
->width
,
1016 size
->length
, size
->left
, size
->bottom
, size
->right
, size
->top
);
1018 puts("\nConstraints:");
1020 for (i
= ppd
->num_consts
, c
= ppd
->consts
; i
> 0; i
--, c
++)
1021 printf(" *UIConstraints: *%s %s *%s %s\n", c
->option1
, c
->choice1
,
1022 c
->option2
, c
->choice2
);
1023 if (ppd
->num_consts
== 0)
1024 puts(" NO CONSTRAINTS");
1028 for (i
= 0; i
< ppd
->num_filters
; i
++)
1029 printf(" %s\n", ppd
->filters
[i
]);
1031 if (ppd
->num_filters
== 0)
1032 puts(" NO FILTERS");
1034 puts("\nAttributes:");
1036 for (attr
= (ppd_attr_t
*)cupsArrayFirst(ppd
->sorted_attrs
);
1038 attr
= (ppd_attr_t
*)cupsArrayNext(ppd
->sorted_attrs
))
1039 printf(" *%s %s/%s: \"%s\"\n", attr
->name
, attr
->spec
,
1040 attr
->text
, attr
->value
? attr
->value
: "");
1043 if (!strncmp(argv
[1], "-d", 2))
1048 if (getenv("MallocStackLogging") && getenv("MallocStackLoggingNoCompact"))
1050 char command
[1024]; /* malloc_history command */
1052 snprintf(command
, sizeof(command
), "malloc_history %d -all_by_size",
1057 #endif /* __APPLE__ */
1066 * End of "$Id: testppd.c 7897 2008-09-02 19:33:19Z mike $".