psl-crefio.red 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. % ===============================================================
  2. % General Purpose I/O package for CREF, adapted to PSL
  3. % MLG, 6:19am Tuesday, 15 December 1981
  4. % ===============================================================
  5. %==============================================================================
  6. % 11/18/82 - rrk - The function REMPROPSS was being called from RECREF in the
  7. % redefintion of a procedure with a single procedure name as the first
  8. % argument. This somehow caused the routine to go into an infinite loop. A
  9. % quick to turn the ID into a list within REMPROPSS solves the problem. The
  10. % reason that the call to REMPROPSS was not changed, is because it is not
  11. % clear if in some cases the argument will be a list.
  12. %==============================================================================
  13. GLOBAL '(!*FORMFEED ORIG!* LNNUM!* MAXLN!* TITLE!* PGNUM!* );
  14. % FLAGS: FORMFEED (ON) controls ^L or spacer of ====;
  15. SYMBOLIC PROCEDURE INITIO();
  16. % Set-up common defaults;
  17. BEGIN
  18. !*FORMFEED:=T;
  19. ORIG!*:=0;
  20. LNNUM!*:=0;
  21. LINELENGTH(75);
  22. MAXLN!*:=55;
  23. TITLE!*:=NIL;
  24. PGNUM!*:=1;
  25. END;
  26. SYMBOLIC PROCEDURE LPOSN();
  27. LNNUM!*;
  28. INITIO();
  29. SYMBOLIC PROCEDURE SETPGLN(P,L);
  30. BEGIN IF P THEN MAXLN!*:=P;
  31. IF L THEN LINELENGTH(L);
  32. END;
  33. % We use EXPLODE to produce a list of chars from atomname,
  34. % and TERPRI() to terminate a buffer..all else
  35. % done in package..spaces,tabs,etc. ;
  36. COMMENT Character lists are (length . chars), for FITS;
  37. SYMBOLIC PROCEDURE GETES U;
  38. % Returns for U , E=(Length . List of char);
  39. BEGIN SCALAR E;
  40. IF NOT IDP U THEN RETURN<<E:=EXPLODE U;LENGTH(E).E>>;
  41. IF NOT(E:=GET(U,'RCCNAM)) THEN <<E:=EXPLODE(U);
  42. E:=LENGTH(E) . E;
  43. PUT(U,'RCCNAM,E)>>;
  44. RETURN E;
  45. END;
  46. SYMBOLIC SMACRO PROCEDURE PRTWRD U;
  47. IF NUMBERP U THEN PRTNUM U
  48. ELSE PRTATM U;
  49. SYMBOLIC PROCEDURE PRTATM U;
  50. PRIN2 U; % For a nice print;
  51. SYMBOLIC PROCEDURE PRTLST U;
  52. IF ATOM U THEN PRIN2 U ELSE FOR EACH X IN U DO PRIN2 X;
  53. SYMBOLIC PROCEDURE PRTNUM N;
  54. PRIN2 N;
  55. SYMBOLIC PROCEDURE PRINCN E;
  56. % output a list of chars, update POSN();
  57. WHILE (E:=CDR E) DO PRINC CAR E;
  58. CommentOutCode << % Defined in PSL
  59. SYMBOLIC PROCEDURE SPACES N;
  60. FOR I:=1:N DO PRINC '! ;
  61. SYMBOLIC PROCEDURE SPACES2 N;
  62. BEGIN SCALAR X;
  63. X := N - POSN();
  64. IF X<1 THEN NEWLINE N
  65. ELSE SPACES X;
  66. END;
  67. >>;
  68. SYMBOLIC PROCEDURE SETPAGE(TITLE,PAGE);
  69. % Initialise current page and title;
  70. BEGIN
  71. TITLE!*:= TITLE ;
  72. PGNUM!*:=PAGE;
  73. END;
  74. SYMBOLIC PROCEDURE NEWLINE N;
  75. % Begins a fresh line at posn N;
  76. BEGIN
  77. LNNUM!*:=LNNUM!*+1;
  78. IF LNNUM!*>=MAXLN!* THEN NEWPAGE()
  79. ELSE TERPRI();
  80. SPACES(ORIG!*+N);
  81. END;
  82. SYMBOLIC PROCEDURE NEWPAGE();
  83. % Start a fresh page, with PGNUM and TITLE, if needed;
  84. BEGIN SCALAR A;
  85. A:=LPOSN();
  86. LNNUM!*:=0;
  87. IF POSN() NEQ 0 THEN NEWLINE 0;
  88. IF A NEQ 0 THEN FORMFEED();
  89. IF TITLE!* THEN
  90. <<SPACES2 5; PRTLST TITLE!*>>;
  91. SPACES2 (LINELENGTH(NIL)-4);
  92. IF PGNUM!* THEN <<PRTNUM PGNUM!*; PGNUM!*:=PGNUM!*+1>>
  93. ELSE PGNUM!*:=2;
  94. NEWLINE 10;
  95. NEWLINE 0;
  96. END;
  97. SYMBOLIC PROCEDURE UNDERLINE2 N;
  98. IF N>=LINELENGTH(NIL) THEN
  99. <<N:=LINELENGTH(NIL)-POSN();
  100. FOR I:=0:N DO PRINC '!- ;
  101. NEWLINE(0)>>
  102. ELSE BEGIN SCALAR J;
  103. J:=N-POSN();
  104. FOR I:=0:J DO PRINC '!-;
  105. END;
  106. SYMBOLIC PROCEDURE LPRINT(U,N);
  107. % prints a list of atoms within block LINELENGTH(NIL)-n;
  108. BEGIN SCALAR E, L,M;
  109. SPACES2 N;
  110. L := LINELENGTH NIL-POSN();
  111. IF L<=0 THEN ERROR(13,"WINDOW TOO SMALL FOR LPRINT");
  112. WHILE U DO
  113. <<E:=GETES CAR U; U:=CDR U;
  114. IF LINELENGTH NIL<POSN() THEN NEWLINE N;
  115. IF CAR E<(M := LINELENGTH NIL-POSN()) THEN PRINCN E
  116. ELSE IF CAR E<L THEN <<NEWLINE N; PRINCN E>>
  117. ELSE BEGIN
  118. E := CDR E;
  119. A: FOR I := 1:M DO <<PRINC CAR E; E := CDR E>>;
  120. NEWLINE N;
  121. IF NULL E THEN NIL
  122. ELSE IF LENGTH E<(M := L) THEN PRINCN(NIL . E)
  123. ELSE GO TO A
  124. END;
  125. PRINC '! >>
  126. END;
  127. % 11/18/82 rrk - Infinite loop caused by calls to this function with an
  128. % id as the ATMLST instead of a list. A quick patch to turn the single
  129. % id into a list is provided, eliminating the infinite loop.
  130. SYMBOLIC PROCEDURE REMPROPSS(ATMLST,LST);
  131. << IF NOT PAIRP ATMLST THEN
  132. ATMLST := LIST (ATMLST);
  133. WHILE ATMLST DO
  134. <<WHILE LST DO <<REMPROP(CAR ATMLST,CAR LST); LST:=CDR LST>>;
  135. ATMLST:=CDR ATMLST>> >>;
  136. SYMBOLIC PROCEDURE REMFLAGSS(ATMLST,LST);
  137. WHILE LST DO <<REMFLAG(ATMLST,CAR LST); LST:=CDR LST>>;
  138. CommentOutCode << % These are defined EXPRs in PSL
  139. SMACRO PROCEDURE REMFLAG1(U,V); REMFLAG(LIST U,V);
  140. SMACRO PROCEDURE FLAG1(U,V); FLAG(LIST U,V);
  141. >>;
  142. SYMBOLIC PROCEDURE FORMFEED;
  143. IF !*FORMFEED THEN EJECT()
  144. ELSE <<TERPRI();
  145. PRIN2 " ========================================= ";
  146. TERPRI()>>;