blob: f03dd5524b797d3e6a95790ee6b4ad0f7ae9970b [file]
//
// Sorted array routines for libppd.
//
// Copyright 2007-2014 by Apple Inc.
// Copyright 1997-2007 by Easy Software Products.
//
// Licensed under Apache License v2.0. See the file "LICENSE" for more
// information.
//
//
// Include necessary headers...
//
#include <ppd/string-private.h>
#include <ppd/debug-internal.h>
#include <ppd/array-private.h>
#include <ppd/libcups2-private.h>
//
// '_ppdArrayAddStrings()' - Add zero or more delimited strings to an array.
//
// Note: The array MUST be created using the @link _ppdArrayNewStrings@
// function. Duplicate strings are NOT added. If the string pointer "s" is NULL
// or the empty string, no strings are added to the array.
//
int // O - 1 on success, 0 on failure
_ppdArrayAddStrings(cups_array_t *a, // I - Array
const char *s, // I - Delimited strings or NULL
char delim) // I - Delimiter character
{
char *buffer, // Copy of string
*start, // Start of string
*end; // End of string
int status = 1; // Status of add
DEBUG_printf(("_ppdArrayAddStrings(a=%p, s=\"%s\", delim='%c')",
(void *)a, s, delim));
if (!a || !s || !*s)
{
DEBUG_puts("1_ppdArrayAddStrings: Returning 0");
return (0);
}
if (delim == ' ')
{
//
// Skip leading whitespace...
//
DEBUG_puts("1_ppdArrayAddStrings: Skipping leading whitespace.");
while (*s && isspace(*s & 255))
s ++;
DEBUG_printf(("1_ppdArrayAddStrings: Remaining string \"%s\".", s));
}
if (!strchr(s, delim) &&
(delim != ' ' || (!strchr(s, '\t') && !strchr(s, '\n'))))
{
//
// String doesn't contain a delimiter, so add it as a single value...
//
DEBUG_puts("1_ppdArrayAddStrings: No delimiter seen, adding a single "
"value.");
if (!cupsArrayFind(a, (void *)s))
status = cupsArrayAdd(a, (void *)s);
}
else if ((buffer = strdup(s)) == NULL)
{
DEBUG_puts("1_ppdArrayAddStrings: Unable to duplicate string.");
status = 0;
}
else
{
for (start = end = buffer; *end; start = end)
{
//
// Find the end of the current delimited string and see if we need to add
// it...
//
if (delim == ' ')
{
while (*end && !isspace(*end & 255))
end ++;
while (*end && isspace(*end & 255))
*end++ = '\0';
}
else if ((end = strchr(start, delim)) != NULL)
*end++ = '\0';
else
end = start + strlen(start);
DEBUG_printf(("1_ppdArrayAddStrings: Adding \"%s\", end=\"%s\"", start,
end));
if (!cupsArrayFind(a, start))
status &= cupsArrayAdd(a, start);
}
free(buffer);
}
DEBUG_printf(("1_ppdArrayAddStrings: Returning %d.", status));
return (status);
}
//
// '_ppdArrayNewStrings()' - Create a new array of comma-delimited strings.
//
// Note: The array automatically manages copies of the strings passed. If the
// string pointer "s" is NULL or the empty string, no strings are added to the
// newly created array.
//
cups_array_t * // O - Array
_ppdArrayNewStrings(const char *s, // I - Delimited strings or NULL
char delim) // I - Delimiter character
{
cups_array_t *a; // Array
if ((a = cupsArrayNew((cups_array_cb_t)strcmp, NULL, NULL, 0,
(cups_acopy_cb_t)_ppdStrAlloc,
(cups_afree_cb_t )_ppdStrFree)) != NULL)
_ppdArrayAddStrings(a, s, delim);
return (a);
}