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