home *** CD-ROM | disk | FTP | other *** search
- program xrefpas;
- {
- Cross reference generator --- based on program 4.8 in
- Wirth's "Algorithms + Data Structures = Programs"
-
- Usage: XREFPAS filename (subdirectories not supported)
-
- >>>> This must be compiled by Turbo Pascal(tm) before running <<<<
- }
- const
- c1 = 10;
- c2 = 8;
- c3 = 6;
- type
- alfa = array [1..c1] of char;
- wordref = ^word;
- itemref = ^item;
- word = record key: alfa;
- first, last: itemref;
- left, right: wordref;
- end ;
- item = record lno: integer;
- next: itemref;
- end ;
- state = (none,symbol,quote,comment);
- var
- param: string[127] absolute cseg:$0080;
- fname: string[14];
- root: wordref;
- k: integer;
- n: integer;
- id: alfa;
- fv: text;
- f: char;
- scan: state;
- pageno:integer;
- title: string[4];
- procedure newpage;
- begin
- pageno := pageno+1;
- write(lst,#12,title,': ',fname,' ':50,'Page ',pageno:3);
- writeln(lst);
- writeln(lst);
- end {newpage};
- 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^.lno := 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^.lno := n;
- x^.next := nil;
- w^.last^.next := x;
- w^.last := x
- end
- end {search} ;
- procedure printtree (w:wordref);
- procedure printword (w:word);
- var l: integer;
- x: itemref;
- begin
- if (n mod 60) = 0 then newpage;
- write(lst,' ',w.key);
- x := w.first;
- l:= 0;
- repeat
- if l = c2 then
- begin
- writeln(lst);
- n := n+1;
- if (n mod 60) = 0 then newpage;
- write(lst,' ':c1+1);
- l := 0
- end ;
- l := l+1;
- write(lst,x^.lno:c3);
- x := x^.next
- until x = nil;
- writeln(lst);
- n := n+1
- end {printword} ;
- begin if w <> nil then
- begin
- printtree(w^.left);
- printword(w^);
- printtree(w^.right)
- end
- end {printtree} ;
- begin
- n := 0;
- repeat
- n := n+1
- until (n > length(param)) or (param[n] <> ' ');
- fname := copy(param,n,length(param)-n+1);
- assign(fv,fname);
- reset(fv);
- root := nil;
- n := 0;
- scan := none;
- pageno := 0;
- title := 'List';
- while not eof(fv) do
- begin
- if (n mod 60) = 0 then newpage;
- n := n+1;
- write(lst,n:c3);
- write(lst,' ');
- while not eoln(fv) do
- begin
- read(fv,f);
- write(lst,f);
- case scan of
- none: begin
- if f in['a'..'z','A'..'Z'] then
- begin
- k := 1;
- id[k] := f;
- scan := symbol
- end
- else
- if f = '''' then scan := quote
- else
- if f = '{' then scan := comment
- end;
- symbol: begin
- if f in['a'..'z','A'..'Z','0'..'9'] then
- begin
- k := k+1;
- if k <= c1 then id[k] := f
- end
- else
- begin
- if k < c1 then
- repeat
- k := k+1;
- id[k] := ' ';
- until k = c1;
- search(root);
- scan := none
- end;
- end;
- quote: begin
- if f = '''' then scan := none
- end;
- comment:begin
- if f = '}' then scan := none
- end;
- end;
- end ;
- writeln(lst);
- readln(fv);
- end ;
- n := 0;
- pageno := 0;
- title := 'xref';
- printtree(root);
- write(lst,#12)
- end .