xref: /inferno-os/appl/lib/tcl_stack.b (revision 46439007cf417cbd9ac8049bb4122c890097a0fa)
1implement Tcl_Stack;
2
3include "sys.m";
4	sys : Sys;
5include "draw.m";
6include "tk.m";
7include "tcl.m";
8include "tcllib.m";
9include "utils.m";
10	htab: Str_Hashtab;
11	shtab: Sym_Hashtab;
12Hash: import htab;
13SHash: import shtab;
14
15sframe : adt {
16	simple : ref Hash;
17	assoc  : array of (ref Hash,string);
18	symtab : ref SHash;
19};
20
21stack := array[100] of sframe;
22curlevel : int;
23nlev : int;
24
25init() {
26	curlevel=-1;
27	nlev=-1;
28	htab = load Str_Hashtab Str_Hashtab->PATH;
29	shtab = load Sym_Hashtab Sym_Hashtab->PATH;
30	sys = load Sys Sys->PATH;
31	if (htab == nil){
32		sys->print("can't load Hashtab %r\n");
33		exit;
34	}
35	if (shtab == nil){
36		sys->print("can't load Sym_Hashtab %r\n");
37		exit;
38	}
39}
40
41newframe() : (ref Hash,array of (ref Hash,string),ref SHash) {
42	nv := htab->alloc(101);
43	av := array[100] of (ref Hash,string);
44	st := shtab->alloc(101);
45	#sys->print("New frame, curlevel is %d\n",curlevel);
46	push (nv,av,st);
47	return (nv,av,st);
48}
49
50level() : int {
51	return curlevel;
52}
53
54move(lev :int) : int {
55	if (lev <0 || lev>nlev)
56		return 0;
57	curlevel=lev;
58	return 1;
59}
60
61push(sv : ref Hash, av : array of (ref Hash,string), st :ref SHash){
62	curlevel++;
63	nlev++;
64	stack[curlevel].simple=sv;
65	stack[curlevel].assoc=av;
66	stack[curlevel].symtab=st;
67}
68
69pop() : (ref Hash,array of (ref Hash,string),ref SHash) {
70	s:=stack[curlevel].simple;
71	a:=stack[curlevel].assoc;
72	t:=stack[curlevel].symtab;
73	stack[curlevel].simple=nil;
74	stack[curlevel].assoc=nil;
75	stack[curlevel].symtab=nil;
76	curlevel--;
77	nlev--;
78	return (s,a,t);
79}
80
81examine(lev : int) : (ref Hash,array of (ref Hash,string),ref SHash) {
82	if (lev <0 || lev > nlev)
83		return (nil,nil,nil);
84	return (stack[lev].simple,stack[lev].assoc,stack[lev].symtab);
85}
86
87dump() {
88	for (i:=0;i<100;i++){
89		if (stack[i].simple!=nil){
90			sys->print("simple table at %d\n",i);
91			for (j:=0;j<101;j++)
92				if (stack[i].simple.tab[j]!=nil){
93					sys->print("\tH_link at %d\n",j);
94					l:=stack[i].simple.tab[j];
95					while(l!=nil){
96					    sys->print("\tname [%s], value [%s]\n",
97						(hd l).name,(hd l).val);
98					    l=tl l;
99					}
100				}
101		}
102		if (stack[i].assoc!=nil){
103			sys->print("assoc table at %d\n",i);
104			for(j:=0;j<100;j++){
105				(rh,s):=stack[i].assoc[j];
106				if (rh!=nil){
107					sys->print(
108					      "\tassoc array at %d, name %s\n",
109							j,s);
110					for (k:=0;k<101;k++)
111						if (rh.tab[k]!=nil){
112							sys->print(
113							 "\t\tH_link at %d\n",k);
114							l:=rh.tab[k];
115							while(l!=nil){
116					    			sys->print(
117						     "\t\tname [%s], value [%s]\n",
118						       (hd l).name,(hd l).val);
119					    			l=tl l;
120							}
121						}
122
123				}
124			}
125		}
126		if (stack[i].symtab!=nil){
127			sys->print("Symbol table at %d\n",i);
128			for (j:=0;j<101;j++)
129				if (stack[i].symtab.tab[j]!=nil){
130					sys->print("\tH_link at %d\n",j);
131					l:=stack[i].symtab.tab[j];
132					while(l!=nil){
133					    sys->print("\tname [%s], alias [%s], "+
134						"value [%d]\n",(hd l).name,
135							(hd l).alias,(hd l).val);
136					    l=tl l;
137					}
138				}
139		}
140	}
141}
142
143