Annotation of embedaddon/quagga/lib/vector.c, revision 1.1
1.1 ! misho 1: /* Generic vector interface routine
! 2: * Copyright (C) 1997 Kunihiro Ishiguro
! 3: *
! 4: * This file is part of GNU Zebra.
! 5: *
! 6: * GNU Zebra is free software; you can redistribute it and/or modify it
! 7: * under the terms of the GNU General Public License as published by the
! 8: * Free Software Foundation; either version 2, or (at your option) any
! 9: * later version.
! 10: *
! 11: * GNU Zebra is distributed in the hope that it will be useful, but
! 12: * WITHOUT ANY WARRANTY; without even the implied warranty of
! 13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
! 14: * General Public License for more details.
! 15: *
! 16: * You should have received a copy of the GNU General Public License
! 17: * along with GNU Zebra; see the file COPYING. If not, write to the Free
! 18: * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
! 19: * 02111-1307, USA.
! 20: */
! 21:
! 22: #include <zebra.h>
! 23:
! 24: #include "vector.h"
! 25: #include "memory.h"
! 26:
! 27: /* Initialize vector : allocate memory and return vector. */
! 28: vector
! 29: vector_init (unsigned int size)
! 30: {
! 31: vector v = XCALLOC (MTYPE_VECTOR, sizeof (struct _vector));
! 32:
! 33: /* allocate at least one slot */
! 34: if (size == 0)
! 35: size = 1;
! 36:
! 37: v->alloced = size;
! 38: v->active = 0;
! 39: v->index = XCALLOC (MTYPE_VECTOR_INDEX, sizeof (void *) * size);
! 40: return v;
! 41: }
! 42:
! 43: void
! 44: vector_only_wrapper_free (vector v)
! 45: {
! 46: XFREE (MTYPE_VECTOR, v);
! 47: }
! 48:
! 49: void
! 50: vector_only_index_free (void *index)
! 51: {
! 52: XFREE (MTYPE_VECTOR_INDEX, index);
! 53: }
! 54:
! 55: void
! 56: vector_free (vector v)
! 57: {
! 58: XFREE (MTYPE_VECTOR_INDEX, v->index);
! 59: XFREE (MTYPE_VECTOR, v);
! 60: }
! 61:
! 62: vector
! 63: vector_copy (vector v)
! 64: {
! 65: unsigned int size;
! 66: vector new = XCALLOC (MTYPE_VECTOR, sizeof (struct _vector));
! 67:
! 68: new->active = v->active;
! 69: new->alloced = v->alloced;
! 70:
! 71: size = sizeof (void *) * (v->alloced);
! 72: new->index = XCALLOC (MTYPE_VECTOR_INDEX, size);
! 73: memcpy (new->index, v->index, size);
! 74:
! 75: return new;
! 76: }
! 77:
! 78: /* Check assigned index, and if it runs short double index pointer */
! 79: void
! 80: vector_ensure (vector v, unsigned int num)
! 81: {
! 82: if (v->alloced > num)
! 83: return;
! 84:
! 85: v->index = XREALLOC (MTYPE_VECTOR_INDEX,
! 86: v->index, sizeof (void *) * (v->alloced * 2));
! 87: memset (&v->index[v->alloced], 0, sizeof (void *) * v->alloced);
! 88: v->alloced *= 2;
! 89:
! 90: if (v->alloced <= num)
! 91: vector_ensure (v, num);
! 92: }
! 93:
! 94: /* This function only returns next empty slot index. It dose not mean
! 95: the slot's index memory is assigned, please call vector_ensure()
! 96: after calling this function. */
! 97: int
! 98: vector_empty_slot (vector v)
! 99: {
! 100: unsigned int i;
! 101:
! 102: if (v->active == 0)
! 103: return 0;
! 104:
! 105: for (i = 0; i < v->active; i++)
! 106: if (v->index[i] == 0)
! 107: return i;
! 108:
! 109: return i;
! 110: }
! 111:
! 112: /* Set value to the smallest empty slot. */
! 113: int
! 114: vector_set (vector v, void *val)
! 115: {
! 116: unsigned int i;
! 117:
! 118: i = vector_empty_slot (v);
! 119: vector_ensure (v, i);
! 120:
! 121: v->index[i] = val;
! 122:
! 123: if (v->active <= i)
! 124: v->active = i + 1;
! 125:
! 126: return i;
! 127: }
! 128:
! 129: /* Set value to specified index slot. */
! 130: int
! 131: vector_set_index (vector v, unsigned int i, void *val)
! 132: {
! 133: vector_ensure (v, i);
! 134:
! 135: v->index[i] = val;
! 136:
! 137: if (v->active <= i)
! 138: v->active = i + 1;
! 139:
! 140: return i;
! 141: }
! 142:
! 143: /* Look up vector. */
! 144: void *
! 145: vector_lookup (vector v, unsigned int i)
! 146: {
! 147: if (i >= v->active)
! 148: return NULL;
! 149: return v->index[i];
! 150: }
! 151:
! 152: /* Lookup vector, ensure it. */
! 153: void *
! 154: vector_lookup_ensure (vector v, unsigned int i)
! 155: {
! 156: vector_ensure (v, i);
! 157: return v->index[i];
! 158: }
! 159:
! 160: /* Unset value at specified index slot. */
! 161: void
! 162: vector_unset (vector v, unsigned int i)
! 163: {
! 164: if (i >= v->alloced)
! 165: return;
! 166:
! 167: v->index[i] = NULL;
! 168:
! 169: if (i + 1 == v->active)
! 170: {
! 171: v->active--;
! 172: while (i && v->index[--i] == NULL && v->active--)
! 173: ; /* Is this ugly ? */
! 174: }
! 175: }
! 176:
! 177: /* Count the number of not emplty slot. */
! 178: unsigned int
! 179: vector_count (vector v)
! 180: {
! 181: unsigned int i;
! 182: unsigned count = 0;
! 183:
! 184: for (i = 0; i < v->active; i++)
! 185: if (v->index[i] != NULL)
! 186: count++;
! 187:
! 188: return count;
! 189: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>