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