162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Implementation of the symbol table type. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Author : Stephen Smalley, <stephen.smalley.work@gmail.com> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci#include <linux/kernel.h> 862306a36Sopenharmony_ci#include <linux/string.h> 962306a36Sopenharmony_ci#include <linux/errno.h> 1062306a36Sopenharmony_ci#include "symtab.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cistatic unsigned int symhash(const void *key) 1362306a36Sopenharmony_ci{ 1462306a36Sopenharmony_ci const char *p, *keyp; 1562306a36Sopenharmony_ci unsigned int size; 1662306a36Sopenharmony_ci unsigned int val; 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci val = 0; 1962306a36Sopenharmony_ci keyp = key; 2062306a36Sopenharmony_ci size = strlen(keyp); 2162306a36Sopenharmony_ci for (p = keyp; (p - keyp) < size; p++) 2262306a36Sopenharmony_ci val = (val << 4 | (val >> (8*sizeof(unsigned int)-4))) ^ (*p); 2362306a36Sopenharmony_ci return val; 2462306a36Sopenharmony_ci} 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_cistatic int symcmp(const void *key1, const void *key2) 2762306a36Sopenharmony_ci{ 2862306a36Sopenharmony_ci const char *keyp1, *keyp2; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci keyp1 = key1; 3162306a36Sopenharmony_ci keyp2 = key2; 3262306a36Sopenharmony_ci return strcmp(keyp1, keyp2); 3362306a36Sopenharmony_ci} 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistatic const struct hashtab_key_params symtab_key_params = { 3662306a36Sopenharmony_ci .hash = symhash, 3762306a36Sopenharmony_ci .cmp = symcmp, 3862306a36Sopenharmony_ci}; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ciint symtab_init(struct symtab *s, u32 size) 4162306a36Sopenharmony_ci{ 4262306a36Sopenharmony_ci s->nprim = 0; 4362306a36Sopenharmony_ci return hashtab_init(&s->table, size); 4462306a36Sopenharmony_ci} 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ciint symtab_insert(struct symtab *s, char *name, void *datum) 4762306a36Sopenharmony_ci{ 4862306a36Sopenharmony_ci return hashtab_insert(&s->table, name, datum, symtab_key_params); 4962306a36Sopenharmony_ci} 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_civoid *symtab_search(struct symtab *s, const char *name) 5262306a36Sopenharmony_ci{ 5362306a36Sopenharmony_ci return hashtab_search(&s->table, name, symtab_key_params); 5462306a36Sopenharmony_ci} 55