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 /* 16 * djb2a 17 * Public domain from cdb v0.75 18 */ 19 unsigned int hash = 5381; 20 unsigned char c; 21 22 while ((c = *(const unsigned char *)key++)) 23 hash = ((hash << 5) + hash) ^ c; 24 25 return hash; 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