home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / XREF.ZIP / XREF.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  1987-11-26  |  20.6 KB  |  728 lines

  1. PROGRAM XREF;
  2.  
  3. {$N-  Don't use the numeric coprocessor.}
  4.  
  5. {    N.WIRTH  10.2.76
  6.      Cross Reference Generator for Pascal Programs,  using  the
  7.      Quadratic Quotient hash method.
  8.  
  9.      Note:  This program was received with the  PASCAL 6000-3.4
  10.             compiler for the Control Data 6600 computer written
  11.             by Urs Ammann  of  the  Institut  fuer  Informatik,
  12.             ETH-Zurich, Switzerland 1972-1974.
  13.  
  14.      Updated for Turbo Pascal by Harry M. Murphy,  4 June 1986.
  15.  
  16.      Updated for Turbo Pascal Version 4.0 on 23 November 1987.
  17.  
  18.      Keylength expanded from 10 to 15 and keywords expanded to
  19.      include Borland's  Turbo Pascal  keywords  by  H.M.M.  on
  20.      17 January 1987.  }
  21.  
  22. USES
  23.       CRT;
  24.  
  25. CONST
  26.       DGPN   =  6;       { No. of digits per number }
  27.       EMPTY  = '               ';  { KLN blanks.    }
  28.       KLN    = 15;       { Keylength                }
  29.       LPPG   = 55;       { No. of lines per page    }
  30.       LLDF   = 78;       { Default line length      }
  31.       P      = 1499;     { Size of hash table       }
  32.       NK     = 213;      { No. of keywords          }
  33.       VERSION = '23 November 1987.';
  34.  
  35. TYPE
  36.      ALFA     = ARRAY [1..KLN] OF CHAR;
  37.      FILESPEC = STRING[65];
  38.      FILESTAT = RECORD
  39.                   FILECH: CHAR;
  40.                   FILEEF: BOOLEAN;
  41.                   FILEEL: BOOLEAN
  42.                 END;
  43.      INDEX    = 0..P;
  44.      REF      = ^ITEM;
  45.      WORD     = RECORD
  46.                   KEY: ALFA;
  47.                   FIRST: REF;
  48.                 END;
  49.      ITEM     = RECORD
  50.                   LNO: 0..32767;
  51.                   NEXT: REF
  52.                 END;
  53.  
  54. VAR
  55.     CC     : INTEGER;     { POSITION OF CHARACTER IN LINE }
  56.     FF     : CHAR;        { FORM-FEED CHARACTER }
  57.     I      : INDEX;
  58.     INP    : TEXT;        { INPUT FILE }
  59.     INPCH  : CHAR;
  60.     INPEF  : BOOLEAN;
  61.     INPEL  : BOOLEAN;
  62.     INPNAM : FILESPEC;    { INPUT FILE NAME }
  63.     INPSTAT: FILESTAT;
  64.     LL1    : INTEGER;     { LENGTH OF LISTING LINE }
  65.     LL2    : INTEGER;     { LENGTH OF TABLE LINE   }
  66.     K      : INTEGER;
  67.     M      : INTEGER;     { NO. OF LINES ON PAGE }
  68.     N      : INTEGER;     { CURRENT LINE NUMBER }
  69.     NOPL   : INTEGER;     { NO. OF LINE-NUMBERS PER LINE }
  70.     OUT    : TEXT;        { OUTPUT FILE }
  71.     OUTNAM : FILESPEC;    { OUTPUT FILE NAME }
  72.     QUOTE  : CHAR;        { SINGLE QUOTE MARK }
  73.     ID     : RECORD
  74.                CASE BOOLEAN OF
  75.                  FALSE: (A: ALFA);
  76.                  TRUE:  (ORD: INTEGER)
  77.                END;
  78.     T      : ARRAY [INDEX] OF WORD;    { HASH TABLE }
  79.     KEY    : ARRAY [1..NK] OF ALFA;
  80.  
  81.  
  82. PROCEDURE GETINP;
  83.  
  84. {  This routine emulates the GET(INP) file primitive,  which  puts
  85.    the next input character in INP^, and which in not available in
  86.    Borland's Turbo Pascal.
  87.  
  88.    Following a call to GETINP, INPCH contains the next input char-
  89.    acter,  INPEF contains the EOF(INP) status and  INPEL  contains
  90.    the EOLN(INP) status.
  91.  
  92.    Routine by Harry M. Murphy,  4 June 1986.  }
  93.  
  94. BEGIN
  95.   WITH INPSTAT DO
  96.     BEGIN
  97.       INPCH := FILECH;
  98.       INPEF := FILEEF;
  99.       INPEL := FILEEL;
  100.       FILECH := ' ';
  101.       FILEEF := EOF(INP);
  102.       FILEEL := EOLN(INP);
  103.       IF NOT FILEEF
  104.         THEN
  105.           IF FILEEL
  106.             THEN
  107.               READLN(INP)
  108.             ELSE
  109.               READ(INP,FILECH)
  110.     END
  111. END  { Procedure GETINP };
  112.  
  113.  
  114. PROCEDURE GETINPFIL(VAR INPNAME: FILESPEC);
  115.  
  116. {  This file gets an input file, either as the first parameter
  117.    on the command line or by requesting it from the user.
  118.  
  119.    Procedure by Harry M. Murphy,  22 February 1986.  }
  120.  
  121.   VAR
  122.       L: INTEGER;
  123.  
  124.   BEGIN
  125.     IF PARAMCOUNT = 0
  126.       THEN
  127.         BEGIN
  128.           WRITE('Input  file: ');
  129.           READLN(INPNAME)
  130.         END
  131.       ELSE
  132.         INPNAME := PARAMSTR(1);
  133.     FOR L:=1 TO LENGTH(INPNAME) DO INPNAME[L] := UPCASE(INPNAME[L]);
  134.     ASSIGN(INP,INPNAME);
  135.     {$I-} RESET(INP) {$I+};
  136.     IF IORESULT <> 0
  137.       THEN
  138.         BEGIN
  139.           WRITELN('ERROR!  Can''t open file ',INPNAME,'!');
  140.           HALT
  141.         END;
  142.   END {Procedure GETINPFIL};
  143.  
  144.  
  145. PROCEDURE GETOUTFIL(VAR OUTNAME: FILESPEC);
  146.  
  147. {  This file gets an output file, either as the second parameter
  148.    on the command line or by requesting it from the user.
  149.  
  150.    Procedure by Harry M. Murphy,  22 February 1986.  }
  151.  
  152.  VAR
  153.      L: INTEGER;
  154.  
  155.   BEGIN
  156.     IF PARAMCOUNT < 2
  157.       THEN
  158.         BEGIN
  159.           WRITE('Output file: ');
  160.           READLN(OUTNAME)
  161.         END
  162.       ELSE
  163.         OUTNAME := PARAMSTR(2);
  164.     FOR L:=1 TO LENGTH(OUTNAME) DO OUTNAME[L] := UPCASE(OUTNAME[L]);
  165.     ASSIGN(OUT,OUTNAME);
  166.     {$I-} REWRITE(OUT) {$I-};
  167.     IF IORESULT <> 0
  168.       THEN
  169.         BEGIN
  170.           WRITELN('ERROR!  Can''t open ',OUTNAME,'!');
  171.           HALT
  172.         END
  173.   END {Procedure GETOUTFIL};
  174.  
  175.  
  176.   FUNCTION NOKEY: BOOLEAN;
  177.  
  178.   VAR
  179.       I,J,K: INTEGER;
  180.  
  181.    BEGIN
  182.      I := 1;
  183.      J := NK;
  184.       REPEAT
  185.         K := (I+J) DIV 2;
  186.         IF KEY[K] <= ID.A
  187.           THEN
  188.             I := SUCC(K)
  189.           ELSE
  190.             J := K-1
  191.       UNTIL I > J;
  192.      IF J = 0
  193.        THEN
  194.          NOKEY := TRUE
  195.        ELSE
  196.          NOKEY := KEY[J] <> ID.A
  197.    END { NOKEY };
  198.  
  199.  
  200.   PROCEDURE EPILOG;
  201.  
  202.   BEGIN
  203.     WRITELN(OUT);
  204.     WRITELN(OUT,
  205.     'This is a Turbo Pascal version of Niklaus Wirth''s Cross Reference'
  206.     );
  207.     WRITELN(OUT,
  208.      'Generator for Pascal Programs,  using the Quadratic Quotient Hash'
  209.     );
  210.     WRITELN(OUT,'Method, dated 10.2.76.  This version date is ',VERSION)
  211.  END { Procedure EPILOG };
  212.  
  213.  
  214.   PROCEDURE COUNTLINE;
  215.  
  216.    BEGIN
  217.      IF M = LPPG
  218.        THEN
  219.          BEGIN
  220.            WRITELN(OUT,FF);
  221.            M := 0
  222.          END;
  223.      M := M+1
  224.    END { COUNTLINE };
  225.  
  226.   PROCEDURE OPENLINE;
  227.  
  228.    BEGIN
  229.      COUNTLINE;
  230.      N := N+1;
  231.      WRITE(OUT,N:6,' ');
  232.      CC := 0
  233.    END { OPENLINE };
  234.  
  235.   PROCEDURE ADVANCE;
  236.  
  237.    BEGIN
  238.      WRITE(OUT,INPCH);
  239.      GETINP;
  240.      CC := SUCC(CC);
  241.      IF CC = LL1
  242.        THEN
  243.          WHILE NOT INPEL DO
  244.            BEGIN
  245.              WRITE(OUT,INPCH);
  246.              GETINP
  247.            END
  248.    END { ADVANCE };
  249.  
  250.   PROCEDURE CLOSELINE;
  251.  
  252.    BEGIN
  253.      WRITELN(OUT);
  254.      GETINP
  255.    END { CLOSELINE };
  256.  
  257.   PROCEDURE SEARCH;
  258.  
  259.   VAR
  260.       H,D,I: INDEX;
  261.       X: REF;
  262.       F: BOOLEAN;
  263.  
  264.    BEGIN
  265.      H := (ID.ORD DIV 4096) MOD P;
  266.      F := FALSE;
  267.      D := 1;
  268.      NEW(X);
  269.      X^.LNO := N;
  270.       REPEAT
  271.         IF T[H].KEY = ID.A
  272.           THEN
  273.             BEGIN { FOUND }
  274.               F := TRUE;
  275.               X^.NEXT := T[H].FIRST;
  276.               T[H].FIRST := X;
  277.             END
  278.           ELSE
  279.             IF T[H].KEY = EMPTY
  280.               THEN
  281.                 BEGIN { NEW ENTRY }
  282.                   F := TRUE;
  283.                   T[H].KEY := ID.A;
  284.                   T[H].FIRST := X;
  285.                   X^.NEXT := NIL
  286.                 END
  287.               ELSE
  288.                 BEGIN { COLLISION }
  289.                   H := H+D;
  290.                   D := D+2;
  291.                   IF H >= P THEN H := H-P;
  292.                   IF D = P
  293.                     THEN
  294.                       BEGIN
  295.                         WRITELN(OUT);
  296.                         WRITELN(OUT,' TABLE FULL');
  297.                         HALT
  298.                       END
  299.                 END
  300.       UNTIL F
  301.    END { SEARCH };
  302.  
  303.   PROCEDURE SORT(L,R: INTEGER);   { QUICKSORT }
  304.  
  305.   VAR
  306.       I,J: INTEGER;
  307.       X: ALFA;
  308.       W: WORD;
  309.  
  310.    BEGIN
  311.      I := L;
  312.      J := R;
  313.      X := T[(I+J) DIV 2].KEY;
  314.       REPEAT
  315.         WHILE T[I].KEY < X DO I := SUCC(I);
  316.         WHILE X < T[J].KEY DO J := PRED(J);
  317.         IF I <= J
  318.           THEN
  319.             BEGIN
  320.               W := T[I];
  321.               T[I] := T[J];
  322.               T[J] := W;
  323.               I := I+1;
  324.               J := J-1
  325.             END
  326.       UNTIL I > J;
  327.      IF L < J THEN SORT(L,J);
  328.      IF I < R THEN SORT(I,R)
  329.    END { SORT };
  330.  
  331.   PROCEDURE PRINTWORD(W: WORD);
  332.  
  333.   VAR
  334.       L     : INTEGER;
  335.       X,Y,Z : REF;
  336.  
  337.    BEGIN
  338.      COUNTLINE;
  339.      WRITE(OUT,' ',W.KEY);
  340.      X := W.FIRST;
  341.      Y := X^.NEXT;
  342.      X^.NEXT := NIL;
  343.      WHILE Y <> NIL DO
  344.        BEGIN
  345.          Z := Y^.NEXT;
  346.          Y^.NEXT := X;
  347.          X := Y;
  348.          Y := Z
  349.        END;
  350.      L := 0;
  351.       REPEAT
  352.         IF L = NOPL
  353.           THEN
  354.             BEGIN
  355.               L := 0;
  356.               WRITELN(OUT);
  357.               COUNTLINE;
  358.               WRITE(OUT,' ',EMPTY)
  359.             END;
  360.         L := L+1;
  361.         WRITE(OUT,X^.LNO:DGPN);
  362.         X := X^.NEXT
  363.       UNTIL X = NIL;
  364.      WRITELN(OUT)
  365.    END { PRINTWORD };
  366.  
  367.   PROCEDURE PRINTTABLE;
  368.  
  369.   VAR
  370.       I,M: INDEX;
  371.  
  372.    BEGIN
  373.      M := 0;    { COMPRESS TABLE }
  374.      FOR I:=0 TO P-1 DO
  375.        IF T[I].KEY <> EMPTY
  376.          THEN
  377.            BEGIN
  378.              T[M] := T[I];
  379.              M := M+1
  380.            END;
  381.      IF M > 0 THEN SORT(0,M-1);
  382.      NOPL := (LL2-KLN-1) DIV DGPN;
  383.      FOR I:=0 TO M-1 DO PRINTWORD(T[I])
  384.    END { PRINTTABLE };
  385.  
  386.  BEGIN
  387.    WRITELN('Wirth''s - Pascal Cross-Reference.  (10.2.76)');
  388.    WRITELN('Turbo Pascal Version of ',VERSION);
  389.    WRITELN;
  390.    GETINPFIL(INPNAM);
  391.    GETOUTFIL(OUTNAM);
  392.  
  393.    WITH INPSTAT DO
  394.      BEGIN
  395.        FILECH := ' ';
  396.        FILEEF := FALSE;
  397.        FILEEL := FALSE
  398.      END;
  399.    GETINP;
  400.    GETINP;
  401.  
  402.    WRITELN('XREF now processing ',INPNAM);
  403.  
  404.    FOR I:=0 TO P-1 DO T[I].KEY := EMPTY;
  405.    KEY[  1] := 'ABS            ';
  406.    KEY[  2] := 'ABSOLUTE       ';
  407.    KEY[  3] := 'ADDR           ';
  408.    KEY[  4] := 'AND            ';
  409.    KEY[  5] := 'ARC            ';
  410.    KEY[  6] := 'ARCTAN         ';
  411.    KEY[  7] := 'ARRAY          ';
  412.    KEY[  8] := 'ASSIGN         ';
  413.    KEY[  9] := 'AUX            ';
  414.    KEY[ 10] := 'AUXINPTR       ';
  415.    KEY[ 11] := 'AUXOUTPTR      ';
  416.    KEY[ 12] := 'BACK           ';
  417.    KEY[ 13] := 'BEGIN          ';
  418.    KEY[ 14] := 'BLOCKREAD      ';
  419.    KEY[ 15] := 'BLOCKWRITE     ';
  420.    KEY[ 16] := 'BOOLEAN        ';
  421.    KEY[ 17] := 'BYTE           ';
  422.    KEY[ 18] := 'CASE           ';
  423.    KEY[ 19] := 'CHAIN          ';
  424.    KEY[ 20] := 'CHAR           ';
  425.    KEY[ 21] := 'CHDIR          ';
  426.    KEY[ 22] := 'CHR            ';
  427.    KEY[ 23] := 'CIRCLE         ';
  428.    KEY[ 24] := 'CLEARSCREEN    ';
  429.    KEY[ 25] := 'CLOSE          ';
  430.    KEY[ 26] := 'CLREOL         ';
  431.    KEY[ 27] := 'CLRSCR         ';
  432.    KEY[ 28] := 'COLORTABLE     ';
  433.    KEY[ 29] := 'CON            ';
  434.    KEY[ 30] := 'CONCAT         ';
  435.    KEY[ 31] := 'CONINPTR       ';
  436.    KEY[ 32] := 'CONOUTPTR      ';
  437.    KEY[ 33] := 'CONST          ';
  438.    KEY[ 34] := 'CONSTPTR       ';
  439.    KEY[ 35] := 'COPY           ';
  440.    KEY[ 36] := 'COS            ';
  441.    KEY[ 37] := 'CRTEXIT        ';
  442.    KEY[ 38] := 'CRTINIT        ';
  443.    KEY[ 39] := 'CSEG           ';
  444.    KEY[ 40] := 'DELAY          ';
  445.    KEY[ 41] := 'DELETE         ';
  446.    KEY[ 42] := 'DELLINE        ';
  447.    KEY[ 43] := 'DISPOSE        ';
  448.    KEY[ 44] := 'DIV            ';
  449.    KEY[ 45] := 'DO             ';
  450.    KEY[ 46] := 'DOWNTO         ';
  451.    KEY[ 47] := 'DRAW           ';
  452.    KEY[ 48] := 'ELSE           ';
  453.    KEY[ 49] := 'END            ';
  454.    KEY[ 50] := 'EOF            ';
  455.    KEY[ 51] := 'EOLN           ';
  456.    KEY[ 52] := 'ERASE          ';
  457.    KEY[ 53] := 'EXECUTE        ';
  458.    KEY[ 54] := 'EXP            ';
  459.    KEY[ 55] := 'EXTERNAL       ';
  460.    KEY[ 56] := 'FALSE          ';
  461.    KEY[ 57] := 'FILE           ';
  462.    KEY[ 58] := 'FILEPOS        ';
  463.    KEY[ 59] := 'FILESIZE       ';
  464.    KEY[ 60] := 'FILLCHAR       ';
  465.    KEY[ 61] := 'FILLPATTERN    ';
  466.    KEY[ 62] := 'FILLSCREEN     ';
  467.    KEY[ 63] := 'FILLSHAPE      ';
  468.    KEY[ 64] := 'FLUSH          ';
  469.    KEY[ 65] := 'FOR            ';
  470.    KEY[ 66] := 'FORWARD        ';
  471.    KEY[ 67] := 'FRAC           ';
  472.    KEY[ 68] := 'FREEMEM        ';
  473.    KEY[ 69] := 'FUNCTION       ';
  474.    KEY[ 70] := 'GET            ';
  475.    KEY[ 71] := 'GETDIR         ';
  476.    KEY[ 72] := 'GETDOT         ';
  477.    KEY[ 73] := 'GETMEM         ';
  478.    KEY[ 74] := 'GETPIC         ';
  479.    KEY[ 75] := 'GOTO           ';
  480.    KEY[ 76] := 'GOTOXY         ';
  481.    KEY[ 77] := 'GRAPHBACKGROUND';
  482.    KEY[ 78] := 'GRAPHCOLORMODE ';
  483.    KEY[ 79] := 'GRAPHMODE      ';
  484.    KEY[ 80] := 'GRAPHWINDOW    ';
  485.    KEY[ 81] := 'HALT           ';
  486.    KEY[ 82] := 'HEADING        ';
  487.    KEY[ 83] := 'HEAPPTR        ';
  488.    KEY[ 84] := 'HI             ';
  489.    KEY[ 85] := 'HIDETURTLE     ';
  490.    KEY[ 86] := 'HIRES          ';
  491.    KEY[ 87] := 'HIRESCOLOR     ';
  492.    KEY[ 88] := 'HOME           ';
  493.    KEY[ 89] := 'IF             ';
  494.    KEY[ 90] := 'IN             ';
  495.    KEY[ 91] := 'INLINE         ';
  496.    KEY[ 92] := 'INPUT          ';
  497.    KEY[ 93] := 'INSERT         ';
  498.    KEY[ 94] := 'INSLINE        ';
  499.    KEY[ 95] := 'INT            ';
  500.    KEY[ 96] := 'INTEGER        ';
  501.    KEY[ 97] := 'INTR           ';
  502.    KEY[ 98] := 'IORESULT       ';
  503.    KEY[ 99] := 'KBD            ';
  504.    KEY[100] := 'KEYPRESSED     ';
  505.    KEY[101] := 'LABEL          ';
  506.    KEY[102] := 'LENGTH         ';
  507.    KEY[103] := 'LN             ';
  508.    KEY[104] := 'LO             ';
  509.    KEY[105] := 'LOWVIDEO       ';
  510.    KEY[106] := 'LST            ';
  511.    KEY[107] := 'LSTOUTPTR      ';
  512.    KEY[108] := 'MARK           ';
  513.    KEY[109] := 'MAXAVAIL       ';
  514.    KEY[110] := 'MAXINT         ';
  515.    KEY[111] := 'MEMAVAIL       ';
  516.    KEY[112] := 'MEMW           ';
  517.    KEY[113] := 'MKDIR          ';
  518.    KEY[114] := 'MOD            ';
  519.    KEY[115] := 'MOVE           ';
  520.    KEY[116] := 'MSDOS          ';
  521.    KEY[117] := 'NEW            ';
  522.    KEY[118] := 'NIL            ';
  523.    KEY[119] := 'NORMVIDEO      ';
  524.    KEY[120] := 'NOSOUND        ';
  525.    KEY[121] := 'NOT            ';
  526.    KEY[122] := 'ODD            ';
  527.    KEY[123] := 'OF             ';
  528.    KEY[124] := 'OFS            ';
  529.    KEY[125] := 'OR             ';
  530.    KEY[126] := 'ORD            ';
  531.    KEY[127] := 'OUTPUT         ';
  532.    KEY[128] := 'OVERLAY        ';
  533.    KEY[129] := 'PACK           ';
  534.    KEY[130] := 'PACKED         ';
  535.    KEY[131] := 'PAGE           ';
  536.    KEY[132] := 'PALETTE        ';
  537.    KEY[133] := 'PARAMCOUNT     ';
  538.    KEY[134] := 'PARAMSTR       ';
  539.    KEY[135] := 'PATTERN        ';
  540.    KEY[136] := 'PENDOWN        ';
  541.    KEY[137] := 'PENUP          ';
  542.    KEY[138] := 'PI             ';
  543.    KEY[139] := 'PLOT           ';
  544.    KEY[140] := 'PORT           ';
  545.    KEY[141] := 'POS            ';
  546.    KEY[142] := 'PRED           ';
  547.    KEY[143] := 'PROCEDURE      ';
  548.    KEY[144] := 'PROGRAM        ';
  549.    KEY[145] := 'PTR            ';
  550.    KEY[146] := 'PUT            ';
  551.    KEY[147] := 'PUTPIC         ';
  552.    KEY[148] := 'RANDOM         ';
  553.    KEY[149] := 'RANDOMIZE      ';
  554.    KEY[150] := 'READ           ';
  555.    KEY[151] := 'READLN         ';
  556.    KEY[152] := 'REAL           ';
  557.    KEY[153] := 'RECORD         ';
  558.    KEY[154] := 'RELEASE        ';
  559.    KEY[155] := 'RENAME         ';
  560.    KEY[156] := 'REPEAT         ';
  561.    KEY[157] := 'RESET          ';
  562.    KEY[158] := 'REWRITE        ';
  563.    KEY[159] := 'RMDIR          ';
  564.    KEY[160] := 'ROUND          ';
  565.    KEY[161] := 'SEEK           ';
  566.    KEY[162] := 'SEEKEOF        ';
  567.    KEY[163] := 'SEEKEOLN       ';
  568.    KEY[164] := 'SEG            ';
  569.    KEY[165] := 'SET            ';
  570.    KEY[166] := 'SETHEADING     ';
  571.    KEY[167] := 'SETPENCOLOR    ';
  572.    KEY[168] := 'SETPOSITION    ';
  573.    KEY[169] := 'SHL            ';
  574.    KEY[170] := 'SHOWTURTLE     ';
  575.    KEY[171] := 'SHR            ';
  576.    KEY[172] := 'SIN            ';
  577.    KEY[173] := 'SIZEOF         ';
  578.    KEY[174] := 'SOUND          ';
  579.    KEY[175] := 'SQR            ';
  580.    KEY[176] := 'SQRT           ';
  581.    KEY[177] := 'STR            ';
  582.    KEY[178] := 'STRING         ';
  583.    KEY[179] := 'SUCC           ';
  584.    KEY[180] := 'SWAP           ';
  585.    KEY[181] := 'TEXT           ';
  586.    KEY[182] := 'TEXTBACKGROUND ';
  587.    KEY[183] := 'TEXTCOLOR      ';
  588.    KEY[184] := 'TEXTMODE       ';
  589.    KEY[185] := 'THEN           ';
  590.    KEY[186] := 'TO             ';
  591.    KEY[187] := 'TRM            ';
  592.    KEY[188] := 'TRUE           ';
  593.    KEY[189] := 'TRUNC          ';
  594.    KEY[190] := 'TURNLEFT       ';
  595.    KEY[191] := 'TURNRIGHT      ';
  596.    KEY[192] := 'TURTLETHERE    ';
  597.    KEY[193] := 'TURTLEWINDOW   ';
  598.    KEY[194] := 'TYPE           ';
  599.    KEY[195] := 'UNPACK         ';
  600.    KEY[196] := 'UNTIL          ';
  601.    KEY[197] := 'UPCASE         ';
  602.    KEY[198] := 'USR            ';
  603.    KEY[199] := 'USRINPTR       ';
  604.    KEY[200] := 'USROUTPTR      ';
  605.    KEY[201] := 'VAL            ';
  606.    KEY[202] := 'VAR            ';
  607.    KEY[203] := 'WHEREX         ';
  608.    KEY[204] := 'WHEREY         ';
  609.    KEY[205] := 'WHILE          ';
  610.    KEY[206] := 'WINDOW         ';
  611.    KEY[207] := 'WITH           ';
  612.    KEY[208] := 'WRAP           ';
  613.    KEY[209] := 'WRITE          ';
  614.    KEY[210] := 'WRITELN        ';
  615.    KEY[211] := 'XCOR           ';
  616.    KEY[212] := 'XOR            ';
  617.    KEY[213] := 'YCOR           ';
  618.    FF := CHR(12);
  619.    QUOTE := CHR(39);
  620.  
  621.    { SCAN INPUT FOR IDENTIFIERS }
  622.    N := 0;
  623.    M := 0;
  624.    LL1 := LLDF;
  625.    LL2 := LLDF;
  626.    WHILE NOT INPEF DO
  627.      BEGIN
  628.        OPENLINE;
  629.        WHILE NOT INPEL DO
  630.          BEGIN
  631.            IF INPCH = ' '
  632.              THEN
  633.                ADVANCE
  634.              ELSE
  635.                IF INPCH IN ['A'..'Z']
  636.                  THEN
  637.                    BEGIN
  638.                      K := 0;
  639.                      ID.A := EMPTY;
  640.                      REPEAT
  641.                        IF K < KLN
  642.                          THEN
  643.                            BEGIN
  644.                              K := K+1;
  645.                              IF INPCH IN ['a'..'z']
  646.                                THEN
  647.                                  ID.A[K] := CHR(ORD(INPCH)-32)
  648.                                ELSE
  649.                                  ID.A[K] := INPCH
  650.                            END;
  651.                        ADVANCE
  652.                      UNTIL NOT(INPCH IN ['A'..'Z', 'a'..'z', '0'..'9']);
  653.                      IF NOKEY THEN SEARCH
  654.                    END
  655.                  ELSE
  656.                    IF INPCH IN ['0'..'9']
  657.                      THEN
  658.                        REPEAT
  659.                          ADVANCE
  660.                        UNTIL NOT (INPCH IN ['B','0'..'9'])
  661.                      ELSE
  662.                        IF INPCH = QUOTE
  663.                          THEN
  664.                            BEGIN { STRING }
  665.                              REPEAT
  666.                                ADVANCE
  667.                              UNTIL (INPCH = QUOTE) OR INPEL;
  668.                              IF NOT INPEL THEN ADVANCE
  669.                            END
  670.                          ELSE
  671.                            IF INPCH = '{'
  672.                              THEN
  673.                                BEGIN { COMMENT }
  674.                                  ADVANCE;
  675.                                  WHILE INPCH <> '}' DO
  676.                                    BEGIN
  677.                                      ADVANCE;
  678.                                      WHILE INPEL DO
  679.                                       BEGIN
  680.                                        CLOSELINE;
  681.                                        OPENLINE
  682.                                       END
  683.                                    END;
  684.                                  ADVANCE
  685.                                END
  686.                              ELSE
  687.                                IF INPCH = '('
  688.                                  THEN
  689.                                    BEGIN
  690.                                      ADVANCE;
  691.                                      IF INPCH = '*'
  692.                                       THEN
  693.                                        BEGIN { COMMENT }
  694.                                         ADVANCE;
  695.                                         REPEAT
  696.                                          WHILE INPCH <> '*' DO
  697.                                           BEGIN
  698.                                            IF INPEL
  699.                                             THEN
  700.                                              BEGIN
  701.                                               CLOSELINE;
  702.                                               OPENLINE
  703.                                              END
  704.                                             ELSE
  705.                                              ADVANCE
  706.                                           END;
  707.                                          ADVANCE
  708.                                         UNTIL INPCH = ')';
  709.                                         ADVANCE
  710.                                        END
  711.                                    END
  712.                                  ELSE
  713.                                    ADVANCE
  714.          END;
  715.        CLOSELINE
  716.      END;
  717.    CLOSE(INP);
  718.    WRITELN(OUT,FF);
  719.    M := 0;
  720.    PRINTTABLE;
  721.    IF (LPPG-M) > 4 THEN EPILOG;
  722.    IF OUTNAM = 'PRN' THEN WRITELN(OUT,FF);
  723.    CLOSE(OUT);
  724.    WRITELN;
  725.    WRITELN('XREF processing of ',INPNAM,' is complete.');
  726.    WRITELN('The cross reference output file is ',OUTNAM)
  727.  END.
  728.