123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- /*
- * stringmap.c: sucky implementation of binary trees
- *
- * This makes no attempt to balance the tree, so has bad worst-case behaviour.
- * Also, I haven't implemented removal of items from the tree. So sue me.
- *
- * Copyright (c) 2001 Chris Lightfoot. All rights reserved.
- *
- */
- static const char rcsid[] = "$Id: stringmap.c,v 1.4 2010/11/27 11:06:12 pdw Exp $";
- #include <stdlib.h>
- #include <string.h>
- #include "stringmap.h"
- #include "vector.h"
- #include "iftop.h"
- /* stringmap_new:
- * Allocate memory for a new stringmap. */
- stringmap stringmap_new() {
- stringmap S;
-
- S = xcalloc(sizeof *S, 1);
- return S;
- }
- /* stringmap_delete:
- * Free memory for a stringmap. */
- void stringmap_delete(stringmap S) {
- if (!S) return;
- if (S->l) stringmap_delete(S->l);
- if (S->g) stringmap_delete(S->g);
- xfree(S->key);
- xfree(S);
- }
- /* stringmap_delete_free:
- * Free memory for a stringmap, and the objects contained in it, assuming that
- * they are pointers to memory allocated by xmalloc(3). */
- void stringmap_delete_free(stringmap S) {
- if (!S) return;
- if (S->l) stringmap_delete_free(S->l);
- if (S->g) stringmap_delete_free(S->g);
- xfree(S->key);
- xfree(S->d.v);
- xfree(S);
- }
- /* stringmap_insert:
- * Insert into S an item having key k and value d. Returns a pointer to
- * the existing item value, or NULL if a new item was created.
- */
- item *stringmap_insert(stringmap S, const char *k, const item d) {
- if (!S) return NULL;
- if (S->key == NULL) {
- S->key = xstrdup(k);
- S->d = d;
- return NULL;
- } else {
- stringmap S2;
- for (S2 = S;;) {
- int i = strcmp(k, S2->key);
- if (i == 0) {
- return &(S2->d);
- }
- else if (i < 0) {
- if (S2->l) S2 = S2->l;
- else {
- if (!(S2->l = stringmap_new())) return NULL;
- S2->l->key = xstrdup(k);
- S2->l->d = d;
- return NULL;
- }
- } else if (i > 0) {
- if (S2->g) S2 = S2->g;
- else {
- if (!(S2->g = stringmap_new())) return NULL;
- S2->g->key = xstrdup(k);
- S2->g->d = d;
- return NULL;
- }
- }
- }
- }
- }
- /* stringmap_find:
- * Find in d an item having key k in the stringmap S, returning the item found
- * on success NULL if no key was found. */
- stringmap stringmap_find(const stringmap S, const char *k) {
- stringmap S2;
- int i;
- if (!S || S->key == NULL) return 0;
- for (S2 = S;;) {
- i = strcmp(k, S2->key);
- if (i == 0) return S2;
- else if (i < 0) {
- if (S2->l) S2 = S2->l;
- else return NULL;
- } else if (i > 0) {
- if (S2->g) S2 = S2->g;
- else return NULL;
- }
- }
- }
|