home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol062 / partc.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1984-04-29  |  10.2 KB  |  318 lines

  1. FUNCTION STACKEMPTY (* RETURNING *) : BOOLEAN;
  2. BEGIN (* STACKEMPTY *)
  3.    IF TOP = 0
  4.       THEN
  5.          STACKEMPTY := TRUE
  6.       ELSE
  7.          STACKEMPTY := FALSE
  8. END; (* STACKEMPTY *)
  9. FUNCTION STACKFULL (* RETURNING *) : BOOLEAN;
  10. BEGIN (* STACKFULL *)
  11.    IF TOP = MAXSTACKSIZE
  12.       THEN
  13.          STACKFULL := TRUE
  14.       ELSE
  15.          STACKFULL := FALSE
  16. END; (* STACKFULL *)
  17. PROCEDURE POPSTACK( (* RETURNING *) VAR INDENTSYMBOL : KEYSYMBOL;
  18.                                     VAR PREVMARGIN   : INTEGER   );
  19. BEGIN (* POPSTACK *)
  20.    IF NOT STACKEMPTY
  21.       THEN
  22.          BEGIN
  23.             INDENTSYMBOL := STACK[TOP].INDENTSYMBOL;
  24.             PREVMARGIN   := STACK[TOP].PREVMARGIN;
  25.             TOP := TOP - 1
  26.          END
  27.       ELSE
  28.          BEGIN
  29.             INDENTSYMBOL := OTHERSYM;
  30.             PREVMARGIN   := 0
  31.          END
  32. END; (* POPSTACK *)
  33. PROCEDURE PUSHSTACK( (* USING *) INDENTSYMBOL : KEYSYMBOL;
  34.                                  PREVMARGIN   : INTEGER   );
  35. BEGIN (* PUSHSTACK *)
  36.    TOP := TOP + 1;
  37.    STACK[TOP].INDENTSYMBOL := INDENTSYMBOL;
  38.    STACK[TOP].PREVMARGIN   := PREVMARGIN
  39. END; (* PUSHSTACK *)
  40. PROCEDURE WRITECRS( (* USING *)          NUMBEROFCRS : INTEGER;
  41.                     (* UPDATING *)   VAR CURRLINEPOS : INTEGER );
  42. VAR
  43.     I: INTEGER;
  44. BEGIN (* WRITECRS *)
  45.    IF NUMBEROFCRS > 0
  46.       THEN
  47.          BEGIN
  48.             FOR I := 1 TO NUMBEROFCRS DO BEGIN
  49.  WRITELN;
  50.                WRITELN(FOUT) END;
  51.             CURRLINEPOS := 0
  52.          END
  53. END; (* WRITECRS *)
  54. PROCEDURE INSERTCR( (* UPDATING *)   VAR CURRSYM    : SYMBOLINFO );
  55. CONST
  56.       ONCE = 1;
  57. BEGIN (* INSERTCR *)
  58.    IF CURRSYM^.CRSBEFORE = 0
  59.       THEN
  60.          BEGIN
  61.             WRITECRS( ONCE, (* UPDATING *)   CURRLINEPOS );
  62.             CURRSYM^.SPACESBEFORE := 0
  63.          END
  64. END; (* INSERTCR *)
  65. PROCEDURE INSERTBLANKLINE( (* UPDATING *)   VAR CURRSYM : SYMBOLINFO );
  66. CONST
  67.       ONCE  = 1;
  68.       TWICE = 2;
  69. BEGIN (* INSERTBLANKLINE *)
  70.    IF CURRSYM^.CRSBEFORE = 0
  71.       THEN
  72.          BEGIN
  73.             IF CURRLINEPOS = 0
  74.                THEN
  75.                    WRITECRS( ONCE, (* UPDATING *)   CURRLINEPOS )
  76.                ELSE
  77.                   WRITECRS( TWICE, (* UPDATING *)   CURRLINEPOS );
  78.             CURRSYM^.SPACESBEFORE := 0
  79.          END
  80.       ELSE
  81.          IF CURRSYM^.CRSBEFORE = 1
  82.             THEN
  83.                IF CURRLINEPOS > 0
  84.                   THEN
  85.                      WRITECRS( ONCE, (* UPDATING *)   CURRLINEPOS )
  86. END; (* INSERTBLANKLINE *)
  87. PROCEDURE LSHIFTON( (* USING *) DINDENTSYMBOLS : KEYSYMSET );
  88. VAR
  89.     INDENTSYMBOL : KEYSYMBOL;
  90.     PREVMARGIN   : INTEGER;
  91. BEGIN (* LSHIFTON *)
  92.    IF NOT STACKEMPTY
  93.       THEN
  94.          BEGIN
  95.             REPEAT
  96.                POPSTACK( (* RETURNING *) INDENTSYMBOL,
  97.                                          PREVMARGIN   );
  98.                IF INDENTSYMBOL IN DINDENTSYMBOLS
  99.                   THEN
  100.                      CURRMARGIN := PREVMARGIN
  101.             UNTIL NOT(INDENTSYMBOL IN DINDENTSYMBOLS)
  102.                    OR (STACKEMPTY);
  103.             IF NOT(INDENTSYMBOL IN DINDENTSYMBOLS)
  104.                THEN
  105.                      PUSHSTACK( (* USING *) INDENTSYMBOL,
  106.                                          PREVMARGIN   )
  107.          END
  108. END; (* LSHIFTON *)
  109. PROCEDURE LSHIFT;
  110. VAR
  111.     INDENTSYMBOL: KEYSYMBOL;
  112.     PREVMARGIN  : INTEGER;
  113. BEGIN (* LSHIFT *)
  114.    IF NOT STACKEMPTY
  115.       THEN
  116.          BEGIN
  117.             POPSTACK( (* RETURNING *) INDENTSYMBOL,
  118.                                       PREVMARGIN   );
  119.             CURRMARGIN := PREVMARGIN
  120.          END
  121. END; (* LSHIFT *)
  122. PROCEDURE INSERTSPACE( (* USING *)      VAR SYMBOL     : SYMBOLINFO );
  123. BEGIN (* INSERTSPACE *)
  124.    IF CURRLINEPOS < MAXLINESIZE
  125.       THEN
  126.          BEGIN
  127.             WRITE(FOUT, SPACE); WRITE ( SPACE );
  128.             CURRLINEPOS := CURRLINEPOS + 1;
  129.             WITH SYMBOL^ DO
  130.                IF (CRSBEFORE = 0) AND (SPACESBEFORE > 0)
  131.                   THEN
  132.                      SPACESBEFORE := SPACESBEFORE - 1
  133.          END
  134. END; (* INSERTSPACE *)
  135. PROCEDURE MOVELINEPOS( (* TO *)       NEWLINEPOS  : INTEGER;
  136.                        (* FROM *) VAR CURRLINEPOS : INTEGER );
  137. VAR
  138.    I: INTEGER;
  139. BEGIN (* MOVELINEPOS *)
  140.    FOR I := CURRLINEPOS+1 TO NEWLINEPOS DO BEGIN WRITE ( SPACE );
  141.       WRITE(FOUT, SPACE) END;
  142.    CURRLINEPOS := NEWLINEPOS
  143. END; (* MOVELINEPOS *)
  144. PROCEDURE PRINTSYMBOL( (* IN *)             CURRSYM     : SYMBOLINFO;
  145.                        (* UPDATING *)   VAR CURRLINEPOS : INTEGER     );
  146. VAR
  147.    I : INTEGER;
  148. BEGIN (* PRINTSYMBOL *)
  149.    WITH CURRSYM^ DO
  150.       BEGIN
  151.          FOR I := 1 TO LENGTH DO BEGIN WRITE ( VALUE[I] );
  152.             WRITE(FOUT, VALUE[I]) END;
  153.          STARTPOS := CURRLINEPOS (* SAVE START POSITION FOR TABBING *);
  154.          CURRLINEPOS := CURRLINEPOS + LENGTH
  155.       END (* WITH *)
  156. END; (* PRINTSYMBOL *)
  157. PROCEDURE PPSYMBOL( (* IN *) CURRSYM : SYMBOLINFO );
  158. CONST
  159.       ONCE  = 1;
  160. VAR
  161.     NEWLINEPOS: INTEGER;
  162. BEGIN (* PPSYMBOL *)
  163.    WITH CURRSYM^ DO
  164.       BEGIN
  165.          WRITECRS( (* USING *)      CRSBEFORE,
  166.                    (* UPDATING *)   CURRLINEPOS );
  167.          IF (CURRLINEPOS + SPACESBEFORE > CURRMARGIN)
  168.             OR (NAME IN [ OPENCOMMENT, CLOSECOMMENT ])
  169.             THEN
  170.                NEWLINEPOS := CURRLINEPOS + SPACESBEFORE
  171.             ELSE
  172.                NEWLINEPOS := CURRMARGIN;
  173.          IF NEWLINEPOS + LENGTH > MAXLINESIZE
  174.             THEN
  175.                BEGIN
  176.                   WRITECRS( ONCE, (* UPDATING *)   CURRLINEPOS );
  177.                   IF CURRMARGIN + LENGTH <= MAXLINESIZE
  178.                      THEN
  179.                         NEWLINEPOS := CURRMARGIN
  180.                      ELSE
  181.                         IF LENGTH < MAXLINESIZE
  182.                            THEN
  183.                               NEWLINEPOS := MAXLINESIZE - LENGTH
  184.                            ELSE
  185.                               NEWLINEPOS := 0
  186.                END;
  187.          MOVELINEPOS( (* TO *)    NEWLINEPOS,
  188.                       (* FROM *)  CURRLINEPOS );
  189.          PRINTSYMBOL( (* IN *)         CURRSYM,
  190.                       (* UPDATING *)   CURRLINEPOS )
  191.       END (* WITH *)
  192. END; (* PPSYMBOL *)
  193.  
  194. PROCEDURE RSHIFTTOCLP( (* USING *) CURRSYM : KEYSYMBOL );
  195.    FORWARD;
  196.  
  197. PROCEDURE GOBBLE(
  198.                   (* UP TO *)            TERMINATORS : KEYSYMSET;
  199.                   (* UPDATING *)     VAR CURRSYM,
  200.                                          NEXTSYM     : SYMBOLINFO );
  201. BEGIN (* GOBBLE *)
  202.    RSHIFTTOCLP( (* USING *) CURRSYM^.NAME );
  203.    WHILE NOT(NEXTSYM^.NAME IN (TERMINATORS + [ENDOFFILE])) DO
  204.       BEGIN
  205.          GETSYMBOL(
  206.                     (* UPDATING *)  NEXTSYM,
  207.                     (* RETURNING *) CURRSYM   );
  208.          PPSYMBOL( (* IN *)         CURRSYM )
  209.       END; (* WHILE *)
  210.    LSHIFT
  211. END; (* GOBBLE *)
  212.  
  213. PROCEDURE RSHIFT( (* USING *) CURRSYM : KEYSYMBOL );
  214. BEGIN (* RSHIFT *)
  215.    IF NOT STACKFULL
  216.       THEN
  217.          PUSHSTACK( (* USING *) CURRSYM,
  218.                                 CURRMARGIN);
  219.    IF STARTPOS > CURRMARGIN
  220.       THEN
  221.          CURRMARGIN := STARTPOS;
  222.    IF CURRMARGIN < SLOFAIL1
  223.       THEN
  224.          CURRMARGIN := CURRMARGIN + INDENT1
  225.       ELSE
  226.                                     IF CURRMARGIN < SLOFAIL2
  227.             THEN
  228.                CURRMARGIN := CURRMARGIN + INDENT2
  229. END; (* RSHIFT *)
  230.  
  231. PROCEDURE RSHIFTTOCLP;
  232. BEGIN (* RSHIFTTOCLP *)
  233.    IF NOT STACKFULL
  234.       THEN
  235.          PUSHSTACK( (* USING *) CURRSYM,
  236.                                 CURRMARGIN);
  237.    CURRMARGIN := CURRLINEPOS
  238. END; (* RSHIFTTOCLP *)
  239.  
  240. BEGIN (* PRETTYPRINT *)
  241.  WRITE ( ' ENTER TEXT FILE TO BE PRETTYPRINTED - - > ');
  242.  READLN ( PROGIN );
  243.  PROGIN := CONCAT ( '#5:',PROGIN,'.TEXT');
  244.  WRITELN;
  245.  WRITE ( 'ENTER NEW FILE NAME OF PRETTYPRINTED PROGRAM - - > ');
  246.  READLN ( PROGOUT );
  247.  PROGOUT := CONCAT ( '#5:',PROGOUT,'.TEXT');
  248.  WRITELN;
  249.  WRITELN (' NOW PRETTYPRINTING.....');
  250.  
  251.  RESET ( FIN,PROGIN);
  252.  REWRITE ( FOUT, PROGOUT);
  253.  
  254.    INITIALIZE( TOP,        CURRLINEPOS,
  255.                CURRMARGIN, KEYWORD,    DBLCHARS,    DBLCHAR,
  256.                SGLCHAR,    RECORDSEEN, CURRCHAR,    NEXTCHAR,
  257.                CURRSYM,    NEXTSYM,    PPOPTION );
  258.    CRPENDING := FALSE;
  259.    WHILE (NEXTSYM^.NAME <> ENDOFFILE) DO
  260.      BEGIN
  261.          GETSYMBOL(
  262.                     (* UPDATING *)  NEXTSYM,
  263.                     (* RETURNING *) CURRSYM   );
  264.          WITH PPOPTION [CURRSYM^.NAME] DO
  265.             BEGIN
  266.                IF (CRPENDING AND NOT(CRSUPPRESS IN OPTIONSSELECTED))
  267.                  OR (CRBEFORE IN OPTIONSSELECTED)
  268.                   THEN
  269.                      BEGIN
  270.                         INSERTCR( (* USING *) CURRSYM);
  271.                         CRPENDING := FALSE
  272.                      END;
  273.                IF BLANKLINEBEFORE IN OPTIONSSELECTED
  274.                   THEN
  275.                      BEGIN
  276.                         INSERTBLANKLINE( (* USING *) CURRSYM);
  277.                         CRPENDING := FALSE
  278.                      END;
  279.                IF DINDENTONKEYS IN OPTIONSSELECTED
  280.                   THEN
  281.                      LSHIFTON(DINDENTSYMBOLS);
  282.                IF DINDENT IN OPTIONSSELECTED
  283.                   THEN
  284.                      LSHIFT;
  285.                IF SPACEBEFORE IN OPTIONSSELECTED
  286.                   THEN
  287.                      INSERTSPACE( (* USING *) CURRSYM );
  288.                PPSYMBOL( (* IN *) CURRSYM );
  289.                IF SPACEAFTER IN OPTIONSSELECTED
  290.                   THEN
  291.                      INSERTSPACE( (* USING *) NEXTSYM );
  292.                IF INDENTBYTAB IN OPTIONSSELECTED
  293.                   THEN
  294.                      RSHIFT( (* USING *) CURRSYM^.NAME );
  295.                IF INDENTTOCLP IN OPTIONSSELECTED
  296.                   THEN
  297.                      RSHIFTTOCLP( (* USING *) CURRSYM^.NAME );
  298.                IF GOBBLESYMBOLS IN OPTIONSSELECTED
  299.                   THEN
  300.                      GOBBLE(
  301.                              (* UP TO *)        GOBBLETERMINATORS,
  302.                              (* UPDATING *)     CURRSYM,
  303.                                                 NEXTSYM            );
  304.                IF CRAFTER IN OPTIONSSELECTED
  305.                   THEN
  306.                      CRPENDING := TRUE
  307.             END (* WITH *)
  308.       END; (* WHILE *)
  309.    IF CRPENDING
  310.       THEN
  311.          WRITELN(FOUT);
  312.    CLOSE ( FOUT, LOCK );
  313.  WRITELN;
  314.  WRITELN;
  315.  WRITELN ( ' YOUR PRETTY PRINTED PGM IS NOW IN ',
  316.  PROGOUT );
  317.  END.
  318.