1 /*
2  * Copyright � 2001 Novell, Inc. All Rights Reserved.
3  *
4  * You may distribute under the terms of either the GNU General Public
5  * License or the Artistic License, as specified in the README file.
6  *
7  */
8 
9 /*
10  * FILENAME     :  hashcls.cpp
11  * DESCRIPTION  :  Implementation of Equivalent of Hash class, NWPerlHashList and
12 					NWPerlKeyHashList
13  *
14  * Author       :  Srivathsa M
15  * Date	Created :  July 26 2001
16  */
17 
18 #include "nwhashcls.h"
19 
NWPerlHashList()20 NWPerlHashList::NWPerlHashList()
21 {
22 	//initialize the hash list to null
23 	for(int i=0;i<BUCKET_SIZE;i++)
24 		MemListHash[i] = NULL;
25 	DEBUGPRINT("In constructor\n");
26 }
27 
~NWPerlHashList()28 NWPerlHashList::~NWPerlHashList()
29 {
30 	DEBUGPRINT("In destructor\n");
31 	removeAll();
32 }
33 
34 int
insert(void * ldata)35 NWPerlHashList::insert(void *ldata)
36 {
37 	HASHNODE *list = new HASHNODE;
38 	if (list) {
39 		list->data = ldata;
40 		list->next = NULL;
41 		unsigned long Bucket = ((unsigned long)ldata) % BUCKET_SIZE;
42 		if (MemListHash[Bucket]) {
43 			//Elements existing, insert at the beginning
44 			list->next = MemListHash[Bucket];
45 			MemListHash[Bucket] = list;
46 			DEBUGPRINT("Inserted to %d\n",Bucket);
47 		} else {
48 			//First element
49 			MemListHash[Bucket] = list;
50 			DEBUGPRINT("Inserted first time to %d\n",Bucket);
51 		}
52 		return 1;
53 	} else
54 		return 0;
55 }
56 
57 int
remove(void * ldata)58 NWPerlHashList::remove(void *ldata)
59 {
60 	unsigned long Bucket = ((unsigned long)ldata) % BUCKET_SIZE;
61 	HASHNODE *list = MemListHash[Bucket];
62 	if (list) {
63 		int found = 0;
64 		HASHNODE *next =list;
65 		HASHNODE *prev =NULL;
66 		do
67 		{
68 			if (list->data != ldata) {
69 				prev = list;
70 				list = list->next;
71 			}
72 			else {
73 				found = 1;
74 				next = list->next;
75 				/*if(list->data)
76 				{
77 					free(list->data);
78 					list->data = NULL;
79 				}*/
80 				//ConsolePrintf ("A:%x;",list->data);
81 				delete list;
82 				list = NULL;
83 				if (prev) {
84 					prev->next = next;
85 				} else {
86 					MemListHash[Bucket]=next;
87 				}
88 				DEBUGPRINT("Removed element from %d\n",Bucket);
89 			}
90 			ThreadSwitchWithDelay();
91 		} while(list && !found);
92 //		if (!found)
93 //			ConsolePrintf("Couldn;t find %x in Bucket %d\n",ldata,Bucket);
94 		return(found);
95 	}
96 	return 1;
97 }
98 
99 
forAll(register void (* user_fn)(void *,void *),void * data) const100 void NWPerlHashList::forAll( register void (*user_fn)(void *, void*), void *data ) const
101 {
102 
103 	for(int i=0; i<BUCKET_SIZE; i++)
104 	{
105 		HASHNODE *next = MemListHash[i];
106 		while(next)
107 		{
108 			HASHNODE *temp = next->next;
109 			if(next->data)
110 			{
111 				DEBUGPRINT("- To remove element from bucket %d\n",i);
112 	            user_fn( next->data, data );
113 			}
114 			next = temp;
115 			ThreadSwitchWithDelay();
116 		}
117 	}
118 	return ;
119 };
120 
removeAll() const121 void NWPerlHashList::removeAll( ) const
122 {
123 
124 	for(int i=0; i<BUCKET_SIZE; i++)
125 	{
126 		HASHNODE *next = MemListHash[i];
127 		while(next)
128 		{
129 			HASHNODE *temp = next->next;
130 			delete next;
131 			next = temp;
132 			ThreadSwitchWithDelay();
133 		}
134 	}
135 	return ;
136 };
137 
138 /**
139 NWPerlKeyHashList::NWPerlKeyHashList()
140 {
141 	//initialize the hash list to null
142 	for(int i=0;i<BUCKET_SIZE;i++)
143 		MemListHash[i] = NULL;
144 	DEBUGPRINT("In constructor\n");
145 }
146 
147 NWPerlKeyHashList::~NWPerlKeyHashList()
148 {
149 	DEBUGPRINT("In destructor\n");
150 	removeAll();
151 }
152 
153 int
154 NWPerlKeyHashList::insert(void *key, void *ldata)
155 {
156 	KEYHASHNODE *list = new KEYHASHNODE;
157 	if (list) {
158 		list->key = key;
159 		list->data = ldata;
160 		list->next = NULL;
161 		unsigned long Bucket = ((unsigned long)key) % BUCKET_SIZE;
162 		if (MemListHash[Bucket]) {
163 			//Elements existing, insert at the beginning
164 			list->next = MemListHash[Bucket];
165 			MemListHash[Bucket] = list;
166 			DEBUGPRINT("Inserted to %d\n",Bucket);
167 		} else {
168 			//First element
169 			MemListHash[Bucket] = list;
170 			DEBUGPRINT("Inserted first time to %d\n",Bucket);
171 		}
172 		return 1;
173 	} else
174 		return 0;
175 }
176 
177 int
178 NWPerlKeyHashList::remove(void *key)
179 {
180 	unsigned long Bucket = ((unsigned long)key) % BUCKET_SIZE;
181 	KEYHASHNODE *list = MemListHash[Bucket];
182 	if (list) {
183 		int found = 0;
184 		KEYHASHNODE *next =list;
185 		KEYHASHNODE *prev =NULL;
186 		do
187 		{
188 			if (list->key != key) {
189 				prev = list;
190 				list = list->next;
191 			}
192 			else {
193 				found = 1;
194 				next = list->next;
195 				delete list;
196 				list = NULL;
197 				if (prev) {
198 					prev->next = next;
199 				} else {
200 					MemListHash[Bucket]=next;
201 				}
202 				DEBUGPRINT("Removed element from %d\n",Bucket);
203 			}
204 		} while(list && !found);
205 //		if (!found)
206 //			ConsolePrintf("Couldn;t find %x in Bucket %d\n",key,Bucket);
207 		return(found);
208 	}
209 	return 1;
210 }
211 
212 
213 void NWPerlKeyHashList::forAll( register void (*user_fn)(void *, void*), void *data ) const
214 {
215 
216 	for(int i=0; i<BUCKET_SIZE; i++)
217 	{
218 		KEYHASHNODE *next = MemListHash[i];
219 		while(next)
220 		{
221 			KEYHASHNODE *temp = next->next;
222 			if(next->data)
223 			{
224 				DEBUGPRINT("- To remove element from bucket %d\n",i);
225 	            user_fn( next->data, data );
226 			}
227 			next = temp;
228 			ThreadSwitchWithDelay();
229 		}
230 	}
231 	return ;
232 };
233 
234 int NWPerlKeyHashList::find(void *key,void **pData)
235 {
236 	for(int i=0; i<BUCKET_SIZE; i++)
237 	{
238 		KEYHASHNODE *next = MemListHash[i];
239 		while(next)
240 		{
241 			if(next->key==key)
242 			{
243 				*pData=next->data;
244 				return 1;
245 			}
246 			next = next->next;
247 			ThreadSwitchWithDelay();
248 		}
249 	}
250 	return 0;
251 }
252 
253 void NWPerlKeyHashList::removeAll( ) const
254 {
255 
256 	for(int i=0; i<BUCKET_SIZE; i++)
257 	{
258 		KEYHASHNODE *next = MemListHash[i];
259 		while(next)
260 		{
261 			KEYHASHNODE *temp = next->next;
262 			delete next;
263 			next = temp;
264 			ThreadSwitchWithDelay();
265 		}
266 	}
267 	return ;
268 };
269 **/
270