tcl_stack.b 2.9 KB

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