{****************************************************************************} {* Erzeugung und Ausdruck der Crossreferenz-Liste *} {****************************************************************************} PROCEDURE NeueSeite; FORWARD; {Sorgt fuer einen Seitenumbruch. Wird erst spaeter definiert} FUNCTION gross ( x : line) : line; VAR i : linelength; BEGIN FOR i:=1 TO length(x) DO x[i]:=upcase(x[i]); gross := x; END; FUNCTION Standard(VAR n : Bez) : boolean; CONST Standardbezeichner : ARRAY[1..87] of Bez = ('ABS','ADDR','ARCTAN','ASSIGN', 'BDOS','BDOSHL','BIOS','BIOSHL','BLOCKREAD','BLOCKWRITE','BOOLEAN','BYTE', 'CHAIN','CHR','CLOSE','CLREOL','CLRSCR','CONCAT', 'COPY','COS','CRTEXIT','CRTINIT', 'DELETE','DELAY','DELLINE','DISPOSE','EOF','EOLN','ERASE','EXECUTE', 'EXP','FALSE','FILEPOS','FILESIZE','FILLCHAR','FRAC','FREEMEM', 'GETMEM','GOTOXY','HALT','HI','HIGHVIDEO','INSERT', 'INSLINE','INT','INTEGER','IORESULT', 'KEYPRESSED','LENGTH','LN','LO','LOWVIDEO','MARK','MAXAVAIL','MEMAVAIL', 'MOVE','NEW','NORMVIDEO','ODD','ORD','POS','PRED','PTR', 'RANDOM','RANDOMIZE','READ','READLN','REAL', 'RELEASE','RENAME','RESET','REWRITE','ROUND', 'SEEK','SIN','SIZEOF','SQR','SQRT','STR','SUCC','SWAP','TRUE','TRUNC', 'UPCASE','VAL','WRITE','WRITELN'); VAR b : Bez; i,j,m : integer; BEGIN b:=gross(n); i:=1; j:=87; REPEAT m:=(i+j) DIV 2; IF b<=Standardbezeichner[m] THEN j:=m ELSE i:=m+1 UNTIL i=j; Standard:=(Standardbezeichner[i]=b) END; {Die folgenden Prozeduren sind fuer die Crossreferenzliste zustaendig. Dabei werden Standardprozeduren und -funktionen nicht! beruecksichtigt.} PROCEDURE Einfuegen(w : Bez; ln:integer); LABEL EXIT; VAR gefunden : boolean; p,q : IdentList; cl,cnl : ZeilenListe; PROCEDURE MachZweig(VAR b : IdentList; w : Bez); BEGIN new(b); gefunden:=true; WITH b^ DO BEGIN l:=NIL; r:=NIL; IName:=w; new(ZList); ZList^.Nummer:=ln; ZList^.ZNext:=NIL END END; BEGIN IF Standard(w) THEN GOTO EXIT; gefunden:=false; q:=CrossList; IF CrossList=NIL THEN MachZweig(CrossList,w) ELSE REPEAT IF gross(w)gross(q^.IName) THEN IF q^.r=NIL THEN BEGIN MachZweig(p,w); q^.r:=p END ELSE q:=q^.r ELSE WITH q^ DO BEGIN gefunden:=true; cl:=ZList; WHILE cl^.ZNext<>NIL DO cl:=cl^.ZNext; IF cl^.Nummer<>ln THEN BEGIN new(cnl); cnl^.Nummer:=ln; cnl^.ZNext:=NIL; cl^.ZNext:=cnl END END UNTIL gefunden; EXIT: END; PROCEDURE SchreibListe(l : IdentList; AZ : integer); VAR h : ZeilenListe; z : integer; BEGIN mt:=3; IF PL-ZeilenZahl-MB<8 THEN NeueSeite; IF PL-ZeilenZahl-MB<5 THEN NeueSeite; write(LST,'':PO,l^.IName,':':20-length(l^.IName)); h:=l^.ZList; z:=0; WHILE h<>NIL DO BEGIN IF z=AZ THEN BEGIN writeln(LST); ZeilenZahl:=succ(ZeilenZahl); write(LST,'':20+PO); z:=0 END; write(LST,h^.Nummer:6); h:=h^.ZNext; z:=succ(z); END; writeln(LST); ZeilenZahl:=succ(ZeilenZahl) END; {$A-} PROCEDURE SchreibBaum(b : IdentList; AZ : integer); VAR x1,xr : integer; BEGIN IF b<>NIL THEN BEGIN IF b^.l<>NIL THEN SchreibBaum(b^.l,AZ); SchreibListe(b,az); IF b^.r<>NIL THEN SchreibBaum(b^.r,AZ) END END; {$A+*} PROCEDURE SchreibCrossListe; BEGIN MT:=3; IF PL-ZeilenZahl-MT<8 THEN NeueSeite; writeln(LST); writeln(LST,'Crossreferenz-Liste:'); writeln(LST); ZeilenZahl:=ZeilenZahl+3; SchreibBaum(CrossList,(SpaltenZahl-21-PO) DIV 6) END;