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> | |
7 | #include <linux/slab.h> | |
8 | #include <linux/string.h> | |
9 | #include <linux/errno.h> | |
10 | #include "symtab.h" | |
11 | ||
bb242497 | 12 | static unsigned int symhash(struct hashtab *h, const void *key) |
1da177e4 | 13 | { |
bb242497 | 14 | const char *p, *keyp; |
1da177e4 LT |
15 | unsigned int size; |
16 | unsigned int val; | |
17 | ||
18 | val = 0; | |
19 | keyp = key; | |
20 | size = strlen(keyp); | |
21 | for (p = keyp; (p - keyp) < size; p++) | |
22 | val = (val << 4 | (val >> (8*sizeof(unsigned int)-4))) ^ (*p); | |
23 | return val & (h->size - 1); | |
24 | } | |
25 | ||
bb242497 | 26 | static int symcmp(struct hashtab *h, const void *key1, const void *key2) |
1da177e4 | 27 | { |
bb242497 | 28 | const char *keyp1, *keyp2; |
1da177e4 LT |
29 | |
30 | keyp1 = key1; | |
31 | keyp2 = key2; | |
32 | return strcmp(keyp1, keyp2); | |
33 | } | |
34 | ||
35 | ||
36 | int symtab_init(struct symtab *s, unsigned int size) | |
37 | { | |
38 | s->table = hashtab_create(symhash, symcmp, size); | |
39 | if (!s->table) | |
40 | return -1; | |
41 | s->nprim = 0; | |
42 | return 0; | |
43 | } | |
44 |