1! LAWRENCE UNIVERSITY COMPUTER CENTER APPLETON, WISCONSIN 54911 (414) 739-3681, EXT 564 PROGRAM NAME, VERSION AND DATE: XREF, VERSION 1A, 18-JUN-74 PROGRAM AUTHORSHIP: 2! XREF WAS WRITTEN AND DESIGNED BY PAUL KONING OF THE LAWRENCE UNIVERSITY COMPUTER CENTER. PURPOSE OF PROGRAM: XREF IS A PROGRAM FOR MAKING A CROSS REFERENCE TABLE OF A BASIC- PLUS PROGRAM. 3! LANGUAGE AND OPERATING SYSTEM: XREF IS WRITTEN IN BASIC-PLUS FOR OPERATION UNDER RSTS V4A-12 ON A PDP11/20 OR PDP11/35 WITH 28K OF CORE. IT WILL ALSO OPERATE UNDER RSTS/E, SINCE IT DOES NOT USE ANY FUNCTIONS 4! PECULIAR TO RSTS V4A-12. 10! AVAILABILITY: XREF IS A NON-PROPRIETARY PROGRAM PRODUCT OF LAWRENCE UNIVERSITY. IT IS DISTRIBUTED AT COST FOR EDUCATIONAL USE, ON THE CONDITION THAT IT NOT BE SOLD, RENTED OR LEASED FOR PROFIT. LIMITATIONS: 11! XREF ASSUMES THAT THE PROGRAM IT CROSS-REFERENCES IS SYNTACTICALLY CORRECT AND THAT 'ERL' ONLY OCCURS IN EXPRESSIONS OF THE FORM: ERL=10 OR ERL<>35. FURTHER DOCUMENTATION: 12! XREF IS STARTED (ASSUMING IT IS SAVED ON [1,2]) BY TYPING: RUN $XREF. XREF WILL ASK: WHICH PROGRAM DO YOU WANT CROSS- REFERENCED? . TYPE IN THE PROGRAM NAME, WITHOUT EXTENSION, BUT 13! IF DESIRED WITH DEVICE SPECIFICATION OR ACCOUNT NUMBER. XREF WILL PRINT OUT 'PASS 1' AND WHILE LATER 'PASS 2'. THEN IT WILL PRINT OUT A HEADER AND ALL LINE NUMBERS OCCURRING IN THE PROGRAM 14! FOLLOWED BY THE NUMBERS OF THE LINES THAT REFERENCE THAT LINE. LINES THAT ARE REFERENCED BUT DO NOT EXIST IN THE PROGRAM ARE MARKED 'UNDEF' (FOR UNDEFINED). NO FURTHER OPERATOR INTERACTION IS NEEDED. 15! XREF CAN BE SAVED IN COMPILED OR SOURCE FORM ON THE SYSTEM LIBRARY [1,2] WITH A PROTECTION CODE OF <40>. 20! DISCLAIMER: NEITHER THE AUTHORS OF THIS PROGRAM NOR LAWRENCE UNIVERSITY ASSUME ANY LIABILITY, EXPRESSED OR IMPLIED, WITH RESPECT TO THE CORRECTNESS OR PERFORMANCE OF THIS PROGRAM. 95 PRINT "XREF V1A -- BASIC-PLUS CROSS REFERENCE PROGRAM -- LAWRENCE" 100 &"WHICH PROGRAM DO YOU WANT CROSS-REFERENCED";:INPUTLINE F$:F$=F$+".BAS": OPEN F$ FOR INPUT AS FILE 1%:ON ERROR GOTO 200 : OPEN"CREF"+NUM$(ASCII(SYS(CHR$(6%)+CHR$(9%)))/2%)+".TMP" FOR OUTPUT AS FILE 2% 110 DIM P%(200%),N%(200%),S1%(100%),S2%(400%):DIM #2%,L%(200%,50%): MAT P%=ZER:MAT N%=ZER:I%=0%:&"PASS 1" 120 GOSUB 220 :I%=I%+1%:P%(I%)=VAL(LEFT(S2$,INSTR(1%,S2$,CHR$(255%))-1%)): GOTO 120 IF I%<200%:&"TOO MANY LINES IN FILE":GOTO 400 130 CLOSE 1%:OPEN F$ FOR INPUT AS FILE 1%:ON ERROR GOTO 210 :&"PASS 2" 140 GOSUB 220 :W%=VAL(LEFT(S2$,INSTR(1%,S2$,CHR$(255%))-1%)):Q%=1%: O%=FNM%(INSTR(1%,S2$,"!"),INSTR(1%,S2$,"DATA")):O%=32767% UNLESS O% 150 GOSUB 290 :IF R% THEN GOSUB 390 :L%(S%,N%(S%))=W%:Q%=R%: N%(S%)=N%(S%)+1%:GOTO 150 160 GOTO 140 170 CLOSE 1%:&CHR$(13%);CHR$(12%),"CROSS REFERENCE TABLE": &:&"LINE #",,"REFERENCES":&:FOR J%=1% TO I% 180 &ABS(P%(J%));:&" UNDEF"; IF P%(J%)<0%:&,:FOR K%=1% TO N%(J%): &USING"##### ",L%(J%,K%-1%);:IF K%/7%*7%=K% THEN &:&, 190 NEXT K%:&"*** NOT REFERENCED ***" UNLESS N%(J%):& IF POS(0%): NEXT J%:GOTO 400 200 IF ERR=11% THEN RESUME 130 ELSE ON ERROR GOTO 0 210 IF ERR=11% THEN RESUME 170 ELSE ON ERROR GOTO 0 220 Z%=1%:N1%=0% 230 INPUT LINE #1%,S1$:CHANGE S1$ TO S1%:FOR S1%=1% TO S1%(0%):S9%=S1%(S1%): IF S9%<33% THEN 250 ELSE IF S9%>47% AND S9%<58% THEN N1%=-1% ELSE IF S9%>96% AND S9%<123% THEN S9%=S9%-32% ELSE IF S9%=34% OR S9%=39% THEN S3%= INSTR(S1%+1%,S1$,CHR$(S9%)):IF S3%=0% THEN 250 ELSE S1%=S3%:GOTO 250 240 S2%(Z%)=S9%:Z%=Z%+1%:IF (S9%>57% OR S9%<48%) AND N1% THEN S2%(Z%-1%)=255%: S2%(Z%)=S9%:Z%=Z%+1%:N1%=0% 250 NEXT S1%:IF INSTR(1%,S1$,CHR$(10%))"),FNI%("ERL=")), FNI%("GOSUB")),FNJ%),FNK%("GOTO")),FNK%("RESUME")), FNK%("THEN")),FNK%("ELSE")):RETURN 300 DEF FNM%(A1%,A2%):A1%=A2% IF A2% AND A2%47% AND S2%(Z2%)<58% THEN Z2%=Z2%+1%:GOTO 330 340 IF S2%(Z2%)=255% AND S2%(Z2%+1%)=44% THEN FNJ%=Z2%+2% ELSE FNJ%=0% 350 FNEND 360 DEF FNK%(Z$)=FNO%(Q%,Z$) 370 DEF FNL%(A%,A$):Z1%=INSTR(A%,S2$,A$):Z1%=Z1%+LEN(A$) IF Z1%: FNL%=Z1%:FNEND 380 DEF FNO%(A%,A$):X%=FNL%(A%,A$):X%=FNO%(X%,A$) IF X% AND (S2%(X%)<48% OR S2%(X%)>57%):FNO%=X%:FNEND 390 Z1%=VAL(MID(S2$,R%,INSTR(R%,S2$,CHR$(255%))-R%)):RETURN IF Z1%=ABS(P%(S%)) FOR S%=1% TO I%:S%,I%=I%+1%:P%(I%)=-Z1%:RETURN 400 CLOSE 1%,2%:KILL "CREF"+NUM$(ASCII(SYS(CHR$(6%)+CHR$(9%)))/2%)+".TMP" 32767 END