home *** CD-ROM | disk | FTP | other *** search
- { Modified for TURBO Pascal 1.00a (MS-DOS Ver.) }
- { By: J.W.Kindschi Jr. February 25, 1984 }
-
- Program crossref(Input,Output);
- Const
- c1 = 10;
- c2 = 10;
- c3 = 6;
- c4 = 9999;
- reserved = 86;
- form_feed = 12;
- Type
- name = String[14];
- cmd = (r,w);
- alpha = Packed Array[1..c1] Of Char;
- wordref = ^word;
- itemref = ^item;
- word = Record
- key : alpha;
- first,last : itemref;
- left,right : wordref;
- End;
- item = Packed Record
- line_no : 0..c4;
- next : itemref;
- End;
- Var
- root : wordref;
- k,k1 : byte;
- result : Integer;
- ptr,n,i: Integer;
- id,a : alpha;
- uid : alpha;
- f,g : Text;
- ch : Char;
- line : String[135];
- source,
- dest : name;
- flag : Boolean;
- keys : Packed Array[0..reserved] Of String[c1];
-
-
-
- Procedure uppercase(Var str:alpha);
- Var i : Integer;
- Begin
- For i := 1 To length(str) Do str[i] := upcase(str[i]);
- End;
-
-
- Procedure search(Var w1:wordref);
- Var
- w: wordref;
- x: itemref;
- Begin
- w := w1;
- If w=Nil Then
- Begin
- New(w);
- New(x);
- With w^ Do
- Begin
- key := id;
- left := Nil;
- right := Nil;
- first := x;
- last := x;
- End;
- x^.line_no := n;
- x^.next := Nil;
- w1 := w;
- End
- Else
- If id<w^.key Then
- search(w^.left)
- Else
- If id>w^.key Then
- search(w^.right)
- Else
- Begin
- New(x);
- x^.line_no := n;
- x^.next := Nil;
- w^.last^.next := x;
- w^.last := x;
- End;
- End;
-
-
- Procedure printtree(w:wordref);
-
- Procedure printword(w:word);
- Var
- l: Integer;
- x: itemref;
- Begin
- Write(g,' ',w.key);
- x := w.first;
- l := 0;
- Repeat
- If l=c2 Then
- Begin
- Writeln(g);
- l := 0;
- Write(g,' ':c1+1);
- End;
- l := l+1;
- Write(g,x^.line_no: c3);
- x := x^.next;
- Until x=Nil;
- Writeln(g);
- End;
-
-
- Begin
- If w<>Nil Then
- Begin
- printtree(w^.left);
- printword(w^);
- printtree(w^.right);
- End;
- End;
-
- Procedure initkeys;
- Begin
- keys[00] := 'ABS '; keys[01] := 'AND '; keys[02] := 'ARCTAN ';
- keys[03] := 'ARRAY '; keys[04] := 'BEGIN '; keys[05] := 'BOOLEAN ';
- keys[06] := 'CASE '; keys[07] := 'CHAR '; keys[08] := 'CHR ';
- keys[09] := 'CONST '; keys[10] := 'COS '; keys[11] := 'DISPOSE ';
- keys[12] := 'DIV '; keys[13] := 'DOWNTO '; keys[14] := 'ELSE ';
- keys[15] := 'END '; keys[16] := 'EOF '; keys[17] := 'EOLN ';
- keys[18] := 'EXP '; keys[19] := 'FALSE '; keys[20] := 'FILE ';
- keys[21] := 'FOR '; keys[22] := 'FORWARD '; keys[23] := 'FUNCTION ';
- keys[24] := 'GET '; keys[25] := 'GOTO '; keys[26] := 'IF ';
- keys[27] := 'IN '; keys[28] := 'INPUT '; keys[29] := 'INTEGER ';
- keys[30] := 'LABEL '; keys[31] := 'LN '; keys[32] := 'MAXINT ';
- keys[33] := 'MOD '; keys[34] := 'NEW '; keys[35] := 'NIL ';
- keys[36] := 'NOT '; keys[37] := 'ODD '; keys[38] := 'OF ';
- keys[39] := 'OR '; keys[40] := 'ORD '; keys[41] := 'OUTPUT ';
- keys[42] := 'PACK '; keys[43] := 'PACKED '; keys[44] := 'PAGE ';
- keys[45] := 'PRED '; keys[46] := 'PROCEDURE '; keys[47] := 'PROGRAM ';
- keys[48] := 'PUT '; keys[49] := 'READ '; keys[50] := 'READLN ';
- keys[51] := 'REAL '; keys[52] := 'RECORD '; keys[53] := 'REPEAT ';
- keys[54] := 'RESET '; keys[55] := 'REWRITE '; keys[56] := 'ROUND ';
- keys[57] := 'SET '; keys[58] := 'SIN '; keys[59] := 'SQR ';
- keys[60] := 'SQRT '; keys[61] := 'STRING '; keys[62] := 'SUCC ';
- keys[63] := 'TEXT '; keys[64] := 'THEN '; keys[65] := 'TO ';
- keys[66] := 'TRUE '; keys[67] := 'TRUNC '; keys[68] := 'TYPE ';
- keys[69] := 'UNPACK '; keys[70] := 'VAR '; keys[71] := 'WHILE ';
- keys[72] := 'WITH '; keys[73] := 'WRITE '; keys[74] := 'WRITELN ';
- keys[75] := 'UNTIL '; keys[76] := 'DO '; keys[77] := ' ';
- keys[78] := ' '; keys[79] := ' '; keys[80] := ' ';
- keys[81] := ' '; keys[82] := ' '; keys[83] := ' ';
- keys[84] := ' '; keys[85] := ' '; keys[86] := 'END. ';
- End;
-
- Function exists(filename : name; func : cmd):Boolean;
- Begin
- If func = r Then assign(f,filename) Else assign(g,filename);
- {$I-}
- If func = r Then Reset(f) Else Rewrite(g);
- {$I+}
- If ioresult <> 0 Then exists := False Else exists := True;
- End;
-
-
-
- Begin
- initkeys;
- flag := False;
- root := Nil;
- n := 0;
- k1 := c1;
- clrscr;
- lowvideo;
- gotoxy(0,3);
- writeln('This Program will read a Pascal Text File, and Write it to a Destination');
- writeln('File along with a Cross Reference List of all words except those that');
- writeln('are classed as being RESERVED, or those listed as STANDARD in the book');
- writeln('titled "The Pascal Handbook" (c) by "SYBEX", also those words on the same');
- writeln('line enclosed within comment braces or quotes are not considered.');
- writeln;
- writeln('By: John W. Kindschi Jr. (c) 1984');
- Repeat
- lowvideo;
- gotoxy(5,12);
- Write(Output,'Source File ? ');
- clreol;
- highvideo;
- Readln(Input,source);
- Until exists(source,r);
- Repeat
- lowvideo;
- gotoxy(5,14);
- Write(Output,'Destination File ? ');
- clreol;
- highvideo;
- Readln(Input,dest);
- Until exists(dest,w);
- Readln(f,line);
- While Not Eof(f) Do
- Begin
- If n=c4 Then n := 0;
- n := n+1;
- Write(g,n:c3);
- Write(g,': ');
- ptr := 1;
- While (ptr <= length(line)) Do
- Begin
- If (line[ptr] In ['A'..'Z','a'..'z','^']) Then
- Begin
- k := 0;
- Repeat
- If k < c1 Then
- Begin
- k := k + 1;
- a[k] := line[ptr];
- End;
- ptr := ptr + 1;
- Until Not (line[ptr] In ['A'..'Z','a'..'z','_','^','.','0'..'9'])
- Or (ptr > length(line));
- If k >= k1 Then
- k1 := k
- Else
- Repeat
- a[k1] := ' ';
- k1 := k1 - 1;
- Until k1 = k;
- id := a;
- uid := a;
- uppercase(uid);
- For i := 0 To reserved Do
- If uid = keys[i] Then flag := True;
- If Not flag Then search(root);
- flag := False;
- End
- Else
- Begin
- If line[ptr] = '{' Then
- Repeat
- ptr := ptr + 1;
- Until line[ptr] = '}';
- If line[ptr] = '''' Then
- Repeat
- ptr := ptr + 1;
- Until line[ptr] = '''';
- ptr := ptr + 1;
- End;
- End;
- Writeln(g,line);
- Readln(f,line);
- End;
- Write(g,chr(12));
- printtree(root);
- close(f);
- close(g);
- End.
-