1 #include "logfsos.h"
2 #include "logfs.h"
3 #include "local.h"
4
5 enum {
6 USTMOD = 127
7 };
8
9 typedef struct UstNode {
10 char s[1];
11 } UstNode;
12
13 struct Ust {
14 UstNode *head[USTMOD];
15 };
16
17 int
logfshashstring(void * s,int n)18 logfshashstring(void *s, int n)
19 {
20 int h = 0;
21 char *p;
22 for(p = s; *p; p++) {
23 ulong g;
24 h = (h << 4) + *p;
25 g = h & 0xf0000000;
26 if(g != 0)
27 h ^= ((g >> 24) & 0xff) | g;
28 }
29 return (h & ~(1 << 31)) % n;
30 }
31
32 static int
compare(void * entry,void * key)33 compare(void *entry, void *key)
34 {
35 return strcmp((char*)entry, (char*)key) == 0;
36 }
37
38 static int
allocsize(void * key)39 allocsize(void *key)
40 {
41 return strlen(key) + 1;
42 }
43
44 char *
logfsustnew(Ust ** ustp)45 logfsustnew(Ust **ustp)
46 {
47 return logfsmapnew(USTMOD, logfshashstring, compare, allocsize, nil, ustp);
48 }
49
50 char *
logfsustadd(Ust * ust,char * s)51 logfsustadd(Ust *ust, char *s)
52 {
53 char *errmsg;
54 char *ep;
55 ep = logfsmapfindentry(ust, s);
56 if(ep != nil) {
57 // print("ust: found %s\n", s);
58 return ep;
59 }
60 errmsg = logfsmapnewentry(ust, s, &ep);
61 if(errmsg != nil)
62 return errmsg;
63 // print("ust: new %s\n", s);
64 return strcpy(ep, s);
65 }
66