REM SLEUTH.BAS * PGM FOR CBASIC CROSS REFERENCE REM * 1135 REM 02 28 83 * J.BUTLER PRINT:PRINT "CROSSREF - CBASIC VERSION" PRINT:PRINT " BY JAMES MONAGAN" PRINT:PRINT "LISTS ALL VARIABLES & REFERENCED LINE #'S" PRINT"------------------------------------------" FF$=CHR$(12) C$="-----------":FOR I=1 TO 7:SSS$=SSS$+C$:NEXT I DIM RWS$(100),PT%(25) SC=500:SK=91:SN=SK-26:SA=SN+1-ASC("A") DIM VNXT%(SC+SK),V$(SC+SK),FRST%(SC),LST%(SC),RFL%(5*SC),NXT%(5*SC) REM RESERVED WORDS DATA ABS,AND,ASC,AS,ATN,CALL,CHAIN,CHR$,CLOSE,COMMON DATA CONSOLE,COS,CREATE,CRUN,DATA DATA DEF,DELETE,DIM DATA ELSE,END,EQ,EXP,FEND,FILE,FOR,FRE DATA GE,"GO SUB","GO TO",GOSUB,GOTO DATA IF,INPUT,INP,INT,LEFT$,LE,LEN,LET,LINE DATA LOG,LPRINTER,LT,MATCH,MID$ DATA NE,NEXT,NOT,ON,OPEN,OR,OUT DATA PEEK,POKE,POS,PRINT,RANDOMIZE,READ,RECL DATA REM,REMARK,RENAME,RESTORE,RETURN,RIGHT$,RND DATA SGN,SIN,SIZE,SQR,STEP,STOP,STR$,STRING$ DATA TAB,TAN,THEN,TO DATA USING,VAL,WEND,WHILE,WIDTH,XOR,^ REM FILL ARRAY WITH RESERVED WORDS RW=0 300 READ RW$ RW=RW+1:RWS$(RW)=RW$ IF RW$="^" THEN 350 I=ASC(RW$)-ASC("A") IF PT%(I)=0 THEN PT%(I)=RW GOTO 300 350 FOR I=0 TO 25 IF PT%(I)=0 THEN PT%(I)=RW NEXT I REM GET SOURCE FILE NAME F=1 410 PRINT:INPUT " CBASIC SOURCE FILE NAME = ";LINE F$ IF F$="" THEN STOP IF MATCH(".",F$,2)=0 THEN F$=F$+".BAS" IF END #F THEN 410 OPEN F$ AS F PRINT:INPUT "INCLUDE '%INCLUDED' PROGRAMS ";C$ IF MID$(C$,1,1)="Y" OR MID$(C$,1,1)="y" THEN INC=1 ELSE INC=0 PRINT:INPUT "DATE = ";D$ PRG$="/"+F$+" - "+D$ GOSUB 610 LPRINTER:PRINT FF$:CONSOLE STOP REM INITIALIZE FOR CROSS REFERENCE 610 LC=0:PZ=0:V$="":C$="":VC=SK:RC=-1 FOR I=0 TO SK:VNXT%(I)=-1:NEXT I 630 IF END #F THEN 1200 650 IF F=1 THEN LN$=":" ELSE LN$="=" REM INPUT SOURCE LINE 670 READ #F;LINE L$ LG=LEN(L$):BRNCH=0:LC=LC+1 LP=0:LN=LC:PRINT STR$(LN);LN$ REM CHECK FOR COMPILER DIRECTIVES IF INC=0 OR MATCH("%INCLUDE",L$,1)<>1 THEN 700 LP=9 690 C$=MID$(L$,LP,1) IF C$<"A" AND C$>"" THEN LP=LP+1:GOTO 690 F$=MID$(L$,LP,14) IF F$="" THEN 670 REM OPEN INCLUDED SOURCE FILE PRINT L$ IF END #F+1 THEN 670 OPEN F$ AS F+1:F=F+1:GOTO 630 700 IF MID$(L$,1,1)="%" THEN 670 REM PARSE LINE 750 LP=LP+1 IF LP>LG THEN GOSUB 1010:GOTO 670 C$=MID$(L$,LP,1) IF C$>="A" AND C$<="Z" THEN 1110 IF C$>="a" AND C$<="z" THEN C$=CHR$(ASC(C$)-32):GOTO 1110 IF C$>="0" AND C$<="9" THEN 1150 IF C$=" " OR C$=CHR$(9) THEN GOSUB 1010:GOTO 750 IF C$="." AND V$>"" THEN 1120 IF C$="\" THEN GOSUB 1010:GOTO 670 IF C$<>"," THEN BRNCH=0 IF C$<>CHR$(34) THEN 780 GOSUB 1010:LP=MATCH(C$,L$,LP+1) IF LP>0 THEN GOTO 750 ELSE GOTO 670 780 IF C$="$" OR C$="%" THEN 1130 GOSUB 1010 GOTO 750 REM TEST FOR COMMAND 890 C=ASC(V$):P=PT%(C-ASC("A")):BRNCH=0:RW$="" 900 IF CRWS$(P) THEN P=P+1:GOTO 900 RW$=V$ IF V$="DATA" OR V$="REM" OR V$="REMARK" THEN LP=LG+1:RETURN IF V$="GOTO" OR V$="GOSUB" OR V$="THEN" THEN BRNCH=1 RETURN REM END VARIABLE 1010 IF V$="" THEN RETURN IF ASC(V$)"" THEN V$="":RETURN IF C$="(" THEN V$=V$+C$ C=ASC(V$)+SA:IL=-1:I=C 1020 IF LEFT$(V$+" ",9)<=LEFT$(V$(I)+" ",9) THEN 1050 IL=I:I=VNXT%(I) IF I>0 THEN GOTO 1020 ELSE GOTO 1060 1030 IF VAL(V$)<1000 THEN C=INT(VAL(V$)/100) ELSE C=9+INT(VAL(V$)/1000) IF C>SN THEN C=SN IL=-1:I=C 1040 IF VAL(V$)<=VAL(V$(I)) THEN 1050 IL=I:I=VNXT%(I) IF I>0 THEN GOTO 1040 ELSE GOTO 1060 1050 IF V$<>V$(I) THEN 1060 J=LST%(I-SK) IF RFL%(J)=LN THEN GOTO 1090 ELSE RC=RC+1:NXT%(J)=RC:GOTO 1080 1060 VC=VC+1 IF IL>=0 THEN VNXT%(IL)=VC V$(VC)=V$:VNXT%(VC)=I:RC=RC+1:FRST%(VC-SK)=RC:I=VC 1080 RFL%(RC)=LN:NXT%(RC)=-1:LST%(I-SK)=RC 1090 V$="":RETURN REM EXPAND VARIABLE 1110 IF VAL(V$)>0 AND VAL(V$)=VAL(V$+MID$(L$,LP,255)) THEN GOSUB 1020 1120 V$=V$+C$:GOTO 750 1130 IF V$<>"" THEN V$=V$+C$ GOTO 750 1150 IF V$>"" OR BRNCH>0 THEN V$=V$+C$ GOTO 750 REM END OF SOURCE FILE 1200 CLOSE F IF F>1 THEN F=F-1:GOTO 650 REM PRINT SYMBOL TABLE PZ=0:LPRINTER WIDTH 80:GOSUB 1400:SZ=-1 FOR J=0 TO SK:V=J 1230 V=VNXT%(V) IF V<0 THEN 1340 IF LZ>56 THEN GOSUB 1400:GOTO 1250 SZ=SZ+1 IF SZ=3 THEN GOSUB 1410 1250 RZ=0:I=FRST%(V-SK):PRINT V$(V); 1260 IF RZ=0 THEN PRINT TAB(16); LN=RFL%(I) PRINT USING " ####";LN; RZ=RZ+1 IF RZ<6 THEN 1280 RZ=0:PRINT:LZ=LZ+1 IF LZ>56 THEN GOSUB 1400 1280 I=NXT%(I) IF I>0 THEN 1260 IF RZ>0 THEN PRINT:LZ=LZ+1 GOTO 1230 1340 NEXT J PRINT SSS$ PRINT "LINES:";LC;" SYMBOLS:";VC-SK;" REFERENCES:";RC+1 LZ=LZ+2:RETURN 1400 GOSUB 1520:PRINT "SYMBOL";TAB(20);"REFERENCE LINE":LZ=LZ+1 1410 PRINT SSS$:LZ=LZ+1:SZ=0:RETURN 1520 PRINT FF$ PZ=PZ+1:PRINT TAB(72);"PG$";PZ PRINT PRG$:PRINT LZ=3:RETURN END