16cd6a6acSopenharmony_ci 26cd6a6acSopenharmony_ci/* Author : Stephen Smalley, <sds@tycho.nsa.gov> */ 36cd6a6acSopenharmony_ci 46cd6a6acSopenharmony_ci/* FLASK */ 56cd6a6acSopenharmony_ci 66cd6a6acSopenharmony_ci/* 76cd6a6acSopenharmony_ci * Implementation of the symbol table type. 86cd6a6acSopenharmony_ci */ 96cd6a6acSopenharmony_ci 106cd6a6acSopenharmony_ci#include <string.h> 116cd6a6acSopenharmony_ci 126cd6a6acSopenharmony_ci#include "private.h" 136cd6a6acSopenharmony_ci 146cd6a6acSopenharmony_ci#include <sepol/policydb/hashtab.h> 156cd6a6acSopenharmony_ci#include <sepol/policydb/symtab.h> 166cd6a6acSopenharmony_ci 176cd6a6acSopenharmony_ciignore_unsigned_overflow_ 186cd6a6acSopenharmony_cistatic unsigned int symhash(hashtab_t h, const_hashtab_key_t key) 196cd6a6acSopenharmony_ci{ 206cd6a6acSopenharmony_ci const char *p, *keyp; 216cd6a6acSopenharmony_ci size_t size; 226cd6a6acSopenharmony_ci unsigned int val; 236cd6a6acSopenharmony_ci 246cd6a6acSopenharmony_ci val = 0; 256cd6a6acSopenharmony_ci keyp = (const char *)key; 266cd6a6acSopenharmony_ci size = strlen(keyp); 276cd6a6acSopenharmony_ci for (p = keyp; ((size_t) (p - keyp)) < size; p++) 286cd6a6acSopenharmony_ci val = 296cd6a6acSopenharmony_ci (val << 4 | (val >> (8 * sizeof(unsigned int) - 4))) ^ (*p); 306cd6a6acSopenharmony_ci return val & (h->size - 1); 316cd6a6acSopenharmony_ci} 326cd6a6acSopenharmony_ci 336cd6a6acSopenharmony_cistatic int symcmp(hashtab_t h 346cd6a6acSopenharmony_ci __attribute__ ((unused)), const_hashtab_key_t key1, 356cd6a6acSopenharmony_ci const_hashtab_key_t key2) 366cd6a6acSopenharmony_ci{ 376cd6a6acSopenharmony_ci return strcmp(key1, key2); 386cd6a6acSopenharmony_ci} 396cd6a6acSopenharmony_ci 406cd6a6acSopenharmony_ciint symtab_init(symtab_t * s, unsigned int size) 416cd6a6acSopenharmony_ci{ 426cd6a6acSopenharmony_ci s->table = hashtab_create(symhash, symcmp, size); 436cd6a6acSopenharmony_ci if (!s->table) 446cd6a6acSopenharmony_ci return -1; 456cd6a6acSopenharmony_ci s->nprim = 0; 466cd6a6acSopenharmony_ci return 0; 476cd6a6acSopenharmony_ci} 486cd6a6acSopenharmony_ci 496cd6a6acSopenharmony_civoid symtab_destroy(symtab_t * s) 506cd6a6acSopenharmony_ci{ 516cd6a6acSopenharmony_ci if (!s) 526cd6a6acSopenharmony_ci return; 536cd6a6acSopenharmony_ci if (s->table) 546cd6a6acSopenharmony_ci hashtab_destroy(s->table); 556cd6a6acSopenharmony_ci return; 566cd6a6acSopenharmony_ci} 576cd6a6acSopenharmony_ci/* FLASK */ 58