]>
git.ipfire.org Git - thirdparty/cups.git/blob - cups/mark.c
2 * "$Id: mark.c 5529 2006-05-15 20:06:46Z mike $"
4 * Option marking routines for the Common UNIX Printing System (CUPS).
6 * Copyright 1997-2006 by Easy Software Products, all rights reserved.
8 * These coded instructions, statements, and computer programs are the
9 * property of Easy Software Products and are protected by Federal
10 * copyright law. Distribution and use rights are outlined in the file
11 * "LICENSE.txt" which should have been included with this file. If this
12 * file is missing or damaged please contact Easy Software Products
15 * Attn: CUPS Licensing Information
16 * Easy Software Products
17 * 44141 Airport View Drive, Suite 204
18 * Hollywood, Maryland 20636 USA
20 * Voice: (301) 373-9600
21 * EMail: cups-info@cups.org
22 * WWW: http://www.cups.org
24 * PostScript is a trademark of Adobe Systems, Inc.
26 * This file is subject to the Apple OS-Developed Software exception.
30 * ppdConflicts() - Check to see if there are any conflicts.
31 * ppdFindChoice() - Return a pointer to an option choice.
32 * ppdFindMarkedChoice() - Return the marked choice for the specified option.
33 * ppdFindOption() - Return a pointer to the specified option.
34 * ppdFirstOption() - Return the first option in the PPD file.
35 * ppdNextOption() - Return the next option in the PPD file.
36 * ppdIsMarked() - Check to see if an option is marked...
37 * ppdMarkDefaults() - Mark all default options in the PPD file.
38 * ppdMarkOption() - Mark an option in a PPD file.
39 * ppd_defaults() - Set the defaults for this group and all sub-groups.
43 * Include necessary headers...
55 static void ppd_defaults(ppd_file_t
*ppd
, ppd_group_t
*g
);
59 * 'ppdConflicts()' - Check to see if there are any conflicts.
62 int /* O - Number of conflicts found */
63 ppdConflicts(ppd_file_t
*ppd
) /* I - PPD to check */
65 int i
, j
, k
, /* Looping variables */
66 conflicts
; /* Number of conflicts */
67 ppd_const_t
*c
; /* Current constraint */
68 ppd_group_t
*g
, *sg
; /* Groups */
69 ppd_option_t
*o1
, *o2
; /* Options */
70 ppd_choice_t
*c1
, *c2
; /* Choices */
77 * Clear all conflicts...
82 for (i
= ppd
->num_groups
, g
= ppd
->groups
; i
> 0; i
--, g
++)
84 for (j
= g
->num_options
, o1
= g
->options
; j
> 0; j
--, o1
++)
87 for (j
= g
->num_subgroups
, sg
= g
->subgroups
; j
> 0; j
--, sg
++)
88 for (k
= sg
->num_options
, o1
= sg
->options
; k
> 0; k
--, o1
++)
93 * Loop through all of the UI constraints and flag any options
97 for (i
= ppd
->num_consts
, c
= ppd
->consts
; i
> 0; i
--, c
++)
100 * Grab pointers to the first option...
103 o1
= ppdFindOption(ppd
, c
->option1
);
107 else if (c
->choice1
[0] != '\0')
110 * This constraint maps to a specific choice.
113 c1
= ppdFindChoice(o1
, c
->choice1
);
118 * This constraint applies to any choice for this option.
121 for (j
= o1
->num_choices
, c1
= o1
->choices
; j
> 0; j
--, c1
++)
126 strcasecmp(c1
->choice
, "None") == 0 ||
127 strcasecmp(c1
->choice
, "Off") == 0 ||
128 strcasecmp(c1
->choice
, "False") == 0)
133 * Grab pointers to the second option...
136 o2
= ppdFindOption(ppd
, c
->option2
);
140 else if (c
->choice2
[0] != '\0')
143 * This constraint maps to a specific choice.
146 c2
= ppdFindChoice(o2
, c
->choice2
);
151 * This constraint applies to any choice for this option.
154 for (j
= o2
->num_choices
, c2
= o2
->choices
; j
> 0; j
--, c2
++)
159 strcasecmp(c2
->choice
, "None") == 0 ||
160 strcasecmp(c2
->choice
, "Off") == 0 ||
161 strcasecmp(c2
->choice
, "False") == 0)
166 * If both options are marked then there is a conflict...
169 if (c1
!= NULL
&& c1
->marked
&&
170 c2
!= NULL
&& c2
->marked
)
172 DEBUG_printf(("%s->%s conflicts with %s->%s (%s %s %s %s)\n",
173 o1
->keyword
, c1
->choice
, o2
->keyword
, c2
->choice
,
174 c
->option1
, c
->choice1
, c
->option2
, c
->choice2
));
182 * Return the number of conflicts found...
190 * 'ppdFindChoice()' - Return a pointer to an option choice.
193 ppd_choice_t
* /* O - Choice pointer or NULL */
194 ppdFindChoice(ppd_option_t
*o
, /* I - Pointer to option */
195 const char *choice
) /* I - Name of choice */
197 int i
; /* Looping var */
198 ppd_choice_t
*c
; /* Current choice */
201 if (o
== NULL
|| choice
== NULL
)
204 for (i
= o
->num_choices
, c
= o
->choices
; i
> 0; i
--, c
++)
205 if (strcasecmp(c
->choice
, choice
) == 0)
213 * 'ppdFindMarkedChoice()' - Return the marked choice for the specified option.
216 ppd_choice_t
* /* O - Pointer to choice or NULL */
217 ppdFindMarkedChoice(ppd_file_t
*ppd
, /* I - PPD file */
218 const char *option
) /* I - Keyword/option name */
220 int i
; /* Looping var */
221 ppd_option_t
*o
; /* Pointer to option */
222 ppd_choice_t
*c
; /* Pointer to choice */
225 if ((o
= ppdFindOption(ppd
, option
)) == NULL
)
228 for (i
= o
->num_choices
, c
= o
->choices
; i
> 0; i
--, c
++)
237 * 'ppdFindOption()' - Return a pointer to the specified option.
240 ppd_option_t
* /* O - Pointer to option or NULL */
241 ppdFindOption(ppd_file_t
*ppd
, /* I - PPD file data */
242 const char *option
) /* I - Option/Keyword name */
245 * Range check input...
254 * Search in the array...
257 ppd_option_t key
; /* Option search key */
260 strlcpy(key
.keyword
, option
, sizeof(key
.keyword
));
262 return ((ppd_option_t
*)cupsArrayFind(ppd
->options
, &key
));
267 * Search in each group...
270 int i
, j
; /* Looping vars */
271 ppd_group_t
*group
; /* Current group */
272 ppd_option_t
*optptr
; /* Current option */
275 for (i
= ppd
->num_groups
, group
= ppd
->groups
; i
> 0; i
--, group
++)
276 for (j
= group
->num_options
, optptr
= group
->options
;
279 if (!strcasecmp(optptr
->keyword
, option
))
288 * 'ppdIsMarked()' - Check to see if an option is marked...
291 int /* O - Non-zero if option is marked */
292 ppdIsMarked(ppd_file_t
*ppd
, /* I - PPD file data */
293 const char *option
, /* I - Option/Keyword name */
294 const char *choice
) /* I - Choice name */
296 ppd_option_t
*o
; /* Option pointer */
297 ppd_choice_t
*c
; /* Choice pointer */
303 if ((o
= ppdFindOption(ppd
, option
)) == NULL
)
306 if ((c
= ppdFindChoice(o
, choice
)) == NULL
)
314 * 'ppdMarkDefaults()' - Mark all default options in the PPD file.
318 ppdMarkDefaults(ppd_file_t
*ppd
)/* I - PPD file record */
320 int i
; /* Looping variables */
321 ppd_group_t
*g
; /* Current group */
327 for (i
= ppd
->num_groups
, g
= ppd
->groups
; i
> 0; i
--, g
++)
328 ppd_defaults(ppd
, g
);
333 * 'ppdMarkOption()' - Mark an option in a PPD file.
337 * -1 is returned if the given option would conflict with any currently
341 int /* O - Number of conflicts */
342 ppdMarkOption(ppd_file_t
*ppd
, /* I - PPD file record */
343 const char *option
, /* I - Keyword */
344 const char *choice
) /* I - Option name */
346 int i
, j
; /* Looping vars */
347 ppd_option_t
*o
; /* Option pointer */
348 ppd_choice_t
*c
; /* Choice pointer */
349 struct lconv
*loc
; /* Locale data */
352 DEBUG_printf(("ppdMarkOption(ppd=%p, option=\"%s\", choice=\"%s\")\n",
353 ppd
, option
, choice
));
356 * Range check input...
359 if (!ppd
|| !option
|| !choice
)
363 * AP_D_InputSlot is the "default input slot" on MacOS X, and setting
364 * it clears the regular InputSlot choices...
367 if (!strcasecmp(option
, "AP_D_InputSlot"))
369 if ((o
= ppdFindOption(ppd
, "InputSlot")) != NULL
)
370 for (i
= 0; i
< o
->num_choices
; i
++)
371 o
->choices
[i
].marked
= 0;
375 * Check for custom options...
378 if ((o
= ppdFindOption(ppd
, option
)) == NULL
)
383 if (!strncasecmp(choice
, "Custom.", 7))
386 * Handle a custom option...
389 if ((c
= ppdFindChoice(o
, "Custom")) == NULL
)
392 if (!strcasecmp(option
, "PageSize"))
395 * Handle custom page sizes...
398 ppdPageSize(ppd
, choice
);
403 * Handle other custom options...
406 ppd_coption_t
*coption
; /* Custom option */
407 ppd_cparam_t
*cparam
; /* Custom parameter */
408 char *units
; /* Custom points units */
410 if ((coption
= ppdFindCustomOption(ppd
, option
)) != NULL
)
412 if ((cparam
= (ppd_cparam_t
*)cupsArrayFirst(coption
->params
)) == NULL
)
415 switch (cparam
->type
)
417 case PPD_CUSTOM_CURVE
:
418 case PPD_CUSTOM_INVCURVE
:
419 case PPD_CUSTOM_REAL
:
420 cparam
->current
.custom_real
= _cupsStrScand(choice
+ 7, NULL
,
424 case PPD_CUSTOM_POINTS
:
425 cparam
->current
.custom_points
= _cupsStrScand(choice
+ 7,
430 if (!strcasecmp(units
, "cm"))
431 cparam
->current
.custom_points
*= 72.0 / 2.54;
432 else if (!strcasecmp(units
, "mm"))
433 cparam
->current
.custom_points
*= 72.0 / 25.4;
434 else if (!strcasecmp(units
, "m"))
435 cparam
->current
.custom_points
*= 72.0 / 0.0254;
436 else if (!strcasecmp(units
, "in"))
437 cparam
->current
.custom_points
*= 72.0;
438 else if (!strcasecmp(units
, "ft"))
439 cparam
->current
.custom_points
*= 12 * 72.0;
443 case PPD_CUSTOM_INT
:
444 cparam
->current
.custom_int
= atoi(choice
+ 7);
447 case PPD_CUSTOM_PASSCODE
:
448 case PPD_CUSTOM_PASSWORD
:
449 case PPD_CUSTOM_STRING
:
450 if (cparam
->current
.custom_string
)
451 free(cparam
->current
.custom_string
);
453 cparam
->current
.custom_string
= strdup(choice
+ 7);
459 else if (choice
[0] == '{')
462 * Handle multi-value custom options...
465 ppd_coption_t
*coption
; /* Custom option */
466 ppd_cparam_t
*cparam
; /* Custom parameter */
467 char *units
; /* Custom points units */
468 int num_vals
; /* Number of values */
469 cups_option_t
*vals
, /* Values */
473 if ((c
= ppdFindChoice(o
, "Custom")) == NULL
)
476 if ((coption
= ppdFindCustomOption(ppd
, option
)) != NULL
)
478 num_vals
= cupsParseOptions(choice
+ 1, 0, &vals
);
480 for (i
= 0, val
= vals
; i
< num_vals
; i
++, val
++)
482 if ((cparam
= ppdFindCustomParam(coption
, val
->name
)) == NULL
)
485 switch (cparam
->type
)
487 case PPD_CUSTOM_CURVE
:
488 case PPD_CUSTOM_INVCURVE
:
489 case PPD_CUSTOM_REAL
:
490 cparam
->current
.custom_real
= _cupsStrScand(val
->value
, NULL
,
494 case PPD_CUSTOM_POINTS
:
495 cparam
->current
.custom_points
= _cupsStrScand(val
->value
, &units
,
500 if (!strcasecmp(units
, "cm"))
501 cparam
->current
.custom_points
*= 72.0 / 2.54;
502 else if (!strcasecmp(units
, "mm"))
503 cparam
->current
.custom_points
*= 72.0 / 25.4;
504 else if (!strcasecmp(units
, "m"))
505 cparam
->current
.custom_points
*= 72.0 / 0.0254;
506 else if (!strcasecmp(units
, "in"))
507 cparam
->current
.custom_points
*= 72.0;
508 else if (!strcasecmp(units
, "ft"))
509 cparam
->current
.custom_points
*= 12 * 72.0;
513 case PPD_CUSTOM_INT
:
514 cparam
->current
.custom_int
= atoi(val
->value
);
517 case PPD_CUSTOM_PASSCODE
:
518 case PPD_CUSTOM_PASSWORD
:
519 case PPD_CUSTOM_STRING
:
520 if (cparam
->current
.custom_string
)
521 free(cparam
->current
.custom_string
);
523 cparam
->current
.custom_string
= strdup(val
->value
);
528 cupsFreeOptions(num_vals
, vals
);
533 for (i
= o
->num_choices
, c
= o
->choices
; i
> 0; i
--, c
++)
534 if (!strcasecmp(c
->choice
, choice
))
542 * Option found; mark it and then handle unmarking any other options.
547 if (o
->ui
!= PPD_UI_PICKMANY
)
550 * Unmark all other choices...
553 for (i
= o
->num_choices
, c
= o
->choices
; i
> 0; i
--, c
++)
554 if (strcasecmp(c
->choice
, choice
))
558 if (!strcasecmp(option
, "PageSize") ||
559 !strcasecmp(option
, "PageRegion"))
562 * Mark current page size...
565 for (j
= 0; j
< ppd
->num_sizes
; j
++)
566 ppd
->sizes
[j
].marked
= !strcasecmp(ppd
->sizes
[j
].name
,
570 * Unmark the current PageSize or PageRegion setting, as
574 if (!strcasecmp(option
, "PageSize"))
576 if ((o
= ppdFindOption(ppd
, "PageRegion")) != NULL
)
577 for (j
= 0; j
< o
->num_choices
; j
++)
578 o
->choices
[j
].marked
= 0;
582 if ((o
= ppdFindOption(ppd
, "PageSize")) != NULL
)
583 for (j
= 0; j
< o
->num_choices
; j
++)
584 o
->choices
[j
].marked
= 0;
587 else if (!strcasecmp(option
, "InputSlot"))
590 * Unmark ManualFeed True and possibly mark ManualFeed False
594 if ((o
= ppdFindOption(ppd
, "ManualFeed")) != NULL
)
595 for (j
= 0; j
< o
->num_choices
; j
++)
596 o
->choices
[j
].marked
= !strcasecmp(o
->choices
[j
].choice
, "False");
598 else if (!strcasecmp(option
, "ManualFeed") &&
599 !strcasecmp(choice
, "True"))
602 * Unmark InputSlot option...
605 if ((o
= ppdFindOption(ppd
, "InputSlot")) != NULL
)
606 for (j
= 0; j
< o
->num_choices
; j
++)
607 o
->choices
[j
].marked
= 0;
613 * Return the number of conflicts...
616 return (ppdConflicts(ppd
));
621 * 'ppdFirstOption()' - Return the first option in the PPD file.
623 * Options are returned from all groups in sorted order.
628 ppd_option_t
* /* O - First option or NULL */
629 ppdFirstOption(ppd_file_t
*ppd
) /* I - PPD file */
634 return ((ppd_option_t
*)cupsArrayFirst(ppd
->options
));
639 * 'ppdNextOption()' - Return the next option in the PPD file.
641 * Options are returned from all groups in sorted order.
646 ppd_option_t
* /* O - Next option or NULL */
647 ppdNextOption(ppd_file_t
*ppd
) /* I - PPD file */
652 return ((ppd_option_t
*)cupsArrayNext(ppd
->options
));
657 * 'ppd_defaults()' - Set the defaults for this group and all sub-groups.
661 ppd_defaults(ppd_file_t
*ppd
, /* I - PPD file */
662 ppd_group_t
*g
) /* I - Group to default */
664 int i
; /* Looping var */
665 ppd_option_t
*o
; /* Current option */
666 ppd_group_t
*sg
; /* Current sub-group */
672 for (i
= g
->num_options
, o
= g
->options
; i
> 0; i
--, o
++)
673 if (strcasecmp(o
->keyword
, "PageRegion") != 0)
674 ppdMarkOption(ppd
, o
->keyword
, o
->defchoice
);
676 for (i
= g
->num_subgroups
, sg
= g
->subgroups
; i
> 0; i
--, sg
++)
677 ppd_defaults(ppd
, sg
);
682 * End of "$Id: mark.c 5529 2006-05-15 20:06:46Z mike $".