Annotation of embedaddon/iftop/stringmap.c, revision 1.1.1.1
1.1 misho 1: /*
2: * stringmap.c: sucky implementation of binary trees
3: *
4: * This makes no attempt to balance the tree, so has bad worst-case behaviour.
5: * Also, I haven't implemented removal of items from the tree. So sue me.
6: *
7: * Copyright (c) 2001 Chris Lightfoot. All rights reserved.
8: *
9: */
10:
11: static const char rcsid[] = "$Id: stringmap.c,v 1.3 2003/11/06 23:37:20 chris Exp $";
12:
13:
14: #include <stdlib.h>
15: #include <string.h>
16:
17: #include "stringmap.h"
18: #include "vector.h"
19: #include "iftop.h"
20:
21: /* stringmap_new:
22: * Allocate memory for a new stringmap. */
23: stringmap stringmap_new() {
24: stringmap S;
25:
26: S = xcalloc(sizeof *S, 1);
27:
28: return S;
29: }
30:
31: /* stringmap_delete:
32: * Free memory for a stringmap. */
33: void stringmap_delete(stringmap S) {
34: if (!S) return;
35: if (S->l) stringmap_delete(S->l);
36: if (S->g) stringmap_delete(S->g);
37:
38: xfree(S->key);
39: xfree(S);
40: }
41:
42: /* stringmap_delete_free:
43: * Free memory for a stringmap, and the objects contained in it, assuming that
44: * they are pointers to memory allocated by xmalloc(3). */
45: void stringmap_delete_free(stringmap S) {
46: if (!S) return;
47: if (S->l) stringmap_delete_free(S->l);
48: if (S->g) stringmap_delete_free(S->g);
49:
50: xfree(S->key);
51: xfree(S->d.v);
52: xfree(S);
53: }
54:
55: /* stringmap_insert:
56: * Insert into S an item having key k and value d. Returns an existing key
57: * or NULL if it was inserted.
58: */
59: item *stringmap_insert(stringmap S, const char *k, const item d) {
60: if (!S) return 0;
61: if (S->key == NULL) {
62: S->key = xstrdup(k);
63: S->d = d;
64: return NULL;
65: } else {
66: stringmap S2;
67: for (S2 = S;;) {
68: int i = strcmp(k, S2->key);
69: if (i == 0) {
70: return &(S2->d);
71: }
72: else if (i < 0) {
73: if (S2->l) S2 = S2->l;
74: else {
75: if (!(S2->l = stringmap_new())) return NULL;
76: S2->l->key = xstrdup(k);
77: S2->l->d = d;
78: return NULL;
79: }
80: } else if (i > 0) {
81: if (S2->g) S2 = S2->g;
82: else {
83: if (!(S2->g = stringmap_new())) return NULL;
84: S2->g->key = xstrdup(k);
85: S2->g->d = d;
86: return NULL;
87: }
88: }
89: }
90: }
91: }
92:
93: /* stringmap_find:
94: * Find in d an item having key k in the stringmap S, returning the item found
95: * on success NULL if no key was found. */
96: stringmap stringmap_find(const stringmap S, const char *k) {
97: stringmap S2;
98: int i;
99: if (!S || S->key == NULL) return 0;
100: for (S2 = S;;) {
101: i = strcmp(k, S2->key);
102: if (i == 0) return S2;
103: else if (i < 0) {
104: if (S2->l) S2 = S2->l;
105: else return NULL;
106: } else if (i > 0) {
107: if (S2->g) S2 = S2->g;
108: else return NULL;
109: }
110: }
111: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>