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