Annotation of embedaddon/iftop/vector.c, revision 1.1.1.1
1.1 misho 1: /*
2: * vector.c:
3: * simple vectors
4: *
5: * Copyright (c) 2001 Chris Lightfoot. All rights reserved.
6: *
7: */
8:
9: static const char rcsid[] = "$Id: vector.c,v 1.3 2003/11/07 02:16:41 pdw Exp $";
10:
11: #ifdef HAVE_CONFIG_H
12: /*include "configuration.h"*/
13: #endif /* HAVE_CONFIG_H */
14:
15: #include <stdlib.h>
16: #include <string.h>
17:
18: #include "vector.h"
19: #include "iftop.h"
20:
21: vector vector_new(void) {
22: vector v;
23:
24: v = xcalloc(1, sizeof *v);
25: if (!v) return NULL;
26:
27: v->ary = xcalloc(16, sizeof *v->ary);
28: v->n = 16;
29: v->n_used = 0;
30: return v;
31: }
32:
33: void vector_delete(vector v) {
34: xfree(v->ary);
35: xfree(v);
36: }
37:
38: void vector_delete_free(vector v) {
39: item *i;
40: vector_iterate(v, i) {
41: xfree(i->v);
42: }
43: xfree(v->ary);
44: xfree(v);
45: }
46:
47: void vector_push_back(vector v, const item t) {
48: if (v->n_used == v->n) vector_reallocate(v, v->n * 2);
49: v->ary[v->n_used++] = t;
50: }
51:
52: void vector_pop_back(vector v) {
53: if (v->n_used > 0) {
54: --v->n_used;
55: if (v->n_used < v->n / 2) vector_reallocate(v, v->n / 2);
56: }
57: }
58:
59: item vector_back(vector v) {
60: return v->ary[v->n_used - 1];
61: }
62:
63: item *vector_remove(vector v, item *t) {
64: if (t >= v->ary + v->n_used) return NULL;
65: if (t < v->ary + v->n_used - 1)
66: memmove(t, t + 1, (v->n_used - (t - v->ary)) * sizeof(item));
67: memset(v->ary + v->n_used--, 0, sizeof(item));
68: if (v->n_used < v->n / 2 && v->n > 16) {
69: size_t i = t - v->ary;
70: vector_reallocate(v, v->n / 2);
71: t = v->ary + i;
72: }
73: return t;
74: }
75:
76: void vector_reallocate(vector v, const size_t n) {
77: if (n < v->n_used || n <= 0) return;
78: v->ary = xrealloc(v->ary, n * sizeof(item));
79: memset(v->ary + v->n_used, 0, (v->n - v->n_used) * sizeof(item));
80: v->n = n;
81: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>