| /* | 
 |  * Implementation of the symbol table type. | 
 |  * | 
 |  * Author : Stephen Smalley, <sds@epoch.ncsc.mil> | 
 |  */ | 
 | #include <linux/kernel.h> | 
 | #include <linux/slab.h> | 
 | #include <linux/string.h> | 
 | #include <linux/errno.h> | 
 | #include "symtab.h" | 
 |  | 
 | static unsigned int symhash(struct hashtab *h, const void *key) | 
 | { | 
 | 	const char *p, *keyp; | 
 | 	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); | 
 | } | 
 |  | 
 | static int symcmp(struct hashtab *h, const void *key1, const void *key2) | 
 | { | 
 | 	const char *keyp1, *keyp2; | 
 |  | 
 | 	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) | 
 | 		return -1; | 
 | 	s->nprim = 0; | 
 | 	return 0; | 
 | } | 
 |  |