]> git.ipfire.org Git - thirdparty/cups.git/blob - cups/attr.c
Load cups into easysw/current.
[thirdparty/cups.git] / cups / attr.c
1 /*
2 * "$Id: attr.c 5826 2006-08-15 19:04:11Z mike $"
3 *
4 * PPD model-specific attribute routines for the Common UNIX Printing System
5 * (CUPS).
6 *
7 * Copyright 1997-2006 by Easy Software Products.
8 *
9 * These coded instructions, statements, and computer programs are the
10 * property of Easy Software Products and are protected by Federal
11 * copyright law. Distribution and use rights are outlined in the file
12 * "LICENSE.txt" which should have been included with this file. If this
13 * file is missing or damaged please contact Easy Software Products
14 * at:
15 *
16 * Attn: CUPS Licensing Information
17 * Easy Software Products
18 * 44141 Airport View Drive, Suite 204
19 * Hollywood, Maryland 20636 USA
20 *
21 * Voice: (301) 373-9600
22 * EMail: cups-info@cups.org
23 * WWW: http://www.cups.org
24 *
25 * Contents:
26 *
27 * ppdFindAttr() - Find the first matching attribute...
28 * ppdFindNextAttr() - Find the next matching attribute...
29 */
30
31 /*
32 * Include necessary headers...
33 */
34
35 #include "ppd.h"
36 #include "debug.h"
37 #include "string.h"
38 #include <stdlib.h>
39
40
41 /*
42 * 'ppdFindAttr()' - Find the first matching attribute...
43 *
44 * @since CUPS 1.1.19@
45 */
46
47 ppd_attr_t * /* O - Attribute or NULL if not found */
48 ppdFindAttr(ppd_file_t *ppd, /* I - PPD file data */
49 const char *name, /* I - Attribute name */
50 const char *spec) /* I - Specifier string or NULL */
51 {
52 ppd_attr_t key, /* Search key */
53 *attr; /* Current attribute */
54 int diff; /* Current difference */
55
56
57 DEBUG_printf(("ppdFindAttr(ppd=%p, name=\"%s\", spec=\"%s\")\n", ppd,
58 name ? name : "(null)", spec ? spec : "(null)"));
59
60 /*
61 * Range check input...
62 */
63
64 if (!ppd || !name || ppd->num_attrs == 0)
65 return (NULL);
66
67 /*
68 * Search for a matching attribute...
69 */
70
71 memset(&key, 0, sizeof(key));
72 strlcpy(key.name, name, sizeof(key.name));
73 if (spec)
74 strlcpy(key.spec, spec, sizeof(key.spec));
75
76 /*
77 * Return the first matching attribute, if any...
78 */
79
80 if ((attr = (ppd_attr_t *)cupsArrayFind(ppd->sorted_attrs, &key)) != NULL)
81 return (attr);
82 else if (spec)
83 return (NULL);
84
85 /*
86 * No match found, loop through the sorted attributes to see if we can
87 * find a "wildcard" match for the attribute...
88 */
89
90 for (attr = (ppd_attr_t *)cupsArrayFirst(ppd->sorted_attrs);
91 attr;
92 attr = (ppd_attr_t *)cupsArrayNext(ppd->sorted_attrs))
93 {
94 if ((diff = strcasecmp(attr->name, name)) == 0)
95 break;
96
97 if (diff > 0)
98 {
99 /*
100 * All remaining attributes are > than the one we are trying to find...
101 */
102
103 cupsArrayIndex(ppd->sorted_attrs, cupsArrayCount(ppd->sorted_attrs));
104
105 return (NULL);
106 }
107 }
108
109 return (attr);
110 }
111
112
113 /*
114 * 'ppdFindNextAttr()' - Find the next matching attribute...
115 *
116 * @since CUPS 1.1.19@
117 */
118
119 ppd_attr_t * /* O - Attribute or NULL if not found */
120 ppdFindNextAttr(ppd_file_t *ppd, /* I - PPD file data */
121 const char *name, /* I - Attribute name */
122 const char *spec) /* I - Specifier string or NULL */
123 {
124 ppd_attr_t *attr; /* Current attribute */
125
126
127 /*
128 * Range check input...
129 */
130
131 if (!ppd || !name || ppd->num_attrs == 0 ||
132 !cupsArrayCurrent(ppd->sorted_attrs))
133 return (NULL);
134
135 /*
136 * See if there are more attributes to return...
137 */
138
139 if ((attr = (ppd_attr_t *)cupsArrayNext(ppd->sorted_attrs)) == NULL)
140 return (NULL);
141
142 /*
143 * Check the next attribute to see if it is a match...
144 */
145
146 if (strcasecmp(attr->name, name) || (spec && strcasecmp(attr->spec, spec)))
147 {
148 /*
149 * Nope, reset the current pointer to the end of the array...
150 */
151
152 cupsArrayIndex(ppd->sorted_attrs, cupsArrayCount(ppd->sorted_attrs));
153
154 return (NULL);
155 }
156
157 /*
158 * Return the next attribute's value...
159 */
160
161 return (attr);
162 }
163
164
165 /*
166 * End of "$Id: attr.c 5826 2006-08-15 19:04:11Z mike $".
167 */