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 8 #include <linux/kernel.h> 9 #include <linux/string.h> 10 #include <linux/errno.h> 11 #include "symtab.h" 12 13 static unsigned int symhash(const void *key) 14 { 15 const char *p, *keyp; 16 unsigned int size; 17 unsigned int val; 18 19 val = 0; 20 keyp = key; 21 size = strlen(keyp); 22 for (p = keyp; (p - keyp) < size; p++) 23 val = (val << 4 | (val >> (8 * sizeof(unsigned int) - 4))) ^ 24 (*p); 25 return val; 26 } 27 28 static int symcmp(const void *key1, const void *key2) 29 { 30 const char *keyp1, *keyp2; 31 32 keyp1 = key1; 33 keyp2 = key2; 34 return strcmp(keyp1, keyp2); 35 } 36 37 static const struct hashtab_key_params symtab_key_params = { 38 .hash = symhash, 39 .cmp = symcmp, 40 }; 41 42 int symtab_init(struct symtab *s, u32 size) 43 { 44 s->nprim = 0; 45 return hashtab_init(&s->table, size); 46 } 47 48 int symtab_insert(struct symtab *s, char *name, void *datum) 49 { 50 return hashtab_insert(&s->table, name, datum, symtab_key_params); 51 } 52 53 void *symtab_search(struct symtab *s, const char *name) 54 { 55 return hashtab_search(&s->table, name, symtab_key_params); 56 } 57