Annotation of embedaddon/dhcp/omapip/array.c, revision 1.1

1.1     ! misho       1: /* listener.c
        !             2: 
        !             3:    Subroutines that support the omapi extensible array type. */
        !             4: 
        !             5: /*
        !             6:  * Copyright (c) 2004-2007,2009 by Internet Systems Consortium, Inc. ("ISC")
        !             7:  * Copyright (c) 2001-2003 by Internet Software Consortium
        !             8:  *
        !             9:  * Permission to use, copy, modify, and distribute this software for any
        !            10:  * purpose with or without fee is hereby granted, provided that the above
        !            11:  * copyright notice and this permission notice appear in all copies.
        !            12:  *
        !            13:  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
        !            14:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            15:  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
        !            16:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            17:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
        !            18:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
        !            19:  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            20:  *
        !            21:  *   Internet Systems Consortium, Inc.
        !            22:  *   950 Charter Street
        !            23:  *   Redwood City, CA 94063
        !            24:  *   <info@isc.org>
        !            25:  *   https://www.isc.org/
        !            26:  *
        !            27:  * This software has been written for Internet Systems Consortium
        !            28:  * by Ted Lemon in cooperation with Vixie Enterprises and Nominum, Inc.
        !            29:  * To learn more about Internet Systems Consortium, see
        !            30:  * ``https://www.isc.org/''.  To learn more about Vixie Enterprises,
        !            31:  * see ``http://www.vix.com''.   To learn more about Nominum, Inc., see
        !            32:  * ``http://www.nominum.com''.
        !            33:  */
        !            34: 
        !            35: #include "dhcpd.h"
        !            36: 
        !            37: #include <omapip/omapip_p.h>
        !            38: 
        !            39: /* Allocate a new extensible array. */
        !            40: 
        !            41: isc_result_t omapi_array_allocate (omapi_array_t **array,
        !            42:                                   omapi_array_ref_t ref,
        !            43:                                   omapi_array_deref_t deref,
        !            44:                                   const char *file, int line)
        !            45: {
        !            46:        omapi_array_t *aptr;
        !            47: 
        !            48:        if (!array || *array)
        !            49:                return ISC_R_INVALIDARG;
        !            50:        aptr = dmalloc (sizeof (omapi_array_t),file, line);
        !            51:        if (!aptr)
        !            52:                return ISC_R_NOMEMORY;
        !            53:        *array = aptr;
        !            54:        aptr -> ref = ref;
        !            55:        aptr -> deref = deref;
        !            56:        return ISC_R_SUCCESS;
        !            57: }
        !            58: 
        !            59: isc_result_t omapi_array_free (omapi_array_t **array,
        !            60:                               const char *file, int line)
        !            61: {
        !            62:        omapi_array_t *aptr;
        !            63:        int i;
        !            64: 
        !            65:        if (!array || !*array)
        !            66:                return ISC_R_INVALIDARG;
        !            67:        aptr = *array;
        !            68:        for (i = 0; i < aptr -> count; i++)
        !            69:                if (aptr -> data [i] && aptr -> deref)
        !            70:                        (*aptr -> deref) (&aptr -> data [i], file, line);
        !            71:        dfree (aptr -> data, MDL);
        !            72:        dfree (aptr, MDL);
        !            73:        *array = (omapi_array_t *)0;
        !            74:        return ISC_R_SUCCESS;
        !            75: }
        !            76: 
        !            77: /* Extend the size of the array by one entry (we may allocate more than that)
        !            78:    and store the specified value in the new array element. */
        !            79: 
        !            80: isc_result_t omapi_array_extend (omapi_array_t *array, char *ptr,
        !            81:                                 int *index, const char *file, int line)
        !            82: {
        !            83:        isc_result_t status;
        !            84:        int new = array -> count;
        !            85:        status = omapi_array_set (array, ptr, new, file, line);
        !            86:        if (index && status == ISC_R_SUCCESS)
        !            87:                *index = new;
        !            88:        return status;
        !            89: }
        !            90: 
        !            91: /* Set a value in the specified array, extending it if necessary. */
        !            92: 
        !            93: isc_result_t omapi_array_set (omapi_array_t *array, void *ptr, int index,
        !            94:                              const char *file, int line)
        !            95: {
        !            96:        char **newbuf;
        !            97:        int delta;
        !            98:        isc_result_t status;
        !            99: 
        !           100:        if (!array)
        !           101:                return ISC_R_INVALIDARG;
        !           102:        if (!ptr)
        !           103:                return ISC_R_INVALIDARG;
        !           104:        if (index < 0)
        !           105:                return ISC_R_INVALIDARG;
        !           106: 
        !           107:        /* If the proposed index is larger than the current available
        !           108:           space in the array, make more space in the array. */
        !           109:        if (array -> max <= index) {
        !           110:                delta = index - array -> max + 10;
        !           111:                newbuf = dmalloc ((array -> max + delta) * sizeof (char *),
        !           112:                                  file, line);
        !           113:                if (!newbuf)
        !           114:                        return ISC_R_NOMEMORY;
        !           115:                /* Zero the new elements. */
        !           116:                memset (&newbuf [array -> max], 0, (sizeof (char *)) * delta);
        !           117:                array -> max += delta;
        !           118:                /* Copy the old array data into the new buffer. */
        !           119:                if (array -> data) {
        !           120:                    memcpy (newbuf,
        !           121:                            array -> data, array -> count * sizeof (char *));
        !           122:                    dfree (array -> data, file, line);
        !           123:                }
        !           124:                array -> data = newbuf;
        !           125:        } else {
        !           126:                /* If there's already data there, and this is an array
        !           127:                   of references, dereference what's there. */
        !           128:                if (array -> data [index]) {
        !           129:                        status = ((*array -> deref) (&array -> data [index],
        !           130:                                                     file, line));
        !           131:                
        !           132:                        if (status != ISC_R_SUCCESS)
        !           133:                                return status;
        !           134:                }
        !           135:        }
        !           136: 
        !           137:        /* Store the pointer using the referencer function.  We have
        !           138:           either just memset this to zero or dereferenced what was
        !           139:           there previously, so there is no need to do anything if the
        !           140:           pointer we have been asked to store is null. */
        !           141:        if (ptr) {
        !           142:                status = (*array -> ref) (&array -> data [index], ptr,
        !           143:                                          file, line);
        !           144:                if (status != ISC_R_SUCCESS)
        !           145:                        return status;
        !           146:        }
        !           147:        if (index >= array -> count)
        !           148:                array -> count = index + 1;
        !           149:        return ISC_R_SUCCESS;
        !           150: }
        !           151: 
        !           152: isc_result_t omapi_array_lookup (char **ptr, omapi_array_t *array, int index,
        !           153:                                 const char *file, int line)
        !           154: {
        !           155:        if (!array || !ptr || *ptr || index < 0 || index >= array -> count)
        !           156:                return ISC_R_INVALIDARG;
        !           157:        if (array -> data [index])
        !           158:                return (*array -> ref) (ptr,
        !           159:                                        array -> data [index], file, line);
        !           160:        return ISC_R_NOTFOUND;
        !           161: }
        !           162: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>