Charles.Forsyth20060303a828770d19 years agoHistory
142 lines · 2.9 KB · Brainfuck
RawDownload
implement Tcl_Stack; include "sys.m";	sys : Sys;include "draw.m";include "tk.m";include "tcl.m";include "tcllib.m";include "utils.m";	htab: Str_Hashtab;	shtab: Sym_Hashtab;Hash: import htab;SHash: import shtab; sframe : adt {	simple : ref Hash;	assoc  : array of (ref Hash,string);	symtab : ref SHash;}; stack := array[100] of sframe;curlevel : int;nlev : int; init() {	curlevel=-1;	nlev=-1;	htab = load Str_Hashtab Str_Hashtab->PATH;	shtab = load Sym_Hashtab Sym_Hashtab->PATH;	sys = load Sys Sys->PATH;	if (htab == nil){		sys->print("can't load Hashtab %r\n");		exit;	}	if (shtab == nil){		sys->print("can't load Sym_Hashtab %r\n");		exit;	}} newframe() : (ref Hash,array of (ref Hash,string),ref SHash) {	nv := htab->alloc(101);	av := array[100] of (ref Hash,string);	st := shtab->alloc(101);	#sys->print("New frame, curlevel is %d\n",curlevel);	push (nv,av,st);	return (nv,av,st);} level() : int {	return curlevel;} move(lev :int) : int {	if (lev <0 || lev>nlev)		return 0;	curlevel=lev;	return 1;} push(sv : ref Hash, av : array of (ref Hash,string), st :ref SHash){	curlevel++;	nlev++;	stack[curlevel].simple=sv;	stack[curlevel].assoc=av;	stack[curlevel].symtab=st;} pop() : (ref Hash,array of (ref Hash,string),ref SHash) {	s:=stack[curlevel].simple;	a:=stack[curlevel].assoc;	t:=stack[curlevel].symtab;	stack[curlevel].simple=nil;	stack[curlevel].assoc=nil;	stack[curlevel].symtab=nil;	curlevel--;	nlev--;	return (s,a,t);} examine(lev : int) : (ref Hash,array of (ref Hash,string),ref SHash) {	if (lev <0 || lev > nlev)		return (nil,nil,nil);	return (stack[lev].simple,stack[lev].assoc,stack[lev].symtab);} dump() {	for (i:=0;i<100;i++){		if (stack[i].simple!=nil){			sys->print("simple table at %d\n",i);			for (j:=0;j<101;j++)				if (stack[i].simple.tab[j]!=nil){					sys->print("\tH_link at %d\n",j);					l:=stack[i].simple.tab[j];					while(l!=nil){					    sys->print("\tname [%s], value [%s]\n",						(hd l).name,(hd l).val);					    l=tl l;					}				}		}		if (stack[i].assoc!=nil){			sys->print("assoc table at %d\n",i);			for(j:=0;j<100;j++){				(rh,s):=stack[i].assoc[j];				if (rh!=nil){					sys->print(					      "\tassoc array at %d, name %s\n",							j,s);					for (k:=0;k<101;k++)						if (rh.tab[k]!=nil){							sys->print(							 "\t\tH_link at %d\n",k);							l:=rh.tab[k];							while(l!=nil){					    			sys->print(						     "\t\tname [%s], value [%s]\n",						       (hd l).name,(hd l).val);					    			l=tl l;							}						} 				}			}		}		if (stack[i].symtab!=nil){			sys->print("Symbol table at %d\n",i);			for (j:=0;j<101;j++)				if (stack[i].symtab.tab[j]!=nil){					sys->print("\tH_link at %d\n",j);					l:=stack[i].symtab.tab[j];					while(l!=nil){					    sys->print("\tname [%s], alias [%s], "+						"value [%d]\n",(hd l).name,							(hd l).alias,(hd l).val);					    l=tl l;					}				}		}	}}