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>