rprint.red 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602
  1. COMMENT MODULE RPRINT;
  2. COMMENT THE STANDARD LISP TO REDUCE PRETTY PRINTER;
  3. COMMENT THESE GUYS ARE SET BY THE OLD PARSER AND DO NOT NORMALLY EXIST IN PSL;
  4. PUT('EXPT,'OP,'((19 19)));
  5. PUT('TIMES,'OP,'((17 17)));
  6. PUT('!*SEMICOL!*,'OP,'((-1 0)));
  7. PUT('OR,'OP,'((3 3)));
  8. PUT('GEQ,'OP,'((11 11)));
  9. PUT('NOT,'OP,'(NIL 5));
  10. PUT('RECIP,'OP,'(NIL 18));
  11. PUT('QUOTIENT,'OP,'((18 18)));
  12. PUT('MEMQ,'OP,'((7 7)));
  13. PUT('MINUS,'OP,'(NIL 16));
  14. PUT('SETQ,'OP,'((2 2)));
  15. PUT('GREATERP,'OP,'((12 12)));
  16. PUT('MEMBER,'OP,'((6 6)));
  17. PUT('AND,'OP,'((4 4)));
  18. PUT('CONS,'OP,'((20 20)));
  19. PUT('PLUS,'OP,'((15 15)));
  20. PUT('EQUAL,'OP,'((8 8)));
  21. PUT('LEQ,'OP,'((13 13)));
  22. PUT('DIFFERENCE,'OP,'((16 16)));
  23. PUT('NEQ,'OP,'((9 9)));
  24. PUT('LESSP,'OP,'((14 14)));
  25. PUT('!*COMMA!*,'OP,'((5 6)));
  26. PUT('EQ,'OP,'((10 10)));
  27. FLUID '(PRETOP PRETOPRINF);
  28. PRETOP := 'OP; PRETOPRINF := 'OPRINF;
  29. FLUID '(COMBUFF);
  30. FLUID '(CURMARK BUFFP RMAR !*N);
  31. SYMBOLIC PROCEDURE RPRINT U;
  32. BEGIN INTEGER !*N; SCALAR BUFF,BUFFP,CURMARK,RMAR,X;
  33. CURMARK := 0;
  34. BUFF := BUFFP := LIST LIST(0,0);
  35. RMAR := LINELENGTH NIL;
  36. X := GET('!*SEMICOL!*,PRETOP);
  37. !*N := 0;
  38. MPRINO1(U,LIST(CAAR X,CADAR X));
  39. PRIN2OX ";";
  40. OMARKO CURMARK;
  41. PRINOS BUFF
  42. END;
  43. SYMBOLIC PROCEDURE RPRIN1 U;
  44. BEGIN SCALAR BUFF,BUFFP,CURMARK,X;
  45. CURMARK := 0;
  46. BUFF := BUFFP := LIST LIST(0,0);
  47. X := GET('!*SEMICOL!*,PRETOP);
  48. MPRINO1(U,LIST(CAAR X,CADAR X));
  49. OMARKO CURMARK;
  50. PRINOS BUFF
  51. END;
  52. SYMBOLIC PROCEDURE MPRINO U; MPRINO1(U,LIST(0,0));
  53. SYMBOLIC PROCEDURE MPRINO1(U,V);
  54. BEGIN SCALAR X;
  55. IF X := ATSOC(U,COMBUFF)
  56. THEN <<FOR EACH Y IN CDR X DO COMPROX Y;
  57. COMBUFF := DELETE(X,COMBUFF)>>;
  58. IF NUMBERP U AND U<0 AND (X := GET('DIFFERENCE,PRETOP))
  59. THEN RETURN BEGIN SCALAR P;
  60. X := CAR X;
  61. P := (NOT CAR X>CADR V) OR (NOT CADR X>CAR V);
  62. IF P THEN PRIN2OX "(";
  63. PRINOX U;
  64. IF P THEN PRINOX ")"
  65. END
  66. ELSE IF ATOM U THEN RETURN PRINOX U
  67. ELSE IF NOT ATOM CAR U
  68. THEN <<CURMARK := CURMARK+1;
  69. PRIN2OX "("; MPRINO CAR U; PRIN2OX ")";
  70. OMARK LIST(CURMARK,3); CURMARK := CURMARK-1>>
  71. ELSE IF X := GET(CAR U,PRETOPRINF)
  72. THEN RETURN BEGIN SCALAR P;
  73. P := CAR V>0 AND NOT CAR U MEMQ '(BLOCK PROG QUOTE STRING);
  74. IF P THEN PRIN2OX "(";
  75. APPLY(X,LIST CDR U);
  76. IF P THEN PRIN2OX ")"
  77. END
  78. ELSE IF X := GET(CAR U,PRETOP)
  79. THEN RETURN IF CAR X THEN INPRINOX(U,CAR X,V)
  80. ELSE IF CDDR U THEN REDERR "SYNTAX ERROR"
  81. ELSE IF NULL CADR X THEN INPRINOX(U,LIST(100,1),V)
  82. ELSE INPRINOX(U,LIST(100,CADR X),V)
  83. ELSE PRINOX CAR U;
  84. IF RLISTATP CAR U THEN RETURN RLPRI(CDR U,V);
  85. U := CDR U;
  86. IF NULL U THEN PRIN2OX "()"
  87. ELSE MPRARGS(U,V)
  88. END;
  89. SYMBOLIC PROCEDURE MPRARGS(U,V);
  90. IF NULL CDR U THEN <<PRIN2OX " "; MPRINO1(CAR U,LIST(100,100))>>
  91. ELSE INPRINOX('!*COMMA!* . U,LIST(0,0),V);
  92. SYMBOLIC PROCEDURE INPRINOX(U,X,V);
  93. BEGIN SCALAR P;
  94. P := (NOT CAR X>CADR V) OR (NOT CADR X>CAR V);
  95. IF P THEN PRIN2OX "("; OMARK '(M U);
  96. INPRINO(CAR U,X,CDR U);
  97. IF P THEN PRIN2OX ")"; OMARK '(M D)
  98. END;
  99. SYMBOLIC PROCEDURE INPRINO(OPR,V,L);
  100. BEGIN SCALAR FLG,X;
  101. CURMARK := CURMARK+2;
  102. X := GET(OPR,PRETOP);
  103. IF X AND CAR X
  104. THEN <<MPRINO1(CAR L,LIST(CAR V,0)); L := CDR L; FLG := T>>;
  105. WHILE L DO
  106. <<IF OPR EQ '!*COMMA!* THEN <<PRIN2OX ","; OMARKO CURMARK>>
  107. ELSE IF OPR EQ 'SETQ
  108. THEN <<PRIN2OX " := "; OMARK LIST(CURMARK,1)>>
  109. ELSE IF ATOM CAR L OR NOT OPR EQ GET!*(CAAR L,'ALT)
  110. THEN <<OMARK LIST(CURMARK,1); OPRINO(OPR,FLG); FLG := T>>;
  111. MPRINO1(CAR L,LIST(IF NULL CDR L THEN 0 ELSE CAR V,
  112. IF NULL FLG THEN 0 ELSE CADR V));
  113. L := CDR L>>;
  114. CURMARK := CURMARK-2
  115. END;
  116. SYMBOLIC PROCEDURE OPRINO(OPR,B);
  117. (LAMBDA X; IF NULL X
  118. THEN <<IF B THEN PRIN2OX " "; PRINOX OPR; PRIN2OX " ">>
  119. ELSE PRIN2OX CAR X)
  120. GET(OPR,'PRTCH);
  121. SYMBOLIC PROCEDURE PRIN2OX U;
  122. <<RPLACD(BUFFP,EXPLODE2 U);
  123. WHILE CDR BUFFP DO BUFFP := CDR BUFFP>>;
  124. SYMBOLIC PROCEDURE PRINOX U;
  125. <<RPLACD(BUFFP,EXPLODE U);
  126. WHILE CDR BUFFP DO BUFFP := CDR BUFFP>>;
  127. SYMBOLIC PROCEDURE GET!*(U,V);
  128. IF NUMBERP U THEN NIL ELSE GET(U,V);
  129. SYMBOLIC PROCEDURE OMARK U;
  130. <<RPLACD(BUFFP,LIST U); BUFFP := CDR BUFFP>>;
  131. SYMBOLIC PROCEDURE OMARKO U; OMARK LIST(U,0);
  132. SYMBOLIC PROCEDURE COMPROX U;
  133. BEGIN SCALAR X;
  134. IF CAR BUFFP = '(0 0)
  135. THEN RETURN <<FOR EACH J IN U DO PRIN2OX J;
  136. OMARK '(0 0)>>;
  137. X := CAR BUFFP;
  138. RPLACA(BUFFP,LIST(CURMARK+1,3));
  139. FOR EACH J IN U DO PRIN2OX J;
  140. OMARK X
  141. END;
  142. SYMBOLIC PROCEDURE RLISTATP U;
  143. GET(U,'STAT) MEMBER '(ENDSTAT RLIS RLIS2);
  144. SYMBOLIC PROCEDURE RLPRI(U,V);
  145. IF NULL U THEN NIL
  146. ELSE IF NOT CAAR U EQ 'LIST OR CDR U THEN REDERR "RPRINT FORMAT ERROR"
  147. ELSE BEGIN
  148. PRIN2OX " ";
  149. OMARK '(M U);
  150. INPRINO('!*COMMA!*,LIST(0,0),RLPRI1 CDAR U);
  151. OMARK '(M D)
  152. END;
  153. SYMBOLIC PROCEDURE RLPRI1 U;
  154. IF NULL U THEN NIL
  155. ELSE IF EQCAR(CAR U,'QUOTE) THEN CADAR U . RLPRI1 CDR U
  156. ELSE IF STRINGP CAR U THEN CAR U . RLPRI1 CDR U
  157. ELSE REDERR "RPRINT FORMAT ERROR";
  158. SYMBOLIC PROCEDURE CONDOX U;
  159. BEGIN SCALAR X;
  160. OMARK '(M U);
  161. CURMARK := CURMARK+2;
  162. WHILE U DO
  163. <<PRIN2OX "IF "; MPRINO CAAR U; OMARK LIST(CURMARK,1);
  164. PRIN2OX " THEN ";
  165. IF CDR U AND EQCAR(CADAR U,'COND)
  166. AND NOT EQCAR(CAR REVERSE CADAR U,'T)
  167. THEN <<X := T; PRIN2OX "(">>;
  168. MPRINO CADAR U;
  169. IF X THEN PRIN2OX ")";
  170. U := CDR U;
  171. IF U THEN <<OMARKO(CURMARK-1); PRIN2OX " ELSE ">>;
  172. IF U AND NULL CDR U AND CAAR U EQ 'T
  173. THEN <<MPRINO CADAR U; U := NIL>>>>;
  174. CURMARK := CURMARK-2;
  175. OMARK '(M D)
  176. END;
  177. PUT('COND,PRETOPRINF,'CONDOX);
  178. SYMBOLIC PROCEDURE BLOCKOX U;
  179. BEGIN
  180. OMARK '(M U);
  181. CURMARK := CURMARK+2;
  182. PRIN2OX "BEGIN ";
  183. IF CAR U THEN VARPRX CAR U;
  184. U := CDR U;
  185. OMARK LIST(CURMARK,IF EQCAR(CAR U,'!*LABEL) THEN 1 ELSE 3);
  186. WHILE U DO
  187. <<MPRINO CAR U;
  188. IF NOT EQCAR(CAR U,'!*LABEL) AND CDR U THEN PRIN2OX "; ";
  189. U := CDR U;
  190. IF U THEN OMARK LIST(CURMARK,IF EQCAR(CAR U,'!*LABEL) THEN 1 ELSE 3)>>;
  191. OMARK LIST(CURMARK-1,-1);
  192. PRIN2OX " END";
  193. CURMARK := CURMARK-2;
  194. OMARK '(M D)
  195. END;
  196. SYMBOLIC PROCEDURE RETOX U;
  197. BEGIN
  198. OMARK '(M U);
  199. CURMARK := CURMARK+2;
  200. PRIN2OX "RETURN ";
  201. OMARK '(M U);
  202. MPRINO CAR U;
  203. CURMARK := CURMARK-2;
  204. OMARK '(M D);
  205. OMARK '(M D)
  206. END;
  207. PUT('RETURN,PRETOPRINF,'RETOX);
  208. %SYMBOLIC PROCEDURE VARPRX U;
  209. % MAPC(CDR U,FUNCTION (LAMBDA J;
  210. % <<PRIN2OX CAR J;
  211. % PRIN2OX " ";
  212. % INPRINO('!*COMMA!*,LIST(0,0),CDR J);
  213. % PRIN2OX "; ";
  214. % OMARK LIST(CURMARK,6)>>));
  215. COMMENT a version for the old parser;
  216. SYMBOLIC PROCEDURE VARPRX U;
  217. BEGIN SCALAR TYP;
  218. U := REVERSE U;
  219. WHILE U DO
  220. <<IF CDAR U EQ TYP
  221. THEN <<PRIN2OX ","; OMARKO(CURMARK+1); PRINOX CAAR U>>
  222. ELSE <<IF TYP THEN <<PRIN2OX "; "; OMARK '(M D)>>;
  223. PRINOX (TYP := CDAR U);
  224. PRIN2OX " "; OMARK '(M U); PRINOX CAAR U>>;
  225. U := CDR U>>;
  226. PRIN2OX "; ";
  227. OMARK '(M D)
  228. END;
  229. PUT('BLOCK,PRETOPRINF,'BLOCKOX);
  230. SYMBOLIC PROCEDURE PROGOX U;
  231. BLOCKOX(MAPCAR(REVERSE CAR U,FUNCTION (LAMBDA J; J . 'SCALAR))
  232. . LABCHK CDR U);
  233. SYMBOLIC PROCEDURE LABCHK U;
  234. BEGIN SCALAR X;
  235. FOR EACH Z IN U DO IF ATOM Z
  236. THEN X := LIST('!*LABEL,Z) . X ELSE X := Z . X;
  237. RETURN REVERSIP X
  238. END;
  239. PUT('PROG,PRETOPRINF,'PROGOX);
  240. SYMBOLIC PROCEDURE GOX U;
  241. <<PRIN2OX "GO TO "; PRINOX CAR U>>;
  242. PUT('GO,PRETOPRINF,'GOX);
  243. SYMBOLIC PROCEDURE LABOX U;
  244. <<PRINOX CAR U; PRIN2OX ": ">>;
  245. PUT('!*LABEL,PRETOPRINF,'LABOX);
  246. SYMBOLIC PROCEDURE QUOTOX U;
  247. IF STRINGP U THEN PRINOX U ELSE <<PRIN2OX "'"; PRINSOX CAR U>>;
  248. SYMBOLIC PROCEDURE PRINSOX U;
  249. IF ATOM U THEN PRINOX U
  250. ELSE <<PRIN2OX "(";
  251. OMARK '(M U);
  252. CURMARK := CURMARK+1;
  253. WHILE U DO <<PRINSOX CAR U;
  254. U := CDR U;
  255. IF U THEN <<OMARK LIST(CURMARK,-1);
  256. IF ATOM U THEN <<PRIN2OX " . "; PRINSOX U; U := NIL>>
  257. ELSE PRIN2OX " ">>>>;
  258. CURMARK := CURMARK-1;
  259. OMARK '(M D);
  260. PRIN2OX ")">>;
  261. PUT('QUOTE,PRETOPRINF,'QUOTOX);
  262. SYMBOLIC PROCEDURE PROGNOX U;
  263. BEGIN
  264. CURMARK := CURMARK+1;
  265. PRIN2OX "<<";
  266. OMARK '(M U);
  267. WHILE U DO <<MPRINO CAR U; U := CDR U;
  268. IF U THEN <<PRIN2OX "; "; OMARKO CURMARK>>>>;
  269. OMARK '(M D);
  270. PRIN2OX ">>";
  271. CURMARK := CURMARK-1
  272. END;
  273. PUT('PROG2,PRETOPRINF,'PROGNOX);
  274. PUT('PROGN,PRETOPRINF,'PROGNOX);
  275. SYMBOLIC PROCEDURE REPEATOX U;
  276. BEGIN
  277. CURMARK := CURMARK+1;
  278. OMARK '(M U);
  279. PRIN2OX "REPEAT ";
  280. MPRINO CAR U;
  281. PRIN2OX " UNTIL ";
  282. OMARK LIST(CURMARK,3);
  283. MPRINO CADR U;
  284. OMARK '(M D);
  285. CURMARK := CURMARK-1
  286. END;
  287. PUT('REPEAT,PRETOPRINF,'REPEATOX);
  288. SYMBOLIC PROCEDURE WHILEOX U;
  289. BEGIN
  290. CURMARK := CURMARK+1;
  291. OMARK '(M U);
  292. PRIN2OX "WHILE ";
  293. MPRINO CAR U;
  294. PRIN2OX " DO ";
  295. OMARK LIST(CURMARK,3);
  296. MPRINO CADR U;
  297. OMARK '(M D);
  298. CURMARK := CURMARK-1
  299. END;
  300. PUT('WHILE,PRETOPRINF,'WHILEOX);
  301. SYMBOLIC PROCEDURE PROCOX U;
  302. BEGIN
  303. OMARK '(M U);
  304. CURMARK := CURMARK+1;
  305. IF CADDDR CDR U THEN <<MPRINO CADDDR CDR U; PRIN2OX " ">>;
  306. PRIN2OX "PROCEDURE ";
  307. PROCOX1(CAR U,CADR U,CADDR U)
  308. END;
  309. SYMBOLIC PROCEDURE PROCOX1(U,V,W);
  310. BEGIN
  311. PRINOX U;
  312. IF V THEN MPRARGS(V,LIST(0,0));
  313. PRIN2OX "; ";
  314. OMARK LIST(CURMARK,3);
  315. MPRINO W;
  316. CURMARK := CURMARK-1;
  317. OMARK '(M D)
  318. END;
  319. PUT('PROC,PRETOPRINF,'PROCOX);
  320. SYMBOLIC PROCEDURE PROCEOX U;
  321. BEGIN
  322. OMARK '(M U);
  323. CURMARK := CURMARK+1;
  324. MPRINO CADR U; PRIN2OX " ";
  325. IF NOT CADDR U EQ 'EXPR THEN <<MPRINO CADDR U; PRIN2OX " ">>;
  326. PRIN2OX "PROCEDURE ";
  327. PROCEOX1(CAR U,CADDDR U,CAR CDDDDR U)
  328. END;
  329. SYMBOLIC PROCEDURE PROCEOX1(U,V,W);
  330. BEGIN
  331. PRINOX U;
  332. IF V THEN MPRARGS(MAPCAR(V,FUNCTION CAR),LIST(0,0));
  333. %we need to check here for non-default type;
  334. PRIN2OX "; ";
  335. OMARK LIST(CURMARK,3);
  336. MPRINO W;
  337. CURMARK := CURMARK -1;
  338. OMARK '(M D)
  339. END;
  340. PUT('PROCEDURE,PRETOPRINF,'PROCEOX);
  341. SYMBOLIC PROCEDURE PROCEOX0(U,V,W,X);
  342. PROCEOX LIST(U,'SYMBOLIC,V,MAPCAR(W,FUNCTION (LAMBDA J; J . 'SYMBOLIC)),X);
  343. SYMBOLIC PROCEDURE DEOX U;
  344. PROCEOX0(CAR U,'EXPR,CADR U,CADDR U);
  345. PUT('DE,PRETOPRINF,'DEOX);
  346. SYMBOLIC PROCEDURE DFOX U;
  347. PROCEOX0(CAR U,'FEXPR,CADR U,CADDR U);
  348. PUT('DF,PRETOPRINF,'DFOX);
  349. SYMBOLIC PROCEDURE DMOX U;
  350. PROCEOX0(CAR U,'MACRO,CADR U,CADDR U);
  351. PUT('DM,PRETOPRINF,'DMOX);
  352. SYMBOLIC PROCEDURE LAMBDOX U;
  353. BEGIN
  354. OMARK '(M U);
  355. CURMARK := CURMARK+1;
  356. PROCOX1('LAMBDA,CAR U,CADR U)
  357. END;
  358. PUT('LAMBDA,PRETOPRINF,'LAMBDOX);
  359. SYMBOLIC PROCEDURE EACHOX U;
  360. <<PRIN2OX "FOR EACH ";
  361. WHILE CDR U DO <<MPRINO CAR U; PRIN2OX " "; U := CDR U>>;
  362. MPRINO CAR U>>;
  363. PUT('FOREACH,PRETOPRINF,'EACHOX);
  364. COMMENT Declarations needed by old parser;
  365. IF NULL GET('!*SEMICOL!*,'OP)
  366. THEN <<PUT('!*SEMICOL!*,'OP,'((-1 0)));
  367. PUT('!*COMMA!*,'OP,'((5 6)))>>;
  368. COMMENT RPRINT MODULE, Page 2;
  369. FLUID '(ORIG CURPOS);
  370. SYMBOLIC PROCEDURE PRINOS U;
  371. BEGIN INTEGER CURPOS;
  372. SCALAR ORIG;
  373. ORIG := LIST POSN();
  374. CURPOS := CAR ORIG;
  375. PRINOY(U,0);
  376. TERPRI0X()
  377. END;
  378. SYMBOLIC PROCEDURE PRINOY(U,N);
  379. BEGIN SCALAR X;
  380. IF CAR(X := SPACELEFT(U,N)) THEN RETURN PRINOM(U,N)
  381. ELSE IF NULL CDR X THEN RETURN IF CAR ORIG<10 THEN PRINOM(U,N)
  382. ELSE <<ORIG := 9 . CDR ORIG;
  383. TERPRI0X();
  384. RPSPACES2(CURPOS := 9+CADAR U);
  385. PRINOY(U,N)>>
  386. ELSE BEGIN
  387. A: U := PRINOY(U,N+1);
  388. IF NULL CDR U OR CAAR U<=N THEN RETURN;
  389. TERPRI0X();
  390. RPSPACES2(CURPOS := CAR ORIG+CADAR U);
  391. GO TO A END;
  392. RETURN U
  393. END;
  394. SYMBOLIC PROCEDURE SPACELEFT(U,MARK);
  395. %U is an expanded buffer of characters delimited by non-atom marks
  396. %of the form: '(M ...) or '(INT INT))
  397. %MARK is an integer;
  398. BEGIN INTEGER N; SCALAR FLG,MFLG;
  399. N := RMAR - CURPOS;
  400. U := CDR U; %move over the first mark;
  401. WHILE U AND NOT FLG AND N>=0 DO
  402. <<IF ATOM CAR U THEN N := N-1
  403. ELSE IF CAAR U EQ 'M THEN NIL
  404. ELSE IF MARK>=CAAR U THEN <<FLG := T; U := NIL . U>>
  405. ELSE MFLG := T;
  406. U := CDR U>>;
  407. RETURN ((N>=0) . MFLG)
  408. END;
  409. SYMBOLIC PROCEDURE PRINOM(U,MARK);
  410. BEGIN INTEGER N; SCALAR FLG,X;
  411. N := CURPOS;
  412. U := CDR U;
  413. WHILE U AND NOT FLG DO
  414. <<IF ATOM CAR U THEN <<X := PRIN20X CAR U; N := N+1>>
  415. ELSE IF CAAR U EQ 'M THEN IF CADAR U EQ 'U THEN ORIG := N . ORIG
  416. ELSE ORIG := CDR ORIG
  417. ELSE IF MARK>=CAAR U
  418. AND NOT(X='!, AND RMAR-N-6>CHARSPACE(U,X,MARK))
  419. THEN <<FLG := T; U := NIL . U>>;
  420. U := CDR U>>;
  421. CURPOS := N;
  422. IF MARK=0 AND CDR U
  423. THEN <<TERPRI0X();
  424. TERPRI0X();
  425. ORIG := LIST 0; CURPOS := 0; PRINOY(U,MARK)>>;
  426. %must be a top level constant;
  427. RETURN U
  428. END;
  429. SYMBOLIC PROCEDURE CHARSPACE(U,CHR,MARK);
  430. %determines if there is space until the next character CHR;
  431. BEGIN INTEGER N;
  432. N := 0;
  433. WHILE U DO
  434. <<IF CAR U = CHR THEN U := LIST NIL
  435. ELSE IF ATOM CAR U THEN N := N+1
  436. ELSE IF CAR U='(M U) THEN <<N := 1000; U := LIST NIL>>
  437. ELSE IF NUMBERP CAAR U AND CAAR U<MARK THEN U := LIST NIL;
  438. U := CDR U>>;
  439. RETURN N
  440. END;
  441. SYMBOLIC PROCEDURE RPSPACES2 N;
  442. %FOR I := 1:N DO PRIN20X '! ;
  443. WHILE N>0 DO <<PRIN20X '! ; N := N-1>>;
  444. SYMBOLIC PROCEDURE PRIN2ROX U;
  445. BEGIN INTEGER M,N; SCALAR X,Y;
  446. M := RMAR-12;
  447. N := RMAR-1;
  448. WHILE U DO
  449. IF CAR U EQ '!"
  450. THEN <<IF NOT STRINGSPACE(CDR U,N-!*N) THEN <<TERPRI0X(); !*N := 0>>
  451. ELSE NIL;
  452. PRIN20X '!";
  453. U := CDR U;
  454. WHILE NOT CAR U EQ '!" DO
  455. <<PRIN20X CAR U; U := CDR U; !*N := !*N+1>>;
  456. PRIN20X '!";
  457. U := CDR U;
  458. !*N := !*N+2;
  459. X := Y := NIL>>
  460. ELSE IF ATOM CAR U AND NOT(CAR U EQ '! AND (!*N=0 OR NULL X
  461. OR CDR U AND BREAKP CADR U OR BREAKP X AND NOT Y EQ '!!))
  462. THEN <<Y := X; PRIN20X(X := CAR U); !*N := !*N+1;
  463. U := CDR U;
  464. IF !*N=N OR !*N>M AND NOT BREAKP CAR U AND NOSPACE(U,N-!*N)
  465. THEN <<TERPRI0X(); X := Y := NIL>> ELSE NIL>>
  466. ELSE U := CDR U
  467. END;
  468. SYMBOLIC PROCEDURE NOSPACE(U,N);
  469. IF N<1 THEN T
  470. ELSE IF NULL U THEN NIL
  471. ELSE IF NOT ATOM CAR U THEN NOSPACE(CDR U,N)
  472. ELSE IF NOT CAR U EQ '!! AND (CADR U EQ '! OR BREAKP CADR U) THEN NIL
  473. ELSE NOSPACE(CDR U,N-1);
  474. SYMBOLIC PROCEDURE BREAKP U;
  475. U MEMBER '(!< !> !; !: != !) !+ !- !, !' !");
  476. SYMBOLIC PROCEDURE STRINGSPACE(U,N);
  477. IF N<1 THEN NIL ELSE IF CAR U EQ '!" THEN T ELSE STRINGSPACE(CDR U,N-1);
  478. COMMENT Some interfaces needed;
  479. PUT('CONS,'PRTCH,'(! !.! !.));
  480. GLOBAL '(RPRIFN!* RTERFN!*);
  481. COMMENT RPRIFN!* allows output from RPRINT to be handled differently,
  482. RTERFN!* allows end of lines to be handled differently;
  483. SYMBOLIC PROCEDURE PRIN20X U;
  484. IF RPRIFN!* THEN APPLY(RPRIFN!*,LIST U) ELSE PRIN2 U;
  485. SYMBOLIC PROCEDURE TERPRI0X;
  486. IF RTERFN!* THEN APPLY(RTERFN!*,NIL) ELSE TERPRI();
  487. END;