table._old_ 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. ;**** A BASIC CLUSYS FILE ****
  2. cluster %table
  3. st.cod==0 ; tvec+5
  4. st.eq==1 ; equal hash chain
  5. st.lt==2 ; lesser hash tree
  6. st.gt==3 ; greater hash tree
  7. st.ha==4 ; hash code
  8. st..==5
  9. se.cod==0 ; tvec+4
  10. se.nxt==1 ; next equal hash item (se.nxt==st.eq)
  11. se.nam==2 ; string
  12. se.val==3 ; value
  13. se..==4
  14. proc tb.ha,[s]
  15. move r0,s(er)
  16. tcheck r0,tstr
  17. $if trne r0,-hichar-1
  18. $then hrrz n3,r0
  19. $go exit
  20. $fi
  21. hrrz n0,(r0)
  22. $loop
  23. move n1,1(r0)
  24. hlrz n2,n1
  25. add n1,n2
  26. add n3,n1
  27. subi n0,bpword
  28. skipg n0
  29. $go exit
  30. aos r0
  31. $pool
  32. $label exit
  33. imuli n3,124124
  34. hrrz rr,n3
  35. stypi rr,tint
  36. $rtn rr
  37. corp %table$hash,[s]
  38. proc tb.cr,[]
  39. movei n1,st..
  40. hrli n1,(tvec)
  41. alloc (n1),n1
  42. $rtn rr
  43. corp %table$create,[]
  44. proc tb.lu,[table,name],[hash],[0]
  45. tcheck table(er),tref
  46. edesc badtab,bad_table
  47. $if hrrz r1,table(er)
  48. hrrz n1,(r1)
  49. cain n1,st..
  50. $then signal badtab
  51. $fi
  52. mcall tb.ha,[name(er)]
  53. movem rr,hash(er)
  54. move r1,table(er)
  55. tcheck st.cod(r1),tvec
  56. hrre n1,rr
  57. $loop
  58. hrre n2,st.ha(r1)
  59. camn n1,n2
  60. $go chain
  61. hrroi r0,st.lt(r1)
  62. caml n1,n2
  63. hrroi r0,st.gt(r1)
  64. $if skipe r1,(r0) ; nothing down this branch!
  65. $then push sp,r0 ; save the plug address
  66. mcall tb.cr ; make a new tree
  67. pop sp,r0
  68. movem rr,(r0) ; plug with new table
  69. move n1,hash(er)
  70. movem n1,st.ha(rr)
  71. move r1,rr
  72. $go chain
  73. $fi
  74. $pool
  75. $label chain
  76. ; At this point r1 points at the node & the hash is equal
  77. $loop
  78. $if skipe r0,st.eq(r1)
  79. $then movei n1,se..
  80. hrli n1,(tvec)
  81. alloc (n1),n1
  82. movem rr,se.nxt(r1)
  83. move r0,$none
  84. movem r0,se.val(rr)
  85. move r0,name(er)
  86. movem r0,se.nam(rr)
  87. $go exit
  88. $elf push sp,r0
  89. mcall s.eq,[name(er),se.nam(r0)]
  90. pop sp,r1
  91. $test
  92. $then move rr,r1
  93. $go exit
  94. $fi
  95. $pool
  96. $label exit
  97. $rtn rr
  98. corp %table$lookup,[table,name],[hash]
  99. proc tb.en,[tab,name,val]
  100. mcall tb.lu,[tab(er),name(er)]
  101. move r1,val(er)
  102. exch r1,rr
  103. movem rr,se.val(r1)
  104. $rtn rr
  105. corp %table$enter,[tab,name,val]
  106. proc tb.va,[tab,name]
  107. mcall tb.lu,[tab(er),name(er)]
  108. move rr,se.val(rr)
  109. $rtn rr
  110. corp %table$value,[tab,name]
  111. proc te.va,[ent]
  112. move r0,ent(er)
  113. hrrz n1,(r0)
  114. $if cain n1,se..
  115. $then edesc badent,bad_entry
  116. signal badent
  117. $fi
  118. move rr,se.val(r0)
  119. $rtn rr
  120. corp %table_entry$value,[entry]
  121. proc te.na,[ent]
  122. move r0,ent(er)
  123. hrrz n1,(r0)
  124. $if cain n1,se..
  125. $then edesc badent,bad_entry
  126. signal badent
  127. $fi
  128. move rr,se.nam(r0)
  129. $rtn rr
  130. corp %table_entry$name,[entry]
  131. proc tb.sev,[ent,val]
  132. move r0,ent(er)
  133. hrrz n1,(r0)
  134. $if cain n1,se..
  135. $then signal badent
  136. $fi
  137. move rr,val(er)
  138. movem rr,se.val(r0)
  139. $rtn rr
  140. corp %table_entry$set_value,[entry,value]
  141. iter tb.iv,[tab]
  142. $for left,rr,call %table$entries,1,[tab(er)]
  143. $if move rr,se.val(rr)
  144. camn rr,$none
  145. $then $yield rr
  146. $fi
  147. $rof left
  148. $rtn $none
  149. reti %table$values,[tab]
  150. iter tb.in,[tab]
  151. $for left,rr,call %table$entries,1,[tab(er)]
  152. $if move r0,se.val(rr)
  153. camn r0,$none
  154. $then $yield se.nam(rr)
  155. $fi
  156. $rof left
  157. $rtn $none
  158. reti %table$names,[tab]
  159. iter tb.ie,[tab]
  160. move r0,tab(er)
  161. $loop
  162. $crtnc r0,e,$none
  163. push sp,r0 ; save the node
  164. $loop ; yield all equal hash entries
  165. $if skipe r1,se.nxt(r0)
  166. $then $go branch
  167. $fi
  168. push sp,r1
  169. move rr,r1
  170. $yield rr
  171. pop sp,r0
  172. $pool
  173. $label branch
  174. move r0,(sp) ; restore the node
  175. $if skipn r1,st.lt(r0)
  176. $then $for left,rr,call %table$entries,1,[r1]
  177. $yield rr
  178. $rof left
  179. $fi
  180. pop sp,r0 ; restore the node again
  181. move r0,st.gt(r0) ; and grab the greater tree
  182. $pool
  183. reti %table$entries,[tab]
  184. proc tb.pr,[tab,ch],[obj],[0]
  185. $for all,obj(er),call %table$entries,1,[tab(er)]
  186. call crlf,1,[ch(er)]
  187. move r0,obj(er)
  188. call chan$writes,2,[ch(er),se.nam(r0)]
  189. link lnk,tchar+11
  190. call chan$writec,2,[ch(er),lnk(lr)]
  191. move r0,obj(er)
  192. call print,2,[ch(er),se.val(r0)]
  193. $rof all
  194. call crlf,1,[ch(er)]
  195. $rtn $none
  196. corp %table$print,[table,channel],[obj]
  197. retsulc %table