home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume23 / abc / part15 < prev    next >
Encoding:
Internet Message Format  |  1991-01-08  |  54.3 KB

  1. Subject:  v23i094:  ABC interactive programming environment, Part15/25
  2. Newsgroups: comp.sources.unix
  3. Approved: rsalz@uunet.UU.NET
  4. X-Checksum-Snefru: 220bd2e4 54a6d47b bf15b66f b896cc92
  5.  
  6. Submitted-by: Steven Pemberton <steven@cwi.nl>
  7. Posting-number: Volume 23, Issue 94
  8. Archive-name: abc/part15
  9.  
  10. #! /bin/sh
  11. # This is a shell archive.  Remove anything before this line, then feed it
  12. # into a shell via "sh file" or similar.  To overwrite existing files,
  13. # type "sh file -c".
  14. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  15. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  16. # Contents:  abc/bed/DEP abc/bint2/i2cmd.c abc/bint2/i2uni.c
  17. #   abc/bint3/i3int.c abc/ehdrs/tabl.h abc/unix/u1keys.c
  18. # Wrapped by rsalz@litchi.bbn.com on Mon Dec 17 13:28:08 1990
  19. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  20. echo If this archive is complete, you will see the following message:
  21. echo '          "shar: End of archive 15 (of 25)."'
  22. if test -f 'abc/bed/DEP' -a "${1}" != "-c" ; then 
  23.   echo shar: Will not clobber existing file \"'abc/bed/DEP'\"
  24. else
  25.   echo shar: Extracting \"'abc/bed/DEP'\" \(9951 characters\)
  26.   sed "s/^X//" >'abc/bed/DEP' <<'END_OF_FILE'
  27. Xe1cell.o: e1cell.c
  28. Xe1cell.o: ../bhdrs/b.h
  29. Xe1cell.o: ../uhdrs/osconf.h
  30. Xe1cell.o: ../uhdrs/os.h
  31. Xe1cell.o: ../uhdrs/conf.h
  32. Xe1cell.o: ../uhdrs/config.h
  33. Xe1cell.o: ../bhdrs/b0lan.h
  34. Xe1cell.o: ../bhdrs/bedi.h
  35. Xe1cell.o: ../bhdrs/bmem.h
  36. Xe1cell.o: ../bhdrs/bobj.h
  37. Xe1cell.o: ../ehdrs/node.h
  38. Xe1cell.o: ../ehdrs/cell.h
  39. Xe1cell.o: ../uhdrs/args.h
  40. Xe1code.o: e1code.c
  41. Xe1code.o: ../bhdrs/b.h
  42. Xe1code.o: ../uhdrs/osconf.h
  43. Xe1code.o: ../uhdrs/os.h
  44. Xe1code.o: ../uhdrs/conf.h
  45. Xe1code.o: ../uhdrs/config.h
  46. Xe1code.o: ../ehdrs/code.h
  47. Xe1comm.o: e1comm.c
  48. Xe1comm.o: ../bhdrs/b.h
  49. Xe1comm.o: ../uhdrs/osconf.h
  50. Xe1comm.o: ../uhdrs/os.h
  51. Xe1comm.o: ../uhdrs/conf.h
  52. Xe1comm.o: ../uhdrs/config.h
  53. Xe1comm.o: ../bhdrs/bedi.h
  54. Xe1comm.o: ../uhdrs/feat.h
  55. Xe1comm.o: ../bhdrs/bfil.h
  56. Xe1comm.o: ../bhdrs/bcom.h
  57. Xe1comm.o: ../ehdrs/node.h
  58. Xe1comm.o: ../ehdrs/supr.h
  59. Xe1comm.o: ../ehdrs/tabl.h
  60. Xe1deco.o: e1deco.c
  61. Xe1deco.o: ../bhdrs/b.h
  62. Xe1deco.o: ../uhdrs/osconf.h
  63. Xe1deco.o: ../uhdrs/os.h
  64. Xe1deco.o: ../uhdrs/conf.h
  65. Xe1deco.o: ../uhdrs/config.h
  66. Xe1deco.o: ../bhdrs/bedi.h
  67. Xe1deco.o: ../btr/etex.h
  68. Xe1deco.o: ../bhdrs/bobj.h
  69. Xe1deco.o: ../uhdrs/feat.h
  70. Xe1deco.o: ../ehdrs/erro.h
  71. Xe1deco.o: ../ehdrs/node.h
  72. Xe1deco.o: ../ehdrs/gram.h
  73. Xe1deco.o: ../ehdrs/supr.h
  74. Xe1deco.o: ../ehdrs/queu.h
  75. Xe1deco.o: ../ehdrs/tabl.h
  76. Xe1edit.o: e1edit.c
  77. Xe1edit.o: ../bhdrs/b.h
  78. Xe1edit.o: ../uhdrs/osconf.h
  79. Xe1edit.o: ../uhdrs/os.h
  80. Xe1edit.o: ../uhdrs/conf.h
  81. Xe1edit.o: ../uhdrs/config.h
  82. Xe1edit.o: ../bhdrs/bedi.h
  83. Xe1edit.o: ../btr/etex.h
  84. Xe1edit.o: ../uhdrs/feat.h
  85. Xe1edit.o: ../bhdrs/bmem.h
  86. Xe1edit.o: ../ehdrs/erro.h
  87. Xe1edit.o: ../bhdrs/bobj.h
  88. Xe1edit.o: ../ehdrs/node.h
  89. Xe1edit.o: ../ehdrs/tabl.h
  90. Xe1edit.o: ../ehdrs/gram.h
  91. Xe1edit.o: ../ehdrs/supr.h
  92. Xe1edit.o: ../ehdrs/queu.h
  93. Xe1edoc.o: e1edoc.c
  94. Xe1edoc.o: ../bhdrs/b.h
  95. Xe1edoc.o: ../uhdrs/osconf.h
  96. Xe1edoc.o: ../uhdrs/os.h
  97. Xe1edoc.o: ../uhdrs/conf.h
  98. Xe1edoc.o: ../uhdrs/config.h
  99. Xe1edoc.o: ../bhdrs/bedi.h
  100. Xe1edoc.o: ../btr/etex.h
  101. Xe1edoc.o: ../uhdrs/feat.h
  102. Xe1edoc.o: ../bhdrs/bobj.h
  103. Xe1edoc.o: ../uhdrs/defs.h
  104. Xe1edoc.o: ../ehdrs/node.h
  105. Xe1edoc.o: ../ehdrs/erro.h
  106. Xe1edoc.o: ../ehdrs/gram.h
  107. Xe1edoc.o: ../ehdrs/keys.h
  108. Xe1edoc.o: ../ehdrs/queu.h
  109. Xe1edoc.o: ../ehdrs/supr.h
  110. Xe1edoc.o: ../ehdrs/tabl.h
  111. Xe1erro.o: e1erro.c
  112. Xe1erro.o: ../bhdrs/b.h
  113. Xe1erro.o: ../uhdrs/osconf.h
  114. Xe1erro.o: ../uhdrs/os.h
  115. Xe1erro.o: ../uhdrs/conf.h
  116. Xe1erro.o: ../uhdrs/config.h
  117. Xe1erro.o: ../bhdrs/bedi.h
  118. Xe1erro.o: ../uhdrs/feat.h
  119. Xe1erro.o: ../bhdrs/bmem.h
  120. Xe1erro.o: ../bhdrs/bobj.h
  121. Xe1erro.o: ../ehdrs/erro.h
  122. Xe1erro.o: ../ehdrs/node.h
  123. Xe1eval.o: e1eval.c
  124. Xe1eval.o: ../bhdrs/b.h
  125. Xe1eval.o: ../uhdrs/osconf.h
  126. Xe1eval.o: ../uhdrs/os.h
  127. Xe1eval.o: ../uhdrs/conf.h
  128. Xe1eval.o: ../uhdrs/config.h
  129. Xe1eval.o: ../bhdrs/b0lan.h
  130. Xe1eval.o: ../bhdrs/bedi.h
  131. Xe1eval.o: ../btr/etex.h
  132. Xe1eval.o: ../ehdrs/node.h
  133. Xe1eval.o: ../ehdrs/gram.h
  134. Xe1getc.o: e1getc.c
  135. Xe1getc.o: ../bhdrs/b.h
  136. Xe1getc.o: ../uhdrs/osconf.h
  137. Xe1getc.o: ../uhdrs/os.h
  138. Xe1getc.o: ../uhdrs/conf.h
  139. Xe1getc.o: ../uhdrs/config.h
  140. Xe1getc.o: ../uhdrs/feat.h
  141. Xe1getc.o: ../bhdrs/bmem.h
  142. Xe1getc.o: ../bhdrs/bobj.h
  143. Xe1getc.o: ../bhdrs/bfil.h
  144. Xe1getc.o: ../ehdrs/keys.h
  145. Xe1getc.o: ../ehdrs/getc.h
  146. Xe1getc.o: ../uhdrs/args.h
  147. Xe1goto.o: e1goto.c
  148. Xe1goto.o: ../bhdrs/b.h
  149. Xe1goto.o: ../uhdrs/osconf.h
  150. Xe1goto.o: ../uhdrs/os.h
  151. Xe1goto.o: ../uhdrs/conf.h
  152. Xe1goto.o: ../uhdrs/config.h
  153. Xe1goto.o: ../bhdrs/bedi.h
  154. Xe1goto.o: ../btr/etex.h
  155. Xe1goto.o: ../uhdrs/feat.h
  156. Xe1goto.o: ../bhdrs/bobj.h
  157. Xe1goto.o: ../ehdrs/erro.h
  158. Xe1goto.o: ../ehdrs/node.h
  159. Xe1goto.o: ../ehdrs/gram.h
  160. Xe1goto.o: ../ehdrs/supr.h
  161. Xe1gram.o: e1gram.c
  162. Xe1gram.o: ../bhdrs/b.h
  163. Xe1gram.o: ../uhdrs/osconf.h
  164. Xe1gram.o: ../uhdrs/os.h
  165. Xe1gram.o: ../uhdrs/conf.h
  166. Xe1gram.o: ../uhdrs/config.h
  167. Xe1gram.o: ../bhdrs/bedi.h
  168. Xe1gram.o: ../btr/etex.h
  169. Xe1gram.o: ../bhdrs/bmem.h
  170. Xe1gram.o: ../uhdrs/feat.h
  171. Xe1gram.o: ../bhdrs/bobj.h
  172. Xe1gram.o: ../ehdrs/node.h
  173. Xe1gram.o: ../ehdrs/gram.h
  174. Xe1gram.o: ../ehdrs/supr.h
  175. Xe1gram.o: ../ehdrs/tabl.h
  176. Xe1gram.o: ../ehdrs/code.h
  177. Xe1gram.o: ../uhdrs/args.h
  178. Xe1help.o: e1help.c
  179. Xe1help.o: ../bhdrs/b.h
  180. Xe1help.o: ../uhdrs/osconf.h
  181. Xe1help.o: ../uhdrs/os.h
  182. Xe1help.o: ../uhdrs/conf.h
  183. Xe1help.o: ../uhdrs/config.h
  184. Xe1help.o: ../bhdrs/bedi.h
  185. Xe1help.o: ../uhdrs/feat.h
  186. Xe1help.o: ../bhdrs/bmem.h
  187. Xe1help.o: ../bhdrs/bfil.h
  188. Xe1help.o: ../bhdrs/bobj.h
  189. Xe1help.o: ../ehdrs/keys.h
  190. Xe1help.o: ../ehdrs/getc.h
  191. Xe1ins2.o: e1ins2.c
  192. Xe1ins2.o: ../bhdrs/b.h
  193. Xe1ins2.o: ../uhdrs/osconf.h
  194. Xe1ins2.o: ../uhdrs/os.h
  195. Xe1ins2.o: ../uhdrs/conf.h
  196. Xe1ins2.o: ../uhdrs/config.h
  197. Xe1ins2.o: ../bhdrs/bedi.h
  198. Xe1ins2.o: ../btr/etex.h
  199. Xe1ins2.o: ../bhdrs/bobj.h
  200. Xe1ins2.o: ../ehdrs/node.h
  201. Xe1ins2.o: ../ehdrs/supr.h
  202. Xe1ins2.o: ../ehdrs/queu.h
  203. Xe1ins2.o: ../ehdrs/gram.h
  204. Xe1ins2.o: ../ehdrs/tabl.h
  205. Xe1inse.o: e1inse.c
  206. Xe1inse.o: ../bhdrs/b.h
  207. Xe1inse.o: ../uhdrs/osconf.h
  208. Xe1inse.o: ../uhdrs/os.h
  209. Xe1inse.o: ../uhdrs/conf.h
  210. Xe1inse.o: ../uhdrs/config.h
  211. Xe1inse.o: ../bhdrs/bedi.h
  212. Xe1inse.o: ../btr/etex.h
  213. Xe1inse.o: ../uhdrs/feat.h
  214. Xe1inse.o: ../bhdrs/bobj.h
  215. Xe1inse.o: ../ehdrs/node.h
  216. Xe1inse.o: ../ehdrs/gram.h
  217. Xe1inse.o: ../ehdrs/supr.h
  218. Xe1inse.o: ../ehdrs/tabl.h
  219. Xe1inse.o: ../ehdrs/code.h
  220. Xe1lexi.o: e1lexi.c
  221. Xe1lexi.o: ../bhdrs/b.h
  222. Xe1lexi.o: ../uhdrs/osconf.h
  223. Xe1lexi.o: ../uhdrs/os.h
  224. Xe1lexi.o: ../uhdrs/conf.h
  225. Xe1lexi.o: ../uhdrs/config.h
  226. Xe1lexi.o: ../bhdrs/bedi.h
  227. Xe1lexi.o: ../bhdrs/bobj.h
  228. Xe1lexi.o: ../ehdrs/node.h
  229. Xe1lexi.o: ../ehdrs/tabl.h
  230. Xe1line.o: e1line.c
  231. Xe1line.o: ../bhdrs/b.h
  232. Xe1line.o: ../uhdrs/osconf.h
  233. Xe1line.o: ../uhdrs/os.h
  234. Xe1line.o: ../uhdrs/conf.h
  235. Xe1line.o: ../uhdrs/config.h
  236. Xe1line.o: ../bhdrs/bedi.h
  237. Xe1line.o: ../btr/etex.h
  238. Xe1line.o: ../bhdrs/bobj.h
  239. Xe1line.o: ../ehdrs/node.h
  240. Xe1line.o: ../ehdrs/gram.h
  241. Xe1line.o: ../ehdrs/supr.h
  242. Xe1move.o: e1move.c
  243. Xe1move.o: ../bhdrs/b.h
  244. Xe1move.o: ../uhdrs/osconf.h
  245. Xe1move.o: ../uhdrs/os.h
  246. Xe1move.o: ../uhdrs/conf.h
  247. Xe1move.o: ../uhdrs/config.h
  248. Xe1move.o: ../uhdrs/feat.h
  249. Xe1move.o: ../bhdrs/bedi.h
  250. Xe1move.o: ../btr/etex.h
  251. Xe1move.o: ../bhdrs/bobj.h
  252. Xe1move.o: ../ehdrs/node.h
  253. Xe1move.o: ../ehdrs/supr.h
  254. Xe1move.o: ../ehdrs/gram.h
  255. Xe1move.o: ../ehdrs/tabl.h
  256. Xe1node.o: e1node.c
  257. Xe1node.o: ../bhdrs/b.h
  258. Xe1node.o: ../uhdrs/osconf.h
  259. Xe1node.o: ../uhdrs/os.h
  260. Xe1node.o: ../uhdrs/conf.h
  261. Xe1node.o: ../uhdrs/config.h
  262. Xe1node.o: ../bhdrs/bedi.h
  263. Xe1node.o: ../btr/etex.h
  264. Xe1node.o: ../bhdrs/bobj.h
  265. Xe1node.o: ../ehdrs/node.h
  266. Xe1node.o: ../bhdrs/bmem.h
  267. Xe1outp.o: e1outp.c
  268. Xe1outp.o: ../bhdrs/b.h
  269. Xe1outp.o: ../uhdrs/osconf.h
  270. Xe1outp.o: ../uhdrs/os.h
  271. Xe1outp.o: ../uhdrs/conf.h
  272. Xe1outp.o: ../uhdrs/config.h
  273. Xe1outp.o: ../bhdrs/bedi.h
  274. Xe1outp.o: ../btr/etex.h
  275. Xe1outp.o: ../bhdrs/bobj.h
  276. Xe1outp.o: ../bhdrs/bmem.h
  277. Xe1outp.o: ../ehdrs/node.h
  278. Xe1outp.o: ../ehdrs/supr.h
  279. Xe1outp.o: ../ehdrs/gram.h
  280. Xe1outp.o: ../ehdrs/cell.h
  281. Xe1outp.o: ../ehdrs/tabl.h
  282. Xe1que1.o: e1que1.c
  283. Xe1que1.o: ../bhdrs/b.h
  284. Xe1que1.o: ../uhdrs/osconf.h
  285. Xe1que1.o: ../uhdrs/os.h
  286. Xe1que1.o: ../uhdrs/conf.h
  287. Xe1que1.o: ../uhdrs/config.h
  288. Xe1que1.o: ../bhdrs/bedi.h
  289. Xe1que1.o: ../btr/etex.h
  290. Xe1que1.o: ../uhdrs/feat.h
  291. Xe1que1.o: ../bhdrs/bobj.h
  292. Xe1que1.o: ../ehdrs/node.h
  293. Xe1que1.o: ../ehdrs/supr.h
  294. Xe1que1.o: ../ehdrs/queu.h
  295. Xe1que1.o: ../ehdrs/gram.h
  296. Xe1que1.o: ../ehdrs/tabl.h
  297. Xe1que2.o: e1que2.c
  298. Xe1que2.o: ../bhdrs/b.h
  299. Xe1que2.o: ../uhdrs/osconf.h
  300. Xe1que2.o: ../uhdrs/os.h
  301. Xe1que2.o: ../uhdrs/conf.h
  302. Xe1que2.o: ../uhdrs/config.h
  303. Xe1que2.o: ../bhdrs/bedi.h
  304. Xe1que2.o: ../btr/etex.h
  305. Xe1que2.o: ../uhdrs/feat.h
  306. Xe1que2.o: ../bhdrs/bobj.h
  307. Xe1que2.o: ../ehdrs/node.h
  308. Xe1que2.o: ../ehdrs/supr.h
  309. Xe1que2.o: ../ehdrs/queu.h
  310. Xe1que2.o: ../ehdrs/gram.h
  311. Xe1que2.o: ../ehdrs/tabl.h
  312. Xe1que2.o: ../ehdrs/code.h
  313. Xe1save.o: e1save.c
  314. Xe1save.o: ../bhdrs/b.h
  315. Xe1save.o: ../uhdrs/osconf.h
  316. Xe1save.o: ../uhdrs/os.h
  317. Xe1save.o: ../uhdrs/conf.h
  318. Xe1save.o: ../uhdrs/config.h
  319. Xe1save.o: ../bhdrs/b0lan.h
  320. Xe1save.o: ../bhdrs/bedi.h
  321. Xe1save.o: ../btr/etex.h
  322. Xe1save.o: ../bhdrs/bmem.h
  323. Xe1save.o: ../bhdrs/bobj.h
  324. Xe1save.o: ../ehdrs/node.h
  325. Xe1save.o: ../ehdrs/gram.h
  326. Xe1scrn.o: e1scrn.c
  327. Xe1scrn.o: ../bhdrs/b.h
  328. Xe1scrn.o: ../uhdrs/osconf.h
  329. Xe1scrn.o: ../uhdrs/os.h
  330. Xe1scrn.o: ../uhdrs/conf.h
  331. Xe1scrn.o: ../uhdrs/config.h
  332. Xe1scrn.o: ../bhdrs/bedi.h
  333. Xe1scrn.o: ../btr/etex.h
  334. Xe1scrn.o: ../uhdrs/feat.h
  335. Xe1scrn.o: ../bhdrs/bobj.h
  336. Xe1scrn.o: ../ehdrs/erro.h
  337. Xe1scrn.o: ../ehdrs/node.h
  338. Xe1scrn.o: ../ehdrs/supr.h
  339. Xe1scrn.o: ../ehdrs/gram.h
  340. Xe1scrn.o: ../ehdrs/cell.h
  341. Xe1scrn.o: ../ehdrs/trm.h
  342. Xe1scrn.o: ../uhdrs/args.h
  343. Xe1spos.o: e1spos.c
  344. Xe1spos.o: ../bhdrs/b.h
  345. Xe1spos.o: ../uhdrs/osconf.h
  346. Xe1spos.o: ../uhdrs/os.h
  347. Xe1spos.o: ../uhdrs/conf.h
  348. Xe1spos.o: ../uhdrs/config.h
  349. Xe1spos.o: ../uhdrs/feat.h
  350. Xe1spos.o: ../bhdrs/bedi.h
  351. Xe1spos.o: ../bhdrs/bobj.h
  352. Xe1spos.o: ../bhdrs/bfil.h
  353. Xe1spos.o: ../ehdrs/node.h
  354. Xe1spos.o: ../ehdrs/supr.h
  355. Xe1spos.o: ../bhdrs/bmem.h
  356. Xe1sugg.o: e1sugg.c
  357. Xe1sugg.o: ../bhdrs/b.h
  358. Xe1sugg.o: ../uhdrs/osconf.h
  359. Xe1sugg.o: ../uhdrs/os.h
  360. Xe1sugg.o: ../uhdrs/conf.h
  361. Xe1sugg.o: ../uhdrs/config.h
  362. Xe1sugg.o: ../uhdrs/feat.h
  363. Xe1sugg.o: ../bhdrs/b0lan.h
  364. Xe1sugg.o: ../bhdrs/bmem.h
  365. Xe1sugg.o: ../bhdrs/bedi.h
  366. Xe1sugg.o: ../btr/etex.h
  367. Xe1sugg.o: ../uhdrs/defs.h
  368. Xe1sugg.o: ../bhdrs/bobj.h
  369. Xe1sugg.o: ../bhdrs/bfil.h
  370. Xe1sugg.o: ../ehdrs/node.h
  371. Xe1sugg.o: ../ehdrs/supr.h
  372. Xe1sugg.o: ../ehdrs/gram.h
  373. Xe1sugg.o: ../ehdrs/tabl.h
  374. Xe1sugg.o: ../ehdrs/queu.h
  375. Xe1sugg.o: ../uhdrs/args.h
  376. Xe1supr.o: e1supr.c
  377. Xe1supr.o: ../bhdrs/b.h
  378. Xe1supr.o: ../uhdrs/osconf.h
  379. Xe1supr.o: ../uhdrs/os.h
  380. Xe1supr.o: ../uhdrs/conf.h
  381. Xe1supr.o: ../uhdrs/config.h
  382. Xe1supr.o: ../bhdrs/bedi.h
  383. Xe1supr.o: ../btr/etex.h
  384. Xe1supr.o: ../uhdrs/feat.h
  385. Xe1supr.o: ../bhdrs/bobj.h
  386. Xe1supr.o: ../ehdrs/erro.h
  387. Xe1supr.o: ../ehdrs/node.h
  388. Xe1supr.o: ../ehdrs/supr.h
  389. Xe1supr.o: ../ehdrs/gram.h
  390. Xe1supr.o: ../ehdrs/tabl.h
  391. Xe1tabl.o: e1tabl.c
  392. Xe1tabl.o: ../bhdrs/b.h
  393. Xe1tabl.o: ../uhdrs/osconf.h
  394. Xe1tabl.o: ../uhdrs/os.h
  395. Xe1tabl.o: ../uhdrs/conf.h
  396. Xe1tabl.o: ../uhdrs/config.h
  397. Xe1tabl.o: ../bhdrs/bedi.h
  398. Xe1tabl.o: ../ehdrs/tabl.h
  399. Xe1term.o: e1term.c
  400. Xe1term.o: ../bhdrs/b.h
  401. Xe1term.o: ../uhdrs/osconf.h
  402. Xe1term.o: ../uhdrs/os.h
  403. Xe1term.o: ../uhdrs/conf.h
  404. Xe1term.o: ../uhdrs/config.h
  405. Xe1term.o: ../uhdrs/feat.h
  406. Xe1term.o: ../ehdrs/erro.h
  407. Xe1wide.o: e1wide.c
  408. Xe1wide.o: ../bhdrs/b.h
  409. Xe1wide.o: ../uhdrs/osconf.h
  410. Xe1wide.o: ../uhdrs/os.h
  411. Xe1wide.o: ../uhdrs/conf.h
  412. Xe1wide.o: ../uhdrs/config.h
  413. Xe1wide.o: ../bhdrs/bedi.h
  414. Xe1wide.o: ../btr/etex.h
  415. Xe1wide.o: ../bhdrs/bobj.h
  416. Xe1wide.o: ../ehdrs/node.h
  417. Xe1wide.o: ../ehdrs/supr.h
  418. Xe1wide.o: ../ehdrs/gram.h
  419. Xe1wide.o: ../ehdrs/tabl.h
  420. END_OF_FILE
  421.   if test 9951 -ne `wc -c <'abc/bed/DEP'`; then
  422.     echo shar: \"'abc/bed/DEP'\" unpacked with wrong size!
  423.   fi
  424.   # end of 'abc/bed/DEP'
  425. fi
  426. if test -f 'abc/bint2/i2cmd.c' -a "${1}" != "-c" ; then 
  427.   echo shar: Will not clobber existing file \"'abc/bint2/i2cmd.c'\"
  428. else
  429.   echo shar: Extracting \"'abc/bint2/i2cmd.c'\" \(9327 characters\)
  430.   sed "s/^X//" >'abc/bint2/i2cmd.c' <<'END_OF_FILE'
  431. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1986. */
  432. X
  433. X#include "b.h"
  434. X#include "bint.h"
  435. X#include "feat.h"
  436. X#include "bobj.h"
  437. X#include "i0err.h"
  438. X#include "b0lan.h"
  439. X#include "i2par.h" 
  440. X#include "i2nod.h"
  441. X#include "i3env.h"
  442. X
  443. X/* ******************************************************************** */
  444. X/*        command_suite                        */
  445. X/* ******************************************************************** */
  446. X
  447. XVisible parsetree cmd_suite(cil, first, suite) intlet cil; bool first;
  448. X        parsetree (*suite)(); {
  449. X    parsetree v= NilTree;
  450. X    
  451. X    if (ateol()) {
  452. X        bool emp= Yes;
  453. X
  454. X        v= (*suite)(cil, first, &emp);
  455. X        if (emp) parerr(MESS(2000, "no command suite where expected"));
  456. X        return v;
  457. X    }
  458. X    else {
  459. X        value c= Vnil;
  460. X        intlet l= lino;
  461. X        
  462. X        suite_command(&v, &c);
  463. X        return node5(SUITE, mk_integer(l), v, c, NilTree);
  464. X    }
  465. X}
  466. X
  467. XVisible parsetree cmd_seq(cil, first, emp) intlet cil; bool first, *emp; {
  468. X    value c= Vnil;
  469. X    intlet level, l;
  470. X    
  471. X    level= ilev(); l= lino;
  472. X    if (is_comment(&c)) 
  473. X        return node5(SUITE, mk_integer(l), NilTree, c,
  474. X                cmd_seq(cil, first, emp));
  475. X    if (chk_indent(level, cil, first)) {
  476. X        parsetree v= NilTree;
  477. X        
  478. X        findceol();
  479. X        suite_command(&v, &c);
  480. X        *emp= No;
  481. X        return node5(SUITE, mk_integer(l), v, c, cmd_seq(level, No, emp));
  482. X    }
  483. X    veli();
  484. X    return NilTree;
  485. X}
  486. X
  487. XHidden Procedure chk_indent(nlevel, olevel, first) intlet nlevel, olevel;
  488. X        bool first; {
  489. X    if (nlevel > olevel) {
  490. X        if (!first) parerr(WRONG_INDENT);
  491. X        else if (nlevel - olevel == 1) parerr(SMALL_INDENT);
  492. X        return Yes;
  493. X    }
  494. X    return nlevel == olevel && !first ? Yes : No;
  495. X}
  496. X
  497. XHidden Procedure suite_command(v, c) parsetree *v; value *c; {
  498. X    char *kw;
  499. X    
  500. X    if (!is_cmdname(ceol, &kw) || !control_command(kw, v) && 
  501. X            !simple_command(kw, v, c) ) 
  502. X        parerr(MESS(2001, "no command where expected"));
  503. X}
  504. X
  505. X/* ******************************************************************** */
  506. X/*        is_comment, tail_line                    */
  507. X/* ******************************************************************** */
  508. X
  509. XVisible bool is_comment(v) value *v; {
  510. X    txptr tx0= tx;
  511. X    skipsp(&tx);
  512. X    if (comment_sign) {
  513. X        while (Space(Char(tx0-1))) tx0--;
  514. X        while (!Eol(tx)) tx++;
  515. X        *v= cr_text(tx0, tx);
  516. X        return Yes;
  517. X    }
  518. X    tx= tx0;
  519. X    return No;
  520. X}
  521. X
  522. XVisible value tail_line() {
  523. X    value v;
  524. X    if (is_comment(&v)) return v;
  525. X    if (!ateol()) parerr(MESS(2002, "something unexpected in this line"));
  526. X    return Vnil;
  527. X}
  528. X
  529. X/* ******************************************************************** */
  530. X/*        simple_command                        */
  531. X/*                                    */
  532. X/* ******************************************************************** */
  533. X
  534. XVisible bool simple_command(kw, v, c) char *kw; parsetree *v; value *c; {
  535. X    return bas_com(kw, v) || term_com(kw, v) || udr_com(kw, v)
  536. X        ? (*c= tail_line(), Yes) : No;
  537. X}
  538. X
  539. X/* ******************************************************************** */
  540. X/*        basic_command                        */
  541. X/* ******************************************************************** */
  542. X
  543. XHidden bool bas_com(kw, v) char *kw; parsetree *v; {
  544. X    parsetree w, t;
  545. X    txptr ftx, ttx; 
  546. X
  547. X    if (check_keyword(kw)) {            /* CHECK */
  548. X        *v= node2(CHECK, test(ceol));
  549. X    }
  550. X    else if (delete_keyword(kw))            /* DELETE */
  551. X        *v= node2(DELETE, targ(ceol));
  552. X    else if (insert_keyword(kw)) {            /* INSERT */
  553. X        req(K_IN_insert, ceol, &ftx, &ttx);
  554. X        w= expr(ftx); tx= ttx;
  555. X        *v= node3(INSERT, w, targ(ceol));
  556. X    }
  557. X    else if (pass_keyword(kw)) {            /* PASS */
  558. X        upto(ceol, K_PASS);
  559. X        *v= node1(PASS);
  560. X    }
  561. X    else if (put_keyword(kw)) {            /* PUT */
  562. X        req(K_IN_put, ceol, &ftx, &ttx);
  563. X        w= expr(ftx); tx= ttx;
  564. X        *v= node3(PUT, w, targ(ceol));
  565. X    }
  566. X    else if (read_keyword(kw)) {            /* READ */
  567. X        if (find(K_RAW, ceol, &ftx, &ttx)) {
  568. X            *v= node2(READ_RAW, targ(ftx)); tx= ttx;
  569. X            upto(ceol, K_RAW);
  570. X        } 
  571. X        else {
  572. X            req(K_EG, ceol, &ftx, &ttx);
  573. X            t= targ(ftx); tx= ttx;
  574. X            *v= node3(READ, t, expr(ceol));
  575. X        }
  576. X    }
  577. X    else if (remove_keyword(kw)) {            /* REMOVE */
  578. X        req(K_FROM_remove, ceol, &ftx, &ttx);
  579. X        w= expr(ftx); tx= ttx;
  580. X        *v= node3(REMOVE, w, targ(ceol));
  581. X    }
  582. X    else if (setrandom_keyword(kw))         /* SET RANDOM */
  583. X        *v= node2(SET_RANDOM, expr(ceol));
  584. X    else if (write_keyword(kw)) {            /* WRITE */
  585. X        intlet b_cnt= 0, a_cnt= 0;
  586. X        value cr_newlines();
  587. X        
  588. X        skipsp(&tx);
  589. X        if (Ceol(tx))
  590. X            parerr(MESS(2003, "no parameter where expected"));
  591. X        while (nwl_sign) {b_cnt++; skipsp(&tx); }
  592. X        if (Ceol(tx)) w= NilTree;
  593. X        else {
  594. X            ftx= ceol;
  595. X            while (Space(Char(ftx-1)) || Char(ftx-1) == '/')
  596. X                if (Char(--ftx) == '/') a_cnt++;
  597. X            skipsp(&tx);
  598. X            w= ftx > tx ? expr(ftx) : NilTree;
  599. X        }
  600. X        *v= node4(w == NilTree || Nodetype(w) != COLLATERAL
  601. X            ? WRITE1 : WRITE,
  602. X            cr_newlines(b_cnt), w, cr_newlines(a_cnt));
  603. X        tx= ceol;
  604. X#ifdef GFX
  605. X    }
  606. X    else if (spacefrom_keyword(kw)) {        /* SPACE FROM */
  607. X        req(K_TO_space, ceol, &ftx, &ttx);
  608. X        w= expr(ftx); tx= ttx;
  609. X        *v= node3(SPACE, w, expr(ceol));
  610. X    }
  611. X    else if (linefrom_keyword(kw)) {        /* LINE FROM */
  612. X        req(K_TO_line, ceol, &ftx, &ttx);
  613. X        w= expr(ftx); tx= ttx;
  614. X        *v= node3(LINE, w, expr(ceol));
  615. X    }
  616. X    else if (clearscreen_keyword(kw)) {        / CLEAR SCREEN */
  617. X        upto(ceol, K_CLEARSCREEN);
  618. X        *v= node1(CLEAR);
  619. X#endif
  620. X    }
  621. X    else return No;
  622. X    return Yes;
  623. X}
  624. X
  625. XHidden value cr_newlines(cnt) intlet cnt; {
  626. X    value v, t= mk_text(S_NEWLINE), n= mk_integer(cnt);
  627. X    v= repeat(t, n);
  628. X    release(t); release(n);
  629. X    return v;
  630. X}
  631. X
  632. X/* ******************************************************************** */
  633. X/*        terminating_command                    */
  634. X/* ******************************************************************** */
  635. X
  636. XVisible bool term_com(kw, v) char *kw; parsetree *v; {
  637. X    if (fail_keyword(kw)) {                /* FAIL */
  638. X        upto(ceol, K_FAIL);
  639. X        *v= node1(FAIL);
  640. X    }
  641. X    else if (quit_keyword(kw)) {            /* QUIT */
  642. X        upto(ceol, K_QUIT);
  643. X        *v= node1(QUIT);
  644. X    }
  645. X    else if (return_keyword(kw))            /* RETURN */
  646. X        *v= node2(RETURN, expr(ceol));
  647. X    else if (report_keyword(kw))            /* REPORT */
  648. X        *v= node2(REPORT, test(ceol));
  649. X    else if (succeed_keyword(kw)) {            /* SUCCEED */
  650. X        upto(ceol, K_SUCCEED);
  651. X        *v= node1(SUCCEED);
  652. X    }
  653. X    else return No;
  654. X    return Yes;
  655. X}
  656. X
  657. X/* ******************************************************************** */
  658. X/*        user_defined_command; refined_command            */
  659. X/* ******************************************************************** */
  660. X
  661. XHidden bool udr_com(kw, v) char *kw; parsetree *v; {
  662. X    value hu_actuals();
  663. X    value w= mk_text(kw);
  664. X    
  665. X    if (!in(w, res_cmdnames)) {
  666. X        *v= node4(USER_COMMAND, copy(w), hu_actuals(ceol, w), Vnil);
  667. X        return Yes;
  668. X    }
  669. X    release(w);
  670. X    return No;
  671. X}
  672. X
  673. XHidden value hu_actuals(q, kw) txptr q; value kw; {
  674. X    parsetree t= NilTree;
  675. X    value v= Vnil, nkw;
  676. X    txptr ftx;
  677. X    
  678. X    skipsp(&tx);
  679. X    if (!findkw(q, &ftx))
  680. X        ftx= q;
  681. X    if (Text(ftx))
  682. X        t= expr(ftx);
  683. X    if (Text(q)) {
  684. X        nkw= mk_text(keyword());
  685. X        v= hu_actuals(q, nkw);
  686. X    }
  687. X    return node4(ACTUAL, kw, t, v);
  688. X}
  689. X
  690. X/* ******************************************************************** */
  691. X/*        control_command                        */
  692. X/* ******************************************************************** */
  693. X
  694. XVisible bool control_command(kw, v) char *kw; parsetree *v; {
  695. X    parsetree s, t, alt_suite(); 
  696. X    value c;
  697. X    txptr ftx, ttx, utx, vtx;
  698. X    
  699. X    skipsp(&tx);
  700. X    if (if_keyword(kw)) {                /* IF */
  701. X        req(S_COLON, ceol, &utx, &vtx);
  702. X        t= test(utx); tx= vtx;
  703. X        if (!is_comment(&c)) c= Vnil;
  704. X        *v= node4(IF, t, c, cmd_suite(cur_ilev, Yes, cmd_seq));
  705. X    }
  706. X    else if (select_keyword(kw)) {            /* SELECT */
  707. X        need(S_COLON);
  708. X        c= tail_line();
  709. X        *v= node3(SELECT, c, alt_suite());
  710. X    }
  711. X    else if (while_keyword(kw)) {            /* WHILE */
  712. X        intlet l= lino;
  713. X        
  714. X        req(S_COLON, ceol, &utx, &vtx);
  715. X        t= test(utx); tx= vtx;
  716. X        if (!is_comment(&c)) c= Vnil;
  717. X        s= node2(COLON_NODE, cmd_suite(cur_ilev, Yes, cmd_seq));
  718. X        *v= node5(WHILE, mk_integer(l), t, c, s);
  719. X    }
  720. X    else if (for_keyword(kw)) {            /* FOR */
  721. X        req(S_COLON, ceol, &utx, &vtx);
  722. X        req(K_IN_for, ceol, &ftx, &ttx);
  723. X        if (ttx > utx) {
  724. X            parerr(MESS(2005, "IN after colon"));
  725. X            ftx= utx= tx; ttx= vtx= ceol;
  726. X        }
  727. X        idf_cntxt= In_ranger;
  728. X        t= idf(ftx); tx= ttx;
  729. X        s= expr(utx); tx= vtx;
  730. X        if (!is_comment(&c)) c= Vnil;
  731. X        *v= node5(FOR, t, s, c, cmd_suite(cur_ilev, Yes, cmd_seq));
  732. X    }
  733. X    else return No;
  734. X    return Yes;
  735. X}
  736. X
  737. X/* ******************************************************************** */
  738. X/*        alternative_suite                    */
  739. X/* ******************************************************************** */
  740. X
  741. XHidden parsetree alt_suite() {
  742. X    parsetree v, alt_seq();
  743. X    bool emp= Yes;
  744. X     
  745. X    v= alt_seq(cur_ilev, Yes, No, &emp);
  746. X    if (emp) parerr(MESS(2006, "no alternative suite for SELECT"));
  747. X    return v;
  748. X}
  749. X
  750. XHidden parsetree alt_seq(cil, first, else_encountered, emp) 
  751. X        bool first, else_encountered, *emp; intlet cil; {
  752. X    value c;
  753. X    intlet level, l;
  754. X    char *kw;
  755. X    
  756. X    level= ilev(); l= lino;
  757. X    if (is_comment(&c)) 
  758. X        return node6(TEST_SUITE, mk_integer(l), NilTree, c,
  759. X                node2(COLON_NODE, NilTree),
  760. X                alt_seq(cil, first, else_encountered, emp));
  761. X    if (chk_indent(level, cil, first)) {
  762. X        parsetree v, s;
  763. X        txptr ftx, ttx, tx0= tx;
  764. X        
  765. X        if (else_encountered)
  766. X            parerr(MESS(2007, "after ELSE no more alternatives allowed"));
  767. X        findceol();
  768. X        req(S_COLON, ceol, &ftx, &ttx);
  769. X        *emp= No;
  770. X        if (is_keyword(&kw) && else_keyword(kw)) {
  771. X            upto(ftx, K_ELSE); tx= ttx;
  772. X            if (!is_comment(&c)) c= Vnil;
  773. X            s= cmd_suite(level, Yes, cmd_seq);
  774. X            release(alt_seq(level, No, Yes, emp));
  775. X            return node4(ELSE, mk_integer(l), c, s);
  776. X        }
  777. X        else tx= tx0;
  778. X        v= test(ftx); tx= ttx;
  779. X        if (!is_comment(&c)) c= Vnil;
  780. X        s= node2(COLON_NODE, cmd_suite(level, Yes, cmd_seq));
  781. X        return node6(TEST_SUITE, mk_integer(l), v, c, s,
  782. X                alt_seq(level, No, else_encountered, emp));
  783. X    }
  784. X    veli();
  785. X    return NilTree;
  786. X}
  787. END_OF_FILE
  788.   if test 9327 -ne `wc -c <'abc/bint2/i2cmd.c'`; then
  789.     echo shar: \"'abc/bint2/i2cmd.c'\" unpacked with wrong size!
  790.   fi
  791.   # end of 'abc/bint2/i2cmd.c'
  792. fi
  793. if test -f 'abc/bint2/i2uni.c' -a "${1}" != "-c" ; then 
  794.   echo shar: Will not clobber existing file \"'abc/bint2/i2uni.c'\"
  795. else
  796.   echo shar: Extracting \"'abc/bint2/i2uni.c'\" \(9532 characters\)
  797.   sed "s/^X//" >'abc/bint2/i2uni.c' <<'END_OF_FILE'
  798. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1986. */
  799. X
  800. X#include "b.h"
  801. X#include "bint.h"
  802. X#include "feat.h"
  803. X#include "bobj.h"
  804. X#include "i0err.h"
  805. X#include "b0lan.h"
  806. X#include "i2par.h"
  807. X#include "i2nod.h"
  808. X#include "i3env.h"
  809. X#include "i3sou.h"
  810. X
  811. X/* ******************************************************************** */
  812. X/*        unit                            */
  813. X/* ******************************************************************** */
  814. X
  815. XHidden value formlist, sharelist;
  816. XHidden envtab reftab; 
  817. XVisible literal idf_cntxt;
  818. X
  819. XForward parsetree ref_suite();
  820. X
  821. X#define unicmd_suite(level) cmd_suite(level, Yes, ucmd_seq)
  822. X
  823. XVisible parsetree unit(heading, editing) bool heading, editing; {
  824. X    parsetree cmd_unit(), funprd_unit();
  825. X    parsetree v= NilTree;
  826. X    char *kw;
  827. X    
  828. X    if (!heading) {
  829. X        lino= 1;
  830. X        cntxt= In_unit;
  831. X        release(uname); uname= Vnil;
  832. X    }
  833. X    if (is_keyword(&kw) && how_keyword(kw)) {
  834. X        need(K_TO_how);
  835. X        if (cur_ilev != 0)
  836. X            parerr(MESS(2800, "how-to starts with indentation"));
  837. X        skipsp(&tx);
  838. X        if (is_cmdname(ceol, &kw)) {
  839. X            if (return_keyword(kw))
  840. X                v= funprd_unit(heading, Yes);
  841. X            else if (report_keyword(kw))
  842. X                v= funprd_unit(heading, No);
  843. X            else v= cmd_unit(kw, heading);
  844. X        }
  845. X        else parerr(MESS(2801, "no how-to name where expected"));
  846. X    }
  847. X    else parerr(MESS(2802, "no how-to keyword where expected"));
  848. X
  849. X#ifdef TYPE_CHECK
  850. X    if (!heading && !editing) type_check(v);
  851. X#endif
  852. X    return v;
  853. X}
  854. X
  855. X/* ******************************************************************** */
  856. X/*        cmd_unit                        */
  857. X/* ******************************************************************** */
  858. X
  859. XHidden parsetree cmd_unit(kw, heading) char *kw; bool heading; {
  860. X    parsetree v;
  861. X    value w= mk_text(kw);
  862. X    value c, f, cmd_formals();
  863. X    txptr ftx, ttx;
  864. X    intlet level= cur_ilev;
  865. X    
  866. X    formlist= mk_elt(); 
  867. X    release(uname); uname= permkey(w, Cmd);
  868. X    if (in(w, res_cmdnames)) 
  869. X        pprerrV(MESS(2803, "%s is a reserved keyword"), w);
  870. X    req(S_COLON, ceol, &ftx, &ttx);
  871. X    idf_cntxt= In_formal;
  872. X    f= cmd_formals(ftx, w); tx= ttx;
  873. X    if (!is_comment(&c)) c= Vnil;
  874. X    v= node8(HOW_TO, copy(w), f, c, NilTree, NilTree, Vnil, Vnil);
  875. X    if (!heading) {
  876. X        sharelist= mk_elt();
  877. X        *Branch(v, HOW_SUITE)= unicmd_suite(level);
  878. X        reftab= mk_elt();
  879. X        *Branch(v, HOW_REFINEMENT)= ref_suite(level);
  880. X        *Branch(v, HOW_R_NAMES)= reftab;
  881. X        release(sharelist);
  882. X    }
  883. X    release(formlist); 
  884. X    return v;
  885. X}
  886. X
  887. XHidden value cmd_formals(q, kw) txptr q; value kw; {
  888. X    value t= Vnil, v= Vnil;
  889. X    txptr ftx;
  890. X    value nkw;
  891. X
  892. X    skipsp(&tx);
  893. X    if (!findkw(q, &ftx))
  894. X        ftx= q;
  895. X    if (Text(ftx))
  896. X        t= idf(ftx);
  897. X    if (Text(q)) {
  898. X        nkw= mk_text(keyword());
  899. X        v= cmd_formals(q, nkw);
  900. X    }
  901. X    return node4(FORMAL, kw, t, v);
  902. X}
  903. X
  904. X/* ******************************************************************** */
  905. X/*        fun_unit/prd_unit                    */
  906. X/* ******************************************************************** */
  907. X
  908. XHidden parsetree funprd_unit(heading, isfunc) bool heading, isfunc; {
  909. X    parsetree v, f; 
  910. X    parsetree fp_formals();
  911. X    value name, c, adicity;
  912. X    txptr ftx, ttx;
  913. X    intlet level= cur_ilev;
  914. X    
  915. X    formlist= mk_elt(); 
  916. X    skipsp(&tx);
  917. X    req(S_COLON, ceol, &ftx, &ttx);
  918. X    f= fp_formals(ftx, isfunc, &name, &adicity); tx= ttx;
  919. X    if (!is_comment(&c)) c= Vnil;
  920. X    v= node9(isfunc ? YIELD : TEST, copy(name), adicity, f, c, NilTree,
  921. X          NilTree, Vnil, Vnil);
  922. X    if (!heading) {
  923. X        sharelist= mk_elt();
  924. X        *Branch(v, FPR_SUITE)= unicmd_suite(level);
  925. X        reftab= mk_elt();
  926. X        *Branch(v, FPR_REFINEMENT)= ref_suite(level);
  927. X        *Branch(v, FPR_R_NAMES)= reftab;
  928. X        release(sharelist);
  929. X    }
  930. X    release(formlist); 
  931. X    return v;
  932. X}
  933. X
  934. X/* ******************************************************************** */
  935. X
  936. X#define FML_IN_FML MESS(2804, "%s is already a formal parameter or operand")
  937. X#define SH_IN_FML  FML_IN_FML
  938. X#define SH_IN_SH   MESS(2805, "%s is already a shared name")
  939. X#define REF_IN_FML SH_IN_FML
  940. X#define REF_IN_SH  SH_IN_SH
  941. X#define REF_IN_REF MESS(2806, "%s is already a refinement name")
  942. X
  943. XHidden Procedure treat_idf(t) value t; {
  944. X    switch (idf_cntxt) {
  945. X        case In_formal:    if (in(t, formlist)) 
  946. X                    pprerrV(FML_IN_FML, t);
  947. X                insert(t, &formlist);
  948. X                break;
  949. X        case In_share:    if (in(t, formlist)) 
  950. X                    pprerrV(SH_IN_FML, t);
  951. X                if (in(t, sharelist)) 
  952. X                    pprerrV(SH_IN_SH, t);
  953. X                insert(t, &sharelist);
  954. X                break;
  955. X        case In_ref:    if (in(t, formlist)) 
  956. X                    pprerrV(REF_IN_FML, t);
  957. X                if (in(t, sharelist)) 
  958. X                    pprerrV(REF_IN_SH, t);
  959. X                break;
  960. X        case In_ranger: break;
  961. X        default:    break;
  962. X    }
  963. X}
  964. X
  965. X#define NO_FUN_NAME    MESS(2807, "cannot find function name")
  966. X
  967. XHidden parsetree fp_formals(q, isfunc, name, adic) txptr q; bool isfunc;
  968. X        value *name, *adic; {
  969. X    parsetree v1, v2, v3;
  970. X    parsetree fml_operand();
  971. X
  972. X    *name= Vnil;
  973. X    idf_cntxt= In_formal;
  974. X    v1= fml_operand(q);
  975. X    skipsp(&tx);
  976. X    if (!Text(q)) { /* zeroadic */
  977. X        *adic= zero; 
  978. X        if (nodetype(v1) == TAG) {
  979. X            *name= *Branch(v1, TAG_NAME);
  980. X            release(uname); 
  981. X            uname= permkey(*name, isfunc ? Zfd : Zpd);
  982. X         }
  983. X         else pprerr(MESS(2808, "user defined functions must be names"));
  984. X        return v1;
  985. X    }
  986. X
  987. X    v2= fml_operand(q);
  988. X    skipsp(&tx);
  989. X    if (!Text(q)) { /* monadic */
  990. X        *adic= one; 
  991. X        if (nodetype(v1) == TAG) {
  992. X            *name= copy(*Branch(v1, TAG_NAME));
  993. X            release(uname); 
  994. X            uname= permkey(*name, isfunc ? Mfd : Mpd);
  995. X        }
  996. X        else pprerr(NO_FUN_NAME);
  997. X        if (nodetype(v2) == TAG) treat_idf(*Branch(v2, TAG_NAME));
  998. X        release(v1);
  999. X        return node4(isfunc ? MONF : MONPRD, *name, v2, Vnil);
  1000. X    }
  1001. X
  1002. X    v3= fml_operand(q);
  1003. X    /* dyadic */
  1004. X    *adic= mk_integer(2);
  1005. X    if (nodetype(v2) == TAG) {
  1006. X        *name= copy(*Branch(v2, TAG_NAME));
  1007. X        release(uname); 
  1008. X        uname= permkey(*name, isfunc ? Dfd : Dpd);
  1009. X    }
  1010. X    else pprerr(NO_FUN_NAME);
  1011. X    upto1(q, MESS(2809, "something unexpected in formula template"));
  1012. X    if (nodetype(v1) == TAG) treat_idf(*Branch(v1, TAG_NAME));
  1013. X    if (nodetype(v3) == TAG) treat_idf(*Branch(v3, TAG_NAME));
  1014. X    release(v2);
  1015. X    return node5(isfunc ? DYAF : DYAPRD, v1, *name, v3, Vnil);
  1016. X}
  1017. X
  1018. XHidden parsetree fml_operand(q) txptr q; {
  1019. X    value t;
  1020. X    skipsp(&tx);
  1021. X    if (nothing(q, MESS(2810, "nothing instead of expected template operand"))) 
  1022. X        return NilTree;
  1023. X    else if (is_tag(&t)) return node2(TAG, t);
  1024. X    else if (open_sign) return compound(q, idf);
  1025. X    else {
  1026. X        parerr(MESS(2811, "no template operand where expected"));
  1027. X        tx= q;
  1028. X        return NilTree;
  1029. X    }
  1030. X}
  1031. X
  1032. X/* ******************************************************************** */
  1033. X/*        unit_command_suite                    */
  1034. X/* ******************************************************************** */
  1035. X
  1036. XVisible parsetree ucmd_seq(cil, first, emp) intlet cil; bool first, *emp; {
  1037. X    value c;
  1038. X    intlet level= ilev();
  1039. X    intlet l= lino;
  1040. X
  1041. X    if (is_comment(&c)) 
  1042. X        return node5(SUITE, mk_integer(l), NilTree, c,
  1043. X                ucmd_seq(cil, first, emp));
  1044. X    if ((level == cil && !first) || (level > cil && first)) {
  1045. X        parsetree v;
  1046. X        findceol();
  1047. X        if (share(ceol, &v, &c)) 
  1048. X            return node5(SUITE, mk_integer(l), v, c,
  1049. X                    ucmd_seq(level, No, emp));
  1050. X        veli();
  1051. X        *emp= No;
  1052. X        return cmd_suite(cil, first, cmd_seq);
  1053. X    }
  1054. X    veli();
  1055. X    return NilTree;
  1056. X} 
  1057. X
  1058. XHidden bool share(q, v, c) txptr q; parsetree *v; value *c; {
  1059. X    char *kw;
  1060. X    txptr tx0= tx;
  1061. X    
  1062. X    if (is_cmdname(q, &kw) && share_keyword(kw)) {
  1063. X        idf_cntxt= In_share;
  1064. X        *v= node2(SHARE, idf(q));
  1065. X        *c= tail_line();
  1066. X        return Yes;
  1067. X    }
  1068. X    else tx= tx0;
  1069. X    return No;
  1070. X}
  1071. X
  1072. X
  1073. X/* ******************************************************************** */
  1074. X/*        refinement_suite                    */
  1075. X/* ******************************************************************** */
  1076. X
  1077. XHidden parsetree  ref_suite(cil) intlet cil; {
  1078. X    char *kw;
  1079. X    value name= Vnil;
  1080. X    bool t;
  1081. X    txptr tx0;
  1082. X    
  1083. X    if (ilev() != cil) {
  1084. X        parerr(WRONG_INDENT);
  1085. X        return NilTree;
  1086. X    }
  1087. X    tx0= tx;
  1088. X    findceol();
  1089. X    if ((t= is_tag(&name)) || is_cmdname(ceol, &kw)) {
  1090. X        parsetree v, s;
  1091. X        value w, *aa, r;
  1092. X        
  1093. X        skipsp(&tx);
  1094. X        if (Char(tx) != ':') {
  1095. X            release(name);
  1096. X            tx= tx0;
  1097. X            veli();
  1098. X            return NilTree;
  1099. X        }
  1100. X        /* lino= 1; cntxt= In_ref; */
  1101. X        tx++;
  1102. X        if (t) {
  1103. X            idf_cntxt= In_ref;
  1104. X            treat_idf(name);
  1105. X        }
  1106. X        else name= mk_text(kw);
  1107. X        if (in_env(reftab, name, &aa)) 
  1108. X            pprerrV(REF_IN_REF, name);
  1109. X        if (!is_comment(&w)) w= Vnil;
  1110. X        s= cmd_suite(cil, Yes, cmd_seq);
  1111. X        v= node6(REFINEMENT, name, w, s, Vnil, Vnil);
  1112. X        e_replace(r= mk_ref(v), &reftab, name);
  1113. X        release(r);
  1114. X        *Branch(v, REF_NEXT)= ref_suite(cil);
  1115. X        return v;
  1116. X    } 
  1117. X    veli();
  1118. X    return NilTree;
  1119. X}
  1120. X
  1121. X/* ******************************************************************** */
  1122. X/*        collateral, compound                    */
  1123. X/* ******************************************************************** */
  1124. X
  1125. XHidden parsetree n_collateral(q, n, base) txptr q; intlet n;
  1126. X        parsetree (*base)(); {
  1127. X    parsetree v, w; txptr ftx, ttx;
  1128. X    if (find(S_COMMA, q, &ftx, &ttx)) {
  1129. X        w= (*base)(ftx); tx= ttx;
  1130. X        v= n_collateral(q, n+1, base);
  1131. X    }
  1132. X    else {
  1133. X        w= (*base)(q);
  1134. X        if (n == 1) return w;
  1135. X        v= mk_compound(n);
  1136. X    }
  1137. X    *Field(v, n-1)= w;
  1138. X    return n > 1 ? v : node2(COLLATERAL, v);
  1139. X}
  1140. X
  1141. XVisible parsetree collateral(q, base) txptr q; parsetree (*base)(); {
  1142. X    return n_collateral(q, 1, base);
  1143. X}
  1144. X
  1145. XVisible parsetree compound(q, base) txptr q; parsetree (*base)(); {
  1146. X    parsetree v; txptr ftx, ttx;
  1147. X    req(S_CLOSE, q, &ftx, &ttx);
  1148. X    v= (*base)(ftx); tx= ttx;
  1149. X    return node2(COMPOUND, v);
  1150. X}
  1151. X
  1152. X/* ******************************************************************** */
  1153. X/*        idf, singidf                        */
  1154. X/* ******************************************************************** */
  1155. X
  1156. XHidden parsetree singidf(q) txptr q; {
  1157. X    parsetree v;
  1158. X    skipsp(&tx);
  1159. X    if (nothing(q, MESS(2812, "nothing instead of expected name")))
  1160. X        v= NilTree;
  1161. X    else if (open_sign)
  1162. X        v= compound(q, idf);
  1163. X    else if (is_tag(&v)) {
  1164. X        treat_idf(v);
  1165. X        v= node2(TAG, v);
  1166. X    }
  1167. X    else {
  1168. X        parerr(MESS(2813, "no name where expected"));
  1169. X        v= NilTree;
  1170. X    }
  1171. X    upto1(q, MESS(2814, "something unexpected in name"));
  1172. X    return v;
  1173. X}
  1174. X
  1175. XVisible parsetree idf(q) txptr q; {
  1176. X    return collateral(q, singidf);
  1177. X}
  1178. END_OF_FILE
  1179.   if test 9532 -ne `wc -c <'abc/bint2/i2uni.c'`; then
  1180.     echo shar: \"'abc/bint2/i2uni.c'\" unpacked with wrong size!
  1181.   fi
  1182.   # end of 'abc/bint2/i2uni.c'
  1183. fi
  1184. if test -f 'abc/bint3/i3int.c' -a "${1}" != "-c" ; then 
  1185.   echo shar: Will not clobber existing file \"'abc/bint3/i3int.c'\"
  1186. else
  1187.   echo shar: Extracting \"'abc/bint3/i3int.c'\" \(8835 characters\)
  1188.   sed "s/^X//" >'abc/bint3/i3int.c' <<'END_OF_FILE'
  1189. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1986. */
  1190. X
  1191. X/* B interpreter using threaded trees */
  1192. X
  1193. X#include "b.h"
  1194. X#include "bint.h"
  1195. X#include "feat.h"
  1196. X#include "bmem.h"
  1197. X#include "bobj.h"
  1198. X#include "i0err.h"
  1199. X#include "i2nod.h"
  1200. X#include "i3env.h"
  1201. X#include "i3int.h"
  1202. X#include "i3in2.h"
  1203. X#include "i3sou.h"
  1204. X#include "i3sta.h"
  1205. X
  1206. X/* Relics from old system: */
  1207. X
  1208. XVisible value resval;
  1209. XVisible bool terminated;
  1210. X
  1211. X
  1212. X/* Shorthands: */
  1213. X
  1214. X#define Pop2(fun) (w = pop(), v = pop(), fun(v, w), release(v), release(w))
  1215. X#define Pop1(fun) (v = pop(), fun(v), release(v))
  1216. X#define Dyop(funvw) \
  1217. X    (w = pop(), v = pop(), push(funvw), release(v), release(w))
  1218. X#define Monop(funv) (v = pop(), push(funv), release(v))
  1219. X#define Flagged() (Thread2(pc) != NilTree)
  1220. X#define LocFlagged() Flagged()
  1221. X#define ValOrLoc(feval, floc) (LocFlagged() ? (floc) : (feval))
  1222. X#define Jump() (next = Thread2(pc))
  1223. X#define Comp(op) (w = pop(), v = pop(), report = (compare(v, w) op 0), Comp2())
  1224. X#define Comp2() (release(v), !Flagged() ? release(w) : Comp3())
  1225. X#define Comp3() (report ? push(w) : (release(w), jumptoend()))
  1226. X#define F(n) ((value)*Branch(pc, (n)))
  1227. X
  1228. X/* Execute a threaded tree until the end or until a terminating-command.
  1229. X   The boolean argument 'wantvalue' tells whether it must deliver
  1230. X   a value or not.
  1231. X*/
  1232. X
  1233. XHidden value
  1234. Xrun(start, wantvalue) parsetree start; bool wantvalue; {
  1235. X    value u, v, w; int k, len; bool X, Y; int call_stop= call_level;
  1236. X    parsetree old_next= next;
  1237. X    /* While run can be used recursively, save some state info */
  1238. X
  1239. X    next= start;
  1240. X    while (still_ok && !Interrupted()) {
  1241. X        pc= next;
  1242. X        if (pc == Halt) {
  1243. X            interr(MESS(3500, "unexpected program halt"));
  1244. X            break;
  1245. X        }
  1246. X        if (!Is_parsetree(pc)) {
  1247. X            if (pc == Stop) {
  1248. X                if (call_level == call_stop) break;
  1249. X                ret();
  1250. X                continue;
  1251. X            }
  1252. X            if (!Is_number(pc)) syserr(MESS(3501, "run: bad thread"));
  1253. X            switch (intval(pc)) {
  1254. X            case 0:
  1255. X                pc= Stop;
  1256. X                break;
  1257. X            case 1:
  1258. X                interr(
  1259. X            MESS(3502, "none of the alternative tests of SELECT succeeds"));
  1260. X                break;
  1261. X            case 2:
  1262. X                if (resexp == Rep)
  1263. X                    interr(TEST_NO_REPORT);
  1264. X                else
  1265. X                    interr(YIELD_NO_RETURN);
  1266. X                break;
  1267. X            case 3:
  1268. X                if (resexp == Rep)
  1269. X                 interr(MESS(3503, "test refinement reports no outcome"));
  1270. X                else
  1271. X                 interr(MESS(3504, "refinement returns no value"));
  1272. X                 /* "expression-" seems superfluous here */
  1273. X                break;
  1274. X            default:
  1275. X                v= convert(pc, No, No);
  1276. X                interrV(MESS(3505, "run-time error %s"), v);
  1277. X                release(v);
  1278. X            }
  1279. X            continue;
  1280. X        }
  1281. X        next = Thread(pc);
  1282. X
  1283. X/* <<<<<<<<<<<<<<<< */
  1284. Xswitch (Nodetype(pc)) {
  1285. X
  1286. Xcase HOW_TO:
  1287. Xcase REFINEMENT:
  1288. X    interr(MESS(3506, "run: cannot execute how-to definition"));
  1289. X    break;
  1290. X
  1291. Xcase YIELD:
  1292. Xcase TEST:
  1293. X    switch (Nodetype(F(FPR_FORMALS))) {
  1294. X    case TAG:
  1295. X        break;
  1296. X    case MONF: case MONPRD:
  1297. X        w= pop(); v= pop();
  1298. X        put(v, w); release(v); release(w);
  1299. X        break;
  1300. X    case DYAF: case DYAPRD:
  1301. X        w= pop(); v= pop(); u= pop();
  1302. X        put(u, w); release(u); release(w);
  1303. X        u= pop();
  1304. X        put(u, v); release(u); release(v);
  1305. X        break;
  1306. X    default:
  1307. X        syserr(MESS(3507, "bad FPR_FORMAL"));
  1308. X        break;
  1309. X    }
  1310. X    release(uname); uname= get_pname(pc);
  1311. X    cntxt= In_unit;
  1312. X    break;
  1313. X
  1314. X/* Commands */
  1315. X
  1316. Xcase SUITE:
  1317. X    curlino = F(SUI_LINO);
  1318. X    curline = F(SUI_CMD);
  1319. X    break;
  1320. X
  1321. Xcase WHILE:
  1322. X    curlino= F(WHL_LINO);
  1323. X    curline= pc;
  1324. X    break;
  1325. X    
  1326. Xcase TEST_SUITE:
  1327. X    curlino= F(TSUI_LINO);
  1328. X    curline= F(TSUI_TEST);
  1329. X    break;
  1330. X
  1331. Xcase IF:
  1332. Xcase AND:
  1333. Xcase COLON_NODE:
  1334. X    if (!report) Jump(); break;
  1335. X
  1336. Xcase OR: if (report) Jump(); break;
  1337. X
  1338. Xcase FOR:
  1339. X    w= pop(); v= pop();
  1340. X    if (!in_ranger(v, &w)) { release(v); release(w); Jump(); }
  1341. X    else { push(v); push(w); }
  1342. X    break;
  1343. X
  1344. Xcase PUT: Pop2(put_with_check); break;
  1345. Xcase INSERT: Pop2(l_insert); break;
  1346. Xcase REMOVE: Pop2(l_remove); break;
  1347. Xcase SET_RANDOM: Pop1(set_random); break;
  1348. Xcase DELETE: Pop1(l_delete); break;
  1349. Xcase CHECK: if (!report) checkerr(); break;
  1350. X
  1351. Xcase WRITE:    /* collateral expression */
  1352. X    nl(F(WRT_L_LINES));
  1353. X    v = pop();
  1354. X    len = Nfields(v);
  1355. X    for (k= 0; k < len && still_ok; ++k)
  1356. X        writ(*Field(v, k));
  1357. X    release(v);
  1358. X    nl(F(WRT_R_LINES));
  1359. X    break;
  1360. Xcase WRITE1:    /* single expression */
  1361. X    nl(F(WRT_L_LINES));
  1362. X    if (F(WRT_EXPR) != Vnil) { v = pop(); writ(v); release(v); }
  1363. X    nl(F(WRT_R_LINES));
  1364. X    break;
  1365. X
  1366. Xcase READ: Pop2(read_eg); break;
  1367. X
  1368. Xcase READ_RAW: Pop1(read_raw); break;
  1369. X
  1370. Xcase QUIT:
  1371. X    if (resexp != Voi)
  1372. X       interr(MESS(3508, "QUIT may only occur in a command or command-refinement"));
  1373. X    if (call_level == 0 && still_ok) terminated= Yes;
  1374. X    next= Stop; break;
  1375. Xcase RETURN:
  1376. X    if (resexp != Ret)
  1377. X       interr(MESS(3509, "RETURN may only occur in a function or expression-refinement"));
  1378. X    resval = pop(); next= Stop; break;
  1379. Xcase REPORT:
  1380. X    if (resexp != Rep)
  1381. X       interr(MESS(3510, "REPORT may only occur in a predicate or test-refinement"));
  1382. X    next= Stop; break;
  1383. Xcase SUCCEED:
  1384. X    if (resexp != Rep)
  1385. X       interr(MESS(3511, "SUCCEED may only occur in a predicate or test-refinement"));
  1386. X    report = Yes; next= Stop; break;
  1387. Xcase FAIL:
  1388. X    if (resexp != Rep)
  1389. X       interr(MESS(3512, "FAIL may only occur in a predicate or test-refinement"));
  1390. X    report = No; next= Stop; break;
  1391. X
  1392. Xcase USER_COMMAND:
  1393. X    x_user_command(F(UCMD_NAME), F(UCMD_ACTUALS), F(UCMD_DEF));
  1394. X    break;
  1395. X
  1396. X/* Expressions, targets */
  1397. X
  1398. Xcase COLLATERAL:
  1399. X    v = mk_compound(k= Nfields(F(COLL_SEQ)));
  1400. X    while (--k >= 0)
  1401. X        *Field(v, k) = pop();
  1402. X    push(v);
  1403. X    break;
  1404. X
  1405. X/* Expressions, targets */
  1406. X
  1407. Xcase SELECTION: Dyop(ValOrLoc(associate(v, w), tbsel_loc(v, w))); break;
  1408. X
  1409. Xcase BEHEAD:
  1410. X    w= pop(); v= pop();
  1411. X    push(LocFlagged() ? trim_loc(v, w, '@') : behead(v, w));
  1412. X    release(v); release(w);
  1413. X    break;
  1414. X
  1415. Xcase CURTAIL:
  1416. X    w= pop(); v= pop();
  1417. X    push(LocFlagged() ? trim_loc(v, w, '|') : curtail(v, w));
  1418. X    release(v); release(w);
  1419. X    break;
  1420. X
  1421. Xcase MONF:
  1422. X    v = pop();
  1423. X    formula(Vnil, F(MON_NAME), v, F(MON_FCT));
  1424. X    release(v);
  1425. X    break;
  1426. X
  1427. Xcase DYAF:
  1428. X    w = pop(); v = pop();
  1429. X    formula(v,  F(DYA_NAME), w, F(DYA_FCT));
  1430. X    release(v); release(w);
  1431. X    break;
  1432. X
  1433. Xcase TEXT_LIT:
  1434. X    v= F(XLIT_TEXT);
  1435. X    if (F(XLIT_NEXT) != Vnil) { w= pop(); v= concat(v, w); release(w); }
  1436. X    else copy(v);
  1437. X    push(v);
  1438. X    break;
  1439. X
  1440. Xcase TEXT_CONV:
  1441. X    if (F(XCON_NEXT) != Vnil) w= pop();
  1442. X    u= pop();
  1443. X    v= convert(u, Yes, Yes);
  1444. X    release(u);
  1445. X    if (F(XCON_NEXT) != Vnil) {
  1446. X        v= concat(u= v, w);
  1447. X        release(u);
  1448. X        release(w);
  1449. X    }
  1450. X    push(v);
  1451. X    break;
  1452. X
  1453. Xcase ELT_DIS: push(mk_elt()); break;
  1454. X
  1455. Xcase LIST_DIS:
  1456. X    k= Nfields(F(LDIS_SEQ));
  1457. X    v= pop();
  1458. X    if (Is_rangebounds(v) && k == 1) {
  1459. X        u= mk_range(R_LWB(v), R_UPB(v));
  1460. X        release(v);
  1461. X    }
  1462. X    else {
  1463. X        u= mk_elt();
  1464. X        while (1) {
  1465. X            if (Is_rangebounds(v))
  1466. X                ins_range(R_LWB(v), R_UPB(v), &u);
  1467. X            else
  1468. X                insert(v, &u);
  1469. X            release(v);
  1470. X            if (--k <= 0)
  1471. X                break;
  1472. X            v= pop();
  1473. X        }
  1474. X    }
  1475. X    push(u);
  1476. X    break;
  1477. X
  1478. Xcase RANGE_BNDS: Dyop(mk_rbounds(v, w)); break;
  1479. X
  1480. Xcase TAB_DIS:
  1481. X    u = mk_elt();
  1482. X    k= Nfields(F(TDIS_SEQ));
  1483. X    while ((k -= 2) >= 0) {
  1484. X        w = pop(); v = pop();
  1485. X        /* Should check for same key with different associate */
  1486. X        replace(w, &u, v);
  1487. X        release(v); release(w);
  1488. X    }
  1489. X    push(u);
  1490. X    break;
  1491. X
  1492. X/* Tests */
  1493. X
  1494. Xcase NOT: report = !report; break;
  1495. X
  1496. X/* Quantifiers can be described as follows:
  1497. X   Report X at first test which reports Y.  If no test reports Y, report !X.
  1498. X      type    X    Y
  1499. X      SOME    Yes    Yes
  1500. X      EACH    No    No
  1501. X      NO    No    Yes. */
  1502. X
  1503. Xcase EACH_IN:    X= Y= No; goto quant;
  1504. Xcase NO_IN:    X= No; Y= Yes; goto quant;
  1505. Xcase SOME_IN:    X= Y= Yes;
  1506. Xquant:
  1507. X    w= pop(); v= pop();
  1508. X    if (Is_compound(w) && report == Y) { report= X; Jump(); }
  1509. X    else if (!in_ranger(v, &w)) { report= !X; Jump(); }
  1510. X    else { push(v); push(w); break; }
  1511. X    release(v); release(w);
  1512. X    break;
  1513. X
  1514. Xcase MONPRD:
  1515. X    v = pop();
  1516. X    proposition(Vnil, F(MON_NAME), v, F(MON_FCT));
  1517. X    release(v);
  1518. X    break;
  1519. X
  1520. Xcase DYAPRD:
  1521. X    w = pop(); v = pop();
  1522. X    proposition(v, F(DYA_NAME), w, F(DYA_FCT));
  1523. X    release(v); release(w);
  1524. X    break;
  1525. X
  1526. Xcase LESS_THAN: Comp(<); break;
  1527. Xcase AT_MOST: Comp(<=); break;
  1528. Xcase GREATER_THAN: Comp(>); break;
  1529. Xcase AT_LEAST: Comp(>=); break;
  1530. Xcase EQUAL: Comp(==); break;
  1531. Xcase UNEQUAL: Comp(!=); break;
  1532. X
  1533. Xcase TAGlocal:
  1534. X    push(ValOrLoc(v_local(F(TAG_NAME), F(TAG_ID)), local_loc(F(TAG_ID))));
  1535. X    break;
  1536. X
  1537. Xcase TAGglobal:
  1538. X    push(ValOrLoc(v_global(F(TAG_NAME)), global_loc(F(TAG_NAME))));
  1539. X    break;
  1540. X
  1541. Xcase TAGrefinement:
  1542. X    call_refinement(F(TAG_NAME), F(TAG_ID), Flagged());
  1543. X    break;
  1544. X
  1545. Xcase TAGzerfun:
  1546. X    formula(Vnil,  F(TAG_NAME), Vnil, F(TAG_ID));
  1547. X    break;
  1548. X
  1549. Xcase TAGzerprd:
  1550. X    proposition(Vnil,  F(TAG_NAME), Vnil, F(TAG_ID));
  1551. X    break;
  1552. X
  1553. Xcase NUMBER:
  1554. X    push(copy(F(NUM_VALUE)));
  1555. X    break;
  1556. X
  1557. X#ifdef GFX
  1558. Xcase SPACE: Pop2(space_to); break;
  1559. Xcase LINE: Pop2(line_to); break;
  1560. Xcase CLEAR: clear_screen(); break;
  1561. X#endif
  1562. X
  1563. Xdefault:
  1564. X    syserr(MESS(3513, "run: bad node type"));
  1565. X
  1566. X}
  1567. X/* >>>>>>>>>>>>>>>> */
  1568. X    }
  1569. X    v = Vnil;
  1570. X    if (wantvalue && still_ok) v = pop();
  1571. X    /* Unwind stack when stopped by error: */
  1572. X    while (call_level != call_stop) ret();
  1573. X    next= old_next;
  1574. X    return v;
  1575. X}
  1576. X
  1577. X
  1578. X/* External interfaces: */
  1579. X
  1580. XVisible Procedure execthread(start) parsetree start; {
  1581. X    VOID run(start, No);
  1582. X}
  1583. X
  1584. XVisible value evalthread(start) parsetree start; {
  1585. X    return run(start, Yes);
  1586. X}
  1587. X
  1588. XHidden Procedure jumptoend() {
  1589. X    while (Thread2(pc) != NilTree)
  1590. X        pc= Thread2(pc);
  1591. X    next= Thread(pc);
  1592. X}
  1593. END_OF_FILE
  1594.   if test 8835 -ne `wc -c <'abc/bint3/i3int.c'`; then
  1595.     echo shar: \"'abc/bint3/i3int.c'\" unpacked with wrong size!
  1596.   fi
  1597.   # end of 'abc/bint3/i3int.c'
  1598. fi
  1599. if test -f 'abc/ehdrs/tabl.h' -a "${1}" != "-c" ; then 
  1600.   echo shar: Will not clobber existing file \"'abc/ehdrs/tabl.h'\"
  1601. else
  1602.   echo shar: Extracting \"'abc/ehdrs/tabl.h'\" \(2890 characters\)
  1603.   sed "s/^X//" >'abc/ehdrs/tabl.h' <<'END_OF_FILE'
  1604. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1988. */
  1605. X
  1606. X/* Header file with grammar table structure. */
  1607. X
  1608. X/* WARNING: this file is constructed by 'mktable'. */
  1609. X/* If you want to change the grammar, see ../boot/README. */
  1610. X
  1611. Xtypedef char classelem;
  1612. Xtypedef classelem *classptr;
  1613. X
  1614. Xstruct classinfo {
  1615. X   classptr c_class;
  1616. X   classptr c_insert;
  1617. X   classptr c_append;
  1618. X   classptr c_join;
  1619. X};
  1620. X
  1621. X#define MAXCHILD 4
  1622. X
  1623. Xstruct table {
  1624. X   string r_name;
  1625. X   string r_repr[MAXCHILD+1];
  1626. X   struct classinfo *r_class[MAXCHILD];
  1627. X   node r_node;
  1628. X};
  1629. X
  1630. Xextern struct table *table;
  1631. X#define TABLEN 95
  1632. Xstruct lexinfo {
  1633. X   string l_start;
  1634. X   string l_continue;
  1635. X};
  1636. X
  1637. Xextern struct lexinfo *lextab;
  1638. X
  1639. X/* Symbols indexing grammar table */
  1640. X
  1641. X#define Rootsymbol 0
  1642. X#define Name 1
  1643. X#define Keyword 2
  1644. X#define Number 3
  1645. X#define Comment 4
  1646. X#define Text1 5
  1647. X#define Text2 6
  1648. X#define Operator 7
  1649. X#define Rawinput 8
  1650. X#define Collateral 9
  1651. X#define Compound 10
  1652. X#define Blocked 11
  1653. X#define Grouped 12
  1654. X#define Sel_expr 13
  1655. X#define List_or_table_display 14
  1656. X#define List_filler_series 15
  1657. X#define Table_filler_series 16
  1658. X#define Table_filler 17
  1659. X#define Text1_display 18
  1660. X#define Text1_plus 19
  1661. X#define Text2_display 20
  1662. X#define Text2_plus 21
  1663. X#define Conversion 22
  1664. X#define Multiple_address 23
  1665. X#define Compound_address 24
  1666. X#define Selection 25
  1667. X#define Behead 26
  1668. X#define Curtail 27
  1669. X#define Multiple_naming 28
  1670. X#define Compound_naming 29
  1671. X#define Else_kw 30
  1672. X#define Not 31
  1673. X#define Some_in 32
  1674. X#define Each_in 33
  1675. X#define No_in 34
  1676. X#define And 35
  1677. X#define Or 36
  1678. X#define And_kw 37
  1679. X#define Or_kw 38
  1680. X#define Cmt_cmd 39
  1681. X#define Short_comp 40
  1682. X#define Cmt_comp 41
  1683. X#define Long_comp 42
  1684. X#define Put 43
  1685. X#define Insert 44
  1686. X#define Remove 45
  1687. X#define Delete 46
  1688. X#define Share 47
  1689. X#define Write 48
  1690. X#define Read 49
  1691. X#define Read_raw 50
  1692. X#define Set 51
  1693. X#define Pass 52
  1694. X#define For 53
  1695. X#define Quit 54
  1696. X#define Succeed 55
  1697. X#define Fail 56
  1698. X#define Check 57
  1699. X#define If 58
  1700. X#define While 59
  1701. X#define Select 60
  1702. X#define Return 61
  1703. X#define Report 62
  1704. X#define Kw_plus 63
  1705. X#define Exp_plus 64
  1706. X#define Suite 65
  1707. X#define Test_suite 66
  1708. X#define Head 67
  1709. X#define Cmt_head 68
  1710. X#define Long_unit 69
  1711. X#define Short_unit 70
  1712. X#define Formal_return 71
  1713. X#define Formal_report 72
  1714. X#define Blocked_ff 73
  1715. X#define Grouped_ff 74
  1716. X#define Formal_kw_plus 75
  1717. X#define Formal_naming_plus 76
  1718. X#define Ref_join 77
  1719. X#define Refinement 78
  1720. X#define Keyword_list 79
  1721. X#define Unit_edit 80
  1722. X#define Target_edit 81
  1723. X#define Imm_cmd 82
  1724. X#define Edit_unit 83
  1725. X#define Colon 84
  1726. X#define Edit_address 85
  1727. X#define Equals 86
  1728. X#define Workspace_cmd 87
  1729. X#define Right 88
  1730. X#define Expression 89
  1731. X#define Raw_input 90
  1732. X#define Suggestion 91
  1733. X#define Sugghowname 92
  1734. X#define Optional 93
  1735. X#define Hole 94
  1736. X
  1737. X/* LEXICAL symbols */
  1738. X
  1739. X#define LEXICAL 95
  1740. X
  1741. X#define NAME 95
  1742. X#define KEYWORD 96
  1743. X#define NUMBER 97
  1744. X#define COMMENT 98
  1745. X#define TEXT1 99
  1746. X#define TEXT2 100
  1747. X#define OPERATOR 101
  1748. X#define RAWINPUT 102
  1749. X#define SUGGESTION 103
  1750. X#define SUGGHOWNAME 104
  1751. X
  1752. X#define NLEX 10
  1753. END_OF_FILE
  1754.   if test 2890 -ne `wc -c <'abc/ehdrs/tabl.h'`; then
  1755.     echo shar: \"'abc/ehdrs/tabl.h'\" unpacked with wrong size!
  1756.   fi
  1757.   # end of 'abc/ehdrs/tabl.h'
  1758. fi
  1759. if test -f 'abc/unix/u1keys.c' -a "${1}" != "-c" ; then 
  1760.   echo shar: Will not clobber existing file \"'abc/unix/u1keys.c'\"
  1761. else
  1762.   echo shar: Extracting \"'abc/unix/u1keys.c'\" \(9064 characters\)
  1763.   sed "s/^X//" >'abc/unix/u1keys.c' <<'END_OF_FILE'
  1764. X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1986. */
  1765. X
  1766. X#include "b.h"
  1767. X#include "feat.h"
  1768. X#include "bmem.h"
  1769. X#include "getc.h"
  1770. X#include "keys.h"
  1771. X#include "args.h"
  1772. X
  1773. Xchar *getenv();
  1774. X
  1775. X/* struct tabent {int code; string name, def, rep;} in getc.h */
  1776. X
  1777. X/* Table of key definitions, filled by the following defaults
  1778. X   and by reading definitions from a file.
  1779. X
  1780. X   For the code field the following holds:
  1781. X   code > 0:
  1782. X       definitions for editor operations,
  1783. X       new defs from keydefs file will be added in bed/e1getc.c,
  1784. X        eliminating conflicting ones;
  1785. X   code < 0:
  1786. X       strings to be send to the terminal,
  1787. X       any new defs from keydefs file overwrite the old ones
  1788. X
  1789. X   Not all control characters can be freely used:
  1790. X   ^Q and ^S are used by the Unix operating system
  1791. X   for output flow control, and ^Z is used by BSD
  1792. X   Unix systems for `job control'.
  1793. X   Also note that ^H, ^I and ^M (and somtimes ^J) have their
  1794. X   own keys on most keyboards and thus usually have a strong
  1795. X   intuitive meaning.
  1796. X
  1797. X   'def' fields initialized with a string starting with '=' are termcap names,
  1798. X   and are replaced by the corresponding termcap entry (NULL if none);
  1799. X   
  1800. X   'def' fields initialized with a string starting with "&" are
  1801. X   special characters for unix, and taken from tty structures.
  1802. X
  1803. X*/
  1804. X
  1805. XVisible struct tabent deftab[MAXDEFS] = {
  1806. X    {IGNORE,    S_IGNORE,    NULL,        NULL},
  1807. X        /* Entry to ignore a key */
  1808. X
  1809. X    /* if there are no or too few function or arrow keys: */
  1810. X    {WIDEN,        S_WIDEN,    "\033w",    "ESC w"},
  1811. X    {EXTEND,    S_EXTEND,    "\033e",    "ESC e"},
  1812. X    {FIRST,        S_FIRST,    "\033f",    "ESC f"},
  1813. X    {LAST,        S_LAST,        "\033l",    "ESC l"},
  1814. X    {PREVIOUS,    S_PREVIOUS,    "\033p",    "ESC p"},
  1815. X    {NEXT,        S_NEXT,        "\033n",    "ESC n"},
  1816. X    {UPARROW,    S_UPARROW,    "\033k",    "ESC k"},
  1817. X    {DOWNARROW,    S_DOWNARROW,    "\033j",    "ESC j"},
  1818. X    {LEFTARROW,    S_LEFTARROW,    "\033,",    "ESC ,"},
  1819. X        /* , below < */
  1820. X    {RITEARROW,    S_RITEARROW,    "\033.",    "ESC ."},
  1821. X        /* . below > */
  1822. X    {UPLINE,    S_UPLINE,    "\033u",    "ESC u"},
  1823. X    {DOWNLINE,    S_DOWNLINE,    "\033d",    "ESC d"},
  1824. X    {COPY,        S_COPY,        "\033c",    "ESC c"},
  1825. X        /* in case ^C is interrupt */
  1826. X
  1827. X    /* function and arrow keys as in termcap;
  1828. X     * these must follow, because the first key in the helpblurb
  1829. X     * will be the last one */
  1830. X    {WIDEN,        S_WIDEN,    "=k1",        "F1"},
  1831. X    {EXTEND,    S_EXTEND,    "=k2",        "F2"},
  1832. X    {FIRST,        S_FIRST,    "=k3",        "F3"},
  1833. X    {LAST,        S_LAST,        "=k4",        "F4"},
  1834. X    {PREVIOUS,    S_PREVIOUS,    "=k5",        "F5"},
  1835. X    {NEXT,        S_NEXT,        "=k6",        "F6"},
  1836. X    {UPLINE,    S_UPLINE,    "=k7",        "F7"},
  1837. X    {DOWNLINE,    S_DOWNLINE,    "=k8",        "F8"},
  1838. X    {COPY,        S_COPY,        "=k9",        "F9"},
  1839. X    {UPARROW,    S_UPARROW,    "=ku",        "^"},
  1840. X    {DOWNARROW,    S_DOWNARROW,    "=kd",        "v"},
  1841. X    {LEFTARROW,    S_LEFTARROW,    "=kl",        "<-"},
  1842. X    {RITEARROW,    S_RITEARROW,    "=kr",        "->"},
  1843. X#ifdef GOTOCURSOR
  1844. X    {GOTO,        S_GOTO,        "\033g",    "ESC g"},
  1845. X    {GOTO,        S_GOTO,        "\007",        "Ctrl-g"},
  1846. X#endif
  1847. X    {ACCEPT,    S_ACCEPT,    "\011",        "TAB"},
  1848. X    {NEWLINE,    S_NEWLINE,    "\015",        "RETURN"},
  1849. X    {UNDO,        S_UNDO,        "\010",        "BACKSP"},
  1850. X    {REDO,        S_REDO,        "\025",        "Ctrl-U"},
  1851. X    {COPY,        S_COPY,        "\003",        "Ctrl-C"},
  1852. X    {DELETE,    S_DELETE,    "\004",        "Ctrl-D"},
  1853. X#ifdef RECORDING
  1854. X    {RECORD,    S_RECORD,    "\022",        "Ctrl-R"},
  1855. X    {PLAYBACK,    S_PLAYBACK,    "\020",        "Ctrl-P"},
  1856. X#endif
  1857. X    {REDRAW,    S_LOOK,        "\014",        "Ctrl-L"},
  1858. X#ifdef HELPFUL
  1859. X    {HELP,        S_HELP,        "\033?",    "ESC ?"},
  1860. X    {HELP,        S_HELP,        "=k0",        "F10"},
  1861. X#endif
  1862. X    {EXIT,        S_EXIT,        "\030",        "Ctrl-X"},
  1863. X    {EXIT,        S_EXIT,        "\033\033",    "ESC ESC"},
  1864. X    
  1865. X    /* These three are taken from stty settings: */
  1866. X    
  1867. X    {CANCEL,    S_INTERRUPT,    "&\003",    NULL},
  1868. X        /* take from intr char */
  1869. X    {SUSPEND,    S_SUSPEND,    "&\032",    NULL},
  1870. X        /* take from susp char */
  1871. X    {UNDO,        S_UNDO,        "&\b",        NULL},
  1872. X        /* take from erase char */
  1873. X    
  1874. X    /* These two are not key defs but string-valued options: */
  1875. X    
  1876. X    {TERMINIT,    S_TERMINIT,    "=ks",        NULL},
  1877. X    {TERMDONE,    S_TERMDONE,    "=ke",        NULL},
  1878. X    {0,        NULL,        NULL,        NULL}
  1879. X};
  1880. X
  1881. X/* Merge key definitions from termcap into the default table. */
  1882. X
  1883. XHidden Procedure readtermcap() {
  1884. X    string tgetstr();
  1885. X    char buffer[1024]; /* Constant dictated by termcap manual entry */
  1886. X    static char area[1024];
  1887. X    string endarea= area;
  1888. X    string anentry;
  1889. X    struct tabent *d, *last;
  1890. X
  1891. X    switch (tgetent(buffer, getenv("TERM"))) {
  1892. X
  1893. X    default:
  1894. X        putmess(errfile, MESS(6800, "*** Bad tgetent() return value.\n"));
  1895. X        /* Fall through */
  1896. X    case -1:
  1897. X        putmess(errfile, MESS(6801, "*** Can't read termcap.\n"));
  1898. X        /* Fall through again */
  1899. X    case 0:
  1900. X    putmess(errfile, MESS(6802, "*** No description for your terminal.\n"));
  1901. X        immexit(1);
  1902. X
  1903. X    case 1:
  1904. X        break;
  1905. X    }
  1906. X
  1907. X    last= deftab+ndefs;
  1908. X    for (d= deftab; d < last; ++d) {
  1909. X        if (d->def != NULL && d->def[0] == '=') {
  1910. X            anentry= tgetstr(d->def+1, &endarea);
  1911. X            if (anentry != NULL && anentry[0] != '\0') {
  1912. X                undefine(d->code, anentry);
  1913. X                d->def= anentry;
  1914. X            }
  1915. X            else
  1916. X                d->def= d->rep= NULL;
  1917. X        }
  1918. X    }
  1919. X}
  1920. X
  1921. X/* Code to get the defaults for interrupt, suspend and undo/erase_char
  1922. X * from tty structs.
  1923. X */
  1924. X
  1925. X#ifndef KEYS
  1926. XHidden char *intr_char= NULL;
  1927. XHidden char *susp_char= NULL;
  1928. X#else
  1929. XVisible char *intr_char= NULL;
  1930. XVisible char *susp_char= NULL;
  1931. X#endif
  1932. X
  1933. XHidden char *erase_char= NULL;
  1934. X
  1935. X#ifndef TERMIO
  1936. X#include <sgtty.h>
  1937. X#else
  1938. X#include <termio.h>
  1939. X#endif
  1940. X#ifdef SIGNAL
  1941. X#include <signal.h>
  1942. X#endif
  1943. X
  1944. XHidden char *getspchars() {
  1945. X#ifndef TERMIO
  1946. X    struct sgttyb sgbuf;
  1947. X#ifdef TIOCGETC
  1948. X    struct tchars tcbuf;
  1949. X#endif
  1950. X    static char str[6];
  1951. X    
  1952. X    if (gtty(0, &sgbuf) == 0) {
  1953. X        if ((int)sgbuf.sg_erase != -1 
  1954. X            &&
  1955. X            !(isprint(sgbuf.sg_erase) || sgbuf.sg_erase == ' ')
  1956. X        ) {
  1957. X            str[0]= sgbuf.sg_erase;
  1958. X            erase_char= &str[0];
  1959. X        }
  1960. X    }
  1961. X#ifdef TIOCGETC
  1962. X    if (ioctl(0, TIOCGETC, (char*)&tcbuf) == 0) {
  1963. X        if ((int)tcbuf.t_intrc !=  -1) {
  1964. X            str[2]= tcbuf.t_intrc;
  1965. X            intr_char= &str[2];
  1966. X        }
  1967. X    }
  1968. X#endif
  1969. X#if defined(TIOCGLTC) && defined(SIGTSTP)
  1970. X    {
  1971. X        struct ltchars buf;
  1972. X        SIGTYPE (*handler)();
  1973. X
  1974. X        handler= signal(SIGTSTP, SIG_IGN);
  1975. X        if (handler != SIG_IGN) {
  1976. X            /* Shell has job control */
  1977. X            signal(SIGTSTP, handler); /* Reset original handler */
  1978. X            if (ioctl(0, TIOCGLTC, (char*) &buf) == 0 &&
  1979. X                    (int)buf.t_suspc != -1) {
  1980. X                str[4]= buf.t_suspc;
  1981. X                susp_char= &str[4];
  1982. X            }
  1983. X        }
  1984. X    }
  1985. X#endif /* TIOCGLTC && SIGTSTP */
  1986. X#else /* TERMIO */
  1987. X    struct termio sgbuf;
  1988. X    static char str[6];
  1989. X    
  1990. X    if (ioctl(0, TCGETA, (char*) &sgbuf) == 0) {
  1991. X        if ((int) sgbuf.c_cc[VERASE] != 0377
  1992. X            &&
  1993. X            !(isprint(sgbuf.c_cc[VERASE]))
  1994. X        ) {
  1995. X            str[0]= sgbuf.c_cc[VERASE];
  1996. X            erase_char= &str[0];
  1997. X        }
  1998. X        if ((int) sgbuf.c_cc[VINTR] != 0377) {
  1999. X            str[2]= sgbuf.c_cc[VINTR];
  2000. X            intr_char= &str[2];
  2001. X        }
  2002. X    }
  2003. X    /* TODO: susp_char (c_cc[VSWTCH]) #ifdef VSWTCH && SIGTSTP_EQUIVALENT */
  2004. X#endif /* TERMIO */
  2005. X}
  2006. X
  2007. XVisible bool is_spchar(c) char c; {
  2008. X    if (intr_char != NULL && *intr_char == c)
  2009. X        return Yes;
  2010. X    else if (susp_char != NULL && *susp_char == c)
  2011. X        return Yes;
  2012. X    return No;
  2013. X}
  2014. X
  2015. XHidden Procedure sig_undef(c) char c; {
  2016. X    struct tabent *d, *last= deftab+ndefs;
  2017. X    string p;
  2018. X
  2019. X    for (d= deftab; d < last; ++d) {
  2020. X        if (d->code > 0 && d->def != NULL) {
  2021. X            for (p= d->def; *p != '\0'; ++p) {
  2022. X                if (*p == c) {
  2023. X                    d->def= d->rep= NULL;
  2024. X                    break;
  2025. X                }
  2026. X            }
  2027. X        }
  2028. X    }
  2029. X}
  2030. X
  2031. X/* The following is needed for the helpblurb */
  2032. X
  2033. X#ifndef KEYS
  2034. XHidden string reprchar(c) int c; {
  2035. X#else
  2036. XVisible string reprchar(c) int c; {
  2037. X#endif /* KEYS */
  2038. X
  2039. X    static char str[20];
  2040. X
  2041. X    c&= 0377;
  2042. X
  2043. X    if ('\000' <= c && c < '\040') {        /* control char */
  2044. X        switch (c) {
  2045. X            case '\010':
  2046. X                return "BACKSP";
  2047. X            case '\011':
  2048. X                return "TAB";
  2049. X            case '\012':
  2050. X                return "LINEFEED";
  2051. X            case '\015':
  2052. X                return "RETURN";
  2053. X            case '\033':
  2054. X                return "ESC";
  2055. X            default:
  2056. X                sprintf(str, "Ctrl-%c", c|0100);
  2057. X                return str;
  2058. X            }
  2059. X        }
  2060. X    else if (c == '\040') {                /* space */
  2061. X        return "SPACE";
  2062. X    }
  2063. X    else if ('\041' <= c && c < '\177') {        /* printable char */
  2064. X        str[0]= c; str[1]= '\0';
  2065. X        return str;
  2066. X    }
  2067. X    else if (c == '\177') {                /* delete */
  2068. X        return "DEL";
  2069. X    }
  2070. X    else if (c == 0200) {                /* conv null char */
  2071. X        return "NULL";
  2072. X    }
  2073. X    else {
  2074. X        sprintf(str, "\\%03o", c);        /* octal value */
  2075. X        return str;
  2076. X    }
  2077. X}
  2078. X
  2079. XHidden Procedure get_special_chars() {
  2080. X    string anentry;
  2081. X    struct tabent *d, *last;
  2082. X    
  2083. X    getspchars();
  2084. X    last= deftab+ndefs;
  2085. X    for (d= deftab; d < last; ++d) {
  2086. X        if (d->def != NULL && d->def[0] == '&') {
  2087. X            if (d->def[1] == '\003') /* interrupt */
  2088. X                anentry= intr_char;
  2089. X            else if (d->def[1] == '\b') /* undo/backspace */
  2090. X                anentry= erase_char;
  2091. X            else if (d->def[1] == '\032') /* suspend */
  2092. X                anentry= susp_char;
  2093. X            else
  2094. X                anentry= NULL;
  2095. X            if (anentry != NULL && anentry[0] != '\0') {
  2096. X                if (anentry == erase_char)
  2097. X                    undefine(d->code, anentry);
  2098. X                else
  2099. X                    sig_undef(anentry[0]);
  2100. X                d->def= anentry;
  2101. X                d->rep= (string) savestr(reprchar(anentry[0]));
  2102. X#ifdef MEMTRACE
  2103. X                fixmem((ptr) d->rep);
  2104. X#endif
  2105. X            }
  2106. X            else
  2107. X                d->def= d->rep= NULL;
  2108. X        }
  2109. X    }
  2110. X}
  2111. X
  2112. XVisible Procedure initkeys() {
  2113. X    countdefs();
  2114. X#ifdef DUMPKEYS
  2115. X    if (kflag)
  2116. X        dumpkeys("before termcap");
  2117. X#endif
  2118. X    readtermcap();
  2119. X#ifdef DUMPKEYS
  2120. X    if (kflag)
  2121. X        dumpkeys("after termcap");
  2122. X#endif
  2123. X    get_special_chars();
  2124. X#ifdef DUMPKEYS
  2125. X    if (kflag)
  2126. X        dumpkeys("after special chars");
  2127. X#endif
  2128. X    rd_keysfile();
  2129. X}
  2130. X
  2131. X#ifdef UNUSED
  2132. X
  2133. XVisible int kbchar() {
  2134. X/* Strip high bit from input characters (matters only on PWB systems?) */
  2135. X    return getchar() & 0177;
  2136. X}
  2137. X
  2138. X#endif
  2139. X
  2140. XVisible int cvchar(c) int c; {
  2141. X#ifdef KEYS
  2142. X    if (c == 0)
  2143. X        return 0200;
  2144. X#endif
  2145. X    return c;
  2146. X}
  2147. END_OF_FILE
  2148.   if test 9064 -ne `wc -c <'abc/unix/u1keys.c'`; then
  2149.     echo shar: \"'abc/unix/u1keys.c'\" unpacked with wrong size!
  2150.   fi
  2151.   # end of 'abc/unix/u1keys.c'
  2152. fi
  2153. echo shar: End of archive 15 \(of 25\).
  2154. cp /dev/null ark15isdone
  2155. MISSING=""
  2156. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ; do
  2157.     if test ! -f ark${I}isdone ; then
  2158.     MISSING="${MISSING} ${I}"
  2159.     fi
  2160. done
  2161. if test "${MISSING}" = "" ; then
  2162.     echo You have unpacked all 25 archives.
  2163.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2164. else
  2165.     echo You still must unpack the following archives:
  2166.     echo "        " ${MISSING}
  2167. fi
  2168. exit 0 # Just in case...
  2169.