| // SPDX-License-Identifier: GPL-2.0 | |
| /* | |
| * Implementation of the symbol table type. | |
| * | |
| * Author : Stephen Smalley, <sds@tycho.nsa.gov> | |
| */ | |
| #include <linux/kernel.h> | |
| #include <linux/string.h> | |
| #include <linux/errno.h> | |
| #include "symtab.h" | |
| static unsigned int symhash(struct hashtab *h, const void *key) | |
| { | |
| const char *p, *keyp; | |
| unsigned int size; | |
| unsigned int val; | |
| val = 0; | |
| keyp = key; | |
| size = strlen(keyp); | |
| for (p = keyp; (p - keyp) < size; p++) | |
| val = (val << 4 | (val >> (8*sizeof(unsigned int)-4))) ^ (*p); | |
| return val & (h->size - 1); | |
| } | |
| static int symcmp(struct hashtab *h, const void *key1, const void *key2) | |
| { | |
| const char *keyp1, *keyp2; | |
| keyp1 = key1; | |
| keyp2 = key2; | |
| return strcmp(keyp1, keyp2); | |
| } | |
| int symtab_init(struct symtab *s, unsigned int size) | |
| { | |
| s->table = hashtab_create(symhash, symcmp, size); | |
| if (!s->table) | |
| return -ENOMEM; | |
| s->nprim = 0; | |
| return 0; | |
| } | |