| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Implementation of the symbol table type. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Author : Stephen Smalley, <sds@epoch.ncsc.mil> | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #include <linux/kernel.h>
 | 
					
						
							|  |  |  | #include <linux/string.h>
 | 
					
						
							|  |  |  | #include <linux/errno.h>
 | 
					
						
							|  |  |  | #include "symtab.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-06 12:38:17 -05:00
										 |  |  | static unsigned int symhash(struct hashtab *h, const void *key) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-11-06 12:38:17 -05:00
										 |  |  | 	const char *p, *keyp; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	unsigned int size; | 
					
						
							|  |  |  | 	unsigned int val; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	val = 0; | 
					
						
							|  |  |  | 	keyp = key; | 
					
						
							|  |  |  | 	size = strlen(keyp); | 
					
						
							|  |  |  | 	for (p = keyp; (p - keyp) < size; p++) | 
					
						
							|  |  |  | 		val = (val << 4 | (val >> (8*sizeof(unsigned int)-4))) ^ (*p); | 
					
						
							|  |  |  | 	return val & (h->size - 1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-11-06 12:38:17 -05:00
										 |  |  | static int symcmp(struct hashtab *h, const void *key1, const void *key2) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-11-06 12:38:17 -05:00
										 |  |  | 	const char *keyp1, *keyp2; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	keyp1 = key1; | 
					
						
							|  |  |  | 	keyp2 = key2; | 
					
						
							|  |  |  | 	return strcmp(keyp1, keyp2); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int symtab_init(struct symtab *s, unsigned int size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	s->table = hashtab_create(symhash, symcmp, size); | 
					
						
							|  |  |  | 	if (!s->table) | 
					
						
							| 
									
										
										
										
											2010-06-12 20:57:39 +02:00
										 |  |  | 		return -ENOMEM; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	s->nprim = 0; | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |