xref: /inferno-os/appl/lib/tcl_modhash.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement Mod_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.Forsyth
9*37da2899SCharles.Forsythinclude "utils.m";
10*37da2899SCharles.Forsyth
11*37da2899SCharles.Forsyth
12*37da2899SCharles.Forsythhashasu(key : string,n : int): int{
13*37da2899SCharles.Forsyth        i, h : int;
14*37da2899SCharles.Forsyth	h=0;
15*37da2899SCharles.Forsyth	i=0;
16*37da2899SCharles.Forsyth        while(i<len key){
17*37da2899SCharles.Forsyth                h = 10*h + key[i];
18*37da2899SCharles.Forsyth		h = h%n;
19*37da2899SCharles.Forsyth		i++;
20*37da2899SCharles.Forsyth	}
21*37da2899SCharles.Forsyth        return h%n;
22*37da2899SCharles.Forsyth}
23*37da2899SCharles.Forsyth
24*37da2899SCharles.Forsythalloc(size : int) : ref MHash {
25*37da2899SCharles.Forsyth	h : MHash;
26*37da2899SCharles.Forsyth	t : list of H_link;
27*37da2899SCharles.Forsyth	t=nil;
28*37da2899SCharles.Forsyth	h.size= size;
29*37da2899SCharles.Forsyth	h.tab = array[size]  of {* => t};
30*37da2899SCharles.Forsyth	return ref h;
31*37da2899SCharles.Forsyth}
32*37da2899SCharles.Forsyth
33*37da2899SCharles.ForsythMHash.dump(h : self ref MHash) : string {
34*37da2899SCharles.Forsyth	retval :string;
35*37da2899SCharles.Forsyth	for (i:=0;i<h.size;i++){
36*37da2899SCharles.Forsyth		tmp:=(h.tab)[i];
37*37da2899SCharles.Forsyth		for(;tmp!=nil;tmp = tl tmp){
38*37da2899SCharles.Forsyth			if ((hd tmp).name!=nil){
39*37da2899SCharles.Forsyth				retval+=(hd tmp).name;
40*37da2899SCharles.Forsyth				retval[len retval]=' ';
41*37da2899SCharles.Forsyth			}
42*37da2899SCharles.Forsyth		}
43*37da2899SCharles.Forsyth	}
44*37da2899SCharles.Forsyth	if (retval!=nil)
45*37da2899SCharles.Forsyth		retval=retval[0:len retval-1];
46*37da2899SCharles.Forsyth	return retval;
47*37da2899SCharles.Forsyth}
48*37da2899SCharles.Forsyth
49*37da2899SCharles.Forsyth
50*37da2899SCharles.Forsyth
51*37da2899SCharles.ForsythMHash.insert(h : self ref MHash,name: string, val:TclLib) : int {
52*37da2899SCharles.Forsyth	link : H_link;
53*37da2899SCharles.Forsyth	hash,found : int;
54*37da2899SCharles.Forsyth	nlist : list of H_link;
55*37da2899SCharles.Forsyth	nlist=nil;
56*37da2899SCharles.Forsyth	found=0;
57*37da2899SCharles.Forsyth	hash = hashasu(name,h.size);
58*37da2899SCharles.Forsyth	tmp:=(h.tab)[hash];
59*37da2899SCharles.Forsyth	for(;tmp!=nil;tmp = tl tmp){
60*37da2899SCharles.Forsyth		link=hd tmp;
61*37da2899SCharles.Forsyth		if (link.name==name){
62*37da2899SCharles.Forsyth			found=1;
63*37da2899SCharles.Forsyth			link.val = val;
64*37da2899SCharles.Forsyth		}
65*37da2899SCharles.Forsyth		nlist = link :: nlist;
66*37da2899SCharles.Forsyth	}
67*37da2899SCharles.Forsyth	if (!found){
68*37da2899SCharles.Forsyth		link.name=name;
69*37da2899SCharles.Forsyth		link.val=val;
70*37da2899SCharles.Forsyth		(h.tab)[hash]= link :: (h.tab)[hash];
71*37da2899SCharles.Forsyth	}else
72*37da2899SCharles.Forsyth		(h.tab)[hash]=nlist;
73*37da2899SCharles.Forsyth	return 1;
74*37da2899SCharles.Forsyth}
75*37da2899SCharles.Forsyth
76*37da2899SCharles.ForsythMHash.find(h : self ref MHash,name : string) : (int, TclLib){
77*37da2899SCharles.Forsyth	hash,flag : int;
78*37da2899SCharles.Forsyth	nlist : list of H_link;
79*37da2899SCharles.Forsyth	retval : TclLib;
80*37da2899SCharles.Forsyth	retval=nil;
81*37da2899SCharles.Forsyth	flag=0;
82*37da2899SCharles.Forsyth	nlist=nil;
83*37da2899SCharles.Forsyth	hash = hashasu(name,h.size);
84*37da2899SCharles.Forsyth	tmp:=(h.tab)[hash];
85*37da2899SCharles.Forsyth	for(;tmp!=nil;tmp = tl tmp){
86*37da2899SCharles.Forsyth		link:=hd tmp;
87*37da2899SCharles.Forsyth		if ((hd tmp).name==name){
88*37da2899SCharles.Forsyth			flag = 1;
89*37da2899SCharles.Forsyth			retval = (hd tmp).val;
90*37da2899SCharles.Forsyth		}
91*37da2899SCharles.Forsyth		nlist = link :: nlist;
92*37da2899SCharles.Forsyth	}
93*37da2899SCharles.Forsyth	(h.tab)[hash]=nlist;
94*37da2899SCharles.Forsyth	return (flag,retval);
95*37da2899SCharles.Forsyth}
96*37da2899SCharles.Forsyth
97*37da2899SCharles.ForsythMHash.delete(h : self ref MHash,name : string) : int {
98*37da2899SCharles.Forsyth	hash,flag : int;
99*37da2899SCharles.Forsyth	nlist : list of H_link;
100*37da2899SCharles.Forsyth	flag=0;
101*37da2899SCharles.Forsyth	nlist=nil;
102*37da2899SCharles.Forsyth	hash = hashasu(name,h.size);
103*37da2899SCharles.Forsyth	tmp:=(h.tab)[hash];
104*37da2899SCharles.Forsyth	for(;tmp!=nil;tmp = tl tmp){
105*37da2899SCharles.Forsyth		link:=hd tmp;
106*37da2899SCharles.Forsyth		if (link.name==name)
107*37da2899SCharles.Forsyth			flag = 1;
108*37da2899SCharles.Forsyth		else
109*37da2899SCharles.Forsyth			nlist = link :: nlist;
110*37da2899SCharles.Forsyth	}
111*37da2899SCharles.Forsyth	(h.tab)[hash]=nlist;
112*37da2899SCharles.Forsyth	return flag;
113*37da2899SCharles.Forsyth}
114*37da2899SCharles.Forsyth
115