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