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