listen.7 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. .insrt clusys;alpha >
  2. cluster %listen,0,0
  3. link root,0
  4. proc listen,[tyi,tyo]
  5. $if skipe root(lr)
  6. $then call %table$create,0
  7. assn root(lr),rr
  8. $fi
  9. $loop
  10. call revp,2,[tyi(er),tyo(er)]
  11. $pool
  12. $rtnc $none
  13. corp listen,[tyi,tyo]
  14. proc revp,[tyi,tyo],[a],[0]
  15. call crlf,1,[tyo(er)]
  16. slink lnk,:
  17. call chan$writes,2,[tyo(er),lnk(lr)]
  18. call simple,3,[tyi(er),tyo(er),$zero]
  19. assn a(er),rr
  20. call crlf,1,[tyo(er)]
  21. call print,2,[tyo(er),a(er)]
  22. $rtnc $none
  23. corp revp,[tyi,tyo],[a]
  24. proc erret,[],[e],[trel]
  25. hrre r0,(er)
  26. $loop
  27. $if skipe r0,(r0)
  28. $then $rtnc $none
  29. $fi
  30. hrrm r0,e(er)
  31. hlro g0,-1(r0)
  32. call pname,1,[g0]
  33. slink lnk,listen
  34. $ift call string$equal,2,[rr,lnk(lr)]
  35. $then move er,e(er)
  36. hlrz mr,-1(er)
  37. move pr,en.lpr(mr)
  38. movs lr,pr
  39. $rtnc $true
  40. $fi
  41. move r0,e(er)
  42. $pool
  43. corp erret,[],[e]
  44. proc valret,[s]
  45. link lnk,tchar+0
  46. call string$append,2,[s(er),lnk(lr)]
  47. movei r0,1(rr)
  48. hrli r0,(.value)
  49. xct r0
  50. $rtn s(er)
  51. corp valret,[s]
  52. ;; simple = proc (tyi,tyo: chan, depth: int) returns (any);
  53. proc simple,[tyi,tyo,depth],[c,cc,p,s,mark,i],[tchar,tchar,trel,tstr,trel,tint]
  54. tcheck tyi(er),tchan
  55. tcheck tyo(er),tchan
  56. tcheck depth(er),tint
  57. ;; depth := depth + 1;
  58. call int$add,2,[depth(er),$one]
  59. movem rr,depth(er)
  60. ;; while true do begin
  61. ;; c: char := chan$peek(tyi);
  62. $loop
  63. call chan$peek,1,[tyi(er)]
  64. movem rr,c(er)
  65. ;; case c in
  66. ;; '\7': return eprint(tyo,"quit!",depth);
  67. link bell,tchar+7
  68. $ift call char$equal,2,[bell(lr),c(er)]
  69. $then slink lnk,quit!
  70. call chan$readc,1,[tyi(er)]
  71. call eprint,3,[tyo(er),lnk(lr),depth(er)]
  72. $rtn rr
  73. ;; '(': begin
  74. link lnklp,tchar+"(
  75. $elf call char$equal,2,[lnklp(lr),c(er)]
  76. $test
  77. ;; chan$readc(tyi);
  78. $then call chan$readc,1,[tyi(er)]
  79. ;; p: proc := simple(tyi);
  80. call simple,3,[tyi(er),tyo(er),depth(er)]
  81. movem rr,p(er)
  82. ;; if bad(p) then return eprint(tyo,"not a legal procedure!",depth);
  83. $if came rr,$bad
  84. $then slink lnk,not a legal procedure!
  85. call eprint,3,[tyo(er),lnk(lr),depth(er)]
  86. $rtn rr
  87. $fi
  88. ;; mark();
  89. hrrm sp,mark(er)
  90. ;; while (c := chan$peek(tyi)) ~= ')'
  91. $loop
  92. call chan$peek,1,[tyi(er)]
  93. movem rr,c(er)
  94. link lnkrp,tchar+")
  95. $ift call char$equal,2,[lnkrp(lr),c(er)]
  96. $then $go l$1
  97. ;; do begin
  98. ;; x: any := simple(tyi);
  99. ;; if bad(x) then return eprint(tyo,"bad argument!",depth);
  100. ;; else if ~none(x) then push(x);
  101. $else call simple,3,[tyi(er),tyo(er),depth(er)]
  102. $if came rr,$bad
  103. $then slink lnk,bad argument!
  104. call eprint,3,[tyo(er),lnk(lr),depth(er)]
  105. $rtn rr
  106. $elf hlrz n1,rr
  107. caie n1,(tmrtn)
  108. $then
  109. $else came rr,$none
  110. push sp,rr
  111. $fi
  112. $fi
  113. ;; end;
  114. $pool
  115. $label l$1
  116. ;; chan$readc(tyi);
  117. call chan$readc,1,[tyi(er)]
  118. ;; if nogood(p)
  119. ;; then return eprint(tyo,"invoked object not a procedure!",depth);
  120. ;; else return tuplecall(p);
  121. move rr,p(er)
  122. $if hlrz n1,rr
  123. caie n1,(tint)
  124. $then pop sp,r0 ; get the nth element
  125. add r0,rr
  126. move rr,(r0)
  127. $rtn rr
  128. $elf hrrz r0,rr
  129. cail r0,pgsize
  130. cail r0,gchi
  131. $then $if hrrz r0,en.lpr(rr)
  132. cail r0,pgsize
  133. cail r0,gchi
  134. $then $if hlrz n0,pr.cod(r0)
  135. caie n0,(tprep)
  136. $then mcall (rr) ; call the given routine
  137. $if hlrz n1,rr
  138. caie n1,(tmrtn)
  139. $then $mrtn (rr)
  140. $else $rtn rr
  141. $fi
  142. $fi
  143. $fi
  144. $fi
  145. slink lnk,invoked object not a procedure!
  146. call eprint,3,[tyo(er),lnk(lr),depth(er)]
  147. $rtn rr
  148. ;; end;
  149. ;; ')': begin
  150. ;; if depth = 1 then chan$readc(tyi);
  151. ;; return;
  152. ;; end;
  153. $elf $test call char$equal,2,[c(er),lnkrp(lr)]
  154. $then $ift call int$equal,2,[depth(er),$one]
  155. $then call chan$readc,1,[tyi(er)]
  156. $fi
  157. $rtnc $none
  158. ;; '&': begin
  159. ;; chan$readc(tyi);
  160. ;; c := char$lower(chan$readc(tyi));
  161. ;; case c in
  162. ;; 't': return true;
  163. ;; 'f': return false;
  164. ;; 'n': return null;
  165. ;; out: return;
  166. ;; end;
  167. ;; end;
  168. $elf link lnkamp,tchar+"&
  169. $test call char$equal,2,[c(er),lnkamp(lr)]
  170. $then call chan$readc,1,[tyi(er)]
  171. call chan$readc,1,[tyi(er)]
  172. call char$lower,1,[rr]
  173. movem rr,c(er)
  174. $if link lnkt,tchar+"t
  175. $test call char$equal,2,[rr,lnkt(lr)]
  176. $then $rtnc $true
  177. $elf link lnkf,tchar+"f
  178. $test call char$equal,2,[c(er),lnkf(lr)]
  179. $then $rtnc $false
  180. $elf link lnkf,tchar+"n
  181. $test call char$equal,2,[c(er),lnkf(lr)]
  182. $then $rtnc $null
  183. $else $rtnc $none
  184. $fi
  185. ;; '.': begin
  186. ;; chan$readc(tyi);
  187. ;; return dotval(idscan(tyi));
  188. ;; end;
  189. $elf link lnkd,tchar+".
  190. $test call char$equal,2,[c(er),lnkd(lr)]
  191. $then call chan$readc,1,[tyi(er)]
  192. call idscan,1,[tyi(er)]
  193. call dotval,1,[rr]
  194. $rtn rr
  195. ;; ':': begin
  196. ;; chan$readc(tyi);
  197. ;; return ass(idscan(tyi),simple(tyi,depth));
  198. ;; end;
  199. $elf link lnk,tchar+":
  200. $test call char$equal,2,[c(er),lnk(lr)]
  201. $then call chan$readc,1,[tyi(er)]
  202. call idscan,1,[tyi(er)]
  203. args [rr]
  204. call simple,3,[tyi(er),tyo(er),depth(er)]
  205. call ass,2,[rr]
  206. $rtn rr
  207. ;; '-': begin
  208. ;; chan$readc(tyi);
  209. ;; return int$neg(simple(tyi))
  210. ;; end;
  211. $elf link lnkm,tchar+"-
  212. $test call char$equal,2,[c(er),lnkm(lr)]
  213. $then call chan$readc,1,[tyi(er)]
  214. call simple,3,[tyi(er),tyo(er),depth(er)]
  215. call int$neg,1,[rr]
  216. $rtn rr
  217. $fi
  218. ;; '0'..'9': begin
  219. ;; i: int := char$c2i(c)-char$c2i('0');
  220. ;; chan$readc(tyi);
  221. $ift call numeric,1,[c(er)]
  222. $then
  223. call char$c2i,1,[c(er)]
  224. push sp,rr
  225. link lnkc0,tchar+"0
  226. call char$c2i,1,[lnkc0(lr)]
  227. call int$sub,2,[rr]
  228. movem rr,i(er)
  229. call chan$readc,1,[tyi(er)]
  230. $loop
  231. call chan$peek,1,[tyi(er)]
  232. movem rr,c(er)
  233. $ift call numeric,1,[c(er)]
  234. $then
  235. $else $go l$2
  236. $fi
  237. ;; while numeric(c := chan$peek(tyi))
  238. ;; do begin
  239. link lnk10,tint+10.
  240. call int$mul,2,[i(er),lnk10(lr)]
  241. push sp,rr
  242. call char$c2i,1,[c(er)]
  243. call int$add,2,[rr]
  244. push sp,rr
  245. call char$c2i,1,[lnkc0(lr)]
  246. call int$sub,2,[rr]
  247. movem rr,i(er)
  248. ;; i := i*10+char$c2i(c)-char$c2i('0');
  249. call chan$readc,1,[tyi(er)]
  250. ;; chan$readc(tyi)
  251. $pool
  252. $label l$2
  253. $rtn i(er)
  254. ;; end;
  255. ;; return i;
  256. ;; end;
  257. $elf $test call alpha,1,[c(er)]
  258. $then
  259. ;; 'a'..'z','_','a'..'z':
  260. call idscan,1,[tyi(er)]
  261. call xfind,1,[rr]
  262. $rtn rr
  263. ;; return xfind(idscan(tyi));
  264. $elf link lnkq1,tchar+"'
  265. link lnkq2,tchar+""
  266. $ift call char$equal,2,[c(er),lnkq1(lr)]
  267. $then
  268. $else call char$equal,2,[c(er),lnkq2(lr)]
  269. $fi
  270. $test
  271. $then
  272. ;; '\'', '\"' : begin
  273. call chan$readc,1,[tyi(er)]
  274. movem rr,cc(er)
  275. ;; cc: char := chan$readc(tyi);
  276. ;; mark();
  277. hrrm sp,mark(er)
  278. ;; while (c:= chan$peek(tyi)) ~= cc do begin
  279. ;; push(chan$readc(tyi));
  280. $loop
  281. call chan$peek,1,[tyi(er)]
  282. movem rr,c(er)
  283. $ift call char$equal,2,[rr,bell(lr)]
  284. $then $rtn $bad
  285. $fi
  286. $ift call char$equal,2,[c(er),cc(er)]
  287. $then $go l$4
  288. $fi
  289. call chan$readc,1,[tyi(er)]
  290. push sp,rr
  291. ;; if c = '\\' then push(chan$readc(tyi));
  292. $if link lnkb,tchar+"\
  293. $test call char$equal,2,[c(er),lnkb(lr)]
  294. $then call chan$readc,1,[tyi(er)]
  295. push sp,rr
  296. $fi
  297. ;; end;
  298. $pool
  299. $label l$4
  300. ;; chan$readc(tyi);
  301. call chan$readc,1,[tyi(er)]
  302. ;; s: str := string$parse(tuplecall(makestr));
  303. hrrz r0,sp
  304. stypi r0,(trel)
  305. call makestr,2,[mark(er),r0]
  306. call string$parse,1,[rr]
  307. movem rr,s(er)
  308. ;; if cc = '\"' then return s
  309. $ift call char$equal,2,[cc(er),lnkq2(lr)]
  310. $then $rtn s(er)
  311. ;; else return string$fetch(s,1)
  312. $else call string$fetch,2,[s(er),$one]
  313. $rtn rr
  314. $fi
  315. ;; end;
  316. ;; out:
  317. $else
  318. ;; chan$readc(tyi);
  319. call chan$readc,1,[tyi(er)]
  320. $fi
  321. $pool
  322. ;; end;
  323. ;; end simple;
  324. corp simple,[tyi,tyo,depth],[c,cc,p,s,mark,i]
  325. proc alpha,[c]
  326. link lnkaa,tchar+"A
  327. link lnka,tchar+"a
  328. link lnkzz,tchar+"Z
  329. link lnkz,tchar+"z
  330. link lnku,tchar+"_
  331. link lnkd,tchar+"$
  332. $ift call numeric,1,[c(er)]
  333. $then $rtn rr
  334. $fi
  335. $ift call char$equal,2,[c(er),lnku(lr)]
  336. $then $rtn rr
  337. $fi
  338. $ift call char$equal,2,[c(er),lnkd(lr)]
  339. $then $rtn rr
  340. $fi
  341. $ift call char$lt,2,[c(er),lnkaa(lr)]
  342. $then $rtnc $false
  343. $fi
  344. $ift call char$gt,2,[c(er),lnkzz(lr)]
  345. $then
  346. $else $rtnc $true
  347. $fi
  348. $ift call char$lt,2,[c(er),lnka(lr)]
  349. $then $rtnc $false
  350. $fi
  351. $ift call char$gt,2,[c(er),lnkz(lr)]
  352. $then $rtnc $false
  353. $else $rtnc $true
  354. $fi
  355. corp alpha,[c]
  356. proc numer,[c]
  357. link lnk0,tchar+"0
  358. link lnk9,tchar+"9
  359. $ift call char$lt,2,[c(er),lnk0(lr)]
  360. $then $rtnc $false
  361. $fi
  362. $ift call char$gt,2,[c(er),lnk9(lr)]
  363. $then $rtnc $false
  364. $fi
  365. $rtnc $true
  366. corp numeric,[c]
  367. proc mstr,[l,h]
  368. move g0,h(er)
  369. sub g0,l(er)
  370. $if skiple g0
  371. $then $rtn $nulls
  372. $fi
  373. stypi g0,(tint)
  374. movei n0,4400
  375. stypi n0,(tint)
  376. call tp2s,3,[l(er),g0,n0]
  377. $rtn rr
  378. corp makestr,[l,h]
  379. proc idscan,[tyi],[mark,c],[trel,tchar]
  380. ;; idscan = proc (tyi: chan) returns (str);
  381. hrrm sp,mark(er)
  382. ;; mark();
  383. call chan$readc,1,[tyi(er)]
  384. call char$lower,1,[rr]
  385. push sp,rr
  386. ;; push(char$lower(chan$readc(tyi)));
  387. $loop
  388. call chan$peek,1,[tyi(er)]
  389. movem rr,c(er)
  390. $ift call alpha,1,[rr]
  391. $then
  392. $else $go l$3
  393. $fi
  394. ;; while alpha(c:=chan$peek(tyi)) do begin
  395. call chan$readc,1,[tyi(er)]
  396. call char$lower,1,[rr]
  397. push sp,rr
  398. ;; push(char$lower(chan$readc(tyi)));
  399. $pool
  400. $label l$3
  401. move r0,sp
  402. stypi r0,(trel)
  403. call makestr,2,[mark(er),r0]
  404. $rtn rr
  405. ;; return tuplecall(makestr);
  406. ;; end idscan;
  407. corp idscan,[tyi],[mark,c]
  408. proc ass,[x,y]
  409. tcheck x(er),tstr
  410. call %table$enter,3,[root(lr),x(er),y(er)]
  411. $rtn y(er)
  412. corp ass,[x,y]
  413. proc dotval,[x]
  414. call %table$value,2,[root(lr),x(er)]
  415. $rtn rr
  416. corp dotval,[x]
  417. proc eprint,[tyo,s,i]
  418. move rr,i(er)
  419. $if came rr,$one
  420. $then call crlf,1,[tyo(er)]
  421. call chan$writes,2,[tyo(er),s(er)]
  422. $rtnc $none
  423. $fi
  424. $rtnc $bad
  425. corp eprint,[tyo,s,i]
  426. retsulc %listen
  427. .insrt clusys;omega >