Annotation of embedaddon/quagga/lib/vector.c, revision 1.1.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>