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