Annotation of embedaddon/iftop/hash.c, revision 1.1.1.1

1.1       misho       1: /* hash table */
                      2: 
                      3: #include <stdio.h>
                      4: #include <stdlib.h>
                      5: #include "hash.h"
                      6: #include "iftop.h"
                      7: 
                      8: hash_status_enum hash_insert(hash_type* hash_table, void* key, void* rec) {
                      9:     hash_node_type *p, *p0;
                     10:     int bucket;
                     11: 
                     12:    /************************************************
                     13:     *  allocate node for data and insert in table  *
                     14:     ************************************************/
                     15: 
                     16: 
                     17:     /* insert node at beginning of list */
                     18:     bucket = hash_table->hash(key);
                     19:     p = xmalloc(sizeof *p);
                     20:     p0 = hash_table->table[bucket];
                     21:     hash_table->table[bucket] = p;
                     22:     p->next = p0;
                     23:     p->key = hash_table->copy_key(key);
                     24:     p->rec = rec;
                     25:     return HASH_STATUS_OK;
                     26: }
                     27: 
                     28: hash_status_enum hash_delete(hash_type* hash_table, void* key) {
                     29:     hash_node_type *p0, *p;
                     30:     int bucket;
                     31: 
                     32:    /********************************************
                     33:     *  delete node containing data from table  *
                     34:     ********************************************/
                     35: 
                     36:     /* find node */
                     37:     p0 = 0;
                     38:     bucket = hash_table->hash(key);
                     39:     p = hash_table->table[bucket];
                     40:     while (p && !hash_table->compare(p->key, key)) {
                     41:         p0 = p;
                     42:         p = p->next;
                     43:     }
                     44:     if (!p) return HASH_STATUS_KEY_NOT_FOUND;
                     45: 
                     46:     /* p designates node to delete, remove it from list */
                     47:     if (p0) {
                     48:         /* not first node, p0 points to previous node */
                     49:         p0->next = p->next;
                     50:     }
                     51:     else {
                     52:         /* first node on chain */
                     53:         hash_table->table[bucket] = p->next;
                     54:     }
                     55: 
                     56:     hash_table->delete_key(p->key);
                     57:     free (p);
                     58:     return HASH_STATUS_OK;
                     59: }
                     60: 
                     61: hash_status_enum hash_find(hash_type* hash_table, void* key, void **rec) {
                     62:     hash_node_type *p;
                     63: 
                     64:    /*******************************
                     65:     *  find node containing data  *
                     66:     *******************************/
                     67:     p = hash_table->table[hash_table->hash(key)];
                     68: 
                     69:     while (p && !hash_table->compare(p->key, key))  {
                     70:         p = p->next;
                     71:     }
                     72:     if (!p) return HASH_STATUS_KEY_NOT_FOUND;
                     73:     *rec = p->rec;
                     74:     return HASH_STATUS_OK;
                     75: }
                     76: 
                     77: hash_status_enum hash_next_item(hash_type* hash_table, hash_node_type** ppnode) {
                     78:     int i;
                     79:     if(*ppnode != NULL) {
                     80:         if((*ppnode)->next != NULL) {
                     81:             *ppnode = (*ppnode)->next;
                     82:             return HASH_STATUS_OK;
                     83:         }
                     84:         i = hash_table->hash((*ppnode)->key) + 1;
                     85:     }
                     86:     else {
                     87:         /* first node */
                     88:         i = 0;
                     89:     }
                     90:     while(i < hash_table->size && hash_table->table[i] == NULL) {
                     91:          i++; 
                     92:     }
                     93:     if(i == hash_table->size) {
                     94:         *ppnode = NULL;
                     95:         return HASH_STATUS_KEY_NOT_FOUND;
                     96:     }
                     97:     *ppnode = hash_table->table[i];
                     98:     return HASH_STATUS_OK;
                     99: }
                    100: 
                    101: void hash_delete_all(hash_type* hash_table) {
                    102:     int i;
                    103:     hash_node_type *n, *nn;
                    104:     for(i = 0; i < hash_table->size; i++) {
                    105:         n = hash_table->table[i];
                    106:         while(n != NULL) {
                    107:             nn = n->next;
                    108:             hash_table->delete_key(n->key);
                    109:             free(n);
                    110:             n = nn;
                    111:         }
                    112:         hash_table->table[i] = NULL;
                    113:     }
                    114: }
                    115: 
                    116: 
                    117: /*
                    118:  * Allocate and return a hash
                    119:  */
                    120: hash_status_enum hash_initialise(hash_type* hash_table) {
                    121:     hash_table->table = xcalloc(hash_table->size, sizeof *hash_table->table);
                    122:     return HASH_STATUS_OK;
                    123: }
                    124: 
                    125: hash_status_enum hash_destroy(hash_type* hash_table) {
                    126:     free(hash_table->table);
                    127:     return HASH_STATUS_OK;
                    128: }
                    129: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>