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