home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol163 / sleuth.bas < prev    next >
Encoding:
BASIC Source File  |  1984-04-29  |  4.7 KB  |  219 lines

  1.     REM SLEUTH.BAS * PGM FOR CBASIC CROSS REFERENCE 
  2.     REM            * 1135
  3.         REM 02 28 83   * J.BUTLER
  4.  
  5.     PRINT:PRINT "CROSSREF  -  CBASIC VERSION"
  6.     PRINT:PRINT "                BY JAMES MONAGAN"
  7.     PRINT:PRINT "LISTS ALL VARIABLES & REFERENCED LINE #'S"
  8.     PRINT"------------------------------------------"
  9.  
  10.     FF$=CHR$(12)
  11.     C$="-----------":FOR I=1 TO 7:SSS$=SSS$+C$:NEXT I
  12.  
  13.     DIM RWS$(100),PT%(25)
  14.  
  15.     SC=500:SK=91:SN=SK-26:SA=SN+1-ASC("A")
  16.     DIM VNXT%(SC+SK),V$(SC+SK),FRST%(SC),LST%(SC),RFL%(5*SC),NXT%(5*SC)
  17.  
  18. REM    RESERVED WORDS
  19.     DATA ABS,AND,ASC,AS,ATN,CALL,CHAIN,CHR$,CLOSE,COMMON
  20.     DATA CONSOLE,COS,CREATE,CRUN,DATA
  21.     DATA DEF,DELETE,DIM
  22.     DATA ELSE,END,EQ,EXP,FEND,FILE,FOR,FRE
  23.     DATA GE,"GO SUB","GO TO",GOSUB,GOTO
  24.     DATA IF,INPUT,INP,INT,LEFT$,LE,LEN,LET,LINE
  25.     DATA LOG,LPRINTER,LT,MATCH,MID$
  26.     DATA NE,NEXT,NOT,ON,OPEN,OR,OUT
  27.     DATA PEEK,POKE,POS,PRINT,RANDOMIZE,READ,RECL
  28.     DATA REM,REMARK,RENAME,RESTORE,RETURN,RIGHT$,RND
  29.     DATA SGN,SIN,SIZE,SQR,STEP,STOP,STR$,STRING$
  30.     DATA TAB,TAN,THEN,TO
  31.         DATA USING,VAL,WEND,WHILE,WIDTH,XOR,^ 
  32.  
  33.     REM    FILL ARRAY WITH RESERVED WORDS
  34.  
  35.     RW=0
  36. 300    READ RW$
  37.     RW=RW+1:RWS$(RW)=RW$
  38.         IF RW$="^" THEN 350
  39.     I=ASC(RW$)-ASC("A")
  40.     IF PT%(I)=0 THEN PT%(I)=RW
  41.     GOTO 300
  42.  
  43. 350    FOR I=0 TO 25
  44.     IF PT%(I)=0 THEN PT%(I)=RW
  45.     NEXT I
  46.  
  47.     REM    GET SOURCE FILE NAME
  48.  
  49.     F=1
  50. 410    PRINT:INPUT " CBASIC SOURCE FILE NAME = ";LINE F$
  51.     IF F$="" THEN STOP
  52.     IF MATCH(".",F$,2)=0 THEN F$=F$+".BAS" 
  53.     IF END #F THEN 410
  54.     OPEN F$ AS F
  55.  
  56.     PRINT:INPUT "INCLUDE '%INCLUDED' PROGRAMS <Y/N> ";C$
  57.     IF MID$(C$,1,1)="Y" OR MID$(C$,1,1)="y" THEN INC=1 ELSE INC=0
  58.     PRINT:INPUT "DATE = ";D$
  59.     PRG$="/"+F$+"     -   "+D$
  60.  
  61.     GOSUB 610
  62.     LPRINTER:PRINT FF$:CONSOLE
  63.     STOP
  64.  
  65.     REM    INITIALIZE FOR CROSS REFERENCE
  66.  
  67. 610    LC=0:PZ=0:V$="":C$="":VC=SK:RC=-1
  68.     FOR I=0 TO SK:VNXT%(I)=-1:NEXT I
  69.  
  70. 630    IF END #F THEN 1200
  71.  
  72. 650    IF F=1 THEN LN$=":" ELSE LN$="="
  73.  
  74.     REM    INPUT SOURCE LINE
  75.  
  76. 670    READ #F;LINE L$
  77.     LG=LEN(L$):BRNCH=0:LC=LC+1
  78.     LP=0:LN=LC:PRINT STR$(LN);LN$
  79.  
  80.     REM    CHECK FOR COMPILER DIRECTIVES
  81.  
  82.     IF INC=0 OR MATCH("%INCLUDE",L$,1)<>1 THEN 700
  83.     LP=9
  84. 690    C$=MID$(L$,LP,1)
  85.     IF C$<"A" AND C$>"" THEN LP=LP+1:GOTO 690
  86.     F$=MID$(L$,LP,14)
  87.     IF F$="" THEN 670
  88.  
  89.     REM    OPEN INCLUDED SOURCE FILE
  90.  
  91.     PRINT L$
  92.     IF END #F+1 THEN 670
  93.     OPEN F$ AS F+1:F=F+1:GOTO 630
  94.     
  95. 700    IF MID$(L$,1,1)="%" THEN 670
  96.  
  97.     REM     PARSE LINE
  98.  
  99. 750    LP=LP+1
  100.     IF LP>LG THEN GOSUB 1010:GOTO 670
  101.     C$=MID$(L$,LP,1)
  102.     IF C$>="A" AND C$<="Z" THEN 1110
  103.     IF C$>="a" AND C$<="z" THEN C$=CHR$(ASC(C$)-32):GOTO 1110
  104.     IF C$>="0" AND C$<="9" THEN 1150
  105.     IF C$=" " OR C$=CHR$(9) THEN GOSUB 1010:GOTO 750
  106.     IF C$="." AND V$>"" THEN 1120
  107.     IF C$="\" THEN GOSUB 1010:GOTO 670
  108.     IF C$<>"," THEN BRNCH=0
  109.     IF C$<>CHR$(34) THEN 780
  110.     GOSUB 1010:LP=MATCH(C$,L$,LP+1)
  111.     IF LP>0 THEN GOTO 750 ELSE GOTO 670
  112.  
  113. 780    IF C$="$" OR C$="%" THEN 1130
  114.     GOSUB 1010
  115.     GOTO 750
  116.  
  117.     REM    TEST FOR COMMAND
  118.  
  119. 890    C=ASC(V$):P=PT%(C-ASC("A")):BRNCH=0:RW$=""
  120.  
  121. 900    IF C<ASC(RWS$(P)) THEN RETURN
  122.     IF V$<>RWS$(P) THEN P=P+1:GOTO 900
  123.     RW$=V$
  124.     IF V$="DATA" OR V$="REM" OR V$="REMARK" THEN LP=LG+1:RETURN
  125.     IF V$="GOTO" OR V$="GOSUB" OR V$="THEN" THEN BRNCH=1
  126.     RETURN
  127.  
  128.     REM    END VARIABLE
  129.  
  130. 1010    IF V$="" THEN RETURN
  131.     IF ASC(V$)<ASC("A") THEN 1030
  132.     GOSUB 890
  133.     IF RW$>"" THEN V$="":RETURN
  134.     IF C$="(" THEN V$=V$+C$
  135.     C=ASC(V$)+SA:IL=-1:I=C
  136.  
  137. 1020    IF LEFT$(V$+"        ",9)<=LEFT$(V$(I)+"        ",9) THEN 1050
  138.     IL=I:I=VNXT%(I)
  139.     IF I>0 THEN GOTO 1020 ELSE GOTO 1060
  140.  
  141. 1030     IF VAL(V$)<1000 THEN C=INT(VAL(V$)/100) ELSE C=9+INT(VAL(V$)/1000)
  142.     IF C>SN THEN C=SN
  143.     IL=-1:I=C
  144.  
  145. 1040    IF VAL(V$)<=VAL(V$(I)) THEN 1050
  146.     IL=I:I=VNXT%(I)
  147.     IF I>0 THEN GOTO 1040 ELSE GOTO 1060
  148.  
  149. 1050    IF V$<>V$(I) THEN 1060
  150.     J=LST%(I-SK)
  151.     IF RFL%(J)=LN THEN GOTO 1090 ELSE RC=RC+1:NXT%(J)=RC:GOTO 1080
  152.  
  153. 1060    VC=VC+1
  154.     IF IL>=0 THEN VNXT%(IL)=VC
  155.     V$(VC)=V$:VNXT%(VC)=I:RC=RC+1:FRST%(VC-SK)=RC:I=VC
  156.  
  157. 1080    RFL%(RC)=LN:NXT%(RC)=-1:LST%(I-SK)=RC
  158.  
  159. 1090    V$="":RETURN
  160.  
  161.     REM    EXPAND VARIABLE
  162.  
  163. 1110    IF VAL(V$)>0 AND VAL(V$)=VAL(V$+MID$(L$,LP,255)) THEN GOSUB 1020
  164.  
  165. 1120    V$=V$+C$:GOTO 750
  166.  
  167. 1130    IF V$<>"" THEN V$=V$+C$
  168.     GOTO 750
  169.  
  170. 1150    IF V$>"" OR BRNCH>0 THEN V$=V$+C$
  171.     GOTO 750
  172.  
  173.     REM    END OF SOURCE FILE
  174.  
  175. 1200    CLOSE F
  176.     IF F>1 THEN F=F-1:GOTO 650
  177.  
  178.     REM    PRINT SYMBOL TABLE
  179.     PZ=0:LPRINTER WIDTH 80:GOSUB 1400:SZ=-1
  180.     FOR J=0 TO SK:V=J
  181.  
  182. 1230    V=VNXT%(V)
  183.     IF V<0 THEN 1340
  184.     IF LZ>56 THEN GOSUB 1400:GOTO 1250
  185.     SZ=SZ+1
  186.     IF SZ=3 THEN GOSUB 1410
  187.  
  188. 1250    RZ=0:I=FRST%(V-SK):PRINT V$(V);
  189.  
  190. 1260    IF RZ=0 THEN PRINT TAB(16);
  191.     LN=RFL%(I)
  192.     PRINT USING "     ####";LN;
  193.     RZ=RZ+1
  194.     IF RZ<6 THEN 1280
  195.     RZ=0:PRINT:LZ=LZ+1
  196.     IF LZ>56 THEN GOSUB 1400
  197.  
  198. 1280    I=NXT%(I)
  199.     IF I>0 THEN 1260
  200.     IF RZ>0 THEN PRINT:LZ=LZ+1
  201.     GOTO 1230
  202.  
  203. 1340    NEXT J
  204.  
  205.     PRINT SSS$
  206.     PRINT "LINES:";LC;"   SYMBOLS:";VC-SK;"   REFERENCES:";RC+1
  207.     LZ=LZ+2:RETURN
  208.  
  209. 1400    GOSUB 1520:PRINT "SYMBOL";TAB(20);"REFERENCE LINE":LZ=LZ+1
  210.  
  211. 1410    PRINT SSS$:LZ=LZ+1:SZ=0:RETURN
  212.  
  213. 1520    PRINT FF$
  214.     PZ=PZ+1:PRINT TAB(72);"PG$";PZ
  215.     PRINT PRG$:PRINT
  216.     LZ=3:RETURN
  217.  
  218.     END
  219.