1000 ! IOXREF.BAS -- Cross-Reference all file access statements in a BASIC
1010 ! Source Code listing
1020 ! AUTHOR: Brad Horine, TDF Corporation, Joplin MO (TDF/AM)
1030 ! Donated to AMUS Network, 22 March 1985
1035 ! Permission granted to use, modify, and exchange freely
1040 !
1045 !**********************************************************************
1050 !* Under NO CIRCUMSTANCES is this program to be sold or used for *
1060 !* commercial gain! *
1070 !* Neither AMUS, the Author, nor any user may be held responsible for *
1080 !* any loss of revenue, etc. resulting from the use of this program *
1085 !**********************************************************************
1090 !
1100 MAP1 CURRENT'VERSION,S,3,"1.0" ! Change each edit
1110 !
1120 MAP1 SOURCEFILE,S,24 ! filename of Source code
1130 MAP1 LISTFILE,S,24 ! filename of Listing file
1140 MAP1 SOURCELINE,S,510 ! lines of code as read in
1150 !
1160 ON ERROR GOTO CHECK'FOR'CTRLC
1170 GOTO END'ERROR'ROUTINE
1180 CHECK'FOR'CTRLC:
1190 IF ERR(0) <> 1 THEN RESUME ! if not ^C then handle normally
1200 IF ERR(1) <= 1820 THEN RESUME ABORT'BEFORE'OPEN
1210 RESUME ABORT'AFTER'OPEN ! change line number in above statement
1220 END'ERROR'ROUTINE: ! if this program is renumbered
1230 !
1240 MAP1 NTOK,F,,12 ! # of tokens in following list
1250 MAP1 TOKEN(25),S,10
1260 TOKEN(1) = "OPEN"
1270 TOKEN(2) = "CLOSE"
1280 TOKEN(3) = "READ"
1290 TOKEN(4) = "READL"
1300 TOKEN(5) = "WRITE"
1310 TOKEN(6) = "WRITEL"
1320 TOKEN(7) = "ISAM"
1330 TOKEN(8) = "LOCK"
1340 TOKEN(9) = "UNLOKR"
1350 TOKEN(10)= "PRINT"
1360 TOKEN(11)= "INPUT"
1370 TOKEN(12)= "INPUT LINE"
1380 !
1390 !***** GET INPUT FROM USER *****
1400 !
1410 GET'INPUT:
1420 PRINT : PRINT "Basic I/O Cross Reference Compiler Version ";
1430 PRINT CURRENT'VERSION
1440 GET'SOURCEFILE:
1450 PRINT : INPUT LINE "Source code filename ? "; SOURCEFILE
1460 !
1470 ! add .BAS extension if needed
1480 !
1490 IF INSTR(1, SOURCEFILE, ".") <> 0 GOTO LOOKUP'SOURCEFILE
1500 BRACK = INSTR(1, SOURCEFILE, "[")
1510 IF BRACK = 0 THEN SOURCEFILE = SOURCEFILE + ".BAS": &
GOTO LOOKUP'SOURCEFILE
1520 SOURCEFILE = SOURCEFILE[1,BRACK-1] + ".BAS" &
+ SOURCEFILE[BRACK,LEN(SOURCEFILE)]
1530 !
1540 LOOKUP'SOURCEFILE:
1550 LOOKUP SOURCEFILE, SF
1560 IF SF>0 THEN GOTO GET'LISTFILE
1570 PRINT "?Cannot find file "; SOURCEFILE: GOTO ABORT'BEFORE'OPEN
1580 !
1590 GET'LISTFILE:
1600 INPUT LINE "Output filename [IOXREF.LST] ? "; LISTFILE
1610 IF LISTFILE = "" THEN LISTFILE = "IOXREF.LST"
1620 !
1630 ! add .LST extension if needed
1640 !
1650 IF INSTR(1, LISTFILE, ".") <> 0 GOTO LOOKUP'LISTFILE
1660 BRACK = INSTR(1, LISTFILE, "[")
1670 IF BRACK = 0 THEN LISTFILE = LISTFILE + ".LST": &
GOTO LOOKUP'LISTFILE
1680 LISTFILE = LISTFILE[1,BRACK-1] + ".BAS" &
+ LISTFILE[BRACK,LEN(LISTFILE)]
1690 !
1700 LOOKUP'LISTFILE:
1710 LOOKUP LISTFILE, LF
1720 IF LF=0 THEN GOTO OPEN'FILES
1730 PRINT "Output file "; LISTFILE; " already exists !"
1740 INPUT LINE "Hit RETURN to overwrite or CTRL-C to abort:"; X$
1750 PRINT "%Overwriting current "; LISTFILE
1760 !
1770 !
1780 ! use the line number of the OPEN'FILES: label below
1790 ! in the ON ERROR GOTO routine above
1800 !
1810 !
1820 OPEN'FILES:
1830 OPEN #1, SOURCEFILE, INPUT
1840 OPEN #9, LISTFILE, OUTPUT
1850 PRINT #9, "===== I/O Cross Reference for filename "; SOURCEFILE; " ====="
1860 PRINT #9: NREF = 0: DOT = 99
1870 PRINT : PRINT "Compiling Cross-Reference, please wait"
1880 !
1890 !***** SCAN SOURCEFILE FOR TOKENS *****
1900 !
1910 SCAN'SOURCEFILE:
1920 INPUT LINE #1, SOURCELINE
1930 IF EOF(1) THEN GOTO END'OF'SOURCEFILE
1940 IF DOT > 70 THEN PRINT TAB(-1,2); TAB(-1,9);: DOT = 0
1950 PRINT ".";: DOT = DOT + 1 ! print dots to show progress
1960 !
1970 FOR ISCAN = 1 TO NTOK
1980 POSN = INSTR(1, UCS(SOURCELINE), TOKEN(ISCAN)[1;LEN(TOKEN(ISCAN))])
1990 IF POSN = 0 THEN GOTO NEXT'TOKEN ! if no token, try next token
2000 !
2010 ! make sure statement is actually a file statement by
2020 ! checking for a '#' symbol immedistely following the token
2030 !
2040 POSN2 = INSTR(POSN, SOURCELINE, "#") ! get posn of next '#' in line
2050 IF POSN2 = 0 THEN GOTO NEXT'TOKEN ! if no '#', try next token
2060 !
2070 ! find 1st nonblank character after token
2080 !
2090 POSN3 = 0
2100 FOR INBLANK = POSN+LEN(TOKEN(ISCAN)) TO LEN(SOURCELINE)
2110 IF SOURCELINE[INBLANK;1] <> " " THEN POSN3 = INBLANK: INBLANK = 999
2120 NEXT INBLANK
2130 IF POSN3 = 0 THEN GOTO NEXT'TOKEN ! if no non-blank, or if 1st
2140 IF POSN2 <> POSN3 THEN GOTO NEXT'TOKEN ! non-blank <> '#', try next tokem
2150 !
2160 ! this line contains a file statement -- add it to the listfile
2170 !
2180 PRINT #9, SOURCELINE: NREF = NREF + 1: ISCAN = 999
2190 !
2200 ! try next token
2210 !
2220 NEXT'TOKEN:
2230 NEXT ISCAN
2240 GOTO SCAN'SOURCEFILE ! get next source line
2250 !
2260 !***** END OF SOURCE FILE *****
2270 !
2280 END'OF'SOURCEFILE:
2290 CLOSE #1: PRINT #9: PRINT
2300 !
2310 ! if no file references found, then say so
2320 !
2330 IF NREF > 0 GOTO END'OF'FILE'2
2340 FOR ICHAN = 0 TO 9 STEP 9
2350 PRINT #ICHAN, "%No file references found in sourcefile"
2360 NEXT ICHAN
2370 CLOSE #9: END
2380 END'OF'FILE'2:
2390 !
2400 ! report number of lines with file references
2410 !
2420 FOR ICHAN = 0 TO 9 STEP 9
2430 PRINT #ICHAN, "Total of"; NREF; "line";
2440 IF NREF > 1 THEN PRINT #ICHAN, "s";
2450 PRINT #ICHAN, " with file references found in sourcefile"
2460 NEXT ICHAN
2470 CLOSE #9: END
2480 !
2490 ABORT'BEFORE'OPEN:
2500 PRINT "%No cross-reference file generated"
2510 END
2520 !
2530 ABORT'AFTER'OPEN:
2540 CLOSE #1
2550 FOR ICHAN = 0 TO 9 STEP 9
2560 PRINT #ICHAN
2570 PRINT #ICHAN, "?Program aborted -- listfile is incomplete"
2580 NEXT ICHAN
2590 CLOSE #9: END