home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / MADTRB28.ZIP / LISTING.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1984-11-11  |  20.7 KB  |  726 lines

  1. PROGRAM LISTING;
  2.  
  3. {$U+}
  4. {$I FUNCTION.PAS}
  5.  
  6.  
  7. TYPE
  8.    STRING128 = STRING[128];
  9.    STRING80 = STRING[80];
  10.    STRING8 = STRING[8];
  11.    STRING5 = STRING[5];
  12.    STRING1 = STRING[1];
  13.    VARPOINTER = ^VARRECORD;
  14.    LINEPOINTER = ^LINERECORD;
  15.    TYPEPOINTER = ^TYPERECORD;
  16.  
  17.    VARRECORD = RECORD
  18.                VARNAME : STRING[80];
  19.                VARTYPE : STRING[10];
  20.                   {INTEGER}
  21.                   {STRING}
  22.                   {CHAR}
  23.                   {REAL}
  24.                   {BOOLEAN}
  25.                   {CONST}
  26.                   {LABEL}
  27.                   {FUNCTION}
  28.                   {PROCEDURE}
  29.                PROCNAME : STRING[80];
  30.                NEXTVAR : VARPOINTER;
  31.                FIRSTLINE : LINEPOINTER;
  32.                LASTLINE : LINEPOINTER;
  33.                END;
  34.  
  35.    LINERECORD = RECORD
  36.                 LINENUM : INTEGER;
  37.                 NEXTLINE : LINEPOINTER;
  38.                 END;
  39.  
  40.    TYPERECORD = RECORD
  41.                 NEXTMARK : TYPEPOINTER;
  42.                 VARPT : VARPOINTER;
  43.                 END;
  44.  
  45.  
  46. VAR
  47.    FILVAR1, FILVAR2, FILVAR3 : TEXT;
  48.    LISTPROG : STRING[140];
  49.    PROGLINE, PROGLINE2 : STRING[128];
  50.    TESTWORD, PROCNAME, VARTYPE : STRING[80];
  51.    INFILE, OUTFILELIST, OUTFILEXREF, TMPFILE : STRING[14];
  52.    SECTION : STRING[10];
  53.    CHECKWORD : STRING[5];
  54.    LINENUMST : STRING[4];
  55.    MARK1, MARK2 : STRING[2];
  56.    LEVEL, LINENUM, PAGE : INTEGER;
  57.    XREF, DEFINITION, PROCSTART,
  58.    TEMPRESULT1, TEMPRESULT2, NOT_DONE : BOOLEAN;
  59.    XREFINP : CHAR;
  60.    FIRSTVAR, LASTVAR, NEWVAR : VARPOINTER;
  61.    NEWLINE : LINEPOINTER;
  62.    FIRSTMARK, LASTMARK, NEWMARK : TYPEPOINTER;
  63.  
  64. CONST
  65.    HEADER1 = 'LINE LEVEL  ';
  66.    HEADER2 = '---- -- --  --------------------------------------------------';
  67.    HEADER3 = 'VARIABLE NAME      TYPE        PROCEDURE          LINE NUMBERS';
  68.    HEADER4 = '------------------ ----------- ------------------ ----------------------------------------';
  69.    ALPHA   = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_';
  70.  
  71.  
  72. PROCEDURE INIT;
  73. {  INITIATE VARIABLES  }
  74.  
  75.    BEGIN
  76.    LINENUM := 0;
  77.    LEVEL := 0;         { INDICATES THE LEVEL OF NESTING OF BEGIN-END BLOCKS  }
  78.    PAGE := 1;
  79.    DEFINITION := TRUE;
  80.    PROCSTART := FALSE;
  81.    PROCNAME := 'MAIN';
  82.    SECTION := '';
  83.    NEW(NEWVAR);
  84.    NEWVAR^.VARNAME := 'A';
  85.    NEWVAR^.VARTYPE := 'A';
  86.    NEWVAR^.PROCNAME := 'A';
  87.    NEWVAR^.FIRSTLINE := NIL;
  88.    NEWVAR^.LASTLINE := NIL;
  89.    NEWVAR^.NEXTVAR := NIL;
  90.    FIRSTMARK := NIL;
  91.    FIRSTVAR := NEWVAR;
  92.    END;  { INIT }
  93.  
  94.  
  95. PROCEDURE ENTER_OPTIONS;
  96. {  ENTER FILE NAMES AND OPTIONS AT BEGINNING OF PROGRAM  }
  97.  
  98.    BEGIN
  99.    CLRSCR;
  100.    WRITE('ENTER NAME OF FILE TO LIST -');
  101.    GOTOXY(42,1);
  102.    READLN(INFILE);
  103.    IF POS('.',INFILE) = 0 THEN INFILE := INFILE + '.PAS';
  104.    OUTFILELIST := INFILE;
  105.    IF POS('.',INFILE) <> 0 THEN DELETE(OUTFILELIST,POS('.',INFILE),4);
  106.    OUTFILEXREF := OUTFILELIST + '.REF';
  107.    OUTFILELIST := OUTFILELIST + '.LST';
  108.    IF INFILE = OUTFILELIST THEN
  109.       BEGIN
  110.       DELETE(OUTFILELIST,LENGTH(OUTFILELIST),1);
  111.       OUTFILELIST := OUTFILELIST + '2';
  112.       END;
  113.  
  114.    IF INFILE = OUTFILEXREF THEN
  115.       BEGIN
  116.       DELETE(OUTFILEXREF,LENGTH(OUTFILEXREF),1);
  117.       OUTFILEXREF := OUTFILEXREF + '2';
  118.       END;
  119.  
  120.    TMPFILE := OUTFILELIST;
  121.    WRITELN;
  122.    WRITELN('ENTER NAME OF OUTPUT FILE  -');
  123.    GOTOXY(5,4);
  124.    WRITELN(TAB(5), '- RETURN = ', OUTFILELIST);
  125.    WRITELN(TAB(5), '- PRN    = PRINTER');
  126.    WRITELN(TAB(5), '- NUL    = NO FILE');
  127.    GOTOXY(42,3);
  128.  
  129.    READLN(OUTFILELIST);
  130.    IF OUTFILELIST = '' THEN OUTFILELIST:=TMPFILE;
  131.    IF INFILE = OUTFILELIST THEN
  132.       BEGIN
  133.       DELETE(OUTFILELIST,LENGTH(OUTFILELIST),1);
  134.       OUTFILELIST := OUTFILELIST + '2';
  135.       END;
  136.    IF INFILE = OUTFILELIST THEN
  137.       BEGIN
  138.       DELETE(OUTFILELIST,LENGTH(OUTFILELIST),1);
  139.       OUTFILELIST := OUTFILELIST + '3';
  140.       END;
  141.  
  142.  
  143.       REPEAT
  144.       GOTOXY(1,8);
  145.       WRITE('DO YOU WANT A CROSS REFERENCE?  (Y OR N) ');
  146.       READ(TRM, XREFINP);
  147.       UNTIL XREFINP IN ['Y', 'y', 'N', 'n'];
  148.  
  149.    IF XREFINP IN ['N', 'n'] THEN XREF := FALSE ELSE XREF := TRUE;
  150.  
  151.    IF XREF THEN
  152.       BEGIN
  153.       TMPFILE := OUTFILEXREF;
  154.       WRITELN;
  155.       WRITELN;
  156.       WRITELN('ENTER NAME OF OUTPUT FILE  -');
  157.       GOTOXY(5,11);
  158.       WRITELN(TAB(5), '- RETURN = ', OUTFILEXREF);
  159.       WRITELN(TAB(5), '- PRN    = PRINTER');
  160.       WRITELN(TAB(5), '- NUL    = NO FILE');
  161.       GOTOXY(42,10);
  162.  
  163.       READLN(OUTFILEXREF);
  164.       IF OUTFILEXREF = '' THEN OUTFILEXREF := TMPFILE;
  165.       IF INFILE = OUTFILEXREF THEN
  166.          BEGIN
  167.          DELETE(OUTFILEXREF,LENGTH(OUTFILEXREF),1);
  168.          OUTFILEXREF := OUTFILEXREF + '2';
  169.          END;
  170.       IF INFILE = OUTFILEXREF THEN
  171.          BEGIN
  172.          DELETE(OUTFILEXREF,LENGTH(OUTFILEXREF),1);
  173.          OUTFILEXREF := OUTFILEXREF + '3';
  174.          END;
  175.  
  176.       END;
  177.  
  178.    CLRSCR;
  179.    WRITELN('READING FROM      - ',INFILE);
  180.    WRITELN('LISTING TO        - ', OUTFILELIST);
  181.    IF XREF THEN WRITELN('CROSS REFERENCE   - ',OUTFILEXREF);
  182.    WRITELN;
  183.    END;  { ENTER_OPTIONS }
  184.  
  185.  
  186. FUNCTION CHECKREM(PROGLINE : STRING128; CHECKWORD : STRING80): BOOLEAN;
  187. {  CHECK A LINE TO SEE IF IT IS A REMARK.  IF 'CHECKWORD' IS IN A REMARK,
  188.    OR CONTAINED IN QUOTES THEN CHECKREM IS TRUE.  }
  189.  
  190.    VAR
  191.       CHECKWORDPOS : INTEGER;
  192.       SURCHAR : CHAR;
  193.       CHECKREMTEMP : BOOLEAN;
  194.  
  195.    LABEL
  196.       RETURN;
  197.  
  198.    BEGIN
  199.       CHECKREMTEMP := FALSE;
  200.       CHECKWORDPOS := POS(CHECKWORD,PROGLINE);
  201.  
  202.       IF LENGTH(CHECKWORD) = LENGTH(PROGLINE) THEN GOTO RETURN;
  203.  
  204.       IF ( (CHECKWORDPOS <> 1) AND
  205.          (CHECKWORDPOS + LENGTH(CHECKWORD)-1 <> LENGTH(PROGLINE)) ) THEN
  206.             BEGIN
  207.             SURCHAR := COPY(PROGLINE, LENGTH(CHECKWORD)+CHECKWORDPOS,1);
  208.             IF POS(SURCHAR,ALPHA) <> 0 THEN
  209.                BEGIN
  210.                CHECKREMTEMP := TRUE;
  211.                GOTO RETURN;
  212.                END;
  213.  
  214.             SURCHAR := COPY(PROGLINE, CHECKWORDPOS-1, 1);
  215.             IF POS(SURCHAR,ALPHA) <> 0 THEN
  216.                BEGIN
  217.                CHECKREMTEMP := TRUE;
  218.                GOTO RETURN;
  219.                END;
  220.             END;
  221.  
  222.       IF CHECKWORDPOS = 1 THEN
  223.          BEGIN
  224.          SURCHAR := COPY(PROGLINE, CHECKWORDPOS + LENGTH(CHECKWORD),1);
  225.          IF POS(SURCHAR,ALPHA) <> 0 THEN
  226.             BEGIN
  227.             CHECKREMTEMP := TRUE;
  228.             GOTO RETURN;
  229.             END;
  230.          END;
  231.  
  232.       IF CHECKWORDPOS + LENGTH(CHECKWORD) - 1 = LENGTH(PROGLINE) THEN
  233.          BEGIN
  234.          SURCHAR := COPY(PROGLINE, CHECKWORDPOS-1,1);
  235.          IF POS(SURCHAR,ALPHA) <> 0 THEN
  236.             BEGIN
  237.             CHECKREMTEMP := TRUE;
  238.             GOTO RETURN;
  239.             END;
  240.          END;
  241.  
  242.       IF ( (POS('(*',PROGLINE)<>0) AND (POS('*)',PROGLINE)<>0)  ) THEN
  243.          BEGIN
  244.          IF ( CHECKWORDPOS > POS('(*',PROGLINE) ) AND
  245.             ( CHECKWORDPOS < POS('*)',PROGLINE) ) THEN
  246.                CHECKREMTEMP := TRUE
  247.                ELSE CHECKREMTEMP := FALSE;
  248.          GOTO RETURN;
  249.          END;
  250.  
  251.       IF ( (POS('{',PROGLINE)<>0) AND (POS('}',PROGLINE)<>0) ) THEN
  252.          BEGIN
  253.          IF ( CHECKWORDPOS > POS('{',PROGLINE) ) AND
  254.             ( CHECKWORDPOS < POS('}',PROGLINE) ) THEN
  255.                CHECKREMTEMP := TRUE
  256.                ELSE CHECKREMTEMP := FALSE;
  257.          GOTO RETURN;
  258.          END;
  259.  
  260.       WHILE ((POS('''',PROGLINE) <> 0) AND (CHECKWORDPOS > POS('''',PROGLINE))) DO
  261.          BEGIN
  262.          DELETE(PROGLINE,1,POS('''',PROGLINE));
  263.          CHECKWORDPOS := POS(CHECKWORD,PROGLINE);
  264.          IF ((POS('''',PROGLINE)<>0) AND (CHECKWORDPOS < POS('''',PROGLINE))) THEN
  265.             BEGIN
  266.             CHECKREMTEMP := TRUE;
  267.             CHECKWORDPOS := 0;      { THIS JUST TERMINATES THE LOOP }
  268.             END;
  269.  
  270.          DELETE(PROGLINE,1,POS('''',PROGLINE));
  271.          CHECKWORDPOS := POS(CHECKWORD,PROGLINE);
  272.          END;
  273.  
  274.       RETURN:
  275.       DELETE(PROGLINE,1,POS(CHECKWORD,PROGLINE) + LENGTH(CHECKWORD) -1);
  276.       IF POS(CHECKWORD, PROGLINE) <> 0 THEN
  277.          CHECKREM := CHECKREMTEMP AND CHECKREM(PROGLINE, CHECKWORD)
  278.          ELSE CHECKREM := CHECKREMTEMP;
  279.    END;  { CHECKREM }
  280.  
  281.  
  282. PROCEDURE INSERTVAR;
  283. {  INSERT A NEW VARIABLE INTO THE VARIABLE LIST.  CALLED FROM ADDVAR  }
  284.  
  285.    BEGIN
  286.    NEWVAR^.FIRSTLINE := NIL;
  287.    NEW(LASTVAR);
  288.    LASTVAR^.NEXTVAR := FIRSTVAR;
  289.    NOT_DONE := TRUE;
  290.    WHILE (NOT_DONE) AND (LASTVAR^.NEXTVAR^.NEXTVAR <> NIL) DO
  291.       BEGIN
  292.       LASTVAR := LASTVAR^.NEXTVAR;
  293.       TEMPRESULT1 := LASTVAR^.NEXTVAR^.PROCNAME < NEWVAR^.PROCNAME;
  294.       TEMPRESULT2 := (LASTVAR^.NEXTVAR^.PROCNAME = NEWVAR^.PROCNAME) AND
  295.                      (LASTVAR^.NEXTVAR^.VARNAME < NEWVAR^.VARNAME);
  296.       NOT_DONE := TEMPRESULT1 OR TEMPRESULT2;
  297.       END;
  298.  
  299.    IF NOT_DONE THEN
  300.       LASTVAR := LASTVAR^.NEXTVAR;
  301.    NEWVAR^.NEXTVAR := LASTVAR^.NEXTVAR;
  302.    LASTVAR^.NEXTVAR := NEWVAR;
  303.    END;  { INSERTVAR }
  304.  
  305.  
  306. FUNCTION GETTYPE(VARTYPE : STRING80) : STRING8;
  307. {  DETERMINE THE VARIABLE TYPE OF A VARIABLE  }
  308.  
  309.    BEGIN
  310.    IF VARTYPE = 'INTEGER' THEN GETTYPE := 'INTEGER'
  311.       ELSE IF VARTYPE = 'STRING' THEN GETTYPE := 'STRING'
  312.          ELSE IF VARTYPE = 'BOOLEAN' THEN GETTYPE := 'BOOLEAN'
  313.             ELSE IF VARTYPE = 'REAL' THEN GETTYPE := 'REAL'
  314.                ELSE IF VARTYPE = 'CHAR' THEN GETTYPE := 'CHAR'
  315.                   ELSE IF VARTYPE = 'SET' THEN GETTYPE := 'SET'
  316.                      ELSE GETTYPE := 'TYPE';
  317.    END;  { GETTYPE }
  318.  
  319.  
  320. FUNCTION GETWORD : STRING80;
  321. {  FIND THE NEXT WORD IN A STRING  }
  322.  
  323.    BEGIN
  324.    TESTWORD := '';
  325.    WHILE (POS( PROGLINE[1], ALPHA ) = 0) AND (LENGTH(PROGLINE) <> 0) DO
  326.       DELETE(PROGLINE,1,1);
  327.    IF LENGTH(PROGLINE) <> 0 THEN
  328.       BEGIN
  329.       WHILE (POS( PROGLINE[1],ALPHA ) <> 0) AND (LENGTH(PROGLINE) > 0) DO
  330.          BEGIN
  331.          TESTWORD := TESTWORD + PROGLINE[1];
  332.          DELETE(PROGLINE,1,1);
  333.          END;
  334.  
  335.       GETWORD := TESTWORD;
  336.       END
  337.  
  338.       ELSE GETWORD := '';
  339.    END;  { GETWORD }
  340.  
  341.  
  342. PROCEDURE ADDVAR;
  343. {  ADD A VARIABLE TO THE CROSS REFERENCE LIST  }
  344.  
  345.    BEGIN
  346.    TESTWORD := GETWORD;
  347.    IF POS(TESTWORD[1], ALPHA) <> 0 THEN
  348.       BEGIN
  349.       PROGLINE := TESTWORD + PROGLINE;
  350.       IF (TESTWORD = 'VAR') OR (TESTWORD = 'CONST') OR
  351.          (TESTWORD = 'LABEL') OR (TESTWORD = 'PROCEDURE') OR
  352.          (TESTWORD = 'FUNCTION') OR (TESTWORD = 'TYPE') THEN
  353.             SECTION := GETWORD;
  354.  
  355.       {  DETERMINE THE VARIABLE TYPE AND PROCESS VARIABLE  }
  356.       CASE SECTION[1] OF
  357.  
  358.          'P': IF SECTION = 'PROCEDURE' THEN
  359.                   BEGIN
  360.                   PROCNAME := GETWORD;
  361.                   NEW(NEWVAR);
  362.                   NEWVAR^.VARNAME := PROCNAME;
  363.                   NEWVAR^.VARTYPE := 'PROCEDURE';
  364.                   NEWVAR^.PROCNAME := 'MAIN';
  365.                   INSERTVAR;
  366.                   SECTION := ' ';
  367.                   END;
  368.  
  369.          'F': IF SECTION = 'FUNCTION' THEN
  370.                   BEGIN
  371.                   PROCNAME := GETWORD;
  372.                   NEW(NEWVAR);
  373.                   NEWVAR^.VARNAME := PROCNAME;
  374.                   NEWVAR^.VARTYPE := 'FUNCTION';
  375.                   NEWVAR^.PROCNAME := 'MAIN';
  376.                   INSERTVAR;
  377.                   SECTION := ' ';
  378.                   END;
  379.  
  380.          'V':
  381.             IF SECTION = 'VAR' THEN
  382.             BEGIN
  383.             WHILE LENGTH(PROGLINE) <> 0 DO
  384.                BEGIN
  385.                WHILE PROGLINE[1] = ' ' DO DELETE(PROGLINE,1,1);
  386.                IF PROGLINE[1] <> ':' THEN
  387.                   BEGIN
  388.                   NEW(NEWVAR);
  389.                   NEWVAR^.VARNAME := GETWORD;
  390.                   NEWVAR^.VARTYPE := '';
  391.                   NEWVAR^.PROCNAME := PROCNAME;
  392.                   INSERTVAR;
  393.                   NEW(NEWMARK);
  394.                   IF FIRSTMARK = NIL THEN
  395.                      FIRSTMARK := NEWMARK
  396.  
  397.                      ELSE LASTMARK^.NEXTMARK := NEWMARK;
  398.                   NEWMARK^.VARPT := NEWVAR;
  399.                   LASTMARK := NEWMARK;
  400.                   WHILE (POS(PROGLINE[1], ALPHA) = 0) AND (LENGTH(PROGLINE) <> 0)
  401.                      AND (PROGLINE[1]<>':')
  402.                         DO DELETE(PROGLINE,1,1);
  403.                   END   { IF-THEN CLAUSE }
  404.  
  405.                   ELSE
  406.                   BEGIN
  407.                   DELETE(PROGLINE,1,1);
  408.                   VARTYPE := GETWORD;
  409.                   VARTYPE := GETTYPE(VARTYPE);
  410.                   NEWMARK := FIRSTMARK;
  411.                   WHILE NEWMARK <> NIL DO
  412.                      BEGIN
  413.                      NEWMARK^.VARPT^.VARTYPE := VARTYPE;
  414.                      NEWMARK := NEWMARK^.NEXTMARK;
  415.                      END;
  416.  
  417.                   FIRSTMARK := NIL;
  418.                   PROGLINE := '';
  419.  
  420.                   END;  { ELSE CLAUSE }
  421.                END;  { WHILE LOOP }
  422.             END;  { VAR DECLARATION HEAD }
  423.  
  424.          'T': BEGIN END;
  425.  
  426.          'C':
  427.             IF SECTION = 'CONST' THEN
  428.             BEGIN
  429.             WHILE (PROGLINE[1] = ' ') AND (LENGTH(PROGLINE) <> 0) DO DELETE(PROGLINE,1,1);
  430.             IF LENGTH(PROGLINE) <> 0 THEN
  431.                BEGIN
  432.                NEW(NEWVAR);
  433.                NEWVAR^.VARNAME := GETWORD;
  434.                NEWVAR^.VARTYPE := 'CONST';
  435.                NEWVAR^.PROCNAME := PROCNAME;
  436.                INSERTVAR;
  437.                WHILE POS(';',PROGLINE) = 0 DO READLN(FILVAR1,PROGLINE);
  438.                END;
  439.             END;
  440.  
  441.          'L':
  442.             IF SECTION = 'LABEL' THEN
  443.             BEGIN
  444.             WHILE (PROGLINE[1] = ' ') AND (LENGTH(PROGLINE) <> 0) DO
  445.                DELETE(PROGLINE,1,1);
  446.             WHILE LENGTH(PROGLINE) <> 0 DO
  447.                BEGIN
  448.                TESTWORD := GETWORD;
  449.                NEW(NEWVAR);
  450.                NEWVAR^.VARNAME := TESTWORD;
  451.                NEWVAR^.VARTYPE := 'LABEL';
  452.                NEWVAR^.PROCNAME := PROCNAME;
  453.                INSERTVAR;
  454.                WHILE (POS(PROGLINE[1], ALPHA) = 0) AND (LENGTH(PROGLINE) <> 0) DO
  455.                   DELETE(PROGLINE,1,1);
  456.                END;
  457.             END;
  458.          END;  { CASE STATEMENT }
  459.       END;  { LENGTH(TESTWORD) > 0 }
  460.    END;  { ADDVAR }
  461.  
  462.  
  463. PROCEDURE ADDLINE;
  464. {  IF A VARIABLE IS FOUND IN A LINE, THEN ADD THAT LINE NUMBER TO THE
  465.    CROSS REFERENCE LIST  }
  466.  
  467.    BEGIN
  468.    NEWVAR := FIRSTVAR;
  469.    WHILE NEWVAR <> NIL DO
  470.       BEGIN
  471.       IF ( (PROCNAME = NEWVAR^.PROCNAME) OR (NEWVAR^.PROCNAME = 'MAIN') ) AND
  472.          (POS(NEWVAR^.VARNAME,PROGLINE) <> 0) THEN
  473.             IF CHECKREM(PROGLINE,NEWVAR^.VARNAME) = FALSE THEN
  474.                BEGIN
  475.                NEW(NEWLINE);
  476.                IF NEWVAR^.FIRSTLINE = NIL THEN
  477.                   NEWVAR^.FIRSTLINE := NEWLINE
  478.  
  479.                   ELSE NEWVAR^.LASTLINE^.NEXTLINE := NEWLINE;
  480.                NEWLINE^.LINENUM := LINENUM;
  481.                NEWLINE^.NEXTLINE := NIL;
  482.                NEWVAR^.LASTLINE := NEWLINE;
  483.                END;  { ADD A LINE NUMBER SECTION }
  484.  
  485.       NEWVAR := NEWVAR^.NEXTVAR;
  486.       END;  { CHECK ALL VARIABLES DEFINED SO FAR }
  487.    END;  { ADDLINE }
  488.  
  489.  
  490. PROCEDURE INCLEV(WORD : STRING8);
  491. {  INCREASE THE NESTING LEVEL FOR 'BEGIN', 'CASE', AND 'RECORD' STATEMENTS  }
  492.  
  493.    BEGIN
  494.    IF POS(WORD,PROGLINE) <> 0 THEN
  495.       IF NOT CHECKREM(PROGLINE,WORD) THEN
  496.       BEGIN
  497.       LEVEL := LEVEL + 1;
  498.       STR(LEVEL,MARK1);
  499.       END;
  500.    END;  { INCLEV }
  501.  
  502.  
  503. {*****  BEGIN MAIN PROGRAM  *****}
  504.  
  505.  
  506. BEGIN
  507.  
  508. {  ENTER PROGRAM OPTIONS  }
  509.  
  510.    ENTER_OPTIONS;
  511.  
  512. {  OPEN FILES  }
  513.  
  514.    ASSIGN(FILVAR1,INFILE);
  515.    RESET(FILVAR1);
  516.    IF ( (COPY(OUTFILELIST,1,3) <> 'NUL') AND (COPY(OUTFILELIST,1,3) <> 'PRN') ) THEN
  517.       BEGIN
  518.       ASSIGN(FILVAR2,OUTFILELIST);
  519.       REWRITE(FILVAR2);
  520.       END;
  521.  
  522.    IF XREF AND (OUTFILELIST <> OUTFILEXREF) AND
  523.       ( (COPY(OUTFILEXREF,1,2) <> 'NUL') AND (COPY(OUTFILEXREF,1,2) <> 'PRN') ) THEN
  524.       BEGIN
  525.       ASSIGN(FILVAR3,OUTFILEXREF);
  526.       REWRITE(FILVAR3);
  527.       END;
  528.  
  529.    INIT;
  530.  
  531.  
  532. { INITIALIZE PRINTER }
  533.  
  534.    IF (COPY(OUTFILELIST,1,3) = 'PRN') THEN
  535.       BEGIN
  536.       WRITELN(LST,CHR(15));
  537.       WRITELN;
  538.       WRITELN(LST, HEADER1, INFILE, '  -  PAGE 1');
  539.       WRITELN(LST, HEADER2);
  540.       END;
  541.  
  542.    IF (COPY(OUTFILEXREF,1,3) = 'PRN') THEN
  543.       WRITE(LST,CHR(15));
  544.  
  545. { INPUT LINES AND CHECK FOR BEGIN AND END OF SEGMENTS }
  546.  
  547.    WHILE NOT EOF(FILVAR1) DO
  548.       BEGIN
  549.       READLN(FILVAR1,PROGLINE);
  550.       LINENUM := LINENUM+1;
  551.       MARK1 := '--';
  552.       MARK2 := '--';
  553.  
  554. { INCREMENT LEVEL FOR 'BEGIN', 'CASE', OR 'RECORD' }
  555.  
  556.    INCLEV('BEGIN');
  557.    INCLEV('begin');
  558.    INCLEV('CASE');
  559.    INCLEV('case');
  560.    INCLEV(' RECORD');
  561.    INCLEV(' record');
  562.  
  563.  
  564. { DECREMENT LEVEL FOR 'END' }
  565.  
  566.    IF ( (POS('END',PROGLINE) <> 0) OR (POS('end',PROGLINE) <> 0) ) THEN
  567.       BEGIN
  568.       IF NOT CHECKREM(PROGLINE, 'END') THEN
  569.          BEGIN
  570.          STR(LEVEL,MARK2);
  571.          LEVEL := LEVEL-1;
  572.          END;
  573.       END;
  574.  
  575.  
  576. { CONSTRUCT PRINT LINE }
  577.  
  578.    LISTPROG := '              ';
  579.    STR(LINENUM,LINENUMST);
  580.    INSERT(LINENUMST,LISTPROG,1);
  581.    INSERT(MARK1,LISTPROG,6);
  582.    INSERT(MARK2,LISTPROG,9);
  583.    INSERT(PROGLINE,LISTPROG,13);
  584.  
  585.  
  586. { PRINT PROGRAM LINE }
  587.  
  588.    IF ( (COPY(OUTFILELIST,1,3) <> 'PRN') AND (COPY(OUTFILELIST,1,3) <> 'NUL')) THEN
  589.       BEGIN
  590.       WRITELN(FILVAR2,LISTPROG);
  591.       END;
  592.  
  593.    WRITELN(LISTPROG);
  594.    IF (COPY(OUTFILELIST,1,3) = 'PRN') THEN
  595.       BEGIN
  596.       WRITELN(LST,LISTPROG);
  597.       IF (LINENUM MOD 58) = 0 THEN
  598.          BEGIN
  599.          PAGE := PAGE + 1;
  600.          WRITELN(LST, CHR(12));
  601.          WRITELN;
  602.          WRITELN(LST, HEADER1, INFILE, '  -  PAGE ', PAGE);
  603.          WRITELN(LST, HEADER2);
  604.          END;
  605.       END;
  606.  
  607.  
  608. { CONSTRUCT CROSS REFERENCE LIST }
  609.  
  610.    IF LEVEL = 0 THEN
  611.       DEFINITION := TRUE
  612.  
  613.       ELSE BEGIN
  614.       DEFINITION := FALSE;
  615.       SECTION := ' ';
  616.       END;
  617.  
  618.    PROGLINE2 := PROGLINE;
  619.    IF XREF AND DEFINITION THEN ADDVAR;
  620.    IF (PROCNAME<>'MAIN') AND (LEVEL = 0) AND PROCSTART THEN
  621.       BEGIN
  622.       PROCSTART := FALSE;
  623.       PROCNAME := 'MAIN';
  624.       END;
  625.  
  626.    IF LEVEL > 0 THEN PROCSTART := TRUE;
  627.    IF PROCSTART AND (LEVEL = 0) THEN PROCSTART := FALSE;
  628.    PROGLINE := PROGLINE2;
  629.    IF XREF THEN ADDLINE;
  630.  
  631.    END;  { DONE SEARCHING EACH LINE }
  632.  
  633.  
  634. { CLOSE FILES }
  635.  
  636.    CLOSE(FILVAR1);
  637.    IF OUTFILELIST <> OUTFILEXREF THEN
  638.       BEGIN
  639.       IF (COPY(OUTFILELIST,1,3) <> 'NUL') AND
  640.          (COPY(OUTFILELIST,1,3) <> 'PRN') THEN CLOSE(FILVAR2);
  641.       ASSIGN(FILVAR3,OUTFILEXREF);
  642.       REWRITE(FILVAR3);
  643.       END;
  644.  
  645.    IF (COPY(OUTFILELIST,1,3) = 'PRN') THEN WRITELN(LST, CHR(12));
  646.  
  647.  
  648. { WRITE CROSS REFERENCE LISTING }
  649.  
  650.    IF XREF THEN
  651.       BEGIN
  652.       NEWVAR := FIRSTVAR^.NEXTVAR;
  653.       WRITELN;
  654.       WRITELN;
  655.       TEXTCOLOR(9);
  656.       WRITELN(HEADER3);
  657.       TEXTCOLOR(7);
  658.       IF (COPY(OUTFILEXREF,1,3)<>'PRN') AND (COPY(OUTFILEXREF,1,3)<>'NUL') THEN
  659.          IF OUTFILELIST = OUTFILEXREF THEN
  660.             WRITELN(FILVAR2,HEADER3)
  661.  
  662.             ELSE WRITELN(FILVAR3,HEADER3);
  663.  
  664.       IF COPY(OUTFILEXREF,1,3) = 'PRN' THEN
  665.          BEGIN
  666.          LINENUM := 3;
  667.          WRITELN(LST, HEADER3);
  668.          WRITELN(LST, HEADER4);
  669.          END;
  670.  
  671.       WHILE NEWVAR <> NIL DO
  672.          BEGIN
  673.          LISTPROG := NEWVAR^.VARNAME + '                    ';
  674.          INSERT(NEWVAR^.VARTYPE,LISTPROG,20);
  675.          LISTPROG := LISTPROG + '            ';
  676.          INSERT(NEWVAR^.PROCNAME,LISTPROG,32);
  677.          NEWLINE := NEWVAR^.FIRSTLINE;
  678.          DELETE(LISTPROG,50,31);
  679.          WHILE LENGTH(LISTPROG) < 50 DO LISTPROG:=LISTPROG + ' ';
  680.          WHILE NEWLINE <> NIL DO
  681.             BEGIN
  682.             IF (LENGTH(LISTPROG) > 125) AND (COPY(OUTFILEXREF,1,3) = 'PRN') THEN
  683.                BEGIN
  684.                WRITELN(LST,LISTPROG);
  685.                LISTPROG := '                                                  ';
  686.                LINENUM := LINENUM + 1;
  687.                END;
  688.  
  689.             STR(NEWLINE^.LINENUM, LINENUMST);
  690.             LISTPROG := LISTPROG + LINENUMST + ' ';
  691.             NEWLINE := NEWLINE^.NEXTLINE;
  692.             END;
  693.  
  694.          WRITELN(LISTPROG);
  695.          IF COPY(OUTFILEXREF,1,3) = 'PRN' THEN
  696.             BEGIN
  697.             WRITELN(LST,LISTPROG);
  698.             LINENUM := LINENUM+1;
  699.             IF LINENUM > 58 THEN
  700.                BEGIN
  701.                LINENUM := 3;
  702.                WRITELN(LST,CHR(12));
  703.                WRITELN(LST,HEADER3);
  704.                WRITELN(LST,HEADER4);
  705.                END;
  706.             END;
  707.  
  708.          IF (COPY(OUTFILEXREF,1,3)<>'PRN') AND (COPY(OUTFILEXREF,1,3)<>'NUL') THEN
  709.             IF OUTFILELIST = OUTFILEXREF THEN
  710.                WRITELN(FILVAR2,LISTPROG)
  711.  
  712.                ELSE WRITELN(FILVAR3,LISTPROG);
  713.  
  714.          IF (COPY(OUTFILEXREF,1,3) = 'PRN') AND
  715.             (NEWVAR^.PROCNAME <> NEWVAR^.NEXTVAR^.PROCNAME) THEN
  716.                WRITELN(LST,' ');
  717.          NEWVAR:=NEWVAR^.NEXTVAR;
  718.          END;
  719.       END;
  720.  
  721.    IF OUTFILELIST = OUTFILEXREF THEN CLOSE(FILVAR2) ELSE CLOSE(FILVAR3);
  722.    IF (COPY(OUTFILELIST,1,3) = 'PRN') OR
  723.       (COPY(OUTFILEXREF,1,3) = 'PRN') THEN
  724.          WRITE(LST,CHR(18));
  725. END.
  726.