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