ON ERROR GOTO <> DIM I(40) \ SMCR$='' !BUFFER FOR MCR COMMAND LINE. DIM LABEL$(200),LNUM(600,4) DIM R$(50) R$(1) ='IND' \ R$(2) ='IF' \ R$(3) ='IMP' \ R$(4) ='INDEXED' R$(5) ='INPUT' \ R$(6) ='INT' \ R$(7) ='INV' \ R$(8) ='KEY' R$(9) ='KILL' \ R$(10)='LEFT' \ R$(11)='LEN' \ R$(12)='LET' R$(13)='LF' \ R$(14)='LINE' \ R$(15)='LINPUT'\ R$(16)='LOC' R$(17)='LOCKED' \ R$(18)='LOF' \ R$(19)='LOG' \ R$(20)='LOG10' R$(21)='LSET' \ R$(22)='MAP' \ R$(23)='MAT' \ R$(24)='MOD' R$(25)='MODE' \ R$(26)='MODIFY'\ R$(27)='MOVE' \ R$(28)='NAME' R$(29)='NEXT' \ R$(30)='NOCHANGES' \ R$(31)='NODUPLICATES' R$(32)='NOECHO' \ R$(33)='NONE' \ R$(34)='NOREWIND' R$(35)='NOSPAN' \ R$(36)='NOT' \ R$(37)='NULL' R$(38)='NUM' \ R$(39)='NUM$' \ R$(40)='NUM1$' R$(41)='NUM2' \ R$(42)='MID' \ R$(43)='INSTR' NUMRSRVD=43 DEL$=" " OPS$="(+-*/^= " EXPOS$=" -+0123456789" CALL GETMCR BY REF (I()) !INPUT MCR LINE. FOR J=2 TO 40 !SCAN INTEGER ARRAY IF I(J)=0 OR I(J)=13 GOTO <> ! FOR CR OR ESC. SMCR$=SMCR$+CHR$(I(J)) !CONVERT 1ST BYTE TO I(J)=I(J)/256 !CHAR, AND SHIFT TO IF I(J)=0 OR I(J)=13 GOTO <> !NEXT BYTE IN WRD, SMCR$=SMCR$+CHR$(I(J)) !CHECKING FOR EOL CHAR. NEXT J !SCAN ENTIRE LINE. <<*start>> K=POS(SMCR$,"=",1) !FIND , DELIMITING FILES. IF K=0 GOTO <> !NONE- FILESPEC ERROR-EXIT. FOUT$="SY0:"+LEFT(SMCR$,(K-1)) !OUTPUT FILE IS TO LEFT OF "," L=POS(SMCR$,"/",1) !OPTION?? IF L <>0 THEN OPT$=RIGHT(SMCR$,L) \ SMCR$=LEFT(SMCR$,(L-1)) FIN$="SY0:"+RIGHT(SMCR$,(K+1)) !INPUT TO THE LEFT. !FILE TYPE? K=POS(FOUT$,".",1) !DO WE EVEN HAVE ONE? IF K=0 THEN FOUT$=FOUT$+".B2S" !IF NO OUTPUT FILETYPE, DEFAULT K=POS(FIN$,".",1) !NOW CHECK INPUT FILE IF K=0 THEN FIN$=FIN$+".BPR" !IF NONE, DEFAULT. OPEN FIN$ FOR INPUT AS FILE #1 OPEN FOUT$ FOR OUTPUT AS FILE #2 LAST=0 IREC=0 IF L<>0 GOTO <> <<*in>> INPUT LINE #1,A$ \ A$=TRM$(A$) IREC=IREC+10 N=POS(A$,"<<*",1) K=POS(A$,'"',1) IF K=0 THEN K=POS(A$,"'",1) IF K=0 THEN K=999 IF K> M=POS(A$,">>",1) IF M=0 GOTO <> LAST=LAST+1 LNUM(LAST,1)=IREC \ LNUM(LAST,2)=M+2 LABEL$(LAST)=SEG$(A$,(N+3),(M-1)) GOTO <> <<*errldef>> PRINT PRINT "LABEL DEFINITION ERROR AT LINE ",IREC PRINT A$ GOTO <> <<*eof>> IF ERR <> 11 THEN GOTO <> IRNUM=IREC / 10 RESTORE #1 IREC=0 I=1 IFLGP=0 FOR L = 1 TO IRNUM IFLGC=0 IREC=IREC+10 B$="" INPUT LINE #1,A$ \ A$=TRM$(A$) \ LL=LEN(A$) IF A$="" THEN PRINT #2,B$ \ GOTO <> IF MID(A$,LL,1) = '&' THEN IFLGC=1 IF LNUM(I,1) <> IREC GOTO <> A$=SPACE$(LNUM(I,2)-1)+RIGHT(A$,LNUM(I,2)) I=I+1 !SCAN THE LINE, BREAKING BY EACH CHARACTER TO THE PROPER HANDLING !SECTION. ! <<*scan>>FOR IK=1 TO LL C$=MID(A$,IK,1) ! !||||||||||||||||| COMMENT ||||||||||||||||||||| ! IF C$<>"!" GOTO <> LASTC=POS(A$,"!",(IK+1)) IF LASTC=0 THEN LASTC=LL C$=SEG$(A$,IK,LASTC) IK=LASTC GOTO <> ! !||||||||||||||||||||| QUOTE ||||||||||||||||||||||||||| !!!SKIP OVER QUOTED STRINGS, NOTE QUOTE MISMATCH ERRORS. <<*quote>> IF C$="'" THEN QUOTE$="'" \ GOTO <> IF C$<>'"' GOTO <> QUOTE$='"' <<*qlp>> B$=B$+C$ IK=IK+1 \ IF IK > LL GOTO <> C$=MID(A$,IK,1) IF C$=QUOTE$ GOTO <> GOTO <> ! !||||||||||||||||||||| LABEL ||||||||||||||||||||||||||| !!!REPLACE LABEL REFERANCE WITH LINE NUMBERS. <<*lbl>> IF IK+1 > LL GOTO <> IF "<<" <> MID(A$,IK,2) GOTO <> IENDLBL=POS(A$,">>",IK) IF IENDLBL=0 GOTO <> HIT$=SEG$(A$,(IK+2),(IENDLBL-1)) FOR K=1 TO LAST IF HIT$ = LABEL$(K) GOTO <> NEXT K GOTO <> <<*hit>> C$=STR$(LNUM(K,1)) IK=IENDLBL+1 GOTO <> ! !|||||||||||||||||||||| CALL ||||||||||||||||||||||||||| !!! DONT REARANGE A CALLED SUBROUTINE (TKB) IN ANY WAY. <<*call>> IF IK+4 > LL GOTO <> IF "CALL" <> MID(A$,IK,4) GOTO <> IK=IK+4 B$=B$+"CALL" FOR IS=IK TO LL C$=MID(A$,IS,1) IF 0=POS(DEL$,C$,1) GOTO <> B$=B$+C$ NEXT IS <<*sub>> IK=IS FOR IS=IK TO LL C$=MID(A$,IS,1) ICP=POS(OPS$,C$,1) \ IF ICP<>0 GOTO <> B$=B$+C$ NEXT IS GOTO <> <<*endcall>> IK=IS-1 GOTO <> ! !|||||||||||||||||||||| ALPHA |||||||||||||||||||||||||| !!!IF THE LINE IS A NON-NUMERIC STRING, DOES IT NEED A % ?? <<*types>> IF C$ < "A" OR C$ > "Z" GOTO <> OLDA$=C$ IPTR=IK <<*alp>> B$=B$+C$ IK=IK+1 \ IF IK > LL GOTO <> C$=MID(A$,IK,1) IF C$ >= "A" AND C$ <= "Z" GOTO <> IF C$ >= "0" AND C$ <= "9" GOTO <> IF C$='.' GOTO <> <<*ealp>> IF C$ = "$" GOTO <> IK=IK-1 <<*endline>> IF OLDA$ < "I" OR OLDA$ > "N" GOTO <> STRNG$=SEG$(A$,IPTR,IK) FOR IR=1 TO NUMRSRVD IF R$(IR) = STRNG$ GOTO <> NEXT IR B$=B$+'%' GOTO <> ! !|||||||||||||||||||||| NUMERIC |||||||||||||||||||||||| !!!IF NUMERIC STRING, DOES IT NEED A % ?? IE., IS IT AN INTEGER? <<*num>> IF C$ < "0" OR C$ > "9" GOTO <> IRFLG=0 IF '.' = MID(A$,(IK-1),1) THEN IRFLG=1 IF '#' = MID(A$,(IK-1),1) THEN IRFLG=1 <<*nlp>> B$=B$+C$ IK=IK+1 \ IF IK > LL GOTO <> C$=MID(A$,IK,1) IF C$ >="0" AND C$ <="9" GOTO <> IF C$="." THEN IRFLG=1 \ GOTO <> FOR IJ=IK TO LL T$=MID(A$,IJ,1) \ IF 0=POS(DEL$,T$,1) GOTO <> NEXT IJ <<*e>> IF 'E'<>T$ GOTO <> T$=MID(A$,(IJ+1),1) IF 0=POS(EXPOS$,T$,1) THEN GOTO <> B$=B$+SEG$(A$,IK,IJ) IK=IJ <<*exp>> IK=IK+1 IF IK > LL GOTO <> C$=MID(A$,IK,1) IF ' ' = C$ THEN B$=B$+C$ \ GOTO <> IF '-' = C$ THEN B$=B$+C$ \ GOTO <> IF '+' = C$ THEN B$=B$+C$ \ GOTO <> IF C$ >="0" AND C$<="9" THEN B$=B$+C$ & ELSE GOTO <> IK=IK+1 \ IF IK > LL GOTO <> C$=MID(A$,IK,1) IF C$ >= "0" AND C$<="9" GOTO <> IK=IK-1 GOTO <> <<*eout>> IK=IK-1 IF IRFLG = 1 GOTO <> B$=B$+'%' GOTO <> <<*next>> B$=B$+C$ <<*nxtchr>> NEXT IK GOTO <> <<*errqot>> E$=" UNMATCHED QUOTES" \ GOTO <> <<*errlbl>> E$=" UNDEFINED LABEL REFERANCE " \ GOTO <> <<*errexp>> E$=" EXPONENT FORMAT ERROR " \ GOTO <> <<*errmsg>> PRINT \ PRINT E$;" IN SOURCE LINE ",IREC PRINT A$ <<*output>> IF IFLGP=1 THEN PRINT #2," "+B$ IF IFLGP=0 THEN PRINT #2,LEFT(STR$(IREC),6)+B$ IFLGP=IFLGC !--- END OF DATA TYPE MODULE --- <<*nextrec>> NEXT L GOTO <> !---------------------------------------------------------> <<*opts>>! IF '/R'<>MID(OPT$,1,2) GOTO <> CALL BRESEQ GOTO <> !---------------------------------------------------------> !!!ERROR HANDLING AND MESSAGES. !|||||||||||||||||||||| ERROR |||||||||||||||||||||||||| <<*error>> PRINT \ PRINT "ERROR ",ERR," AT ",ERL N=ERR \ PRINT ERT$(N) PRINT "THIS IS NOT A SYNTAX ERROR IN THE SOURCE FILE," PRINT "BUT AN ERROR IN BPR ITSELF. CONTACT BRSO" GOTO <> <<*opterr>> PRINT "Option ";OPT$;" is not supported!" GOTO <> <<*filerr>> SMCR$=EDIT$(SMCR$,2) IF SMCR$="" THEN GOTO <> PRINT "FILE SPEC ERROR IN COMMAND LINE." \ GOTO <> PRINT SMCR$ GOTO <> !---------------------------------------------> <<*help>>! PRINT PRINT "Basic Preprocessor Options:" PRINT PRINT "output=input (Translate input BPR file to output BASIC+2 file)." PRINT " Default file types: output-B2S; input-BPR." PRINT "output=input/RES (Resequence: output file is resequenced input file)." PRINT " Default file types for resequencing are B2S." PRINT <<*stop>> CLOSE #1 CLOSE #2 END