Merge pull request #2326 from NGSegovia/keepalive/first_check_on_start
[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                 PKG_MEM_ERROR;
62                 return -1;
63         }
64         ht->size=size;
65         return 0;
66 }
67
68
69
70 inline static void str_hash_init(struct str_hash_table* ht)
71 {
72         int r;
73
74         for (r=0; r<ht->size; r++) clist_init(&(ht->table[r]), next, prev);
75 }
76
77
78
79 inline static void str_hash_add(struct str_hash_table* ht,
80                                                                 struct str_hash_entry* e)
81 {
82         int h;
83
84         h=get_hash1_raw(e->key.s, e->key.len) % ht->size;
85         clist_insert(&ht->table[h], e, next, prev);
86 }
87
88
89
90 inline static struct str_hash_entry* str_hash_get(struct str_hash_table* ht,
91                                                                         const char* key, int len)
92 {
93         int h;
94         struct str_hash_entry* e;
95
96         h=get_hash1_raw(key, len) % ht->size;
97         clist_foreach(&ht->table[h], e, next){
98                 if ((e->key.len==len) && (memcmp(e->key.s, key, len)==0))
99                         return e;
100         }
101         return 0;
102 }
103
104 inline static void str_hash_case_add(struct str_hash_table* ht,
105                                                                 struct str_hash_entry* e)
106 {
107         int h;
108
109         h=get_hash1_case_raw(e->key.s, e->key.len) % ht->size;
110         clist_insert(&ht->table[h], e, next, prev);
111 }
112
113
114
115 inline static struct str_hash_entry* str_hash_case_get(struct str_hash_table* ht,
116                                                                         const char* key, int len)
117 {
118         int h;
119         struct str_hash_entry* e;
120
121         h=get_hash1_case_raw(key, len) % ht->size;
122         clist_foreach(&ht->table[h], e, next){
123                 if ((e->key.len==len) && (strncasecmp(e->key.s, key, len)==0))
124                         return e;
125         }
126         return 0;
127 }
128
129 #define str_hash_del(e) clist_rm(e, next, prev)
130
131 #endif