100 REM ************************************************ 110 REM **** CROSSV.BAS 28-FEB-78/20-NOV-78 **** 120 REM **** N A BOURGEOIS SANDIA LABORATORIES **** 130 REM ************************************************ 140 REM **** CROSS REFERENCE PROGRAM FOR BASIC TEXT **** 150 REM **** CLINT PURDUE KEN NOWOTNY 20-JAN-75 **** 160 REM ************************************************ 170 REM **** INITIALIZATION **** 180 REM ************************ 190 DIM #3,S1%(857%) 200 DIM #4,S2%(2200%,1%) 210 DIM #5,S4%(500%,1%) 220 OPEN 'TEMP3' AS FILE #3 230 OPEN 'TEMP4' AS FILE #4 240 OPEN 'TEMP5' AS FILE #5 250 FOR I%=0% TO 857% 260 S1%(I%)=0% 270 NEXT I% 280 FOR J%=0% TO 1% 290 FOR I%=0% TO 2200% 300 S2%(I%,J%)=0% 310 NEXT I% 320 FOR I%=0% TO 500% 330 S4%(I%,J%)=0% 340 NEXT I% 350 NEXT J% 360 S3%=1% 370 S5%=0% 380 DIM D1$(1%) 390 D1$(0%)="'" 400 D1$(1%)='"' 410 DIM D$(106%) 420 I8%=106% 430 FOR I%=0% TO I8% 440 READ D$(I%) 450 NEXT I% 460 P$=CHR$(12%) 470 T$=' CROSS REFERENCE '&DAT$&' '&CLK$ 480 REM ************************** 490 REM **** KEYBOARD ENTRIES **** 500 REM ************************** 510 PRINT 'ENTER THE INPUT FILE NAME', 520 LINPUT A$ 530 IF POS(A$,':',1%)=0 THEN A$='SY:'&A$ 540 IF POS(A$,'.',1%)=0 THEN A$=A$&'.BAS' 550 PRINT 'NAME THE OUTPUT DEVICE', 560 LINPUT F$ 570 IF F$='' THEN F$='LP:' 580 IF POS(F$,':',1%)=0 THEN 550 590 I%=POS(A$,':',1%) 600 J%=POS(A$,".",1%) 610 Z$=SEG$(A$,I%+1%,J%-1%) 620 F$=F$&Z$&'.CRF' 630 I%=POS(A$,':',1%) 640 Z$=SEG$(A$,I%+1%,255%) 650 T$=Z$&T$ 660 REM ************************ 670 REM **** OPEN THE FILES **** 680 REM ************************ 690 OPEN A$ FOR INPUT AS FILE #1 700 OPEN F$ FOR OUTPUT AS FILE #2 710 IF SEG$(F$,1%,3%)='TT:' THEN PRINT #2 720 PRINT #2,T$ 730 PRINT #2 740 REM ******************************** 750 REM **** START OF MAIN SEQUENCE **** 760 REM ******************************** 770 IF END #1 THEN 2150 \ REM **** PRINT THE VARIABLES USAGE TABLE 780 LINPUT #1,B$ 790 PRINT #2,B$ 800 I1%=1% 810 GOSUB 2760 \ REM **** OBTAIN THE LINE NUMBER 820 I9%=I2% 830 REM ********************************* 840 REM **** IGNORE 'REM' STATEMENTS **** 850 REM ********************************* 860 IF SEG$(B$,I1%,I1%+2%)='REM' THEN 770 \ REM **** GET ANOTHER LINE 870 REM **************************************** 880 REM **** FIND AND REMOVE QUOTED STRINGS **** 890 REM **************************************** 900 FOR I%=0% TO 1% 910 I1%=POS(B$,D1$(I%),1%) 920 IF I1%=0 THEN 1040 930 I4%=POS(B$,D1$(I%),I1%+1%) 940 IF I4%=0 THEN 1040 950 I3%=POS(B$,D1$(1%-I%),1%) 960 IF I3%>I1% THEN 1010 970 I5%=POS(B$,D1$(1%-I%),I3%+1%) 980 IF I5%=0 THEN 1010 990 I1%=I3% 1000 I4%=I5% 1010 I4%=I4%+1% 1020 GOSUB 3080 \ REM **** REMOVE QUOTED STRING 1030 GO TO 910 1040 NEXT I% 1050 REM **************************************** 1060 REM **** TRUNCATE ' \ REM' STATEMENTS **** 1070 REM **************************************** 1080 I1%=POS(B$,'\ REM',1%) 1090 IF I1%=0 THEN 1140 1100 B$=SEG$(B$,1%,I1%-1%) 1110 REM *********************************** 1120 REM **** FIND AND REMOVE KEY WORDS **** 1130 REM *********************************** 1140 FOR I%=0 TO I8% 1150 I1%=POS(B$,D$(I%),1%) 1160 IF I1%=0 THEN 1380 1170 I4%=I1%+LEN(D$(I%)) 1180 GOSUB 3080 \ REM **** REMOVE KEY WORD 1190 IF I%>2% THEN 1150 1200 GOSUB 2760 \ REM **** OBTAIN THE LINE NUMBER 1210 IF I%=2% THEN I9%=-I9% \ REM **** KEY WORD 'GOSUB' 1220 FOR J%=0% TO S5% 1230 IF S4%(J%,0%)<>I2% THEN 1300 1240 K%=S4%(J%,1%) 1250 IF S2%(K%,1%)=0% THEN 1280 1260 K%=S2%(K%,1%) 1270 GO TO 1250 1280 S2%(K%,1%)=S3% 1290 GO TO 1340 1300 NEXT J% 1310 S4%(S5%,0%)=I2% 1320 S4%(S5%,1%)=S3% 1330 S5%=S5%+1% 1340 S2%(S3%,0%)=I9% 1350 S3%=S3%+1% 1360 I9%=ABS(I9%) 1370 GO TO 1150 1380 NEXT I% 1390 REM ******************************* 1400 REM **** REPLACE 'AS' WITH '?' **** 1410 REM ******************************* 1420 I1%=POS(B$,'AS',1%) 1430 IF I1%=0% THEN 1490 1440 B$=SEG$(B$,1%,I1%-1%)&'?'&SEG$(B$,I1%+2%,255%) 1450 GO TO 1420 1460 REM ******************************* 1470 REM **** REPLACE 'IF' WITH '@' **** 1480 REM ******************************* 1490 I1%=POS(B$,'IF',1%) 1500 IF I1%=0% THEN 1560 1510 B$=SEG$(B$,1%,I1%-1%)&'@'&SEG$(B$,I1%+2%,255%) 1520 GO TO 1490 1530 REM ************************************** 1540 REM **** FIND AND SAVE VARIABLE NAMES **** 1550 REM ************************************** 1560 I3%=0% 1570 I2%=LEN(B$) 1580 IF I2%=0% THEN 770 \ REM **** GET ANOTHER LINE 1590 I1%=1% 1600 J5%=I3% 1610 J1%=0% 1620 J2%=0% 1630 J3%=0% 1640 I3%=ASC(SEG$(B$,1%,1%)) 1650 GOSUB 3030 \ REM **** REMOVE SINGLE CHARACTER 1660 IF I3%<65% THEN 1570 \ REM **** 'A' 1670 IF I3%>90% THEN 1570 \ REM **** 'Z' 1680 J1%=I3% 1690 IF I2%=1% THEN 1860 1700 I4%=ASC(SEG$(B$,1,1)) 1710 IF I4%=36% THEN 1820 \ REM **** '$' 1720 IF I4%=37% THEN 1840 \ REM **** '%' 1730 IF I4%>57% THEN 1860 \ REM **** '9' 1740 IF I4%<48% THEN 1860 \ REM **** '0' 1750 J2%=I4% 1760 GOSUB 3030 \ REM **** REMOVE SINGLE CHARACTER 1770 IF I2%=2% THEN 1860 1780 I4%=ASC(SEG$(B$,1%,1%)) 1790 IF I4%<36% THEN 1860 \ REM **** '$' 1800 IF I4%>37% THEN 1860 \ REM **** '%' 1810 IF I4%=37% THEN 1840 1820 J3%=1% 1830 GO TO 1850 1840 J3%=2% 1850 GOSUB 3030 \ REM **** REMOVE SINGLE CHARACTER 1860 IF LEN(B$)<1% THEN 1950 1870 IF J5%=64 THEN 1950 \ REM **** '@' (IF ) 1880 Z$=SEG$(B$,1%,1%) 1890 IF Z$='=' THEN 1940 1900 IF Z$<>'(' THEN 1950 1910 I4%=POS(B$,')',1%) 1920 IF I4%=0% THEN 1950 1930 IF SEG$(B$,I4%+1%,I4%+1%)<>'=' THEN 1950 1940 I9%=-I9% \ REM **** VARIABLE PRECEEDED BY '=' 1950 IF J2%=0% THEN J2%=47% 1960 J9%=J3%*286%+(J1%-65%)*11%+J2%-47% 1970 IF S1%(J9%)<>0% THEN 2030 1980 S1%(J9%)=S3% 1990 S2%(S3%,0%)=I9% 2000 I9%=ABS(I9%) 2010 S3%=S3%+1% 2020 GO TO 1570 \ REM **** LOOK FOR ANOTHER VARIABLE 2030 I1%=S1%(J9%) 2040 IF S2%(I1%,1%)<>0% THEN 2070 2050 S2%(I1%,1%)=S3% 2060 GO TO 1990 2070 I1%=S2%(I1%,1%) 2080 GO TO 2040 2090 REM ****************************** 2100 REM **** END OF MAIN SEQUENCE **** 2110 REM ****************************** 2120 REM ***************************************** 2130 REM **** PRINT THE VARIABLES USAGE TABLE **** 2140 REM ***************************************** 2150 CLOSE #1 2160 PRINT #2,P$ 2170 IF SEG$(F$,1%,3%)='TT:' THEN PRINT #2 2180 PRINT #2,T$ 2190 PRINT #2 2200 PRINT #2,'VARIABLE LINE(S) WHERE USED:'; 2210 PRINT #2,' IF PRECEEDED BY -, VAR FOLLOWED BY =' 2220 PRINT #2 2230 FOR K%=0% TO 285% 2240 FOR K1%=0% TO 572% STEP 286% 2250 I%=K%+K1% 2260 IF S1%(I%)=0% THEN 2450 2270 V$='' 2280 J3%=I% 2290 J4%=INT(I%/286%) 2300 IF J4%=0% THEN 2370 2310 IF J4%=1% THEN 2350 2320 V$='%' 2330 J3%=I%-572% 2340 GO TO 2370 2350 V$='$' 2360 J3%=I%-286% 2370 I3%=INT(J3%/11%) 2380 I2%=J3%-I3%*11% 2390 IF I2%=0% THEN 2410 2400 V$=CHR$(I2%+47%)&V$ 2410 V$=CHR$(I3%+65%)&V$ 2420 I1%=S1%(I%) 2430 PRINT #2,V$; 2440 GOSUB 2890 \ REM **** PRINT THE LINE NUMBERS USED 2450 NEXT K1% 2460 NEXT K% 2470 REM ***************************************** 2480 REM **** PRINT THE CONTOL TRANSFER TABLE **** 2490 REM ***************************************** 2500 K1%=1% 2510 S6%=S5%-1% 2520 PRINT #2,P$ 2530 IF SEG$(F$,1%,3%)='TT:' THEN PRINT #2 2540 PRINT #2,T$ 2550 PRINT #2 2560 PRINT #2,'CONTROL TRANSFER SECTION (GOSUB, GO TO & THEN):'; 2570 PRINT #2,' GOSUB PRECEEDED BY -' 2580 PRINT #2 2590 K2%=32767% 2600 FOR K%=0% TO S6% 2610 IF S4%(K%,0%)<=K1% THEN 2650 2620 IF S4%(K%,0%)>K2% THEN 2650 2630 K2%=S4%(K%,%0) 2640 I1%=S4%(K%,1%) 2650 NEXT K% 2660 IF K2%=32767% THEN 3510 \ REM **** CLOSEOUT ROUTINE 2670 K1%=K2% 2680 PRINT #2,K1%; 2690 GOSUB 2890 \ REM **** PRINT THE LINE NUMBERS USED 2700 GO TO 2590 2710 REM ********************* 2720 REM **** SUBROUTINES **** 2730 REM ************************************ 2740 REM **** S/R OBTAIN THE LINE NUMBER **** 2750 REM ************************************ 2760 I2%=0% 2770 IF I1%>LEN(B$) THEN 2850 2780 I3%=ASC(SEG$(B$,I1%,I1%)) 2790 IF I3%=32% THEN 2830 \ REM **** 'SPACE' 2800 IF I3%<48% THEN 2850 \ REM **** '0' 2810 IF I3%>57% THEN 2850 \ REM **** '9' 2820 I2%=I2%*10%+I3%-48% 2830 GOSUB 3030 \ REM **** REMOVE SINGLE CHARACTER 2840 GO TO 2770 2850 RETURN 2860 REM ***************************************** 2870 REM **** S/R PRINT THE LINE NUMBERS USED **** 2880 REM ***************************************** 2890 I2%=5% 2900 I2%=2%+I2%+LEN(STR$(S2%(I1%,0%))) 2910 IF I2%<60% THEN 2940 2920 PRINT #2 2930 GO TO 2890 2940 PRINT #2,TAB(10%);S2%(I1%,0%); 2950 I1%=S2%(I1%,1%) 2960 IF I1%<>0% THEN 2900 2970 PRINT #2 2980 PRINT #2 2990 RETURN 3000 REM ************************************* 3010 REM **** S/R REMOVE SINGLE CHARACTER **** 3020 REM ************************************* 3030 B$=SEG$(B$,1%,I1%-1%)&SEG$(B$,I1%+1%,255%) 3040 RETURN 3050 REM ********************************************** 3060 REM **** S/R REMOVE KEY WORD OR QUOTED STRING **** 3070 REM ********************************************** 3080 B$=SEG$(B$,1%,I1%-1%)&SEG$(B$,I4%,255%) 3090 RETURN 3100 REM ******************* 3110 REM **** KEY WORDS **** 3120 REM ******************** 3130 REM **** STATEMENTS **** 3140 REM ******************** 3150 DATA 'GO TO','THEN','GOSUB' 3160 DATA 'AS FILE','CALL','CHAIN','CLOSE #','CLOSE','COMMON' 3170 DATA 'DATA','DEF','DIM #','DIM','DOUBLE BUF','FILESIZE' 3180 DATA 'FOR INPUT','FOR OUTPUT','FOR','IF END #','END',LINPUT #' 3190 DATA 'LINPUT','INPUT #','INPUT','KILL','LET','LINE' 3200 DATA 'MODE','NAME','NEXT','ON','OPEN','OVERLAY' 3210 DATA 'PRINT #','PRINT','RANDOMIZE','READ','RECORDSIZE','REM' 3220 DATA 'RESET #','RESET','RESTORE #','RESTORE','RETURN','STEP' 3230 DATA 'STOP','TO','USING' 3240 REM ****************************** 3250 REM **** ARITHMETIC FUNCTIONS **** 3260 REM ****************************** 3270 DATA 'ABS','ATN','COS','EXP','INT','LOG10' 3280 DATA 'LOG','PI','RND','SGN','SIN','SQR' 3290 DATA 'TAB' 3300 REM ************************** 3310 REM **** STRING FUNCTIONS **** 3320 REM ************************** 3330 DATA 'ASC','BIN','CHR$','CLK$','DAT$','LEN' 3340 DATA 'OCT','POS','SEG$','STR$','TRM$','VAL' 3350 REM ******************************** 3360 REM **** USER DEFINED FUNCTIONS **** 3370 REM ******************************** 3380 DATA 'FNA','FNB','FNC','FND','FNE','FNF' 3390 DATA 'FNG','FNH','FNI','FNJ','FNK','FNL' 3400 DATA 'FNM','FNN','FNO','FNP','FNQ','FNR' 3410 DATA 'FNS','FNT','FNU','FNV','FNW','FNX' 3420 DATA 'FNY','FNZ' 3430 REM *************************** 3440 REM **** DATBAS CALL NAMES **** 3450 REM *************************** 3460 DATA 'GETB','GET','IDEN','NULL' 3470 DATA 'PUTB','PUT','SBIT','TBIT' 3480 REM ************************** 3490 REM **** CLOSEOUT ROUTINE **** 3500 REM ************************** 3510 PRINT #2,P$ 3520 CLOSE #2,#3,#4,#5 3530 KILL 'TEMP3' 3540 KILL 'TEMP4' 3550 KILL 'TEMP5' 3560 END