1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * PPD constraint test program for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * Copyright 2008-2012 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker *
6*5e7646d2SAndroid Build Coastguard Worker * Licensed under Apache License v2.0. See the file "LICENSE" for more information.
7*5e7646d2SAndroid Build Coastguard Worker */
8*5e7646d2SAndroid Build Coastguard Worker
9*5e7646d2SAndroid Build Coastguard Worker /*
10*5e7646d2SAndroid Build Coastguard Worker * Include necessary headers...
11*5e7646d2SAndroid Build Coastguard Worker */
12*5e7646d2SAndroid Build Coastguard Worker
13*5e7646d2SAndroid Build Coastguard Worker #include "cups.h"
14*5e7646d2SAndroid Build Coastguard Worker #include "ppd.h"
15*5e7646d2SAndroid Build Coastguard Worker #include "string-private.h"
16*5e7646d2SAndroid Build Coastguard Worker
17*5e7646d2SAndroid Build Coastguard Worker
18*5e7646d2SAndroid Build Coastguard Worker /*
19*5e7646d2SAndroid Build Coastguard Worker * 'main()' - Main entry.
20*5e7646d2SAndroid Build Coastguard Worker */
21*5e7646d2SAndroid Build Coastguard Worker
22*5e7646d2SAndroid Build Coastguard Worker int /* O - Exit status */
main(int argc,char * argv[])23*5e7646d2SAndroid Build Coastguard Worker main(int argc, /* I - Number of command-line arguments */
24*5e7646d2SAndroid Build Coastguard Worker char *argv[]) /* I - Command-line arguments */
25*5e7646d2SAndroid Build Coastguard Worker {
26*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
27*5e7646d2SAndroid Build Coastguard Worker ppd_file_t *ppd; /* PPD file loaded from disk */
28*5e7646d2SAndroid Build Coastguard Worker char line[256], /* Input buffer */
29*5e7646d2SAndroid Build Coastguard Worker *ptr, /* Pointer into buffer */
30*5e7646d2SAndroid Build Coastguard Worker *optr, /* Pointer to first option name */
31*5e7646d2SAndroid Build Coastguard Worker *cptr; /* Pointer to first choice */
32*5e7646d2SAndroid Build Coastguard Worker int num_options; /* Number of options */
33*5e7646d2SAndroid Build Coastguard Worker cups_option_t *options; /* Options */
34*5e7646d2SAndroid Build Coastguard Worker char *option, /* Current option */
35*5e7646d2SAndroid Build Coastguard Worker *choice; /* Current choice */
36*5e7646d2SAndroid Build Coastguard Worker
37*5e7646d2SAndroid Build Coastguard Worker
38*5e7646d2SAndroid Build Coastguard Worker if (argc != 2)
39*5e7646d2SAndroid Build Coastguard Worker {
40*5e7646d2SAndroid Build Coastguard Worker puts("Usage: testconflicts filename.ppd");
41*5e7646d2SAndroid Build Coastguard Worker return (1);
42*5e7646d2SAndroid Build Coastguard Worker }
43*5e7646d2SAndroid Build Coastguard Worker
44*5e7646d2SAndroid Build Coastguard Worker if ((ppd = ppdOpenFile(argv[1])) == NULL)
45*5e7646d2SAndroid Build Coastguard Worker {
46*5e7646d2SAndroid Build Coastguard Worker ppd_status_t err; /* Last error in file */
47*5e7646d2SAndroid Build Coastguard Worker int linenum; /* Line number in file */
48*5e7646d2SAndroid Build Coastguard Worker
49*5e7646d2SAndroid Build Coastguard Worker err = ppdLastError(&linenum);
50*5e7646d2SAndroid Build Coastguard Worker
51*5e7646d2SAndroid Build Coastguard Worker printf("Unable to open PPD file \"%s\": %s on line %d\n", argv[1],
52*5e7646d2SAndroid Build Coastguard Worker ppdErrorString(err), linenum);
53*5e7646d2SAndroid Build Coastguard Worker return (1);
54*5e7646d2SAndroid Build Coastguard Worker }
55*5e7646d2SAndroid Build Coastguard Worker
56*5e7646d2SAndroid Build Coastguard Worker ppdMarkDefaults(ppd);
57*5e7646d2SAndroid Build Coastguard Worker
58*5e7646d2SAndroid Build Coastguard Worker option = NULL;
59*5e7646d2SAndroid Build Coastguard Worker choice = NULL;
60*5e7646d2SAndroid Build Coastguard Worker
61*5e7646d2SAndroid Build Coastguard Worker for (;;)
62*5e7646d2SAndroid Build Coastguard Worker {
63*5e7646d2SAndroid Build Coastguard Worker num_options = 0;
64*5e7646d2SAndroid Build Coastguard Worker options = NULL;
65*5e7646d2SAndroid Build Coastguard Worker
66*5e7646d2SAndroid Build Coastguard Worker if (!cupsResolveConflicts(ppd, option, choice, &num_options, &options))
67*5e7646d2SAndroid Build Coastguard Worker puts("Unable to resolve conflicts!");
68*5e7646d2SAndroid Build Coastguard Worker else if ((!option && num_options > 0) || (option && num_options > 1))
69*5e7646d2SAndroid Build Coastguard Worker {
70*5e7646d2SAndroid Build Coastguard Worker fputs("Resolved conflicts with the following options:\n ", stdout);
71*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < num_options; i ++)
72*5e7646d2SAndroid Build Coastguard Worker if (!option || _cups_strcasecmp(option, options[i].name))
73*5e7646d2SAndroid Build Coastguard Worker printf(" %s=%s", options[i].name, options[i].value);
74*5e7646d2SAndroid Build Coastguard Worker putchar('\n');
75*5e7646d2SAndroid Build Coastguard Worker
76*5e7646d2SAndroid Build Coastguard Worker cupsFreeOptions(num_options, options);
77*5e7646d2SAndroid Build Coastguard Worker }
78*5e7646d2SAndroid Build Coastguard Worker
79*5e7646d2SAndroid Build Coastguard Worker if (option)
80*5e7646d2SAndroid Build Coastguard Worker {
81*5e7646d2SAndroid Build Coastguard Worker free(option);
82*5e7646d2SAndroid Build Coastguard Worker option = NULL;
83*5e7646d2SAndroid Build Coastguard Worker }
84*5e7646d2SAndroid Build Coastguard Worker
85*5e7646d2SAndroid Build Coastguard Worker if (choice)
86*5e7646d2SAndroid Build Coastguard Worker {
87*5e7646d2SAndroid Build Coastguard Worker free(choice);
88*5e7646d2SAndroid Build Coastguard Worker choice = NULL;
89*5e7646d2SAndroid Build Coastguard Worker }
90*5e7646d2SAndroid Build Coastguard Worker
91*5e7646d2SAndroid Build Coastguard Worker printf("\nNew Option(s): ");
92*5e7646d2SAndroid Build Coastguard Worker fflush(stdout);
93*5e7646d2SAndroid Build Coastguard Worker if (!fgets(line, sizeof(line), stdin) || line[0] == '\n')
94*5e7646d2SAndroid Build Coastguard Worker break;
95*5e7646d2SAndroid Build Coastguard Worker
96*5e7646d2SAndroid Build Coastguard Worker for (ptr = line; isspace(*ptr & 255); ptr ++);
97*5e7646d2SAndroid Build Coastguard Worker for (optr = ptr; *ptr && *ptr != '='; ptr ++);
98*5e7646d2SAndroid Build Coastguard Worker if (!*ptr)
99*5e7646d2SAndroid Build Coastguard Worker break;
100*5e7646d2SAndroid Build Coastguard Worker for (*ptr++ = '\0', cptr = ptr; *ptr && !isspace(*ptr & 255); ptr ++);
101*5e7646d2SAndroid Build Coastguard Worker if (!*ptr)
102*5e7646d2SAndroid Build Coastguard Worker break;
103*5e7646d2SAndroid Build Coastguard Worker *ptr++ = '\0';
104*5e7646d2SAndroid Build Coastguard Worker
105*5e7646d2SAndroid Build Coastguard Worker option = strdup(optr);
106*5e7646d2SAndroid Build Coastguard Worker choice = strdup(cptr);
107*5e7646d2SAndroid Build Coastguard Worker num_options = cupsParseOptions(ptr, 0, &options);
108*5e7646d2SAndroid Build Coastguard Worker
109*5e7646d2SAndroid Build Coastguard Worker ppdMarkOption(ppd, option, choice);
110*5e7646d2SAndroid Build Coastguard Worker if (cupsMarkOptions(ppd, num_options, options))
111*5e7646d2SAndroid Build Coastguard Worker puts("Options Conflict!");
112*5e7646d2SAndroid Build Coastguard Worker cupsFreeOptions(num_options, options);
113*5e7646d2SAndroid Build Coastguard Worker }
114*5e7646d2SAndroid Build Coastguard Worker
115*5e7646d2SAndroid Build Coastguard Worker if (option)
116*5e7646d2SAndroid Build Coastguard Worker free(option);
117*5e7646d2SAndroid Build Coastguard Worker if (choice)
118*5e7646d2SAndroid Build Coastguard Worker free(choice);
119*5e7646d2SAndroid Build Coastguard Worker
120*5e7646d2SAndroid Build Coastguard Worker return (0);
121*5e7646d2SAndroid Build Coastguard Worker }
122