10 ON ERROR GOTO 760 30 DIM I%(40%) \ SMCR$='' !BUFFER FOR MCR COMMAND LINE. 50 DIM LABEL$(200%),LNUM%(600%,4%) 60 DIM R$(50%) 80 R$(1%) ='IND' \ R$(2%) ='IF' \ R$(3%) ='IMP' \ R$(4%) ='INDEXED' 90 R$(5%) ='INPUT' \ R$(6%) ='INT' \ R$(7%) ='INV' \ R$(8%) ='KEY' 100 R$(9%) ='KILL' \ R$(10%)='LEFT' \ R$(11%)='LEN' \ R$(12%)='LET' 110 R$(13%)='LF' \ R$(14%)='LINE' \ R$(15%)='LINPUT'\ R$(16%)='LOC' 120 R$(17%)='LOCKED' \ R$(18%)='LOF' \ R$(19%)='LOG' \ R$(20%)='LOG10' 130 R$(21%)='LSET' \ R$(22%)='MAP' \ R$(23%)='MAT' \ R$(24%)='MOD' 140 R$(25%)='MODE' \ R$(26%)='MODIFY'\ R$(27%)='MOVE' \ R$(28%)='NAME' 150 R$(29%)='NEXT' \ R$(30%)='NOCHANGES' \ R$(31%)='NODUPLICATES' 160 R$(32%)='NOECHO' \ R$(33%)='NONE' \ R$(34%)='NOREWIND' 170 R$(35%)='NOSPAN' \ R$(36%)='NOT' \ R$(37%)='NULL' 180 R$(38%)='NUM' \ R$(39%)='NUM$' \ R$(40%)='NUM1$' 190 R$(41%)='NUM2' \ R$(42%)='MID' \ R$(43%)='INSTR' 200 NUMRSRVD%=43% 220 DEL$=" " 230 OPS$="(+-*/^= " 240 EXPOS$=" -+0123456789" 280 CALL GETMCR BY REF (I%()) !INPUT MCR LINE. 290 FOR J%=2% TO 40% !SCAN INTEGER ARRAY 300 IF I%(J%)=0% OR I%(J%)=13% GOTO 360 ! FOR CR OR ESC. 310 SMCR$=SMCR$+CHR$(I%(J%)) !CONVERT 1ST BYTE TO 320 I%(J%)=I%(J%)/256% !CHAR, AND SHIFT TO 330 IF I%(J%)=0% OR I%(J%)=13% GOTO 360 !NEXT BYTE IN WRD, 340 SMCR$=SMCR$+CHR$(I%(J%)) !CHECKING FOR EOL CHAR. 350 NEXT J% !SCAN ENTIRE LINE. 360 K%=POS(SMCR$,"=",1%) !FIND , DELIMITING FILES. 370 IF K%=0% GOTO 2550 !NONE- FILESPEC ERROR-EXIT. 380 FOUT$="SY0:"+LEFT(SMCR$,(K%-1%)) !OUTPUT FILE IS TO LEFT OF "," 390 L%=POS(SMCR$,"/",1%) !OPTION?? 400 IF L% <>0% THEN OPT$=RIGHT(SMCR$,L%) \ SMCR$=LEFT(SMCR$,(L%-1%)) 410 FIN$="SY0:"+RIGHT(SMCR$,(K%+1%)) !INPUT TO THE LEFT. 420 !FILE TYPE? 430 K%=POS(FOUT$,".",1%) !DO WE EVEN HAVE ONE? 440 IF K%=0% THEN FOUT$=FOUT$+".B2S" !IF NO OUTPUT FILETYPE, DEFAULT 450 K%=POS(FIN$,".",1%) !NOW CHECK INPUT FILE 460 IF K%=0% THEN FIN$=FIN$+".BPR" !IF NONE, DEFAULT. 480 OPEN FIN$ FOR INPUT AS FILE #1 490 OPEN FOUT$ FOR OUTPUT AS FILE #2 520 LAST%=0% 530 IREC%=0% 540 IF L%<>0% GOTO 2390 560 INPUT LINE #1,A$ \ A$=TRM$(A$) 570 IREC%=IREC%+10% 580 N%=POS(A$,"<<*",1%) 590 K%=POS(A$,'"',1%) 600 IF K%=0% THEN K%=POS(A$,"'",1%) 610 IF K%=0% THEN K%=999% 620 IF K%>",1%) 640 IF M%=0% GOTO 690 650 LAST%=LAST%+1% 660 LNUM%(LAST%,1%)=IREC% \ LNUM%(LAST%,2%)=M%+2% 670 LABEL$(LAST%)=SEG$(A$,(N%+3%),(M%-1%)) 680 GOTO 560 690 PRINT 700 PRINT "LABEL DEFINITION ERROR AT LINE ",IREC% 710 PRINT A$ 720 GOTO 560 760 IF ERR <> 11% THEN GOTO 2470 770 IRNUM%=IREC% / 10% 780 RESTORE #1 790 IREC%=0% 800 I%=1% 810 IFLGP%=0% 830 FOR L% = 1% TO IRNUM% 840 IFLGC%=0% 850 IREC%=IREC%+10% 860 B$="" 870 INPUT LINE #1,A$ \ A$=TRM$(A$) \ LL%=LEN(A$) 880 IF A$="" THEN PRINT #2,B$ \ GOTO 2360 890 IF MID(A$,LL%,1%) = '&' THEN IFLGC%=1% 900 IF LNUM%(I%,1%) <> IREC% GOTO 970 910 A$=SPACE$(LNUM%(I%,2%)-1%)+RIGHT(A$,LNUM%(I%,2%)) 920 I%=I%+1% 940 !SCAN THE LINE, BREAKING BY EACH CHARACTER TO THE PROPER HANDLING 950 !SECTION. 960 ! 970 FOR IK%=1% TO LL% 980 C$=MID(A$,IK%,1%) 1000 ! 1010 !||||||||||||||||| COMMENT ||||||||||||||||||||| 1020 ! 1030 IF C$<>"!" GOTO 1130 1040 LASTC%=POS(A$,"!",(IK%+1%)) 1050 IF LASTC%=0% THEN LASTC%=LL% 1060 C$=SEG$(A$,IK%,LASTC%) 1070 IK%=LASTC% 1080 GOTO 2190 1100 ! 1110 !||||||||||||||||||||| QUOTE ||||||||||||||||||||||||||| 1120 !!!SKIP OVER QUOTED STRINGS, NOTE QUOTE MISMATCH ERRORS. 1130 IF C$="'" THEN QUOTE$="'" \ GOTO 1160 1140 IF C$<>'"' GOTO 1240 1150 QUOTE$='"' 1160 B$=B$+C$ 1170 IK%=IK%+1% \ IF IK% > LL% GOTO 2250 1180 C$=MID(A$,IK%,1%) 1190 IF C$=QUOTE$ GOTO 2190 1200 GOTO 1160 1210 ! 1220 !||||||||||||||||||||| LABEL ||||||||||||||||||||||||||| 1230 !!!REPLACE LABEL REFERANCE WITH LINE NUMBERS. 1240 IF IK%+1% > LL% GOTO 1610 1250 IF "<<" <> MID(A$,IK%,2%) GOTO 1400 1260 IENDLBL%=POS(A$,">>",IK%) 1270 IF IENDLBL%=0% GOTO 2260 1280 HIT$=SEG$(A$,(IK%+2%),(IENDLBL%-1%)) 1290 FOR K%=1% TO LAST% 1300 IF HIT$ = LABEL$(K%) GOTO 1330 1310 NEXT K% 1320 GOTO 2260 1330 C$=STR$(LNUM%(K%,1%)) 1340 IK%=IENDLBL%+1% 1350 GOTO 2190 1370 ! 1380 !|||||||||||||||||||||| CALL ||||||||||||||||||||||||||| 1390 !!! DONT REARANGE A CALLED SUBROUTINE (TKB) IN ANY WAY. 1400 IF IK%+4% > LL% GOTO 1610 1410 IF "CALL" <> MID(A$,IK%,4%) GOTO 1610 1420 IK%=IK%+4% 1430 B$=B$+"CALL" 1440 FOR IS%=IK% TO LL% 1450 C$=MID(A$,IS%,1%) 1460 IF 0%=POS(DEL$,C$,1%) GOTO 1490 1470 B$=B$+C$ 1480 NEXT IS% 1490 IK%=IS% 1500 FOR IS%=IK% TO LL% 1510 C$=MID(A$,IS%,1%) 1520 ICP%=POS(OPS$,C$,1%) \ IF ICP%<>0% GOTO 1560 1530 B$=B$+C$ 1540 NEXT IS% 1550 GOTO 2310 1560 IK%=IS%-1% 1570 GOTO 2210 1580 ! 1590 !|||||||||||||||||||||| ALPHA |||||||||||||||||||||||||| 1600 !!!IF THE LINE IS A NON-NUMERIC STRING, DOES IT NEED A % ?? 1610 IF C$ < "A" OR C$ > "Z" GOTO 1830 1620 OLDA$=C$ 1630 IPTR%=IK% 1640 B$=B$+C$ 1650 IK%=IK%+1% \ IF IK% > LL% GOTO 1720 1660 C$=MID(A$,IK%,1%) 1670 IF C$ >= "A" AND C$ <= "Z" GOTO 1640 1680 IF C$ >= "0" AND C$ <= "9" GOTO 1640 1690 IF C$='.' GOTO 1640 1700 IF C$ = "$" GOTO 2190 1710 IK%=IK%-1% 1720 IF OLDA$ < "I" OR OLDA$ > "N" GOTO 2210 1730 STRNG$=SEG$(A$,IPTR%,IK%) 1740 FOR IR%=1% TO NUMRSRVD% 1750 IF R$(IR%) = STRNG$ GOTO 2210 1760 NEXT IR% 1770 B$=B$+'%' 1780 GOTO 2210 1800 ! 1810 !|||||||||||||||||||||| NUMERIC |||||||||||||||||||||||| 1820 !!!IF NUMERIC STRING, DOES IT NEED A % ?? IE., IS IT AN INTEGER? 1830 IF C$ < "0" OR C$ > "9" GOTO 2190 1840 IRFLG%=0% 1850 IF '.' = MID(A$,(IK%-1%),1%) THEN IRFLG%=1% 1860 IF '#' = MID(A$,(IK%-1%),1%) THEN IRFLG%=1% 1870 B$=B$+C$ 1880 IK%=IK%+1% \ IF IK% > LL% GOTO 2140 1890 C$=MID(A$,IK%,1%) 1900 IF C$ >="0" AND C$ <="9" GOTO 1870 1910 IF C$="." THEN IRFLG%=1% \ GOTO 1870 1920 FOR IJ%=IK% TO LL% 1930 T$=MID(A$,IJ%,1%) \ IF 0%=POS(DEL$,T$,1%) GOTO 1950 1940 NEXT IJ% 1950 IF 'E'<>T$ GOTO 2140 1960 T$=MID(A$,(IJ%+1%),1%) 1970 IF 0%=POS(EXPOS$,T$,1%) THEN GOTO 2140 1980 B$=B$+SEG$(A$,IK%,IJ%) 1990 IK%=IJ% 2000 IK%=IK%+1% 2010 IF IK% > LL% GOTO 2270 2020 C$=MID(A$,IK%,1%) 2030 IF ' ' = C$ THEN B$=B$+C$ \ GOTO 2000 2040 IF '-' = C$ THEN B$=B$+C$ \ GOTO 2000 2050 IF '+' = C$ THEN B$=B$+C$ \ GOTO 2000 2060 IF C$ >="0" AND C$<="9" THEN B$=B$+C$ & ELSE GOTO 2140 2080 IK%=IK%+1% \ IF IK% > LL% GOTO 2310 2090 C$=MID(A$,IK%,1%) 2100 IF C$ >= "0" AND C$<="9" GOTO 2190 2110 IK%=IK%-1% 2120 GOTO 2210 2140 IK%=IK%-1% 2150 IF IRFLG% = 1% GOTO 2210 2160 B$=B$+'%' 2170 GOTO 2210 2190 B$=B$+C$ 2210 NEXT IK% 2220 GOTO 2310 2250 E$=" UNMATCHED QUOTES" \ GOTO 2280 2260 E$=" UNDEFINED LABEL REFERANCE " \ GOTO 2280 2270 E$=" EXPONENT FORMAT ERROR " \ GOTO 2280 2280 PRINT \ PRINT E$;" IN SOURCE LINE ",IREC% 2290 PRINT A$ 2310 IF IFLGP%=1% THEN PRINT #2," "+B$ 2320 IF IFLGP%=0% THEN PRINT #2,LEFT(STR$(IREC%),6%)+B$ 2330 IFLGP%=IFLGC% 2340 !--- END OF DATA TYPE MODULE --- 2360 NEXT L% 2370 GOTO 2700 2380 !---------------------------------------------------------> 2390 ! 2400 IF '/R'<>MID(OPT$,1%,2%) GOTO 2530 2410 CALL BRESEQ 2420 GOTO 2700 2440 !---------------------------------------------------------> 2450 !!!ERROR HANDLING AND MESSAGES. 2460 !|||||||||||||||||||||| ERROR |||||||||||||||||||||||||| 2470 PRINT \ PRINT "ERROR ",ERR," AT ",ERL 2480 N%=ERR \ PRINT ERT$(N%) 2490 PRINT "THIS IS NOT A SYNTAX ERROR IN THE SOURCE FILE," 2500 PRINT "BUT AN ERROR IN BPR ITSELF. CONTACT BRSO" 2510 GOTO 2700 2530 PRINT "Option ";OPT$;" is not supported!" 2540 GOTO 2700 2550 SMCR$=EDIT$(SMCR$,2%) 2560 IF SMCR$="" THEN GOTO 2610 2570 PRINT "FILE SPEC ERROR IN COMMAND LINE." \ GOTO 2700 2580 PRINT SMCR$ 2590 GOTO 2700 2600 !---------------------------------------------> 2610 ! 2620 PRINT 2630 PRINT "Basic Preprocessor Options:" 2640 PRINT 2650 PRINT "output=input (Translate input BPR file to output BASIC+2 file)." 2660 PRINT " Default file types: output-B2S; input-BPR." 2670 PRINT "output=input/RES (Resequence: output file is resequenced input file)." 2680 PRINT " Default file types for resequencing are B2S." 2690 PRINT 2700 CLOSE #1 2710 CLOSE #2 2730 END