core, lib, modules: restructured source code tree
[sip-router] / src / core / str_hash.h
1 /*
2  * Copyright (C) 2006 iptelorg GmbH 
3  *
4  * Permission to use, copy, modify, and distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16
17 #ifndef _str_hashs_h
18 #define _str_hashs_h
19
20 #include "str.h"
21 #include "hashes.h"
22 #include "mem/mem.h"
23 #include "clist.h"
24 #include <string.h>
25
26
27 /* generic, simple str keyed hash */
28
29 struct str_hash_entry{
30         struct str_hash_entry* next;
31         struct str_hash_entry* prev;
32         str key;
33         unsigned int flags;
34         union{
35                 void* p;
36                 char* s;
37                 int   n;
38                 char  data[sizeof(void*)];
39         }u;
40 };
41
42
43 struct str_hash_head{
44         struct str_hash_entry* next;
45         struct str_hash_entry* prev;
46 };
47
48
49 struct str_hash_table{
50         struct str_hash_head* table;
51         int size;
52 };
53
54
55
56 /* returns 0 on success, <0 on failure */
57 inline static int str_hash_alloc(struct str_hash_table* ht, int size)
58 {
59         ht->table=(struct str_hash_head*)pkg_malloc(sizeof(struct str_hash_head)*size);
60         if (ht->table==0)
61                 return -1;
62         ht->size=size;
63         return 0;
64 }
65
66
67
68 inline static void str_hash_init(struct str_hash_table* ht)
69 {
70         int r;
71         
72         for (r=0; r<ht->size; r++) clist_init(&(ht->table[r]), next, prev);
73 }
74
75
76
77 inline static void str_hash_add(struct str_hash_table* ht, 
78                                                                 struct str_hash_entry* e)
79 {
80         int h;
81         
82         h=get_hash1_raw(e->key.s, e->key.len) % ht->size;
83         clist_insert(&ht->table[h], e, next, prev);
84 }
85
86
87
88 inline static struct str_hash_entry* str_hash_get(struct str_hash_table* ht,
89                                                                         const char* key, int len)
90 {
91         int h;
92         struct str_hash_entry* e;
93         
94         h=get_hash1_raw(key, len) % ht->size;
95         clist_foreach(&ht->table[h], e, next){
96                 if ((e->key.len==len) && (memcmp(e->key.s, key, len)==0))
97                         return e;
98         }
99         return 0;
100 }
101
102
103 #define str_hash_del(e) clist_rm(e, next, prev)
104
105 #endif