home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / DATABASE / DBLIST11.LBR / DBLIST.PZS / DBLIST.PAS
Pascal/Delphi Source File  |  2000-06-30  |  18KB  |  658 lines

  1. Program DBLIST11(input,output);
  2.  
  3. {This program produces a cross-reference listing for a
  4.  DBASEII program.  Occurences only are listed.  No distinction is
  5.  made between definitions and references.  It will also give a
  6.  graphical representation of the block structure of the program.
  7.  
  8.  Note: This program was originally written by N. Wirth.  It was
  9.  adapted  for  UCSD  Pascal (1.4) by Shawn Fanning  in  1978  and
  10.  subsequently adopted for Pascal/MT+  by Mike Lehman in 1981.
  11.  It was modified by Warren A. Smith to try to get back to ISO
  12.  standard pascal and to add the additional features of mapping
  13.  out the compound statements.  It was adapted for Turbo Pascal
  14.  by Ron Finger in July 1984.  Further modified by William Mabes
  15.  and Larry Clive in October, 1986.
  16.  
  17.  DBLIST11 developed by Ellis B. Levin -Chicago, IL
  18.  to analyze DBASE II programs in June, 1987}
  19.  
  20. {$I-}
  21. {$V-}
  22. Const
  23.  
  24.       P  = 749;        {SIZE of HASHTABLE}
  25.       NK =  82;        {NO. of KEYWORDS}
  26.       PAGESIZE = 65;   { LINES PER PAGE}
  27.       ALFALEN  =  16;   {  SIZE of IDENTIFIERS}
  28.       REFSPERLINE = 8;
  29.       REFSPERITEM =  8;
  30.       NESTMAX = 21 ;
  31.  
  32. Type
  33.  
  34.      Str80 = string[80];
  35.      FNAME = STRING[14];
  36.      ALFA = Packed Array[1..ALFALEN] of Char;
  37.      INDEX = 0..P;
  38.      ITEMPTR = ^ITEM;
  39.      WORD = Record
  40.                KEY: ALFA;
  41.                FIRST, LAST: ITEMPTR;
  42.                FOL: INDEX
  43.             End ;
  44.      NUMREFS = 1..REFSPERITEM;
  45.      REFTYPE = (COUNT, PTR);
  46.      ITEM = Record
  47.                REF   : ARRAY[NUMREFS] of Integer;
  48.                CASE REFTYPE of
  49.                   COUNT: (REFNUM: NUMREFS);
  50.                   PTR: (NEXT: ITEMPTR)
  51.             End ;
  52.      BUFFER = STRING[131]{Packed Array[0..131] of Char};
  53.  
  54.  
  55. Var
  56.     TOP: INDEX;  {TOP of CHAIN LINKING ALL ENTRIES IN T}
  57.     I,LINECOUNT,BUFCURSOR: Integer; {CURRENT LINE NUMBER}
  58.     FF,CH: Char;          {CURRENT CHAR SCANNED }
  59.     WORKSTRING,BUF : BUFFER;
  60.     T : ARRAY [INDEX] of WORD;   {HASH TABLE}
  61.     KEY: ARRAY [1..NK] of ALFA; {RESERVED KEYWORD TABLE }
  62.     ERROR,                      { ERROR FLAG }
  63.     BLOCK,LISTING: Boolean;     { LISTING/BLOCK OPTION }
  64.     INFILE,LST: Text;
  65.     LSTFILENAME : String[14];
  66.     INPUT_LINE : BUFFER{ String[120]};
  67.     LAST_KEY,PAGE_NUM,NESTLVL:Integer;
  68.     ABORT,LITERAL,ACOMMENT,BCOMMENT,EOL,NESTUP,NESTDN,
  69.     NODOT,Nextime,nex2time,nex3time:Boolean;
  70.     BAR : Char ;
  71.     FILENAME,FILETITLE:FNAME {String[14]};
  72.     DATE:String[20];
  73.     LDATE,LTITLE:Byte;
  74.     search1,search2, search3, search4: string[5];
  75.  
  76.  
  77. PROCEDURE PROCESSLINE; FORWARD;
  78.  
  79. procedure WHITESPACE;  {rsr * added 1/13/87 to eliminate whitespace}
  80.       BEGIN
  81.       WHILE LENGTH(INPUT_LINE) > 0 DO
  82.       BEGIN
  83.       IF INPUT_LINE[1] IN[^I,' '] THEN DELETE(INPUT_LINE,1,1) ELSE EXIT;
  84.       END;
  85.       END; { Whitespace }
  86.  
  87.  
  88.   Function Open(var fp:text; name: Fname): boolean;
  89.   begin
  90.     Assign(fp,Name);
  91.     {$I-}
  92.     reset(fp);
  93.     {$I+}
  94.     If IOresult <> 0 then
  95.      begin
  96.       Open := False;
  97.       close(fp);
  98.      end
  99.     else
  100.       Open := True;
  101.   end { Open };
  102.  
  103.  
  104.      Function IncludeIn(VAR CurStr: buffer): Boolean;
  105.      Var ChkChar: char;
  106.          column: integer;
  107.      begin
  108.        ChkChar := '-';
  109.        column := pos(search1,CurStr);
  110.        if column <> 0 then
  111.          chkchar := CurStr[column+3]
  112.        else
  113.        begin
  114.          column := Pos(search3,CurStr);
  115.          if column <> 0 then
  116.            chkchar := CurStr[column+4]
  117.          else
  118.          begin
  119.            column := Pos(search2,CurStr);
  120.            if column <> 0 then
  121.              chkchar := CurStr[column+3]
  122.            else
  123.            begin
  124.              column := Pos(search4,CurStr);
  125.              if column <> 0 then
  126.                chkchar := CurStr[column+4]
  127.            end;
  128.          end;
  129.        end;
  130.        if ChkChar in ['+','-'] then IncludeIn := False
  131.        Else IncludeIn := True;
  132.      end { IncludeIn };
  133.  
  134.      Procedure ProcessIncludeFile(VAR IncStr: buffer);
  135.  
  136.      var NameStart, NameEnd: integer;
  137.          IncludeFile: text;
  138.          IncludeFileName: Fname;
  139.  
  140.        Function Parse(IncStr: buffer): buffer;
  141.        begin
  142.          NameStart := pos('$I',IncStr)+2;
  143.          while IncStr[NameStart] = ' ' do
  144.            NameStart := Succ(NameStart);
  145.          NameEnd := NameStart;
  146.          while (not (IncStr[NameEnd] in [' ','}','*']))
  147.               AND ((NameEnd - NameStart) <= 14{PathLength})
  148.               do NameEnd := Succ(NameEnd);
  149.          NameEnd := Pred(NameEnd);
  150.          Parse := copy(IncStr,NameStart,(NameEnd-NameStart+1));
  151.        end {Parse};
  152.  
  153.      begin  {Process include file}
  154.        IncludeFileName := Parse(IncStr);
  155.        If not Open(IncludeFile,IncludeFileName) then
  156.        begin
  157.          INPUT_LINE := 'ERROR -- Include file not found:  ' + IncludeFileName;
  158.        end
  159.        Else
  160.        begin
  161.        IF LISTING OR BLOCK THEN
  162.          WRITELN(LST,^M^J'(***** Start of ',INCLUDEFILENAME,' *****)'^M^J);
  163.          while not eof(IncludeFile) do
  164.          begin
  165.            BUFCURSOR:=0;
  166.            NESTUP:= FALSE;
  167.            NESTDN:=FALSE;
  168.            Readln(IncludeFile,INPUT_LINE);
  169.            WHITESPACE;
  170.            PROCESSLINE;
  171.          end;
  172.          IF LISTING OR BLOCK THEN
  173.          WRITELN(LST,^M^J'(***** End of ',INCLUDEFILENAME,' *****)'^M^J);
  174.          close(IncludeFile);
  175.        end;
  176.      end {Process include file};
  177.  
  178. function ConstStr(C : Char; N : Integer) : Str80;
  179. var
  180.   S : string[80];
  181. begin
  182.   if N < 0 then
  183.     N := 0;
  184.   S[0] := Chr(N);
  185.   FillChar(S[1],N,C);
  186.   ConstStr := S;
  187. end;
  188.  
  189. procedure BigDash;
  190. var
  191.   I : integer;
  192. begin
  193.   For I := 1 to 79 do
  194.      begin
  195.        Write('-');
  196.       end;
  197.    writeln;
  198.  end;
  199.  
  200. Function Centered(TheString:Str80):Str80;
  201. begin
  202.   Centered := ConstStr(' ',((80 - Length(TheString)) Div 2)) +
  203.   TheString;
  204. end;
  205.  
  206.  
  207. Function Space(Spaces : Integer) : Str80;
  208. Var
  209.   Column : Integer;
  210.   Temp   : Str80;
  211. begin
  212.   Temp :='';
  213.   For Column := 1 to Spaces do
  214.   begin
  215.     Temp := Temp + ' ';
  216.     Space := Temp;
  217.   end;
  218. end;
  219.  
  220.  
  221. Procedure LPWRITELN;
  222. Var
  223.   I : Integer;
  224. Begin
  225.   {BUF[BUFCURSOR]:=CHR(13);
  226.   BUFCURSOR:=BUFCURSOR+1;}
  227.   For I := 0 to BUFCURSOR-1 do
  228.   Write(LST,BUF[I]);
  229.   Writeln(LST);
  230.   BUFCURSOR:=0;
  231.   LINECOUNT:=LINECOUNT+1;
  232.     {If (LINECOUNT MOD PAGESIZE) = 0 then
  233.     TITLELINE;}
  234. End;
  235.  
  236. Procedure INITIALIZE;
  237. Var
  238.   I : Integer;
  239.  
  240. Begin { INITIALIZE }
  241.    FF:=CHR(12);
  242.    ERROR := FALSE;
  243.    For I := 0 to P do
  244.       T[I].KEY := '                ';
  245.    KEY[ 1] := 'ACCE            ';
  246.    KEY[ 2] := 'ACCCEPT         ';
  247.    KEY[ 3] := 'ADD             ';
  248.    KEY[ 4] := 'ALL             ';
  249.    KEY[ 5] := 'AND             ';
  250.    KEY[ 6] := 'APPEND          ';
  251.    KEY[ 7] := 'ASCENDING       ';
  252.    KEY[ 8] := 'BLANK           ';
  253.    KEY[ 9] := 'BROWSE          ';
  254.    KEY[10] := 'CANCEL          ';
  255.    KEY[11] := 'CHANGE          ';
  256.    KEY[12] := 'CLEAR           ';
  257.    KEY[13] := 'CONTINUE        ';
  258.    KEY[14] := 'COPY            ';
  259.    KEY[15] := 'COUNT           ';
  260.    KEY[16] := 'CREATE          ';
  261.    KEY[17] := 'DELETE          ';
  262.    KEY[18] := 'DELIMITED       ';
  263.    KEY[19] := 'DESCENDING      ';
  264.    KEY[20] := 'DISPLAY         ';
  265.    KEY[21] := 'DO              ';
  266.    KEY[22] := 'EDIT            ';
  267.    KEY[23] := 'EOF             ';
  268.    KEY[24] := 'EJECT           ';
  269.    KEY[25] := 'ELSE            ';
  270.    KEY[26] := 'ENDCASE         ';
  271.    KEY[27] := 'ENDDO           ';
  272.    KEY[28] := 'ENDIF           ';
  273.    KEY[29] := 'ERASE           ';
  274.    KEY[30] := 'FIELD           ';
  275.    KEY[31] := 'FILE            ';
  276.    KEY[32] := 'FILES           ';
  277.    KEY[33] := 'FIND            ';
  278.    KEY[34] := 'FOR             ';
  279.    KEY[35] := 'GET             ';
  280.    KEY[36] := 'GO              ';
  281.    KEY[37] := 'IF              ';
  282.    KEY[38] := 'INDEX           ';
  283.    KEY[39] := 'INPUT           ';
  284.    KEY[40] := 'INSERT          ';
  285.    KEY[41] := 'JOIN            ';
  286.    KEY[42] := 'LEN             ';
  287.    KEY[43] := 'LIST            ';
  288.    KEY[44] := 'LOCATE          ';
  289.    KEY[45] := 'LOOP            ';
  290.    KEY[46] := 'NOT             ';
  291.    KEY[47] := 'NOTE            ';
  292.    KEY[48] := 'MODIFY          ';
  293.    KEY[49] := 'OFF             ';
  294.    KEY[50] := 'ON              ';
  295.    KEY[51] := 'OR              ';
  296.    KEY[52] := 'PACK            ';
  297.    KEY[53] := 'PICTURE         ';
  298.    KEY[54] := 'POKE            ';
  299.    KEY[55] := 'QUIT            ';
  300.    KEY[56] := 'READ            ';
  301.    KEY[57] := 'RECALL          ';
  302.    KEY[58] := 'RELEASE         ';
  303.    KEY[59] := 'REMARK          ';
  304.    KEY[60] := 'RENAME          ';
  305.    KEY[61] := 'REPLACE         ';
  306.    KEY[62] := 'REPORT          ';
  307.    KEY[63] := 'RESET           ';
  308.    KEY[64] := 'RESTORE         ';
  309.    KEY[65] := 'RETURN          ';
  310.    KEY[66] := 'SAVE            ';
  311.    KEY[67] := 'SAY             ';
  312.    KEY[68] := 'SELECT          ';
  313.    KEY[69] := 'SET             ';
  314.    KEY[70] := 'SDF             ';
  315.    KEY[71] := 'SKIP            ';
  316.    KEY[72] := 'SORT            ';
  317.    KEY[73] := 'STORE           ';
  318.    KEY[74] := 'STRUCTURE       ';
  319.    KEY[75] := 'SUM             ';
  320.    KEY[76] := 'TO              ';
  321.    KEY[77] := 'TOTAL           ';
  322.    KEY[78] := 'UPDATE          ';
  323.    KEY[79] := 'USE             ';
  324.    KEY[80] := 'USING           ';
  325.    KEY[81] := 'WAIT            ';
  326.    KEY[82] := 'WITH            ';
  327.  
  328.    LINECOUNT:= 1;
  329.    TOP := P;
  330.    PAGE_NUM := 1 ;
  331.    LITERAL := FALSE ;
  332.    ACOMMENT := FALSE ;
  333.    BCOMMENT := FALSE ;
  334.    NESTLVL := 0 ;
  335.    LAST_KEY := 0 ;
  336.    BAR := '|' ;
  337.    CH  := ' ';
  338.     search1 := '{$'+'I';  { So LISTER can list itself! }
  339.     search2 := '{$'+'i';
  340.     search3 := '(*$'+'I';
  341.     search4 := '(*$'+'i';
  342.  
  343. End; { INITIALIZE }
  344.  
  345. {$I DLSTOVER.INC}
  346.  
  347. Procedure PRINTWORD(W: WORD);
  348. Var
  349.     L,NEXTREF: Integer;
  350.     X: ITEMPTR;
  351.     THISREF: NUMREFS;
  352. Begin
  353.    PUTALFA(W.KEY);
  354.    X := W.FIRST;
  355.    L := 0;
  356.    Repeat
  357.       If L = REFSPERLINE
  358.          then
  359.             Begin
  360.                L := 0;
  361.                LPWRITELN;
  362.                PUTALFA('                ');
  363.             End ;
  364.       L := L+1;
  365.       THISREF := (L-1) MOD REFSPERITEM + 1;
  366.       NEXTREF := X^.REF[ THISREF ];
  367.       If THISREF = X^.REFNUM
  368.          then
  369.             X := NIL
  370.          Else
  371.             If THISREF = REFSPERITEM
  372.                then
  373.                   X := X^.NEXT;
  374.       PUTNUMBER(NEXTREF);
  375.    Until X = NIL;
  376.   LPWRITELN;
  377. End {PRINTWORD} ;
  378.  
  379. Procedure PRINTTABLE;
  380. Var
  381.     I,J,M: INDEX;
  382. Begin
  383.    I := TOP;
  384.    While I <> P do
  385.       Begin {FIND MINIMAL WORD}
  386.          M := I;
  387.          J := T[I].FOL;
  388.          While J <> P do
  389.             Begin
  390.                If T[J].KEY < T[M].KEY
  391.                   then
  392.                      M := J;
  393.                J := T[J].FOL
  394.             End ;
  395.          PRINTWORD(T[M]);
  396.          If M <> I then
  397.            Begin
  398.              T[M].KEY:=T[I].KEY;
  399.              T[M].FIRST:=T[I].FIRST;
  400.              T[M].LAST:=T[I].LAST;
  401.            End;
  402.          I := T[I].FOL
  403.       End
  404. End {PRINTTABLE} ;
  405.  
  406. Procedure OUTPUT_LINE (BUF : BUFFER) ;
  407.   Var
  408.     I : Integer ;
  409.  
  410.   Procedure PRTNEST (Var LINE : BUFFER) ;
  411.  
  412.     Var COL : Integer ;
  413.  
  414.     Begin { PRTNEST }
  415.     For COL := 1 to NESTLVL - 1 do
  416.       Write (LST, BAR, ' ') ;
  417.     If NESTLVL > 0 then
  418.       If NESTUP OR NESTDN then
  419.         Begin
  420.         If NESTDN then
  421.           Begin
  422.           Write (LST, BAR, ' ') ;
  423.           Write (LST, 'E--') ;
  424.           For COL := NESTLVL+2 to NESTMAX do
  425.             Write (LST, '-')
  426.           End
  427.         Else
  428.           Begin
  429.           Write (LST, 'B--') ;
  430.           For COL := NESTLVL+1 to NESTMAX do
  431.             Write (LST, '-')
  432.           End ;
  433.         End
  434.       Else
  435.         Begin
  436.         Write (LST, BAR, ' ') ;
  437.         For COL := NESTLVL+1 to NESTMAX do
  438.           Write (LST,'')
  439.         End
  440.     Else
  441.       If NESTDN then
  442.         Begin
  443.         Write (LST, 'E--') ;
  444.         For COL := 2 to NESTMAX do
  445.           Write (LST, '-') ;
  446.         End
  447.       Else
  448.         For COL := 1 to NESTMAX do
  449.           Write (LST,'')
  450.     End ; { PRTNEST }
  451.  
  452.   Begin { OUTPUT_LINE }
  453.   If ((LINECOUNT MOD PAGESIZE) = 0) OR (PAGE_NUM = 1)
  454.   then
  455.     Begin
  456.       If LISTING OR BLOCK then
  457.     If (LSTFILENAME <> 'CON:') AND (((LINECOUNT MOD PAGESIZE) = 0) OR
  458.     (EOF(INFILE)))
  459.     then
  460.     BEGIN
  461.       Writeln (OUTPUT, '< ', LINECOUNT:4, ',', MEMAVAIL:5, ' >');
  462.       IF EOF(INFILE) THEN
  463.        IF NOT BLOCK THEN
  464.        WRITELN(OUTPUT,^M^J'Working on Cross Reference Listing');
  465.     END;
  466.     End ;
  467.   Write (LST, LINECOUNT:4, '  ') ;
  468.   PRTNEST (BUF) ;
  469.   For I := 1 to BUFCURSOR do
  470.     Write (LST, BUF[I]) ;
  471.   Writeln (LST) ;
  472.   If LSTFILENAME <> 'CON:' then
  473.     Write (OUTPUT, '.')
  474.   End ; { OUTPUT_LINE }
  475.  
  476. Procedure GETNEXTCHAR;
  477. Var I : Integer;
  478.  
  479. Begin { GETNEXTCHAR }
  480. If BUFCURSOR >= LENGTH (INPUT_LINE) then
  481.   Begin
  482.   EOL := TRUE ;
  483.   CH := ' ' ;
  484.   ERROR := EOF(INFILE)
  485.   End
  486. Else
  487.   Begin
  488.   BUFCURSOR := BUFCURSOR + 1 ;
  489.   CH := INPUT_LINE [BUFCURSOR] ;
  490.   BUF [BUFCURSOR] := CH ;
  491.   CH := UPcase(CH)
  492.   End
  493. End; { GETNEXTCHAR }
  494.  
  495. Procedure GETIDENTIFIER;
  496. Var
  497.     J,K,I: Integer;
  498.     ID: ALFA;
  499.  
  500. Begin { GETIDENTIFIER }
  501.    I := 0;
  502.    ID := '                ';
  503.    Repeat
  504.       If I < ALFALEN
  505.          then
  506.             Begin
  507.                I := I+1;
  508.                ID[I] := CH
  509.             End;
  510.       GETNEXTCHAR
  511.    Until ( NOT(((CH>='A') AND (CH<='Z')) OR (CH='_')
  512.                 OR ((CH>='0') AND (CH<='9')))) OR (ERROR);
  513.    I := 1;
  514.    J := NK;
  515.    Repeat
  516.       K := (I+J) DIV 2;      {BINARY SEARCH}
  517.       If KEY[K] <= ID
  518.          then
  519.             I := K+1;
  520.  
  521.       If KEY[K] >= ID
  522.          then
  523.             J := K-1;
  524.  
  525.    Until I > J;
  526.    If KEY[K] <> ID then
  527.      SEARCH(ID)
  528.    Else
  529.      Begin
  530.        If (K=21) OR (K=37)  then     { DO or IF}
  531.          Begin
  532.            LAST_KEY := K ;
  533.            If NESTLVL = NESTMAX then
  534.              Write (LST, '----Too many levels')
  535.            Else
  536.              Begin
  537.                NESTLVL := NESTLVL + 1 ;
  538.                NESTUP := TRUE
  539.              End
  540.          End ;
  541.  
  542.        If (K=26) OR (K=27) OR (K= 28) then    { ENDDO or ENDIF or ENDCASE}
  543.          If (NESTLVL = 0) AND LISTING then
  544.            Write (LST, '----Nesting error  ')
  545.          Else
  546.            Begin
  547.              NESTLVL := NESTLVL - 1 ;
  548.              NESTDN := TRUE
  549.            End
  550.      End
  551.  
  552. End; { GETIDENTIFIER }
  553.  
  554. PROCEDURE PROCESSLINE;
  555. BEGIN
  556.       If LENGTH (INPUT_LINE) > 0 then
  557.         Begin
  558.         EOL := FALSE ;
  559.         BUFCURSOR := BUFCURSOR + 1 ;
  560.         CH := INPUT_LINE[BUFCURSOR] ;
  561.         BUF[BUFCURSOR] := CH ;
  562.         CH := UPcase (CH)
  563.         End
  564.       Else
  565.         Begin
  566.         EOL := TRUE ;
  567.         CH := ' '
  568.         End ;
  569.       While NOT EOL do
  570.         Begin
  571.         If ((CH >= 'A') AND (CH <= 'Z')) AND (NOT LITERAL) AND
  572.            (NOT ACOMMENT) AND (NOT BCOMMENT) then
  573.           GETIDENTIFIER
  574.         Else
  575.           If (CH = '''') OR LITERAL then
  576.             Begin
  577.               Repeat
  578.                 GETNEXTCHAR;
  579.               Until (CH = '''') OR (ERROR) OR EOL;
  580.               LITERAL := EOL ;
  581.               GETNEXTCHAR
  582.             End
  583.           Else
  584.             If (CH = '{') OR ACOMMENT then
  585.               Begin
  586.                 While (CH <> '}') AND (NOT ERROR) AND (NOT EOL) do
  587.                   GETNEXTCHAR ;
  588.                 ACOMMENT := EOL ;
  589.                 GETNEXTCHAR
  590.               End
  591.             Else
  592.               If (CH = '(') OR BCOMMENT then
  593.                 Begin
  594.                   If NOT BCOMMENT then
  595.                     GETNEXTCHAR;
  596.                   If (CH = '*') OR BCOMMENT then
  597.                     Begin
  598.                       If NOT BCOMMENT then
  599.                         GETNEXTCHAR;
  600.                       Repeat
  601.                         While (CH <> '*') AND (NOT ERROR) AND (NOT EOL) do
  602.                           GETNEXTCHAR ;
  603.                         BCOMMENT := EOL ;
  604.                         If NOT EOL then
  605.                           GETNEXTCHAR
  606.                       Until (CH = ')') OR ERROR OR EOL ;
  607.                       If NOT EOL then
  608.                         GETNEXTCHAR
  609.                     End
  610.                 End
  611.               Else
  612.                 GETNEXTCHAR;
  613.       END;{WHILE}
  614.       EOL := FALSE ;
  615.       If LISTING OR BLOCK then
  616.       OUTPUT_LINE(BUF) ;
  617.       LINECOUNT := LINECOUNT + 1;
  618.       END; {PROCESSLINE}
  619.  
  620. Begin { CROSSREF } {AND ELIM. LEFT WHITESPACE}
  621.    nextime := true;
  622.    nex2time := true;
  623.    nex3time := true;
  624.    INITIALIZE;
  625.    OPENFILES;
  626.    While NOT EOF(INFILE) AND (NOT ABORT) do
  627.       Begin
  628.       BUFCURSOR:= 0;
  629.       NESTUP := FALSE ;
  630.       NESTDN := FALSE ;
  631.       READLN (INFILE, INPUT_LINE) ;
  632.       WHITESPACE; {rsr * added 1/13/87 to eliminate whitespace}
  633.       IF INCLUDEIN(INPUT_LINE) THEN
  634.       PROCESSINCLUDEFILE(INPUT_LINE)
  635.       ELSE
  636.       PROCESSLINE;
  637.       END;
  638.  
  639.    If NOT ABORT then
  640.      Begin
  641.      {TITLELINE;}
  642.      IF ((NOT BLOCK) OR LISTING) THEN
  643.      BEGIN
  644.      LINECOUNT := 0;
  645.      BUFCURSOR := 0;
  646.      WRITELN(LST,^M^J'CROSS REFERENCE TABLE for ',FILENAME,^M^J);
  647.      PRINTTABLE;
  648.      Writeln(LST,^M^J'END of CROSS REFERENCE TABLE for ',FILENAME,^M^J);
  649.      END;
  650.      CLOSE(LST);
  651.      If IOresult <> 0 then
  652.      Writeln('ERROR CLOSING OUTPUT FILE')
  653.      End;
  654.   WRITELN(^M^J'PROGRAM COMPLETE: Written to ',LSTFILENAME,' - EXITING ');
  655.   {CLRSCR}
  656.   END.
  657.  
  658.