vector.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:4k
源码类别:

网络

开发平台:

Unix_Linux

  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. #include <zebra.h>
  22. #include "vector.h"
  23. #include "memory.h"
  24. /* Initialize vector : allocate memory and return vector. */
  25. vector
  26. vector_init (unsigned int size)
  27. {
  28.   vector v = XCALLOC (MTYPE_VECTOR, sizeof (struct _vector));
  29.   /* allocate at least one slot */
  30.   if (size == 0)
  31.     size = 1;
  32.   v->alloced = size;
  33.   v->max = 0;
  34.   v->index = XCALLOC (MTYPE_VECTOR_INDEX, sizeof (void *) * size);
  35.   return v;
  36. }
  37. void
  38. vector_only_wrapper_free (vector v)
  39. {
  40.   XFREE (MTYPE_VECTOR, v);
  41. }
  42. void
  43. vector_only_index_free (void *index)
  44. {
  45.   XFREE (MTYPE_VECTOR_INDEX, index);
  46. }
  47. void
  48. vector_free (vector v)
  49. {
  50.   XFREE (MTYPE_VECTOR_INDEX, v->index);
  51.   XFREE (MTYPE_VECTOR, v);
  52. }
  53. vector
  54. vector_copy (vector v)
  55. {
  56.   unsigned int size;
  57.   vector new = XCALLOC (MTYPE_VECTOR, sizeof (struct _vector));
  58.   new->max = v->max;
  59.   new->alloced = v->alloced;
  60.   size = sizeof (void *) * (v->alloced);
  61.   new->index = XCALLOC (MTYPE_VECTOR_INDEX, size);
  62.   memcpy (new->index, v->index, size);
  63.   return new;
  64. }
  65. /* Check assigned index, and if it runs short double index pointer */
  66. void
  67. vector_ensure (vector v, unsigned int num)
  68. {
  69.   if (v->alloced > num)
  70.     return;
  71.   v->index = XREALLOC (MTYPE_VECTOR_INDEX, 
  72.        v->index, sizeof (void *) * (v->alloced * 2));
  73.   memset (&v->index[v->alloced], 0, sizeof (void *) * v->alloced);
  74.   v->alloced *= 2;
  75.   
  76.   if (v->alloced <= num)
  77.     vector_ensure (v, num);
  78. }
  79. /* This function only returns next empty slot index.  It dose not mean
  80.    the slot's index memory is assigned, please call vector_ensure()
  81.    after calling this function. */
  82. int
  83. vector_empty_slot (vector v)
  84. {
  85.   unsigned int i;
  86.   if (v->max == 0)
  87.     return 0;
  88.   for (i = 0; i < v->max; i++)
  89.     if (v->index[i] == 0)
  90.       return i;
  91.   return i;
  92. }
  93. /* Set value to the smallest empty slot. */
  94. int
  95. vector_set (vector v, void *val)
  96. {
  97.   unsigned int i;
  98.   i = vector_empty_slot (v);
  99.   vector_ensure (v, i);
  100.   v->index[i] = val;
  101.   if (v->max <= i)
  102.     v->max = i + 1;
  103.   return i;
  104. }
  105. /* Set value to specified index slot. */
  106. int
  107. vector_set_index (vector v, unsigned int i, void *val)
  108. {
  109.   vector_ensure (v, i);
  110.   v->index[i] = val;
  111.   if (v->max <= i)
  112.     v->max = i + 1;
  113.   return i;
  114. }
  115. /* Look up vector.  */
  116. void *
  117. vector_lookup (vector v, unsigned int i)
  118. {
  119.   if (i >= v->max)
  120.     return NULL;
  121.   return v->index[i];
  122. }
  123. /* Lookup vector, ensure it. */
  124. void *
  125. vector_lookup_ensure (vector v, unsigned int i)
  126. {
  127.   vector_ensure (v, i);
  128.   return v->index[i];
  129. }
  130. /* Unset value at specified index slot. */
  131. void
  132. vector_unset (vector v, unsigned int i)
  133. {
  134.   if (i >= v->alloced)
  135.     return;
  136.   v->index[i] = NULL;
  137.   if (i + 1 == v->max) 
  138.     {
  139.       v->max--;
  140.       while (i && v->index[--i] == NULL && v->max--) 
  141. ; /* Is this ugly ? */
  142.     }
  143. }
  144. /* Count the number of not emplty slot. */
  145. unsigned int
  146. vector_count (vector v)
  147. {
  148.   unsigned int i;
  149.   unsigned count = 0;
  150.   for (i = 0; i < v->max; i++) 
  151.     if (v->index[i] != NULL)
  152.       count++;
  153.   return count;
  154. }