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 11static 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 25static 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 35int 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