125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Sorted array routines for CUPS.
325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copyright 2007-2014 by Apple Inc.
525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copyright 1997-2007 by Easy Software Products.
625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * These coded instructions, statements, and computer programs are the
825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * property of Apple Inc. and are protected by Federal copyright
925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
1025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * which should have been included with this file.  If this file is
112447373f182dbfeb47fb86c0f5a6ac5773c65ac2Philip P. Moltmann * missing or damaged, see the license at "http://www.cups.org/".
1225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
1325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This file is subject to the Apple OS-Developed Software exception.
1425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
1525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
1625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
1725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Include necessary headers...
1825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
1925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
2025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include <cups/cups.h>
2125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include "string-private.h"
2225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include "debug-private.h"
2325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include "array-private.h"
2425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
2525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
2625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
2725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Limits...
2825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
2925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
3025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#define _CUPS_MAXSAVE	32		/**** Maximum number of saves ****/
3125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
3225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
3325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
3425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Types and structures...
3525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
3625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
3725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstruct _cups_array_s			/**** CUPS array structure ****/
3825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
3925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
4025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * The current implementation uses an insertion sort into an array of
4125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * sorted pointers.  We leave the array type private/opaque so that we
4225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * can change the underlying implementation without affecting the users
4325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * of this API.
4425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
4525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
4625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  int			num_elements,	/* Number of array elements */
4725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			alloc_elements,	/* Allocated array elements */
4825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			current,	/* Current element */
4925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			insert,		/* Last inserted element */
5025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			unique,		/* Are all elements unique? */
5125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			num_saved,	/* Number of saved elements */
5225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			saved[_CUPS_MAXSAVE];
5325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann					/* Saved elements */
5425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  void			**elements;	/* Array elements */
5525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  cups_array_func_t	compare;	/* Element comparison function */
5625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  void			*data;		/* User data passed to compare */
5725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  cups_ahash_func_t	hashfunc;	/* Hash function */
5825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  int			hashsize,	/* Size of hash */
5925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			*hash;		/* Hash array */
6025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  cups_acopy_func_t	copyfunc;	/* Copy function */
6125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  cups_afree_func_t	freefunc;	/* Free function */
6225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann};
6325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
6425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
6525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
6625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Local functions...
6725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
6825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
6925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int	cups_array_add(cups_array_t *a, void *e, int insert);
7025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int	cups_array_find(cups_array_t *a, void *e, int prev, int *rdiff);
7125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
7225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
7325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
7425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayAdd()' - Add an element to the array.
7525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
7625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * When adding an element to a sorted array, non-unique elements are
7725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * appended at the end of the run of identical elements.  For unsorted arrays,
7825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * the element is appended to the end of the array.
7925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
8025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
8125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
8225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
8325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint					/* O - 1 on success, 0 on failure */
8425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayAdd(cups_array_t *a,		/* I - Array */
8525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann             void         *e)		/* I - Element */
8625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
8725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  DEBUG_printf(("2cupsArrayAdd(a=%p, e=%p)", (void *)a, e));
8825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
8925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
9025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Range check input...
9125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
9225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
9325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a || !e)
9425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
9525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    DEBUG_puts("3cupsArrayAdd: returning 0");
9625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (0);
9725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
9825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
9925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
10025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Append the element...
10125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
10225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
10325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (cups_array_add(a, e, 0));
10425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
10525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
10625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
10725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
10825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * '_cupsArrayAddStrings()' - Add zero or more delimited strings to an array.
10925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
11025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Note: The array MUST be created using the @link _cupsArrayNewStrings@
11125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * function. Duplicate strings are NOT added. If the string pointer "s" is NULL
11225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * or the empty string, no strings are added to the array.
11325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
11425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
11525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint					/* O - 1 on success, 0 on failure */
11625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cupsArrayAddStrings(cups_array_t *a,	/* I - Array */
11725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                     const char   *s,	/* I - Delimited strings or NULL */
11825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                     char         delim)/* I - Delimiter character */
11925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
12025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  char		*buffer,		/* Copy of string */
12125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		*start,			/* Start of string */
12225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		*end;			/* End of string */
12325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  int		status = 1;		/* Status of add */
12425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
12525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
12625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  DEBUG_printf(("_cupsArrayAddStrings(a=%p, s=\"%s\", delim='%c')", (void *)a, s, delim));
12725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
12825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a || !s || !*s)
12925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
13025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    DEBUG_puts("1_cupsArrayAddStrings: Returning 0");
13125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (0);
13225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
13325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
13425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (delim == ' ')
13525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
13625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
13725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Skip leading whitespace...
13825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
13925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
14025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    DEBUG_puts("1_cupsArrayAddStrings: Skipping leading whitespace.");
14125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
14225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    while (*s && isspace(*s & 255))
14325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      s ++;
14425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
14525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    DEBUG_printf(("1_cupsArrayAddStrings: Remaining string \"%s\".", s));
14625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
14725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
14825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!strchr(s, delim) &&
14925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      (delim != ' ' || (!strchr(s, '\t') && !strchr(s, '\n'))))
15025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
15125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
15225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * String doesn't contain a delimiter, so add it as a single value...
15325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
15425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
15525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    DEBUG_puts("1_cupsArrayAddStrings: No delimiter seen, adding a single "
15625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann               "value.");
15725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
15825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (!cupsArrayFind(a, (void *)s))
15925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      status = cupsArrayAdd(a, (void *)s);
16025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
16125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else if ((buffer = strdup(s)) == NULL)
16225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
16325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    DEBUG_puts("1_cupsArrayAddStrings: Unable to duplicate string.");
16425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    status = 0;
16525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
16625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
16725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
16825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    for (start = end = buffer; *end; start = end)
16925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
17025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
17125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Find the end of the current delimited string and see if we need to add
17225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * it...
17325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
17425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
17525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (delim == ' ')
17625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
17725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        while (*end && !isspace(*end & 255))
17825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          end ++;
17925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        while (*end && isspace(*end & 255))
18025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          *end++ = '\0';
18125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
18225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else if ((end = strchr(start, delim)) != NULL)
18325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        *end++ = '\0';
18425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else
18525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        end = start + strlen(start);
18625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
18725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      DEBUG_printf(("1_cupsArrayAddStrings: Adding \"%s\", end=\"%s\"", start,
18825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                    end));
18925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
19025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (!cupsArrayFind(a, start))
19125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        status &= cupsArrayAdd(a, start);
19225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
19325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
19425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    free(buffer);
19525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
19625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
19725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  DEBUG_printf(("1_cupsArrayAddStrings: Returning %d.", status));
19825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
19925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (status);
20025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
20125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
20225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
20325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
20425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayClear()' - Clear the array.
20525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
20625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This function is equivalent to removing all elements in the array.
20725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The caller is responsible for freeing the memory used by the
20825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * elements themselves.
20925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
21025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
21125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
21225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
21325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid
21425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayClear(cups_array_t *a)		/* I - Array */
21525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
21625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
21725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Range check input...
21825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
21925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
22025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a)
22125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return;
22225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
22325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
22425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Free the existing elements as needed..
22525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
22625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
22725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (a->freefunc)
22825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
22925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    int		i;			/* Looping var */
23025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    void	**e;			/* Current element */
23125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
23225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    for (i = a->num_elements, e = a->elements; i > 0; i --, e ++)
23325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      (a->freefunc)(*e, a->data);
23425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
23525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
23625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
23725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Set the number of elements to 0; we don't actually free the memory
23825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * here - that is done in cupsArrayDelete()...
23925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
24025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
24125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->num_elements = 0;
24225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->current      = -1;
24325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->insert       = -1;
24425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->unique       = 1;
24525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->num_saved    = 0;
24625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
24725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
24825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
24925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
25025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayCount()' - Get the number of elements in the array.
25125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
25225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
25325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
25425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
25525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint					/* O - Number of elements */
25625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayCount(cups_array_t *a)		/* I - Array */
25725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
25825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
25925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Range check input...
26025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
26125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
26225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a)
26325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (0);
26425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
26525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
26625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Return the number of elements...
26725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
26825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
26925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (a->num_elements);
27025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
27125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
27225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
27325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
27425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayCurrent()' - Return the current element in the array.
27525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
27625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The current element is undefined until you call @link cupsArrayFind@,
27725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @link cupsArrayFirst@, or @link cupsArrayIndex@, or @link cupsArrayLast@.
27825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
27925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
28025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
28125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
28225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid *					/* O - Element */
28325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayCurrent(cups_array_t *a)	/* I - Array */
28425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
28525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
28625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Range check input...
28725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
28825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
28925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a)
29025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
29125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
29225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
29325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Return the current element...
29425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
29525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
29625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (a->current >= 0 && a->current < a->num_elements)
29725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (a->elements[a->current]);
29825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
29925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
30025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
30125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
30225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
30325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
30425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayDelete()' - Free all memory used by the array.
30525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
30625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The caller is responsible for freeing the memory used by the
30725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * elements themselves.
30825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
30925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
31025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
31125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
31225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid
31325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayDelete(cups_array_t *a)	/* I - Array */
31425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
31525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
31625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Range check input...
31725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
31825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
31925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a)
32025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return;
32125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
32225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
32325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Free the elements if we have a free function (otherwise the caller is
32425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * responsible for doing the dirty work...)
32525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
32625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
32725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (a->freefunc)
32825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
32925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    int		i;			/* Looping var */
33025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    void	**e;			/* Current element */
33125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
33225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    for (i = a->num_elements, e = a->elements; i > 0; i --, e ++)
33325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      (a->freefunc)(*e, a->data);
33425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
33525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
33625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
33725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Free the array of element pointers...
33825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
33925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
34025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (a->alloc_elements)
34125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    free(a->elements);
34225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
34325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (a->hashsize)
34425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    free(a->hash);
34525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
34625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  free(a);
34725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
34825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
34925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
35025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
35125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayDup()' - Duplicate the array.
35225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
35325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
35425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
35525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
35625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_array_t *				/* O - Duplicate array */
35725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayDup(cups_array_t *a)		/* I - Array */
35825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
35925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  cups_array_t	*da;			/* Duplicate array */
36025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
36125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
36225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
36325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Range check input...
36425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
36525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
36625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a)
36725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
36825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
36925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
37025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Allocate memory for the array...
37125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
37225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
37325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  da = calloc(1, sizeof(cups_array_t));
37425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!da)
37525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
37625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
37725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  da->compare   = a->compare;
37825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  da->data      = a->data;
37925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  da->current   = a->current;
38025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  da->insert    = a->insert;
38125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  da->unique    = a->unique;
38225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  da->num_saved = a->num_saved;
38325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
38425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  memcpy(da->saved, a->saved, sizeof(a->saved));
38525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
38625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (a->num_elements)
38725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
38825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
38925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Allocate memory for the elements...
39025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
39125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
39225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    da->elements = malloc((size_t)a->num_elements * sizeof(void *));
39325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (!da->elements)
39425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
39525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      free(da);
39625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      return (NULL);
39725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
39825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
39925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
40025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Copy the element pointers...
40125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
40225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
40325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (a->copyfunc)
40425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
40525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
40625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Use the copy function to make a copy of each element...
40725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
40825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
40925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      int	i;			/* Looping var */
41025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
41125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      for (i = 0; i < a->num_elements; i ++)
41225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	da->elements[i] = (a->copyfunc)(a->elements[i], a->data);
41325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
41425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else
41525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
41625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
41725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Just copy raw pointers...
41825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
41925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
42025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      memcpy(da->elements, a->elements, (size_t)a->num_elements * sizeof(void *));
42125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
42225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
42325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    da->num_elements   = a->num_elements;
42425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    da->alloc_elements = a->num_elements;
42525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
42625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
42725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
42825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Return the new array...
42925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
43025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
43125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (da);
43225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
43325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
43425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
43525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
43625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayFind()' - Find an element in the array.
43725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
43825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
43925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
44025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
44125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid *					/* O - Element found or @code NULL@ */
44225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayFind(cups_array_t *a,		/* I - Array */
44325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann              void         *e)		/* I - Element */
44425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
44525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  int	current,			/* Current element */
44625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	diff,				/* Difference */
44725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	hash;				/* Hash index */
44825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
44925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
45025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
45125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Range check input...
45225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
45325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
45425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a || !e)
45525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
45625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
45725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
45825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * See if we have any elements...
45925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
46025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
46125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a->num_elements)
46225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
46325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
46425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
46525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Yes, look for a match...
46625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
46725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
46825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (a->hash)
46925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
47025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    hash = (*(a->hashfunc))(e, a->data);
47125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
47225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (hash < 0 || hash >= a->hashsize)
47325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
47425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      current = a->current;
47525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      hash    = -1;
47625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
47725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else
47825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
47925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      current = a->hash[hash];
48025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
48125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (current < 0 || current >= a->num_elements)
48225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        current = a->current;
48325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
48425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
48525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
48625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
48725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    current = a->current;
48825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    hash    = -1;
48925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
49025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
49125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  current = cups_array_find(a, e, current, &diff);
49225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!diff)
49325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
49425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
49525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Found a match!  If the array does not contain unique values, find
49625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * the first element that is the same...
49725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
49825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
49925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (!a->unique && a->compare)
50025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
50125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
50225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * The array is not unique, find the first match...
50325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
50425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
50525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      while (current > 0 && !(*(a->compare))(e, a->elements[current - 1],
50625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                                             a->data))
50725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        current --;
50825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
50925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
51025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    a->current = current;
51125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
51225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (hash >= 0)
51325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      a->hash[hash] = current;
51425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
51525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (a->elements[current]);
51625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
51725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
51825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
51925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
52025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * No match...
52125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
52225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
52325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    a->current = -1;
52425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
52525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
52625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
52725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
52825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
52925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
53025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
53125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayFirst()' - Get the first element in the array.
53225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
53325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
53425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
53525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
53625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid *					/* O - First element or @code NULL@ if the array is empty */
53725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayFirst(cups_array_t *a)		/* I - Array */
53825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
53925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
54025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Range check input...
54125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
54225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
54325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a)
54425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
54525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
54625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
54725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Return the first element...
54825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
54925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
55025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->current = 0;
55125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
55225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (cupsArrayCurrent(a));
55325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
55425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
55525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
55625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
55725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayGetIndex()' - Get the index of the current element.
55825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
55925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The current element is undefined until you call @link cupsArrayFind@,
56025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @link cupsArrayFirst@, or @link cupsArrayIndex@, or @link cupsArrayLast@.
56125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
56225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.3/macOS 10.5@
56325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
56425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
56525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint					/* O - Index of the current element, starting at 0 */
56625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayGetIndex(cups_array_t *a)	/* I - Array */
56725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
56825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a)
56925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (-1);
57025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
57125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (a->current);
57225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
57325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
57425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
57525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
57625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayGetInsert()' - Get the index of the last inserted element.
57725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
57825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.3/macOS 10.5@
57925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
58025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
58125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint					/* O - Index of the last inserted element, starting at 0 */
58225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayGetInsert(cups_array_t *a)	/* I - Array */
58325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
58425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a)
58525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (-1);
58625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
58725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (a->insert);
58825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
58925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
59025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
59125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
59225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayIndex()' - Get the N-th element in the array.
59325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
59425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
59525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
59625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
59725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid *					/* O - N-th element or @code NULL@ */
59825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayIndex(cups_array_t *a,		/* I - Array */
59925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann               int          n)		/* I - Index into array, starting at 0 */
60025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
60125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a)
60225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
60325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
60425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->current = n;
60525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
60625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (cupsArrayCurrent(a));
60725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
60825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
60925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
61025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
61125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayInsert()' - Insert an element in the array.
61225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
61325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * When inserting an element in a sorted array, non-unique elements are
61425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * inserted at the beginning of the run of identical elements.  For unsorted
61525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * arrays, the element is inserted at the beginning of the array.
61625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
61725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
61825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
61925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
62025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint					/* O - 0 on failure, 1 on success */
62125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayInsert(cups_array_t *a,	/* I - Array */
62225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		void         *e)	/* I - Element */
62325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
62425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  DEBUG_printf(("2cupsArrayInsert(a=%p, e=%p)", (void *)a, e));
62525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
62625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
62725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Range check input...
62825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
62925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
63025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a || !e)
63125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
63225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    DEBUG_puts("3cupsArrayInsert: returning 0");
63325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (0);
63425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
63525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
63625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
63725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Insert the element...
63825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
63925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
64025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (cups_array_add(a, e, 1));
64125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
64225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
64325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
64425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
64525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayLast()' - Get the last element in the array.
64625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
64725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
64825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
64925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
65025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid *					/* O - Last element or @code NULL@ if the array is empty */
65125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayLast(cups_array_t *a)		/* I - Array */
65225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
65325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
65425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Range check input...
65525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
65625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
65725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a)
65825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
65925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
66025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
66125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Return the last element...
66225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
66325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
66425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->current = a->num_elements - 1;
66525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
66625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (cupsArrayCurrent(a));
66725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
66825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
66925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
67025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
67125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayNew()' - Create a new array.
67225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
67325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The comparison function ("f") is used to create a sorted array. The function
67425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * receives pointers to two elements and the user data pointer ("d") - the user
67525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * data pointer argument can safely be omitted when not required so functions
67625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * like @code strcmp@ can be used for sorted string arrays.
67725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
67825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
67925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
68025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
68125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_array_t *				/* O - Array */
68225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayNew(cups_array_func_t f,	/* I - Comparison function or @code NULL@ for an unsorted array */
68325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann             void              *d)	/* I - User data pointer or @code NULL@ */
68425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
68525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (cupsArrayNew3(f, d, 0, 0, 0, 0));
68625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
68725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
68825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
68925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
69025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayNew2()' - Create a new array with hash.
69125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
69225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The comparison function ("f") is used to create a sorted array. The function
69325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * receives pointers to two elements and the user data pointer ("d") - the user
69425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * data pointer argument can safely be omitted when not required so functions
69525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * like @code strcmp@ can be used for sorted string arrays.
69625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
69725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The hash function ("h") is used to implement cached lookups with the
69825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * specified hash size ("hsize").
69925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
70025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.3/macOS 10.5@
70125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
70225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
70325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_array_t *				/* O - Array */
70425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayNew2(cups_array_func_t  f,	/* I - Comparison function or @code NULL@ for an unsorted array */
70525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann              void               *d,	/* I - User data or @code NULL@ */
70625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann              cups_ahash_func_t  h,	/* I - Hash function or @code NULL@ for unhashed lookups */
70725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	      int                hsize)	/* I - Hash size (>= 0) */
70825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
70925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (cupsArrayNew3(f, d, h, hsize, 0, 0));
71025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
71125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
71225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
71325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
71425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayNew3()' - Create a new array with hash and/or free function.
71525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
71625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The comparison function ("f") is used to create a sorted array. The function
71725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * receives pointers to two elements and the user data pointer ("d") - the user
71825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * data pointer argument can safely be omitted when not required so functions
71925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * like @code strcmp@ can be used for sorted string arrays.
72025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
72125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The hash function ("h") is used to implement cached lookups with the
72225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * specified hash size ("hsize").
72325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
72425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The copy function ("cf") is used to automatically copy/retain elements when
72525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * added or the array is copied.
72625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
72725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The free function ("cf") is used to automatically free/release elements when
72825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * removed or the array is deleted.
72925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
73025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.5/macOS 10.7@
73125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
73225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
73325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_array_t *				/* O - Array */
73425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayNew3(cups_array_func_t  f,	/* I - Comparison function or @code NULL@ for an unsorted array */
73525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann              void               *d,	/* I - User data or @code NULL@ */
73625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann              cups_ahash_func_t  h,	/* I - Hash function or @code NULL@ for unhashed lookups */
73725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	      int                hsize,	/* I - Hash size (>= 0) */
73825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	      cups_acopy_func_t  cf,	/* I - Copy function */
73925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	      cups_afree_func_t  ff)	/* I - Free function */
74025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
74125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  cups_array_t	*a;			/* Array  */
74225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
74325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
74425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
74525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Allocate memory for the array...
74625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
74725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
74825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a = calloc(1, sizeof(cups_array_t));
74925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a)
75025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
75125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
75225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->compare   = f;
75325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->data      = d;
75425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->current   = -1;
75525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->insert    = -1;
75625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->num_saved = 0;
75725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->unique    = 1;
75825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
75925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (hsize > 0 && h)
76025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
76125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    a->hashfunc  = h;
76225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    a->hashsize  = hsize;
76325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    a->hash      = malloc((size_t)hsize * sizeof(int));
76425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
76525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (!a->hash)
76625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
76725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      free(a);
76825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      return (NULL);
76925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
77025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
77125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    memset(a->hash, -1, (size_t)hsize * sizeof(int));
77225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
77325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
77425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->copyfunc = cf;
77525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->freefunc = ff;
77625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
77725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (a);
77825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
77925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
78025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
78125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
78225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * '_cupsArrayNewStrings()' - Create a new array of comma-delimited strings.
78325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
78425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Note: The array automatically manages copies of the strings passed. If the
78525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * string pointer "s" is NULL or the empty string, no strings are added to the
78625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * newly created array.
78725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
78825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
78925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_array_t *				/* O - Array */
79025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cupsArrayNewStrings(const char *s,	/* I - Delimited strings or NULL */
79125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                     char       delim)	/* I - Delimiter character */
79225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
79325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  cups_array_t	*a;			/* Array */
79425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
79525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
79625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if ((a = cupsArrayNew3((cups_array_func_t)strcmp, NULL, NULL, 0,
79725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                         (cups_acopy_func_t)_cupsStrAlloc,
79825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			 (cups_afree_func_t)_cupsStrFree)) != NULL)
79925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    _cupsArrayAddStrings(a, s, delim);
80025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
80125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (a);
80225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
80325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
80425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
80525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
80625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayNext()' - Get the next element in the array.
80725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
80825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This function is equivalent to "cupsArrayIndex(a, cupsArrayGetIndex(a) + 1)".
80925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
81025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The next element is undefined until you call @link cupsArrayFind@,
81125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @link cupsArrayFirst@, or @link cupsArrayIndex@, or @link cupsArrayLast@
81225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * to set the current element.
81325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
81425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
81525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
81625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
81725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid *					/* O - Next element or @code NULL@ */
81825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayNext(cups_array_t *a)		/* I - Array */
81925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
82025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
82125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Range check input...
82225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
82325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
82425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a)
82525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
82625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
82725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
82825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Return the next element...
82925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
83025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
83125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (a->current < a->num_elements)
83225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    a->current ++;
83325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
83425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (cupsArrayCurrent(a));
83525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
83625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
83725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
83825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
83925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayPrev()' - Get the previous element in the array.
84025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
84125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This function is equivalent to "cupsArrayIndex(a, cupsArrayGetIndex(a) - 1)".
84225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
84325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The previous element is undefined until you call @link cupsArrayFind@,
84425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @link cupsArrayFirst@, or @link cupsArrayIndex@, or @link cupsArrayLast@
84525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * to set the current element.
84625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
84725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
84825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
84925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
85025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid *					/* O - Previous element or @code NULL@ */
85125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayPrev(cups_array_t *a)		/* I - Array */
85225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
85325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
85425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Range check input...
85525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
85625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
85725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a)
85825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
85925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
86025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
86125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Return the previous element...
86225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
86325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
86425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (a->current >= 0)
86525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    a->current --;
86625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
86725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (cupsArrayCurrent(a));
86825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
86925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
87025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
87125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
87225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayRemove()' - Remove an element from the array.
87325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
87425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * If more than one element matches "e", only the first matching element is
87525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * removed.
87625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
87725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The caller is responsible for freeing the memory used by the
87825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * removed element.
87925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
88025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
88125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
88225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
88325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint					/* O - 1 on success, 0 on failure */
88425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayRemove(cups_array_t *a,	/* I - Array */
88525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                void         *e)	/* I - Element */
88625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
88725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  ssize_t	i,			/* Looping var */
88825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		current;		/* Current element */
88925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  int		diff;			/* Difference */
89025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
89125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
89225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
89325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Range check input...
89425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
89525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
89625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a || !e)
89725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (0);
89825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
89925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
90025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * See if the element is in the array...
90125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
90225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
90325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a->num_elements)
90425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (0);
90525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
90625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  current = cups_array_find(a, e, a->current, &diff);
90725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (diff)
90825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (0);
90925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
91025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
91125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Yes, now remove it...
91225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
91325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
91425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->num_elements --;
91525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
91625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (a->freefunc)
91725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    (a->freefunc)(a->elements[current], a->data);
91825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
91925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (current < a->num_elements)
92025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    memmove(a->elements + current, a->elements + current + 1,
92125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann            (size_t)(a->num_elements - current) * sizeof(void *));
92225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
92325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (current <= a->current)
92425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    a->current --;
92525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
92625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (current < a->insert)
92725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    a->insert --;
92825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else if (current == a->insert)
92925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    a->insert = -1;
93025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
93125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  for (i = 0; i < a->num_saved; i ++)
93225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (current <= a->saved[i])
93325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      a->saved[i] --;
93425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
93525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (a->num_elements <= 1)
93625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    a->unique = 1;
93725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
93825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (1);
93925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
94025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
94125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
94225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
94325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayRestore()' - Reset the current element to the last @link cupsArraySave@.
94425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
94525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
94625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
94725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
94825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid *					/* O - New current element */
94925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayRestore(cups_array_t *a)	/* I - Array */
95025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
95125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a)
95225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
95325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
95425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (a->num_saved <= 0)
95525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
95625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
95725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->num_saved --;
95825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->current = a->saved[a->num_saved];
95925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
96025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (a->current >= 0 && a->current < a->num_elements)
96125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (a->elements[a->current]);
96225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
96325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
96425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
96525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
96625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
96725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
96825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArraySave()' - Mark the current element for a later @link cupsArrayRestore@.
96925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
97025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The current element is undefined until you call @link cupsArrayFind@,
97125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @link cupsArrayFirst@, or @link cupsArrayIndex@, or @link cupsArrayLast@
97225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * to set the current element.
97325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
97425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The save/restore stack is guaranteed to be at least 32 elements deep.
97525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
97625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
97725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
97825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
97925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint					/* O - 1 on success, 0 on failure */
98025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArraySave(cups_array_t *a)		/* I - Array */
98125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
98225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a)
98325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (0);
98425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
98525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (a->num_saved >= _CUPS_MAXSAVE)
98625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (0);
98725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
98825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->saved[a->num_saved] = a->current;
98925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->num_saved ++;
99025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
99125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (1);
99225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
99325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
99425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
99525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
99625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cupsArrayUserData()' - Return the user data for an array.
99725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
99825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
99925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
100025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
100125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid *					/* O - User data */
100225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmanncupsArrayUserData(cups_array_t *a)	/* I - Array */
100325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
100425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (a)
100525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (a->data);
100625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
100725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
100825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
100925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
101025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
101125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
101225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cups_array_add()' - Insert or append an element to the array.
101325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
101425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
101525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
101625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
101725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int				/* O - 1 on success, 0 on failure */
101825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_array_add(cups_array_t *a,		/* I - Array */
101925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann               void         *e,		/* I - Element to add */
102025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	       int          insert)	/* I - 1 = insert, 0 = append */
102125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
102225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  int		i,			/* Looping var */
102325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		current;		/* Current element */
102425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  int		diff;			/* Comparison with current element */
102525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
102625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
102725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  DEBUG_printf(("7cups_array_add(a=%p, e=%p, insert=%d)", (void *)a, e, insert));
102825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
102925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
103025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Verify we have room for the new element...
103125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
103225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
103325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (a->num_elements >= a->alloc_elements)
103425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
103525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
103625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Allocate additional elements; start with 16 elements, then
103725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * double the size until 1024 elements, then add 1024 elements
103825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * thereafter...
103925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
104025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
104125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    void	**temp;			/* New array elements */
104225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    int		count;			/* New allocation count */
104325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
104425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
104525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (a->alloc_elements == 0)
104625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
104725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      count = 16;
104825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      temp  = malloc((size_t)count * sizeof(void *));
104925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
105025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else
105125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
105225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (a->alloc_elements < 1024)
105325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        count = a->alloc_elements * 2;
105425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else
105525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        count = a->alloc_elements + 1024;
105625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
105725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      temp = realloc(a->elements, (size_t)count * sizeof(void *));
105825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
105925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
106025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    DEBUG_printf(("9cups_array_add: count=" CUPS_LLFMT, CUPS_LLCAST count));
106125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
106225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (!temp)
106325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
106425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      DEBUG_puts("9cups_array_add: allocation failed, returning 0");
106525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      return (0);
106625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
106725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
106825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    a->alloc_elements = count;
106925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    a->elements       = temp;
107025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
107125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
107225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
107325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Find the insertion point for the new element; if there is no
107425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * compare function or elements, just add it to the beginning or end...
107525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
107625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
107725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!a->num_elements || !a->compare)
107825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
107925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
108025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * No elements or comparison function, insert/append as needed...
108125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
108225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
108325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (insert)
108425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      current = 0;			/* Insert at beginning */
108525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else
108625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      current = a->num_elements;	/* Append to the end */
108725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
108825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
108925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
109025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
109125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Do a binary search for the insertion point...
109225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
109325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
109425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    current = cups_array_find(a, e, a->insert, &diff);
109525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
109625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (diff > 0)
109725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
109825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
109925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Insert after the current element...
110025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
110125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
110225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      current ++;
110325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
110425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else if (!diff)
110525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
110625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
110725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Compared equal, make sure we add to the begining or end of
110825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * the current run of equal elements...
110925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
111025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
111125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      a->unique = 0;
111225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
111325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (insert)
111425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
111525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
111625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * Insert at beginning of run...
111725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
111825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
111925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	while (current > 0 && !(*(a->compare))(e, a->elements[current - 1],
112025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                                               a->data))
112125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          current --;
112225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
112325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else
112425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
112525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
112625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * Append at end of run...
112725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
112825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
112925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	do
113025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
113125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          current ++;
113225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
113325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	while (current < a->num_elements &&
113425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann               !(*(a->compare))(e, a->elements[current], a->data));
113525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
113625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
113725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
113825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
113925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
114025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Insert or append the element...
114125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
114225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
114325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (current < a->num_elements)
114425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
114525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
114625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Shift other elements to the right...
114725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
114825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
114925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    memmove(a->elements + current + 1, a->elements + current,
115025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann            (size_t)(a->num_elements - current) * sizeof(void *));
115125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
115225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (a->current >= current)
115325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      a->current ++;
115425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
115525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    for (i = 0; i < a->num_saved; i ++)
115625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (a->saved[i] >= current)
115725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	a->saved[i] ++;
115825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
115925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    DEBUG_printf(("9cups_array_add: insert element at index " CUPS_LLFMT, CUPS_LLCAST current));
116025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
116125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef DEBUG
116225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
116325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    DEBUG_printf(("9cups_array_add: append element at " CUPS_LLFMT, CUPS_LLCAST current));
116425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* DEBUG */
116525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
116625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (a->copyfunc)
116725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
116825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if ((a->elements[current] = (a->copyfunc)(e, a->data)) == NULL)
116925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
117025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      DEBUG_puts("8cups_array_add: Copy function returned NULL, returning 0");
117125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      return (0);
117225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
117325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
117425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
117525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    a->elements[current] = e;
117625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
117725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->num_elements ++;
117825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  a->insert = current;
117925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
118025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef DEBUG
118125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  for (current = 0; current < a->num_elements; current ++)
118225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    DEBUG_printf(("9cups_array_add: a->elements[" CUPS_LLFMT "]=%p", CUPS_LLCAST current, a->elements[current]));
118325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* DEBUG */
118425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
118525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  DEBUG_puts("9cups_array_add: returning 1");
118625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
118725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (1);
118825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
118925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
119025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
119125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
119225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'cups_array_find()' - Find an element in the array.
119325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
119425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
119525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int				/* O - Index of match */
119625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_array_find(cups_array_t *a,	/* I - Array */
119725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        	void         *e,	/* I - Element */
119825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		int          prev,	/* I - Previous index */
119925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		int          *rdiff)	/* O - Difference of match */
120025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
120125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  int	left,				/* Left side of search */
120225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	right,				/* Right side of search */
120325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	current,			/* Current element */
120425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	diff;				/* Comparison with current element */
120525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
120625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
120725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  DEBUG_printf(("7cups_array_find(a=%p, e=%p, prev=%d, rdiff=%p)", (void *)a, e, prev, (void *)rdiff));
120825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
120925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (a->compare)
121025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
121125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
121225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Do a binary search for the element...
121325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
121425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
121525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    DEBUG_puts("9cups_array_find: binary search");
121625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
121725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (prev >= 0 && prev < a->num_elements)
121825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
121925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
122025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Start search on either side of previous...
122125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
122225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
122325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if ((diff = (*(a->compare))(e, a->elements[prev], a->data)) == 0 ||
122425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          (diff < 0 && prev == 0) ||
122525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  (diff > 0 && prev == (a->num_elements - 1)))
122625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
122725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
122825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * Exact or edge match, return it!
122925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
123025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
123125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        DEBUG_printf(("9cups_array_find: Returning %d, diff=%d", prev, diff));
123225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
123325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*rdiff = diff;
123425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
123525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	return (prev);
123625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
123725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else if (diff < 0)
123825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
123925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
124025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * Start with previous on right side...
124125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
124225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
124325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	left  = 0;
124425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	right = prev;
124525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
124625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else
124725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
124825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
124925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * Start wih previous on left side...
125025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
125125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
125225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        left  = prev;
125325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	right = a->num_elements - 1;
125425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
125525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
125625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else
125725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
125825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
125925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Start search in the middle...
126025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
126125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
126225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      left  = 0;
126325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      right = a->num_elements - 1;
126425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
126525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
126625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    do
126725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
126825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      current = (left + right) / 2;
126925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      diff    = (*(a->compare))(e, a->elements[current], a->data);
127025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
127125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      DEBUG_printf(("9cups_array_find: left=%d, right=%d, current=%d, diff=%d",
127225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                    left, right, current, diff));
127325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
127425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (diff == 0)
127525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	break;
127625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else if (diff < 0)
127725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	right = current;
127825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else
127925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	left = current;
128025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
128125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    while ((right - left) > 1);
128225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
128325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (diff != 0)
128425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
128525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
128625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Check the last 1 or 2 elements...
128725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
128825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
128925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if ((diff = (*(a->compare))(e, a->elements[left], a->data)) <= 0)
129025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        current = left;
129125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else
129225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
129325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        diff    = (*(a->compare))(e, a->elements[right], a->data);
129425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        current = right;
129525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
129625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
129725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
129825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
129925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
130025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
130125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Do a linear pointer search...
130225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
130325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
130425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    DEBUG_puts("9cups_array_find: linear search");
130525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
130625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    diff = 1;
130725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
130825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    for (current = 0; current < a->num_elements; current ++)
130925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (a->elements[current] == e)
131025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
131125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        diff = 0;
131225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        break;
131325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
131425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
131525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
131625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
131725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Return the closest element and the difference...
131825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
131925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
132025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  DEBUG_printf(("8cups_array_find: Returning %d, diff=%d", current, diff));
132125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
132225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  *rdiff = diff;
132325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
132425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (current);
132525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
1326