xref: /inferno-os/liblogfs/ust.c (revision 28942ead413418b56c5be78e8c4c400881fba72e)
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