1*37da2899SCharles.Forsythimplement Int_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 IHash { 24*37da2899SCharles.Forsyth h : IHash; 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.ForsythIHash.insert(h : self ref IHash,name: 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 } 47*37da2899SCharles.Forsyth nlist = link :: nlist; 48*37da2899SCharles.Forsyth } 49*37da2899SCharles.Forsyth if (!found){ 50*37da2899SCharles.Forsyth link.name=name; 51*37da2899SCharles.Forsyth link.val=val; 52*37da2899SCharles.Forsyth (h.tab)[hash]= link :: (h.tab)[hash]; 53*37da2899SCharles.Forsyth }else 54*37da2899SCharles.Forsyth (h.tab)[hash]=nlist; 55*37da2899SCharles.Forsyth return 1; 56*37da2899SCharles.Forsyth} 57*37da2899SCharles.Forsyth 58*37da2899SCharles.ForsythIHash.find(h : self ref IHash,name : string) : (int, int){ 59*37da2899SCharles.Forsyth hash,flag : int; 60*37da2899SCharles.Forsyth nlist : list of H_link; 61*37da2899SCharles.Forsyth retval:=0; 62*37da2899SCharles.Forsyth flag=0; 63*37da2899SCharles.Forsyth nlist=nil; 64*37da2899SCharles.Forsyth hash = hashasu(name,h.size); 65*37da2899SCharles.Forsyth tmp:=(h.tab)[hash]; 66*37da2899SCharles.Forsyth for(;tmp!=nil;tmp = tl tmp){ 67*37da2899SCharles.Forsyth link:=hd tmp; 68*37da2899SCharles.Forsyth if ((hd tmp).name==name){ 69*37da2899SCharles.Forsyth flag = 1; 70*37da2899SCharles.Forsyth retval = (hd tmp).val; 71*37da2899SCharles.Forsyth } 72*37da2899SCharles.Forsyth nlist = link :: nlist; 73*37da2899SCharles.Forsyth } 74*37da2899SCharles.Forsyth (h.tab)[hash]=nlist; 75*37da2899SCharles.Forsyth return (flag,retval); 76*37da2899SCharles.Forsyth} 77*37da2899SCharles.Forsyth 78*37da2899SCharles.ForsythIHash.delete(h : self ref IHash,name : string) : int { 79*37da2899SCharles.Forsyth hash,flag : int; 80*37da2899SCharles.Forsyth nlist : list of H_link; 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 (link.name==name) 88*37da2899SCharles.Forsyth flag = 1; 89*37da2899SCharles.Forsyth else 90*37da2899SCharles.Forsyth nlist = link :: nlist; 91*37da2899SCharles.Forsyth } 92*37da2899SCharles.Forsyth (h.tab)[hash]=nlist; 93*37da2899SCharles.Forsyth return flag; 94*37da2899SCharles.Forsyth} 95*37da2899SCharles.Forsyth 96