2 * "$Id: testppd.c 9793 2011-05-20 03:49:49Z mike $"
4 * PPD test program for CUPS.
6 * Copyright 2007-2011 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 _cups_strcasecmp(val, "Letter") ||
305 (val = cupsGetOption("PageSize", num_options, options)) == NULL ||
306 _cups_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 && !_cups_strcasecmp(options[0].name, "InputSlot") &&
356 !_cups_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=oe_letter-fullbleed_8.5x11in): ", stdout);
445 num_options = cupsAddOption("media", "oe_letter-fullbleed_8.5x11in", 0,
447 cupsMarkOptions(ppd, num_options, options);
448 cupsFreeOptions(num_options, options);
450 size = ppdPageSize(ppd, NULL);
451 if (!size || strcmp(size->name, "Letter.Fullbleed"))
453 printf("FAIL (%s)\n", size ? size->name : "unknown");
459 fputs("cupsMarkOptions(media=A4): ", stdout);
460 num_options = cupsAddOption("media", "A4", 0, &options);
461 cupsMarkOptions(ppd, num_options, options);
462 cupsFreeOptions(num_options, options);
464 size = ppdPageSize(ppd, NULL);
465 if (!size || strcmp(size->name, "A4"))
467 printf("FAIL (%s)\n", size ? size->name : "unknown");
474 * Test localization...
477 fputs("ppdLocalizeIPPReason(text): ", stdout);
478 if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) &&
479 !strcmp(buffer, "Foo Reason"))
484 printf("FAIL (\"%s\" instead of \"Foo Reason\")\n", buffer);
487 fputs("ppdLocalizeIPPReason(http): ", stdout);
488 if (ppdLocalizeIPPReason(ppd, "foo", "http", buffer, sizeof(buffer)) &&
489 !strcmp(buffer, "http://foo/bar.html"))
494 printf("FAIL (\"%s\" instead of \"http://foo/bar.html\")\n", buffer);
497 fputs("ppdLocalizeIPPReason(help): ", stdout);
498 if (ppdLocalizeIPPReason(ppd, "foo", "help", buffer, sizeof(buffer)) &&
499 !strcmp(buffer, "help:anchor='foo'%20bookID=Vendor%20Help"))
504 printf("FAIL (\"%s\" instead of \"help:anchor='foo'%%20bookID=Vendor%%20Help\")\n", buffer);
507 fputs("ppdLocalizeIPPReason(file): ", stdout);
508 if (ppdLocalizeIPPReason(ppd, "foo", "file", buffer, sizeof(buffer)) &&
509 !strcmp(buffer, "/help/foo/bar.html"))
514 printf("FAIL (\"%s\" instead of \"/help/foo/bar.html\")\n", buffer);
519 putenv("LC_CTYPE=fr");
520 putenv("LC_MESSAGES=fr");
522 fputs("ppdLocalizeIPPReason(fr text): ", stdout);
523 if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) &&
524 !strcmp(buffer, "La Long Foo Reason"))
529 printf("FAIL (\"%s\" instead of \"La Long Foo Reason\")\n", buffer);
532 putenv("LANG=zh_TW");
533 putenv("LC_ALL=zh_TW");
534 putenv("LC_CTYPE=zh_TW");
535 putenv("LC_MESSAGES=zh_TW");
537 fputs("ppdLocalizeIPPReason(zh_TW text): ", stdout);
538 if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) &&
539 !strcmp(buffer, "Number 1 Foo Reason"))
544 printf("FAIL (\"%s\" instead of \"Number 1 Foo Reason\")\n", buffer);
548 * cupsMarkerName localization...
553 putenv("LC_CTYPE=en");
554 putenv("LC_MESSAGES=en");
556 fputs("ppdLocalizeMarkerName(bogus): ", stdout);
558 if ((text = ppdLocalizeMarkerName(ppd, "bogus")) != NULL)
561 printf("FAIL (\"%s\" instead of NULL)\n", text);
566 fputs("ppdLocalizeMarkerName(cyan): ", stdout);
568 if ((text = ppdLocalizeMarkerName(ppd, "cyan")) != NULL &&
569 !strcmp(text, "Cyan Toner"))
574 printf("FAIL (\"%s\" instead of \"Cyan Toner\")\n",
575 text ? text : "(null)");
580 putenv("LC_CTYPE=fr");
581 putenv("LC_MESSAGES=fr");
583 fputs("ppdLocalizeMarkerName(fr cyan): ", stdout);
584 if ((text = ppdLocalizeMarkerName(ppd, "cyan")) != NULL &&
585 !strcmp(text, "La Toner Cyan"))
590 printf("FAIL (\"%s\" instead of \"La Toner Cyan\")\n",
591 text ? text : "(null)");
594 putenv("LANG=zh_TW");
595 putenv("LC_ALL=zh_TW");
596 putenv("LC_CTYPE=zh_TW");
597 putenv("LC_MESSAGES=zh_TW");
599 fputs("ppdLocalizeMarkerName(zh_TW cyan): ", stdout);
600 if ((text = ppdLocalizeMarkerName(ppd, "cyan")) != NULL &&
601 !strcmp(text, "Number 1 Cyan Toner"))
606 printf("FAIL (\"%s\" instead of \"Number 1 Cyan Toner\")\n",
607 text ? text : "(null)");
613 * Test new constraints...
616 fputs("ppdOpenFile(test2.ppd): ", stdout);
618 if ((ppd = ppdOpenFile("test2.ppd")) != NULL)
622 ppd_status_t err; /* Last error in file */
623 int line; /* Line number in file */
627 err = ppdLastError(&line);
629 printf("FAIL (%s on line %d)\n", ppdErrorString(err), line);
632 fputs("ppdMarkDefaults: ", stdout);
633 ppdMarkDefaults(ppd);
635 if ((conflicts = ppdConflicts(ppd)) == 0)
640 printf("FAIL (%d conflicts)\n", conflicts);
643 fputs("ppdEmitString (defaults): ", stdout);
644 if ((s = ppdEmitString(ppd, PPD_ORDER_ANY, 0.0)) != NULL &&
645 !strcmp(s, default2_code))
650 printf("FAIL (%d bytes instead of %d)\n", s ? (int)strlen(s) : 0,
651 (int)strlen(default2_code));
660 fputs("ppdConflicts(): ", stdout);
661 ppdMarkOption(ppd, "PageSize", "Env10");
662 ppdMarkOption(ppd, "InputSlot", "Envelope");
663 ppdMarkOption(ppd, "Quality", "Photo");
665 if ((conflicts = ppdConflicts(ppd)) == 1)
669 printf("FAIL (%d)\n", conflicts);
673 fputs("cupsResolveConflicts(Quality=Photo): ", stdout);
676 if (cupsResolveConflicts(ppd, "Quality", "Photo", &num_options,
679 printf("FAIL (%d options:", num_options);
680 for (i = 0; i < num_options; i ++)
681 printf(" %s=%s", options[i].name, options[i].value);
686 puts("PASS (Unable to resolve)");
687 cupsFreeOptions(num_options, options);
689 fputs("cupsResolveConflicts(No option/choice): ", stdout);
692 if (cupsResolveConflicts(ppd, NULL, NULL, &num_options, &options) &&
693 num_options == 1 && !_cups_strcasecmp(options->name, "Quality") &&
694 !_cups_strcasecmp(options->value, "Normal"))
696 else if (num_options > 0)
698 printf("FAIL (%d options:", num_options);
699 for (i = 0; i < num_options; i ++)
700 printf(" %s=%s", options[i].name, options[i].value);
706 puts("FAIL (Unable to resolve!)");
709 cupsFreeOptions(num_options, options);
711 fputs("cupsResolveConflicts(loop test): ", stdout);
712 ppdMarkOption(ppd, "PageSize", "A4");
713 ppdMarkOption(ppd, "InputSlot", "Tray");
714 ppdMarkOption(ppd, "Quality", "Photo");
717 if (!cupsResolveConflicts(ppd, NULL, NULL, &num_options, &options))
719 else if (num_options > 0)
721 printf("FAIL (%d options:", num_options);
722 for (i = 0; i < num_options; i ++)
723 printf(" %s=%s", options[i].name, options[i].value);
727 puts("FAIL (No conflicts!)");
729 fputs("ppdInstallableConflict(): ", stdout);
730 if (ppdInstallableConflict(ppd, "Duplex", "DuplexNoTumble") &&
731 !ppdInstallableConflict(ppd, "Duplex", "None"))
733 else if (!ppdInstallableConflict(ppd, "Duplex", "DuplexNoTumble"))
735 puts("FAIL (Duplex=DuplexNoTumble did not conflict)");
740 puts("FAIL (Duplex=None conflicted)");
748 ppdMarkDefaults(ppd);
750 fputs("ppdPageSizeLimits(default): ", stdout);
751 if (ppdPageSizeLimits(ppd, &minsize, &maxsize))
753 if (minsize.width != 36 || minsize.length != 36 ||
754 maxsize.width != 1080 || maxsize.length != 86400)
756 printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, "
757 "expected min=36x36, max=1080x86400)\n", minsize.width,
758 minsize.length, maxsize.width, maxsize.length);
766 puts("FAIL (returned 0)");
770 ppdMarkOption(ppd, "InputSlot", "Manual");
772 fputs("ppdPageSizeLimits(InputSlot=Manual): ", stdout);
773 if (ppdPageSizeLimits(ppd, &minsize, &maxsize))
775 if (minsize.width != 100 || minsize.length != 100 ||
776 maxsize.width != 1000 || maxsize.length != 1000)
778 printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, "
779 "expected min=100x100, max=1000x1000)\n", minsize.width,
780 minsize.length, maxsize.width, maxsize.length);
788 puts("FAIL (returned 0)");
792 ppdMarkOption(ppd, "Quality", "Photo");
794 fputs("ppdPageSizeLimits(Quality=Photo): ", stdout);
795 if (ppdPageSizeLimits(ppd, &minsize, &maxsize))
797 if (minsize.width != 200 || minsize.length != 200 ||
798 maxsize.width != 1000 || maxsize.length != 1000)
800 printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, "
801 "expected min=200x200, max=1000x1000)\n", minsize.width,
802 minsize.length, maxsize.width, maxsize.length);
810 puts("FAIL (returned 0)");
814 ppdMarkOption(ppd, "InputSlot", "Tray");
816 fputs("ppdPageSizeLimits(Quality=Photo): ", stdout);
817 if (ppdPageSizeLimits(ppd, &minsize, &maxsize))
819 if (minsize.width != 300 || minsize.length != 300 ||
820 maxsize.width != 1080 || maxsize.length != 86400)
822 printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, "
823 "expected min=300x300, max=1080x86400)\n", minsize.width,
824 minsize.length, maxsize.width, maxsize.length);
832 puts("FAIL (returned 0)");
838 const char *filename; /* PPD filename */
839 struct stat fileinfo; /* File information */
842 if (!strncmp(argv[1], "-d", 2))
844 const char *printer; /* Printer name */
847 printer = argv[1] + 2;
852 puts("Usage: ./testppd -d printer");
856 filename = cupsGetPPD(printer);
860 printf("%s: %s\n", printer, cupsLastErrorString());
867 if (lstat(filename, &fileinfo))
869 printf("%s: %s\n", filename, strerror(errno));
873 if (S_ISLNK(fileinfo.st_mode))
875 char realfile[1024]; /* Real file path */
876 ssize_t realsize; /* Size of real file path */
879 if ((realsize = readlink(filename, realfile, sizeof(realfile) - 1)) < 0)
880 strcpy(realfile, "Unknown");
882 realfile[realsize] = '\0';
884 if (stat(realfile, &fileinfo))
885 printf("%s: symlink to \"%s\", %s\n", filename, realfile,
888 printf("%s: symlink to \"%s\", %ld bytes\n", filename, realfile,
889 (long)fileinfo.st_size);
892 printf("%s: regular file, %ld bytes\n", filename, (long)fileinfo.st_size);
894 if ((ppd = ppdOpenFile(filename)) == NULL)
896 ppd_status_t err; /* Last error in file */
897 int line; /* Line number in file */
901 err = ppdLastError(&line);
903 printf("%s: %s on line %d\n", argv[1], ppdErrorString(err), line);
907 int j, k; /* Looping vars */
908 ppd_group_t *group; /* Option group */
909 ppd_option_t *option; /* Option */
910 ppd_coption_t *coption; /* Custom option */
911 ppd_cparam_t *cparam; /* Custom parameter */
912 ppd_const_t *c; /* UIConstraints */
913 char lang[255], /* LANG environment variable */
914 lc_all[255], /* LC_ALL environment variable */
915 lc_ctype[255], /* LC_CTYPE environment variable */
916 lc_messages[255];/* LC_MESSAGES environment variable */
921 snprintf(lang, sizeof(lang), "LANG=%s", argv[2]);
923 snprintf(lc_all, sizeof(lc_all), "LC_ALL=%s", argv[2]);
925 snprintf(lc_ctype, sizeof(lc_ctype), "LC_CTYPE=%s", argv[2]);
927 snprintf(lc_messages, sizeof(lc_messages), "LC_MESSAGES=%s", argv[2]);
932 ppdMarkDefaults(ppd);
936 text = ppdLocalizeIPPReason(ppd, argv[3], NULL, buffer, sizeof(buffer));
937 printf("ppdLocalizeIPPReason(%s)=%s\n", argv[3],
938 text ? text : "(null)");
939 return (text == NULL);
942 for (i = ppd->num_groups, group = ppd->groups;
946 printf("%s (%s):\n", group->name, group->text);
948 for (j = group->num_options, option = group->options;
952 printf(" %s (%s):\n", option->keyword, option->text);
954 for (k = 0; k < option->num_choices; k ++)
955 printf(" - %s%s (%s)\n",
956 option->choices[k].marked ? "*" : "",
957 option->choices[k].choice, option->choices[k].text);
959 if ((coption = ppdFindCustomOption(ppd, option->keyword)) != NULL)
961 for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params);
963 cparam = (ppd_cparam_t *)cupsArrayNext(coption->params))
965 switch (cparam->type)
967 case PPD_CUSTOM_CURVE :
968 printf(" %s(%s): PPD_CUSTOM_CURVE (%g to %g)\n",
969 cparam->name, cparam->text,
970 cparam->minimum.custom_curve,
971 cparam->maximum.custom_curve);
974 case PPD_CUSTOM_INT :
975 printf(" %s(%s): PPD_CUSTOM_INT (%d to %d)\n",
976 cparam->name, cparam->text,
977 cparam->minimum.custom_int,
978 cparam->maximum.custom_int);
981 case PPD_CUSTOM_INVCURVE :
982 printf(" %s(%s): PPD_CUSTOM_INVCURVE (%g to %g)\n",
983 cparam->name, cparam->text,
984 cparam->minimum.custom_invcurve,
985 cparam->maximum.custom_invcurve);
988 case PPD_CUSTOM_PASSCODE :
989 printf(" %s(%s): PPD_CUSTOM_PASSCODE (%d to %d)\n",
990 cparam->name, cparam->text,
991 cparam->minimum.custom_passcode,
992 cparam->maximum.custom_passcode);
995 case PPD_CUSTOM_PASSWORD :
996 printf(" %s(%s): PPD_CUSTOM_PASSWORD (%d to %d)\n",
997 cparam->name, cparam->text,
998 cparam->minimum.custom_password,
999 cparam->maximum.custom_password);
1002 case PPD_CUSTOM_POINTS :
1003 printf(" %s(%s): PPD_CUSTOM_POINTS (%g to %g)\n",
1004 cparam->name, cparam->text,
1005 cparam->minimum.custom_points,
1006 cparam->maximum.custom_points);
1009 case PPD_CUSTOM_REAL :
1010 printf(" %s(%s): PPD_CUSTOM_REAL (%g to %g)\n",
1011 cparam->name, cparam->text,
1012 cparam->minimum.custom_real,
1013 cparam->maximum.custom_real);
1016 case PPD_CUSTOM_STRING :
1017 printf(" %s(%s): PPD_CUSTOM_STRING (%d to %d)\n",
1018 cparam->name, cparam->text,
1019 cparam->minimum.custom_string,
1020 cparam->maximum.custom_string);
1029 for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++)
1030 printf(" %s = %gx%g, [%g %g %g %g]\n", size->name, size->width,
1031 size->length, size->left, size->bottom, size->right, size->top);
1033 puts("\nConstraints:");
1035 for (i = ppd->num_consts, c = ppd->consts; i > 0; i --, c ++)
1036 printf(" *UIConstraints: *%s %s *%s %s\n", c->option1, c->choice1,
1037 c->option2, c->choice2);
1038 if (ppd->num_consts == 0)
1039 puts(" NO CONSTRAINTS");
1043 for (i = 0; i < ppd->num_filters; i ++)
1044 printf(" %s\n", ppd->filters[i]);
1046 if (ppd->num_filters == 0)
1047 puts(" NO FILTERS");
1049 puts("\nAttributes:");
1051 for (attr = (ppd_attr_t *)cupsArrayFirst(ppd->sorted_attrs);
1053 attr = (ppd_attr_t *)cupsArrayNext(ppd->sorted_attrs))
1054 printf(" *%s %s/%s: \"%s\"\n", attr->name, attr->spec,
1055 attr->text, attr->value ? attr->value : "");
1058 if (!strncmp(argv[1], "-d", 2))
1063 if (getenv("MallocStackLogging") && getenv("MallocStackLoggingNoCompact"))
1065 char command[1024]; /* malloc_history command */
1067 snprintf(command, sizeof(command), "malloc_history %d -all_by_size",
1072 #endif /* __APPLE__ */
1081 * End of "$Id: testppd.c 9793 2011-05-20 03:49:49Z mike $".