1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Implementation of the symbol table type. 4 * 5 * Author : Stephen Smalley, <stephen.smalley.work@gmail.com> 6 */ 7 #include <linux/kernel.h> 8 #include <linux/string.h> 9 #include <linux/errno.h> 10 #include "symtab.h" 11 12 static unsigned int symhash(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; 24 } 25 26 static int symcmp(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 static const struct hashtab_key_params symtab_key_params = { 36 .hash = symhash, 37 .cmp = symcmp, 38 }; 39 40 int symtab_init(struct symtab *s, u32 size) 41 { 42 s->nprim = 0; 43 return hashtab_init(&s->table, size); 44 } 45 46 int symtab_insert(struct symtab *s, char *name, void *datum) 47 { 48 return hashtab_insert(&s->table, name, datum, symtab_key_params); 49 } 50 51 void *symtab_search(struct symtab *s, const char *name) 52 { 53 return hashtab_search(&s->table, name, symtab_key_params); 54 } 55