10 REM XREF: BASIC LANGUAGE CROSS-REFERENCE GENERATOR 20 REM ADAPTED FOR BASIC-PLUS BY GARY LUCKENBAUGH, 6/20/73 30 REM DSAA PROJECT DELTA 40 REM ORIGINAL PROGRAM FROM HP TIME-SHARED BASIC PROGRAM LIBRARY 120 Z1$=NUM$(100%+ASCII(SYS(CHR$(6%)+CHR$(9%)))/2%): Z1$="XREF"+MID(Z1$, 3%,LEN(Z1$)-3%)+".RUN": OPEN Z1$ FOR OUTPUT AS FILE 2%: DIM #2%, A(2940): GOSUB 10000 130 D$="0123456789": E$="ABCDEFGHIJKLMNOPQRSTUVWXYZ" 170 P2%=2941% 900 INPUT "PROGRAM NAME";P$ 920 INPUT "DO YOU WANT A CROSS REFERENCE OF LINE NUMBERS";A$: IF LEFT(A$,1%)<>"Y" THEN Q8%=2%: GOTO 1004 960 INPUT "DO YOU WANT A DICTIONARY OF VARIABLES WITH LINE REFERENCES"; A$: IF LEFT(A$,1%)="Y" THEN Q8%=3% ELSE Q8%=1% 1004 INPUT "DO YOU WANT THE LISTING DOUBLE SPACED";A$: IF LEFT(A$,1%)="Y" THEN Q5%=1% ELSE Q5%=2% 1019 OPEN P$ FOR INPUT AS FILE 1% 1020 PRINT 1025 ON ERROR GOTO 1033 1030 INPUT LINE #1%, A$: PRINT A$; 1031 A$=LEFT(A$,LEN(A$)-1%): Z%=ASCII(RIGHT(A$,LEN(A$))): IF Z%=13% OR Z%=10% THEN 1031 1032 GOTO 1050 1033 IF ERR<>11% THEN ON ERROR GOTO 0 ELSE PRINT: RESUME 1034 1034 ON ERROR GOTO 0: PRINT "IS THERE ANOTHER PROGRAM FOR "; P$; 1036 INPUT A$: IF LEFT(A$,1%)="Y" THEN INPUT "PROGRAM NAME";P$: GOTO 1019 1046 GOSUB 7000: GOTO 32767 1050 FOR P%=1% TO 5%: IF MID(A$,P%,1%)=" " THEN 1070 1060 NEXT P% 1070 I$=LEFT(A$,P%-1%): GOSUB 6000: N=I 1092 IF LEN(A$)>72% THEN I=I+40000.: GOSUB 4000: GOTO 1030 1100 GOSUB 5000: IF F%<>3% THEN 1240 1150 IF B$="GOTO" THEN 1280 ELSE IF B$="GOSUB" THEN N=N+.5: GOTO 1280 1160 IF B$="RESTORE" THEN 1280 1170 IF B$="IF" THEN 1480 1180 IF B$="DEF" THEN 1580 1190 IF B$="MAT" THEN 1680 1195 IF B$="PRINT" THEN 2600 1200 RESTORE: FOR Z9%=1% TO 7%: READ B9$ 1204 IF B$=B9$ THEN 1030 1206 NEXT Z9% 1208 DATA RETURN, STOP, END, DATA, FILES, REM, IMAGE 1220 GOSUB 5000 1230 IF F%<>2% THEN 1260 1240 GOSUB 8000: GOSUB 4000 1260 IF F1%=0% THEN 1220 ELSE 1030 1280 I$=RIGHT(A$,P%+1%): IF LEN(I$)=0% THEN 1030 ELSE GOSUB 6000 1300 IF K%=1% THEN 1330 ELSE GOSUB 4000: GOTO 1030 1330 GOSUB 5000: IF F%<>2% THEN 1380 1350 GOSUB 8000: GOSUB 4000: GOTO 1330 1380 IF B$<>"OF" THEN 1330 1385 A$=A$+CHR$(0%) 1390 FOR I%=P%+1% TO LEN(A$): IF MID(A$,I%,1%)="," THEN 1420 1410 NEXT I% 1420 I$=MID(A$,P%+1%,(I%-P%)-1%): P%=I%: GOSUB 6000: GOSUB 4000 1460 IF P%2% THEN 1530 ELSE GOSUB 8000: GOSUB 4000: GOTO 1480 1530 IF B$<>"THEN" THEN 1480 ELSE I$=RIGHT(A$,P%+1%): GOSUB 6000: GOSUB 4000: GOTO 1030 1580 GOSUB 5000: IF F%<>2% THEN 1580 ELSE I$=B$ 1610 GOSUB 5000 1620 IF F%<>2% THEN 1660 ELSE IF I$=B$ THEN 1660 1640 GOSUB 8000: GOSUB 4000 1660 IF F1%=0% THEN 1610 ELSE 1030 1680 GOSUB 5000: IF B$<>"PRINT" THEN 1970 1700 IF MID(A$,P%+1%,1%)="#" THEN 1990 ELSE GOSUB 5000 1720 IF B$<>"USING" THEN 2060 ELSE I$=MID(A$,P%+1%,1%): GOSUB 6000 1750 IF K%=1% THEN 1860 1760 FOR J%=P%+2% TO LEN(A$) 1770 I$=MID(A$,J%,1%): GOSUB 6000: IF K%=1% THEN 1810 1800 NEXT J% 1810 I$=MID(A$,P%+1%,(J%-P%)-1%): P%=J%: GOSUB 6000: GOSUB 4000: GOTO 1900 1860 GOSUB 5000: IF F%<>2% THEN 1900 ELSE GOSUB 8000: GOSUB 4000 1900 IF P%>=LEN(A$) THEN 1030 1910 GOSUB 5000 1920 B$=LEFT(B$,1%)+"[": GOSUB 8000: GOSUB 4000 1950 IF F1%=0% THEN 1910 ELSE 1030 1970 IF B$<>"READ" THEN 2040 ELSE IF MID(A$,P%+1%,1%)<>"#" THEN 2050 1990 FOR Q%=P%-1% TO LEN(A$): IF MID(A$,Q%,1%)=";" THEN 2005 2000 NEXT Q% 2005 GOSUB 5000: IF P%>Q% THEN 2060 ELSE IF F%<>2% THEN 2005 2020 GOSUB 8000: GOSUB 4000: GOTO 2005 2040 IF B$<>"INPUT" THEN 2270 2050 GOSUB 5000 2060 B$=LEFT(B$,1%)+"[": GOSUB 8000: GOSUB 4000: IF F1%=1% THEN 1030 2100 IF MID(A$,P%,1%)<>"[" THEN 2050 2110 Q1%=1%: FOR Q2%=P%+1% TO LEN(A$) 2130 IF MID(A$,Q2%,1%)="[" THEN Q1%=Q1%+1%: GOTO 2180 2140 IF MID(A$,Q2%,1%)<>"]" THEN 2190 ELSE Q1%=Q1%-1% 2180 IF Q1%=0% THEN 2200 2190 NEXT Q2% 2200 GOSUB 5000: IF P%>Q2% THEN 2060 2220 IF F%=2% THEN GOSUB 8000: GOSUB 4000 2250 IF F1%=0% THEN 2200 ELSE 1030 2270 B$=LEFT(B$,1%)+"[": GOSUB 8000: GOSUB 4000: GOSUB 5000 2300 IF B$="ZER" OR B$="CON" THEN 2330 2320 IF B$<>"IDN" THEN 2390 2330 IF F1%=1% THEN 1030 ELSE GOSUB 5000 2350 IF F%<>2% THEN 2330 ELSE GOSUB 8000: GOSUB 4000: GOTO 2330 2390 FOR I%=1% TO LEN(A$): IF MID(A$,I%,1%)="=" THEN 2420 2410 NEXT I% 2420 IF MID(A$,I%+2%,1%)<>"(" THEN 2520 2430 FOR Q2%=LEN(A$) TO 1% STEP -1%: IF MID(A$,Q2%,1%)=")" THEN 2460 2450 NEXT Q2% 2460 IF P%>Q2% THEN 2520 ELSE IF F%<>2% THEN 2500 2480 GOSUB 8000: GOSUB 4000 2500 GOSUB 5000: GOTO 2460 2520 IF F%<>2% THEN 2560 ELSE B$=LEFT(B$,1%)+"[" 2540 GOSUB 8000: GOSUB 4000 2560 IF F1%=1% THEN 1030 ELSE GOSUB 5000: GOTO 2520 2600 GOSUB 5000 2610 IF B$<>"USING" THEN 1230 ELSE I$=MID(A$,P%+1%,1%): GOSUB 6000 2640 IF K%=1% THEN 2750 2650 FOR J%=P%+2% TO LEN(A$): I$=MID(A$,J%,1%) 2670 GOSUB 6000: IF K%=1% THEN 2700 2690 NEXT J% 2700 I$=MID(A$,P%+1%,(J%-P%)-1%): P%=J% 2720 GOSUB 6000: GOSUB 4000: GOTO 2790 2750 GOSUB 5000: IF F%=2% THEN GOSUB 8000: GOSUB 4000 2790 IF P%>=LEN(A$) THEN 1030 2800 GOSUB 5000: IF F1%<>0% THEN 1030 ELSE GOSUB 8000: GOSUB 4000: GOTO 2800 3000 I$=MID(NUM$(I),2%,LEN(NUM$(I))-2%): I=0: RETURN 4000 IF P2%-P1%<=10% THEN PRINT: PRINT "PROGRAM TOO LARGE.": PRINT "THE LISTING THUS FAR WILL BE PRODUCED.": GOTO 1046 4030 ON Q8% GOTO 4032,4036,4039 4032 IF I<10000 THEN 4039 ELSE RETURN 4036 IF I>=10000 THEN 4039 ELSE RETURN 4039 J%=1% 4040 IF J%>P1% THEN 4100 4050 IF A(J%)0 THEN 4150 4200 P2%=P2%-2%: A(J%+1%)=P2%: A(P2%)=N: RETURN 5000 F%=1%: B$="": F1%=0% 5030 IF P%=LEN(A$) THEN F1%=1%: RETURN 5060 P%=P%+1%: C$=MID(A$,P%,1%) 5080 IF C$<"A" OR C$>"Z" THEN 5170 5100 ON F% GOTO 5110,5140,5140,5030 5110 IF C$="E" THEN IF MID(A$,P%-1%,1%)>="0" AND MID(A$,P%-1%,1%)<="9" THEN 5030 5116 B$=C$: F%=2%: GOTO 5030 5140 B$=B$+C$: F%=3%: GOTO 5030 5170 IF C$<"0" OR C$>"9" THEN 5250 5190 ON F% GOTO 5030,5200,5210,5030 5200 B$=B$+C$ 5210 RETURN 5250 IF C$<>"$" THEN 5290 ELSE IF F%=4% THEN 5030 5270 B$=LEFT(B$,1%)+C$: F%=2%: RETURN 5290 IF C$<>"[" THEN 5330 ELSE IF F%<>2% THEN 5030 5310 B$=LEFT(B$,1%)+C$: RETURN 5330 IF C$<>'"' THEN 5390 5350 ON F% GOTO 5360,5380,5380,5000 5360 F%=4%: GOTO 5030 5380 RETURN 5390 ON F% GOTO 5000,5400,5400,5030 5400 RETURN 6000 I,K%=0: J1%=1%: J1%=J1%+1% WHILE INSTR(1%,D$,MID(I$,J1%,1%)) AND J1%<=LEN(I$) 6010 I=VAL(LEFT(I$,J1%-1%)): IF J1%<=LEN(I$) THEN K%=1% 6080 RETURN 7000 GOSUB 8500: GOSUB 8500: J%=1%: PRINT "PROGRAM NAME IS: ";P$: GOSUB 8500 7032 IF Q8%=2% THEN 7180 ELSE IF A(1%)>9999 OR A(1%)=0 THEN 7176 7035 GOSUB 8500: PRINT " CROSS REFERENCE OF LINE NUMBERS " "(S = GOSUB REFERENCE):": GOSUB 8500: PRINT TAB(4%); "LINE NO. REFERENCED BY:": S$="S" 7120 I=A(J%): GOSUB 3000: PRINT TAB(10-LEN(I$));I$;: GOSUB 9000: J%=J%+2%: IF A(J%)<=9999 AND A(J%)<>0 THEN 7120 7175 IF Q8%=1% THEN 7580 7176 IF A(J%)>12610 OR A(J%)=0 THEN 7335 7180 GOSUB 8500: PRINT " DICTIONARY OF SIMPLE VARIABLES WITH " "LINE REFERENCES:": S$=" " 7210 GOSUB 8500 7250 K=A(J%)-10000: I=INT(K/100): B$=MID(E$,I,1%): IF I*100=K THEN 7300 ELSE I=K-I*100: B$=LEFT(B$,1%)+MID(D$,I,1%) 7300 PRINT TAB(7%);B$;: IF Q5%<>2% THEN PRINT 7310 GOSUB 9000: J%=J%+2%: IF A(J%)<=12610 AND A(J%)<>0 THEN 7250 7335 IF A(J%)>20026 OR A(J%)=0 THEN 7455 7340 GOSUB 8500: PRINT " DICTIONARY OF DIMENSIONED VARIABLES WITH" " LINE REFERENCES:": GOSUB 8500 7410 I$=MID(E$,A(J%)-20000,1%): PRINT TAB(7%);I$;"[]"; 7422 IF Q5%<>2% THEN PRINT 7430 GOSUB 9000: J%=J%+2% 7450 IF A(J%)<=20026 AND A(J%)<>0 THEN 7410 7455 IF A(J%)>30026 OR A(J%)=0 THEN 7580 7460 GOSUB 8500: PRINT " DICTIONARY OF STRING VARIABLES WITH " "LINE REFERENCES:": GOSUB 8500 7530 I$=MID(E$,A(J%)-30000,1%): PRINT TAB(7%);I$;"$"; 7542 IF Q5%<>2% THEN PRINT 7550 GOSUB 9000: J%=J%+2%: IF A(J%)<=30026 AND A(J%)<>0 THEN 7530 7580 GOSUB 8500: IF A(J%)=0 THEN 7670 ELSE PRINT " LIST OF LINES" " WITH MORE THAN 72 CHARACTERS": PRINT " (AND HENCE " "UNPROCESSED):": GOSUB 8500 7620 I=A(J%)-40000: GOSUB 3000: PRINT TAB(10-LEN(I$));I$: J%=J%+2%: IF A(J%)<>0 THEN 7620 7670 GOSUB 8500: GOSUB 8500: RETURN 8000 C$=MID(B$,1%,1%): IF C$>="A" AND C$<="Z" THEN 8060 8020 I$=B$: GOSUB 6000: RETURN 8060 FOR J=1 TO 26: IF C$=MID(E$,J,1%) THEN 8100 8090 NEXT J 8100 IF LEN(B$)>1% THEN 8130 ELSE I=J*100+10000: RETURN 8130 C$=MID(B$,2%,1%): IF C$="[" THEN I=J+20000: RETURN 8150 IF C$="$" THEN I=J+30000: RETURN 8160 I$=C$: GOSUB 6000: I=J*100+I+10001: RETURN 8500 PRINT: PRINT: RETURN 9000 J3%=J%: C%=0% 9010 J3%=A(J3%+1%): I=A(J3%): IF I=INT(I) THEN R$=" " ELSE R$=S$ 9029 I=INT(I): GOSUB 3000: IF C%=10% THEN C%=0%: PRINT 9038 C%=C%+1%: PRINT TAB(12%);" ";SPACE$(4%-LEN(I$));R$;I$; 9050 IF A(J3%+1%)<>0 THEN 9010 ELSE PRINT: RETURN 10000 FIELD #2%, 512% AS Z2$: Z$=CHR$(0%): Z$=Z$+Z$ UNTIL LEN(Z$)=512% 10010 LSET Z2$=Z$: PUT #2% FOR A%=1% TO 23%: RETURN 32767 CLOSE 1%,2%: KILL Z1$: END