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