src/protocols/jabber/xhash.c

Mon, 31 Mar 2003 07:19:46 +0000

author
Sean Egan <seanegan@pidgin.im>
date
Mon, 31 Mar 2003 07:19:46 +0000
changeset 4916
11b8fd3f8ffc
parent 3127
4213ad5b231c
permissions
-rw-r--r--

[gaim-migrate @ 5250]
Buddy list editing.

Does this work? I don't know; I don't test things. It compiles though.

It probably does work though, because I'm perfect.

So, see, I did really terribly in school last semester (really terribly--
like, why didn't they kick me out terribly) and so I'm working really hard
to do well this semester (and I am so far :)). Anyway, that's why you may
have noticed I'm a bit slow with the development of late. In fact, I would
test and fix this stuff up, but I really need to work on an English paper,
so I figured it'd be best just to commit it as is and let Rob, Nathan, Chip
and the boys work out the kinks. Besides, I've had most of this code written
for weeks already.

Thank you all for your patience.

Oh, so there's now an Edit menu on your buddy list (which makes the minimum
buddy list width wider :-D) and here you'll find things with which to edit
your list and privacy, prefs and accounts. It should all be real intuitive.

Feel free to IM me if you want to talk about my paper.

3127
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
1 /* --------------------------------------------------------------------------
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
2 *
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
3 * License
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
4 *
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
5 * The contents of this file are subject to the Jabber Open Source License
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
6 * Version 1.0 (the "JOSL"). You may not copy or use this file, in either
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
7 * source code or executable form, except in compliance with the JOSL. You
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
8 * may obtain a copy of the JOSL at http://www.jabber.org/ or at
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
9 * http://www.opensource.org/.
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
10 *
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
11 * Software distributed under the JOSL is distributed on an "AS IS" basis,
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
12 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the JOSL
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
13 * for the specific language governing rights and limitations under the
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
14 * JOSL.
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
15 *
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
16 * Copyrights
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
17 *
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
18 * Portions created by or assigned to Jabber.com, Inc. are
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
19 * Copyright (c) 1999-2002 Jabber.com, Inc. All Rights Reserved. Contact
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
20 * information for Jabber.com, Inc. is available at http://www.jabber.com/.
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
21 *
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
22 * Portions Copyright (c) 1998-1999 Jeremie Miller.
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
23 *
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
24 * Acknowledgements
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
25 *
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
26 * Special thanks to the Jabber Open Source Contributors for their
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
27 * suggestions and support of Jabber.
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
28 *
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
29 * Alternatively, the contents of this file may be used under the terms of the
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
30 * GNU General Public License Version 2 or later (the "GPL"), in which case
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
31 * the provisions of the GPL are applicable instead of those above. If you
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
32 * wish to allow use of your version of this file only under the terms of the
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
33 * GPL and not to allow others to use your version of this file under the JOSL,
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
34 * indicate your decision by deleting the provisions above and replace them
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
35 * with the notice and other provisions required by the GPL. If you do not
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
36 * delete the provisions above, a recipient may use your version of this file
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
37 * under either the JOSL or the GPL.
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
38 *
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
39 *
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
40 * --------------------------------------------------------------------------*/
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
41
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
42 #include "lib.h"
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
43
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
44
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
45 /* Generates a hash code for a string.
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
46 * This function uses the ELF hashing algorithm as reprinted in
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
47 * Andrew Binstock, "Hashing Rehashed," Dr. Dobb's Journal, April 1996.
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
48 */
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
49 int _xhasher(const char *s)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
50 {
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
51 /* ELF hash uses unsigned chars and unsigned arithmetic for portability */
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
52 const unsigned char *name = (const unsigned char *)s;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
53 unsigned long h = 0, g;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
54
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
55 while (*name)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
56 { /* do some fancy bitwanking on the string */
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
57 h = (h << 4) + (unsigned long)(*name++);
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
58 if ((g = (h & 0xF0000000UL))!=0)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
59 h ^= (g >> 24);
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
60 h &= ~g;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
61
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
62 }
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
63
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
64 return (int)h;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
65 }
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
66
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
67
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
68 xhn _xhash_node_new(xht h, int index)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
69 {
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
70 xhn n;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
71 int i = index % h->prime;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
72
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
73 /* get existing empty one */
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
74 for(n = &h->zen[i]; n != NULL; n = n->next)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
75 if(n->key == NULL)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
76 return n;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
77
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
78 /* overflowing, new one! */
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
79 n = pmalloco(h->p, sizeof(_xhn));
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
80 n->next = h->zen[i].next;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
81 h->zen[i].next = n;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
82 return n;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
83 }
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
84
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
85
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
86 xhn _xhash_node_get(xht h, const char *key, int index)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
87 {
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
88 xhn n;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
89 int i = index % h->prime;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
90 for(n = &h->zen[i]; n != NULL; n = n->next)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
91 if(j_strcmp(key, n->key) == 0)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
92 return n;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
93 return NULL;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
94 }
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
95
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
96
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
97 xht xhash_new(int prime)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
98 {
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
99 xht xnew;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
100 pool p;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
101
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
102 /* log_debug(ZONE,"creating new hash table of size %d",prime); */
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
103
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
104 p = pool_heap(sizeof(_xhn)*prime + sizeof(_xht));
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
105 xnew = pmalloco(p, sizeof(_xht));
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
106 xnew->prime = prime;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
107 xnew->p = p;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
108 xnew->zen = pmalloco(p, sizeof(_xhn)*prime); /* array of xhn size of prime */
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
109 return xnew;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
110 }
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
111
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
112
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
113 void xhash_put(xht h, const char *key, void *val)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
114 {
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
115 int index;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
116 xhn n;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
117
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
118 if(h == NULL || key == NULL)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
119 return;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
120
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
121 index = _xhasher(key);
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
122
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
123 /* if existing key, replace it */
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
124 if((n = _xhash_node_get(h, key, index)) != NULL)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
125 {
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
126 /* log_debug(ZONE,"replacing %s with new val %X",key,val); */
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
127
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
128 n->key = key;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
129 n->val = val;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
130 return;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
131 }
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
132
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
133 /* log_debug(ZONE,"saving %s val %X",key,val); */
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
134
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
135 /* new node */
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
136 n = _xhash_node_new(h, index);
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
137 n->key = key;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
138 n->val = val;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
139 }
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
140
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
141
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
142 void *xhash_get(xht h, const char *key)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
143 {
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
144 xhn n;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
145
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
146 if(h == NULL || key == NULL || (n = _xhash_node_get(h, key, _xhasher(key))) == NULL)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
147 {
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
148 /* log_debug(ZONE,"failed lookup of %s",key); */
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
149 return NULL;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
150 }
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
151
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
152 /* log_debug(ZONE,"found %s returning %X",key,n->val); */
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
153 return n->val;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
154 }
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
155
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
156
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
157 void xhash_zap(xht h, const char *key)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
158 {
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
159 xhn n;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
160
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
161 if(h == NULL || key == NULL || (n = _xhash_node_get(h, key, _xhasher(key))) == NULL)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
162 return;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
163
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
164 /* log_debug(ZONE,"zapping %s",key); */
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
165
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
166 /* kill an entry by zeroing out the key */
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
167 n->key = NULL;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
168 }
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
169
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
170
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
171 void xhash_free(xht h)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
172 {
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
173 /* log_debug(ZONE,"hash free %X",h); */
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
174
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
175 if(h != NULL)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
176 pool_free(h->p);
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
177 }
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
178
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
179 void xhash_walk(xht h, xhash_walker w, void *arg)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
180 {
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
181 int i;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
182 xhn n;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
183
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
184 if(h == NULL || w == NULL)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
185 return;
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
186
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
187 /* log_debug(ZONE,"walking %X",h); */
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
188
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
189 for(i = 0; i < h->prime; i++)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
190 for(n = &h->zen[i]; n != NULL; n = n->next)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
191 if(n->key != NULL && n->val != NULL)
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
192 (*w)(h, n->key, n->val, arg);
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
193 }
4213ad5b231c [gaim-migrate @ 3142]
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
194

mercurial