External Cross::Insym(1);{$L-}{$C-}{$E-} Procedure InSymbol(Var Dbl_DecF,Dbl_DecL:Dbl_Ptr;Var CurProc:List_Ptr_Ty); Label 1; Var Base:Integer;Base_Set:Set Of Char; OLD_SPACES_MARK, (*ALTER ZEICHENVORSCHUB BEI FORMATIERUNG VON KOMMENTAREN*) I : INTEGER; OLDSYTY: SYMBOL; PROCEDURE READBUFFER; PROCEDURE READLINE; VAR Exit:Boolean; CH : CHAR; BEGIN (*READLINE*) REPEAT Exit:=False; WHILE HACK_EOLN (OLDSOURCE) AND NOT (EOF (OLDSOURCE)) DO BEGIN READLN (OLDSOURCE); BEGIN IF REALLINCNT = MAXLINE THEN HEADER; LINECNT := LINECNT + 1; REALLINCNT := REALLINCNT + 1; WRITELN (CROSSLIST,' ' : 12,LINECNT * INCREMENT : 5); WRITE_LINE_NUMBER;WriteLin; IF MAXINC = LINECNT THEN NEWPAGE; END; END; IF NOT EOF(OLDSOURCE) THEN READ (OLDSOURCE,CH); UNTIL (CH <> ' ') OR (EOF (OLDSOURCE)); {%E} BUFFLEN := 0; REPEAT Exit:=False; BUFFLEN := BUFFLEN + 1; BUFFER [BUFFLEN] := CH; IF (HACK_EOLN (OLDSOURCE) OR (BUFFLEN = 147)) OR (EOF(OLDSOURCE)) THEN Exit:=True; If Not Exit Then Read (OLDSOURCE,CH); UNTIL Exit; IF NOT (HACK_EOLN (OLDSOURCE)) THEN BEGIN WRITELN (OUTPUT); WRITELN (OUTPUT,'Line ',(LINECNT+1)*INCREMENT : 5,'Too long'); WRITELN (CROSSLIST,' ' : 17,' **** Next line too long ****'); END ELSE IF NOT (EOF (OLDSOURCE)) THEN BEGIN READLN (OLDSOURCE); END; BUFFERPTR := 1; BUFFMARK := 0; END (*READLINE*) ; {%E} BEGIN (*READBUFFER*) IF BUFFERPTR = BUFFLEN + 2 THEN BEGIN WR_LINE (BUFFERPTR); CH := ' '; IF EOF (OLDSOURCE) THEN EOB := TRUE ELSE READLINE; END ELSE BEGIN CH := BUFFER [BUFFERPTR]; BUFFERPTR := BUFFERPTR + 1; END; END (*READBUFFER*) ; PROCEDURE PARENTHESE; VAR OLD_SPACES_MARK : INTEGER; (*ALTER ZEICHENVORSCHUB BEI FORMATIERUNG VON KLAMMERN*) BEGIN (*PARENTHESE*) OLD_SPACES_MARK := SPACES; IF OLDSPACES THEN SPACES := LASTSPACES + BUFFERPTR - 2 ELSE BEGIN LASTSPACES := SPACES; SPACES := SPACES + BUFFERPTR - 2; OLDSPACES := TRUE; END; REPEAT INSYMBOL(Dbl_DecF,Dbl_DecL,CurProc) UNTIL SYTY IN [RPARENT,EOBSY]; SPACES := OLD_SPACES_MARK; OLDSPACES := TRUE; INSYMBOL(Dbl_DecF,Dbl_DecL,CurProc); END (*PARENTHESE*) ; {%E} FUNCTION RESWORD: BOOLEAN ; LABEL 1; VAR I : INTEGER; BEGIN (*RESWORD*) RESWORD:= FALSE; FOR I:=RESNUM[CHCNT] TO RESNUM [CHCNT + 1] -1 DO IF RESLIST[ I ] = SY THEN BEGIN RESWORD := TRUE; SYTY := RESSY [I]; If Syty=Sub_Program Then Begin SyTy:=OtherSy; No_Main:=True; End; GOTO 1; END; 1: END (*RESWORD*) ; {%E} PROCEDURE FINDNAME; LABEL 1; VAR PROCPTR : PROC_CALL_TYPE; (*ZEIGER AUF RUFENDE BZW. GERUFENE PROZEDUR BEI DEREN VERKETTUNG*) LPTR: LIST_PTR_TY; (*ZEIGER AUF DEN VORGAENGER IM BAUM*) ZPTR : LINE_PTR_TY; (*ZEIGER AUF DIE VORLETZTE ZEILENNUMMER IN EINER KETTE*) RIGHT: BOOLEAN; (*MERKVARIABLE FUER DIE VERZWEIGUNG IM BAUM*) INDEXCH : CHAR; (*INDEXVARIABLE FUER DAS FELD DER STARTZEIGER (FIRSTNAME)*) PROCEDURE FINDPROC (COMP : LIST_PTR_TY); VAR PROCCALLPTR : PROC_CALL_TYPE; (*MERK SICH LETZTE PROZEDUR FALLS EINE NEUE ERZEUGT WERDEN MUSS*) BEGIN (*FINDPROC*) WHILE (PROCPTR^.PROCNAME <> COMP) AND (PROCPTR^.NEXTPROC <> NIL) DO PROCPTR := PROCPTR^.NEXTPROC; IF PROCPTR^.PROCNAME = COMP THEN BEGIN ZPTR := PROCPTR^.LAST; NEW (PROCPTR^.LAST); WITH PROCPTR^.LAST^ DO BEGIN LINENR := LINECNT + 1; PAGENR := PAGECNT; CONTLINK := NIL; END; ZPTR^.CONTLINK := PROCPTR^.LAST; END ELSE BEGIN PROCCALLPTR := PROCPTR; NEW (PROCPTR); WITH PROCPTR^ DO BEGIN PROCNAME := COMP; NEXTPROC := NIL; NEW (FIRST); WITH FIRST^ DO BEGIN LINENR := LINECNT + 1; PAGENR := PAGECNT; CONTLINK := NIL; END; LAST := FIRST; END; PROCCALLPTR^.NEXTPROC := PROCPTR; END; END (*FINDPROC*) ; {%E} PROCEDURE NEWPROCEDURE; BEGIN (*NEWPROCEDURE*) WITH LISTPTR^ DO BEGIN PROCVAR := PROCDEC; NEW (CALLEDBY); WITH CALLEDBY^ DO BEGIN PROCNAME := CURPROC; NEXTPROC := NIL; NEW (FIRST); WITH FIRST^ DO BEGIN LINENR := LINECNT + 1; PAGENR := PAGECNT; CONTLINK := NIL; END; LAST := FIRST; END; NEW (CALLED); WITH CALLED^ DO BEGIN PROCNAME := FIRSTNAME ['M']; NEXTPROC := NIL; NEW (FIRST); WITH FIRST^ DO BEGIN LINENR := LINECNT + 1; PAGENR := PAGECNT; CONTLINK := NIL; END; LAST := FIRST; END; END; NEW (PROC_CL^.NEXTPROC); PROC_CL := PROC_CL^.NEXTPROC; WITH PROC_CL^ DO BEGIN PROCNAME := LISTPTR; NEXTPROC := NIL; LINENR := LINECNT + 1; PAGENR := PAGECNT; PROCLEVEL := LEVEL; END; END (*NEWPROCEDURE*) ; {%E} BEGIN (*FINDNAME*) INDEXCH := SY [1]; LISTPTR := FIRSTNAME [INDEXCH]; WHILE LISTPTR <> NIL DO BEGIN LPTR:= LISTPTR; IF SY = LISTPTR^.NAME THEN BEGIN ZPTR := LISTPTR^.LAST; NEW (LISTPTR^.LAST); WITH LISTPTR^.LAST^ DO BEGIN LINENR := LINECNT + 1; PAGENR := PAGECNT; CONTLINK := NIL; END; ZPTR^.CONTLINK := LISTPTR^.LAST; IF LISTPTR^.PROCVAR <> 0 THEN BEGIN IF LISTPTR^.PROCVAR = 2 THEN WHILE CH = ' ' DO BEGIN SYLENG := SYLENG + 1; READBUFFER; END; IF (CH <> ':') OR (LISTPTR^.PROCVAR = 1) THEN BEGIN PROCPTR := LISTPTR^.CALLEDBY; FINDPROC (CURPROC); PROCPTR := CURPROC^.CALLED; FINDPROC (LISTPTR); END END {%E} ELSE IF PROCDEC <> 0 THEN BEGIN IF DBL_DECF = NIL THEN BEGIN NEW (DBL_DECF); DBL_DECL := DBL_DECF; END ELSE BEGIN NEW (DBL_DECL^.NEXTPROC); DBL_DECL := DBL_DECL^.NEXTPROC; END; DBL_DECL^.NEXTPROC := NIL; DBL_DECL^.PROCORT := LISTPTR; NEWPROCEDURE; END; GOTO 1; END ELSE IF SY > LISTPTR^.NAME THEN BEGIN LISTPTR:= LISTPTR^.RLINK; RIGHT:= TRUE; END ELSE BEGIN LISTPTR:= LISTPTR^.LLINK; RIGHT:= FALSE; END; END; {%E} NEW (LISTPTR); WITH LISTPTR^ DO BEGIN NAME := SY; LLINK := NIL; RLINK := NIL; END; IF FIRSTNAME [INDEXCH] = NIL THEN FIRSTNAME [INDEXCH] := LISTPTR ELSE IF RIGHT THEN LPTR^.RLINK := LISTPTR ELSE LPTR^.LLINK := LISTPTR; WITH LISTPTR^ DO BEGIN NEW (FIRST); WITH FIRST^ DO BEGIN LINENR := LINECNT + 1; PAGENR := PAGECNT; CONTLINK := NIL; END; LAST := FIRST ; IF PROCDEC = 0 THEN BEGIN PROCVAR := 0; CALLED := NIL; CALLEDBY := NIL; END ELSE NEWPROCEDURE; END; 1: PROCDEC := 0; END (*FINDNAME*) ; {%E} PROCEDURE CHECK_E(Pos:Integer); {CHECK FOR THE E OPTION AND PAGE IF SO} BEGIN If (Buffer[Pos+1]='%')And ((Buffer[Pos+2]='E')Or(Buffer[Pos+2]='e')) Then NewPage; End; Procedure SkipComment(C:Char;Pos:Integer); Begin {Skip over comments checking for eject option} IF C='{' Then Begin Check_E(Pos-1); While (CH<>'}')And (Not Eob) Do Begin ReadBuffer; End; End Else Begin ReadBuffer; Check_E(Pos); Repeat ReadBuffer Until(Ch=')')And(Buffer[BufferPtr-2]='*')Or Eob; End; End; {%E} PROCEDURE FINDCOMMENT; LABEL 1; VAR C: CHAR; I: INTEGER; FOUND: BOOLEAN; BEGIN I:= BUFFERPTR - 1; C:= ' '; FOUND := FALSE; WHILE (C=' ') AND (I'{')And(Ch<>'(')Do ReadBuffer; SkipComment(Ch,BufferPtr); END; ReadBuffer; End; FUNCTION UPPER(C:CHAR):CHAR; BEGIN IF (C>='a')And(C<='z') Then Upper:=CHR(ORD(C)-Ord('a')+ord('A')) Else Upper:=C; End; {%E} BEGIN (*INSYMBOL*) SYLENG := 0; WHILE ((CH IN ['(',' ','?','!','@'])OR(CH='{') OR(CH='}'))AND NOT EOB DO BEGIN IF (CH = '{') OR (CH = '(') AND (BUFFER[BUFFERPTR] = '*') THEN BEGIN OLD_SPACES_MARK := SPACES; IF OLDSPACES THEN SPACES := LASTSPACES ELSE LASTSPACES := SPACES; SPACES := SPACES + BUFFERPTR - 1; OLDSPACES := TRUE; SkipComment(CH,BufferPtr); SPACES := OLD_SPACES_MARK; OLDSPACES := TRUE; END ELSE IF CH = '(' THEN GOTO 1; READBUFFER; END; IF CH = '''' THEN BEGIN SYTY := STRGCONST; REPEAT READBUFFER; UNTIL (CH = '''') OR EOB; READBUFFER; END ELSE IF CH IN LETTERS THEN BEGIN SYLENG := 0; REPEAT SYLENG := SYLENG + 1; IF SYLENG <= 10 THEN SY [SYLENG] :=UPPER(CH); READBUFFER; UNTIL NOT (CH IN ALPHANUM); FOR I := SYLENG + 1 TO 10 DO SY [I] := ' '; IF SYLENG > 10 THEN CHCNT := 10 ELSE CHCNT := SYLENG; IF NOT RESWORD THEN BEGIN SYTY := IDENT ; FINDNAME; END END ELSE {%E} IF CH IN DIGITS THEN BEGIN Base:=0; REPEAT If Base<36 Then Base:=Base*10+Ord(Ch)-Ord('0'); READBUFFER; UNTIL NOT (CH IN DIGITS); SYTY := INTCONST; If (Ch='#')And (Base<36) Then Begin Base_Set:=Digits; For Base:=Base DownTo 11 Do Base_Set:=Base_Set+[Chr(Base-11+Ord('A'))]; Repeat ReadBuffer; Until Not(Ch In Base_Set); End; BEGIN IF CH = '.' THEN BEGIN REPEAT READBUFFER UNTIL NOT (CH IN DIGITS); SYTY := OTHERSY; END; IF (CH = 'E')OR(CH='e') THEN BEGIN READBUFFER; IF CH IN ['+','-'] THEN READBUFFER; WHILE CH IN DIGITS DO READBUFFER; SYTY := OTHERSY; END; END; END ELSE IF CH <> ' ' THEN BEGIN 1 : OLDSYTY := SYTY; If (CH<' ')Or(CH>'_')Then SYTY:=OTHERSY Else SYTY := DELSY [CH]; READBUFFER; IF (OLDSYTY=ENDSY) AND (SYTY=SEMICOLON) THEN FINDCOMMENT; IF SYTY = LPARENT THEN PARENTHESE ELSE IF (SYTY = COLON) AND (CH = '=') THEN BEGIN SYTY := OTHERSY; READBUFFER; END; END ELSE SYTY := EOBSY; END (*INSYMBOL*) ; .