xref: /aosp_15_r20/external/libcups/cups/testconflicts.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
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