1 /* 2 * Implementation of the symbol table type. 3 * 4 * Author : Stephen Smalley, <sds@epoch.ncsc.mil> 5 */ 6 #include <linux/kernel.h> 7 #include <linux/slab.h> 8 #include <linux/string.h> 9 #include <linux/errno.h> 10 #include "symtab.h" 11 12 static unsigned int symhash(struct hashtab *h, const void *key) 13 { 14 const char *p, *keyp; 15 unsigned int size; 16 unsigned int val; 17 18 val = 0; 19 keyp = key; 20 size = strlen(keyp); 21 for (p = keyp; (p - keyp) < size; p++) 22 val = (val << 4 | (val >> (8*sizeof(unsigned int)-4))) ^ (*p); 23 return val & (h->size - 1); 24 } 25 26 static int symcmp(struct hashtab *h, const void *key1, const void *key2) 27 { 28 const char *keyp1, *keyp2; 29 30 keyp1 = key1; 31 keyp2 = key2; 32 return strcmp(keyp1, keyp2); 33 } 34 35 36 int symtab_init(struct symtab *s, unsigned int size) 37 { 38 s->table = hashtab_create(symhash, symcmp, size); 39 if (!s->table) 40 return -1; 41 s->nprim = 0; 42 return 0; 43 } 44 45