xref: /inferno-os/appl/lib/tcl_symhash.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement Sym_Hashtab;
2*37da2899SCharles.Forsyth
3*37da2899SCharles.Forsythinclude "sys.m";
4*37da2899SCharles.Forsythinclude "draw.m";
5*37da2899SCharles.Forsythinclude "tk.m";
6*37da2899SCharles.Forsythinclude "tcl.m";
7*37da2899SCharles.Forsythinclude "tcllib.m";
8*37da2899SCharles.Forsythinclude "utils.m";
9*37da2899SCharles.Forsyth
10*37da2899SCharles.Forsyth
11*37da2899SCharles.Forsythhashasu(key : string,n : int): int{
12*37da2899SCharles.Forsyth        i, h : int;
13*37da2899SCharles.Forsyth	h=0;
14*37da2899SCharles.Forsyth	i=0;
15*37da2899SCharles.Forsyth        while(i<len key){
16*37da2899SCharles.Forsyth                h = 10*h + key[i];
17*37da2899SCharles.Forsyth		h = h%n;
18*37da2899SCharles.Forsyth		i++;
19*37da2899SCharles.Forsyth	}
20*37da2899SCharles.Forsyth        return h%n;
21*37da2899SCharles.Forsyth}
22*37da2899SCharles.Forsyth
23*37da2899SCharles.Forsythalloc(size : int) : ref SHash {
24*37da2899SCharles.Forsyth	h : SHash;
25*37da2899SCharles.Forsyth	t : list of H_link;
26*37da2899SCharles.Forsyth	t=nil;
27*37da2899SCharles.Forsyth	h.size= size;
28*37da2899SCharles.Forsyth	h.tab = array[size]  of {* => t};
29*37da2899SCharles.Forsyth	return ref h;
30*37da2899SCharles.Forsyth}
31*37da2899SCharles.Forsyth
32*37da2899SCharles.Forsyth
33*37da2899SCharles.ForsythSHash.insert(h : self ref SHash,name,alias: string,val:int) : int {
34*37da2899SCharles.Forsyth	link : H_link;
35*37da2899SCharles.Forsyth	hash,found : int;
36*37da2899SCharles.Forsyth	nlist : list of H_link;
37*37da2899SCharles.Forsyth	nlist=nil;
38*37da2899SCharles.Forsyth	found=0;
39*37da2899SCharles.Forsyth	hash = hashasu(name,h.size);
40*37da2899SCharles.Forsyth	tmp:=(h.tab)[hash];
41*37da2899SCharles.Forsyth	for(;tmp!=nil;tmp = tl tmp){
42*37da2899SCharles.Forsyth		link=hd tmp;
43*37da2899SCharles.Forsyth		if (link.name==name){
44*37da2899SCharles.Forsyth			found=1;
45*37da2899SCharles.Forsyth			link.val = val;
46*37da2899SCharles.Forsyth			link.alias = alias;
47*37da2899SCharles.Forsyth		}
48*37da2899SCharles.Forsyth		nlist = link :: nlist;
49*37da2899SCharles.Forsyth	}
50*37da2899SCharles.Forsyth	if (!found){
51*37da2899SCharles.Forsyth		link.name=name;
52*37da2899SCharles.Forsyth		link.val=val;
53*37da2899SCharles.Forsyth		link.alias = alias;
54*37da2899SCharles.Forsyth		(h.tab)[hash]= link :: (h.tab)[hash];
55*37da2899SCharles.Forsyth	}else
56*37da2899SCharles.Forsyth		(h.tab)[hash]=nlist;
57*37da2899SCharles.Forsyth	return 1;
58*37da2899SCharles.Forsyth}
59*37da2899SCharles.Forsyth
60*37da2899SCharles.ForsythSHash.find(h : self ref SHash,name : string) : (int, int,string){
61*37da2899SCharles.Forsyth	hash,flag : int;
62*37da2899SCharles.Forsyth	nlist : list of H_link;
63*37da2899SCharles.Forsyth	al : string;
64*37da2899SCharles.Forsyth	retval:=0;
65*37da2899SCharles.Forsyth	flag=0;
66*37da2899SCharles.Forsyth	nlist=nil;
67*37da2899SCharles.Forsyth	hash = hashasu(name,h.size);
68*37da2899SCharles.Forsyth	tmp:=(h.tab)[hash];
69*37da2899SCharles.Forsyth	for(;tmp!=nil;tmp = tl tmp){
70*37da2899SCharles.Forsyth		link:=hd tmp;
71*37da2899SCharles.Forsyth		if ((hd tmp).name==name){
72*37da2899SCharles.Forsyth			flag = 1;
73*37da2899SCharles.Forsyth			retval = (hd tmp).val;
74*37da2899SCharles.Forsyth			al = (hd tmp).alias;
75*37da2899SCharles.Forsyth		}
76*37da2899SCharles.Forsyth		nlist = link :: nlist;
77*37da2899SCharles.Forsyth	}
78*37da2899SCharles.Forsyth	(h.tab)[hash]=nlist;
79*37da2899SCharles.Forsyth	return (flag,retval,al);
80*37da2899SCharles.Forsyth}
81*37da2899SCharles.Forsyth
82*37da2899SCharles.ForsythSHash.delete(h : self ref SHash,name : string) : int {
83*37da2899SCharles.Forsyth	hash,flag : int;
84*37da2899SCharles.Forsyth	nlist : list of H_link;
85*37da2899SCharles.Forsyth	flag=0;
86*37da2899SCharles.Forsyth	nlist=nil;
87*37da2899SCharles.Forsyth	hash = hashasu(name,h.size);
88*37da2899SCharles.Forsyth	tmp:=(h.tab)[hash];
89*37da2899SCharles.Forsyth	for(;tmp!=nil;tmp = tl tmp){
90*37da2899SCharles.Forsyth		link:=hd tmp;
91*37da2899SCharles.Forsyth		if (link.name==name)
92*37da2899SCharles.Forsyth			flag = 1;
93*37da2899SCharles.Forsyth		else
94*37da2899SCharles.Forsyth			nlist = link :: nlist;
95*37da2899SCharles.Forsyth	}
96*37da2899SCharles.Forsyth	(h.tab)[hash]=nlist;
97*37da2899SCharles.Forsyth	return flag;
98*37da2899SCharles.Forsyth}
99*37da2899SCharles.Forsyth
100