symtab.c 850 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. /*
  2. * Implementation of the symbol table type.
  3. *
  4. * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
  5. */
  6. #include <linux/kernel.h>
  7. #include <linux/string.h>
  8. #include <linux/errno.h>
  9. #include "symtab.h"
  10. static unsigned int symhash(struct hashtab *h, const void *key)
  11. {
  12. const char *p, *keyp;
  13. unsigned int size;
  14. unsigned int val;
  15. val = 0;
  16. keyp = key;
  17. size = strlen(keyp);
  18. for (p = keyp; (p - keyp) < size; p++)
  19. val = (val << 4 | (val >> (8*sizeof(unsigned int)-4))) ^ (*p);
  20. return val & (h->size - 1);
  21. }
  22. static int symcmp(struct hashtab *h, const void *key1, const void *key2)
  23. {
  24. const char *keyp1, *keyp2;
  25. keyp1 = key1;
  26. keyp2 = key2;
  27. return strcmp(keyp1, keyp2);
  28. }
  29. int symtab_init(struct symtab *s, unsigned int size)
  30. {
  31. s->table = hashtab_create(symhash, symcmp, size);
  32. if (!s->table)
  33. return -ENOMEM;
  34. s->nprim = 0;
  35. return 0;
  36. }