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/string.h> 8 #include <linux/errno.h> 9 #include "symtab.h" 10 11 static unsigned int symhash(struct hashtab *h, const void *key) 12 { 13 const char *p, *keyp; 14 unsigned int size; 15 unsigned int val; 16 17 val = 0; 18 keyp = key; 19 size = strlen(keyp); 20 for (p = keyp; (p - keyp) < size; p++) 21 val = (val << 4 | (val >> (8*sizeof(unsigned int)-4))) ^ (*p); 22 return val & (h->size - 1); 23 } 24 25 static int symcmp(struct hashtab *h, const void *key1, const void *key2) 26 { 27 const char *keyp1, *keyp2; 28 29 keyp1 = key1; 30 keyp2 = key2; 31 return strcmp(keyp1, keyp2); 32 } 33 34 35 int symtab_init(struct symtab *s, unsigned int size) 36 { 37 s->table = hashtab_create(symhash, symcmp, size); 38 if (!s->table) 39 return -ENOMEM; 40 s->nprim = 0; 41 return 0; 42 } 43 44