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