Annotation of embedaddon/iftop/stringmap.c, revision 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>