.TITLE CHKINC - CHECK FOR INCLUDE LINES .IDENT /X01.00/ .SBTTL TITLE PAGE ;**- ; Module name: CHKINC - CHECK FOR INCLUDE LINES ; ; Version X01.00 Last edit: 28-JUN-80 16:15 ; Status: Development/Debugging ; ; Revision history: ; ; Version X01.00 27-JUN-80 14:45 - 28-JUN-80 16:15 ; Created by: K.J. CROSS ; ;**- ; ; THIS ROUTINE HANDLES "INCLUDE" LINES IN FLECS PROGRAMS. ; ; IT TAKES THE FOLLOWING ACTIONS: ; ; 1. IF CARRY IS SET, CHECK FOR EOF. IF EOF AND AN INCLUDE FILE ; IS CURRENTLY OPEN, RESTORE THE PREVIOUS LEVEL AND PROCEED. ; ; 2. IF CARRY CLEAR, CHECK THE CURRENT LINE FOR " INCLUDE 'filespec'". ; THE ONLY SWITCH ALLOWED IN THE FILESPEC IS "/NOLIST". ; ; 3. IF THIS IS AN INCLUDE LINE, SAVE THE CONTEXT OF THE CURRENT FILE ; AND OPEN THE NEW FILE. ; ; INPUTS: ; R0 = FDB ADDRESS OF INPUT FILE ; CARRY = RESULTS OF GET$ ; ; OUTPUTS: ; CARRY CLEAR - LINE READ INTO BUFFER ; CARRY SET - ERROR INDICATION ; R1 = 0 MEANS EOF IN TOP-LEVEL ROUTINE ; R1 <> 0 = ADDRESS OF ERROR MESSAGE BLOCK ; .SBTTL MACROS AND LOCAL DEFINITIONS ; ; SYSTEM MACRO CALLS. ; .MCALL CSI$,CSI$1,CSI$2,CSI$SW,CSI$ND .MCALL OPEN$R,OFNB$R,CLOSE$,FDOF$L,NBOF$L,GET$ NBOF$L ;DEFINE NAMEBLOCK OFFSETS FDOF$L ;DEFINE FDB OFFSETS ; ; LOCAL DEFINITIONS ; MAXLVL = 5 ;MAXIMUM LEVEL OF NESTING INCLUDES SW.LST = 1 ;BIT SET FOR /NOLIST ; ; SAVE AREA OFFSETS. ; .ASECT . = 0 S.VFNB: .BLKB S.FNB ;SAVED FILENAME BLOCK S.VMRK: .BLKW 3 ;SAVED INFO FROM .MARK S.VLST: .BLKW 1 ;SAVED LISTING FLAG S.VSIZ = . ;SIZE OF SAVE ARE FOR ONE FILE .PSECT .SBTTL LOCAL DATA .PSECT DATA ; ; ERROR MESSAGE STORAGE. ; ERM1: .WORD EMES1,EMES1L ERM2: .WORD EMES2,EMES2L ERM3: .WORD EMES3,EMES3L ERM4: .WORD EMES4,EMES4L ERM5: .WORD EMES5,EMES5L .ENABL LC EMES1: .ASCII /Open failure on INCLUDE file./ EMES1L = .-EMES1 EMES2: .ASCII /Syntax error on INCLUDE line./ EMES2L = .-EMES2 EMES3: .ASCII /INCLUDE's exceed maximum level of nesting./ EMES3L = .-EMES3 EMES4: .ASCII "I/O error on INCLUDE file." EMES4L = .-EMES4 EMES5: .ASCII "Input line exceeds maximum allowable length." EMES5L = .-EMES5 INCSTR: .ASCII /INCLUDE/ .EVEN ; ; SAVE AREA FOR FILE INFORMATION. ; SAVPTR: .WORD SAVBLK ;POINTER INTO SAVE AREA SAVBLK: .BLKB S.VSIZ * MAXLVL ;SAVE AREA FOR "MAXLVL" FILES ; ; CURRENT INCLUDE NESTING LEVEL. ; INCLVL: .WORD 0 ; ; FIRST LINE FLAG. IF THIS FLAG IS SET NON-ZERO, IT MEANS THAT ; THE "INCLUDE" LINE HAS JUST BEEN READ. IF THE INCLUDE LINE ; HAS "/NOLIST" IN IT, IT WON'T BE LISTED. SO, THIS FLAG IS SET ; TO INDICATE WHETHER OR NOT IT SHOULD BE LISTED. ; FIRSTF: .WORD 0 ; ; LISTING FLAG. ; LSTFLG: .WORD 0 ; ; CSI BLOCK FOR PARSING FILE NAME. ; CSI$ CSIBLK: .BLKB C.SIZE ;ALLOCATE A CSI BLOCK ; ; STORAGE FOR FILENAME. ; FILENM: .BLKB 50. ; ; CSI SWITCHES. ; SWTAB: CSI$SW LIST,SW.LST,,CLEAR,NEG ;/NOLIST CSI$ND .SBTTL CHKINC ENTRY POINT .PSECT .ENABL LSB ; ; CHKINC ENTRY POINT. ; CHKINC:: JSR R5,$SAVRG ;SAVE REGISTERS 3-5 BCC 10$ ;IF CC, CHECK FOR INCLUDE LINE JMP RSTINC ;RESTORE TO NEXT HIGHER LEVEL 10$: CLR FIRSTF ;NOT FIRST LINE ANY MORE MOV F.NRBD(R0),R2 ;GET LENGTH OF INPUT LINE CMP R2,#70. ;LINE TOO LONG? BLT 15$ ;IF LT, NO MOV #ERM5,R1 ;"LINE TOO LONG" JMP 97$ ;ERROR EXIT 15$: MOV F.URBD+2(R0),R3 ;GET ADDRESS OF INPUT LINE BLE 45$ ;IF LE, NOTHING TO CHECK - QUICK EXIT ; ; SKIP ALL LEADING TABS AND SPACES. ; 20$: CMPB (R3)+,#11 ;TAB? BEQ 40$ ;IF EQ, YES CMPB -1(R3),#40 ;SPACE? BNE 50$ ;IF NE, NO 40$: SOB R2,20$ ;SKIP SPACES AND TABS 45$: JMP 98$ ;NOTHING SPECIAL ON THE COMMAND LINE ; ; CHECK THE LINE FOR THE STRING "INCLUDE" ; 50$: MOV #7,R4 ;INIT COUNTER MOV #INCSTR,R5 ;GET POINTER TO STRING DEC R3 ;POINT TO THE NON-BLANK CHARACTER 55$: CMPB (R3)+,(R5)+ ;MATCH? BNE 45$ ;IF NE, NO DEC R2 ;MAKE SURE THERE'S SOME LEFT BEQ 45$ ;IF EQ, NO SOB R4,55$ ;CHECK 7 CHARACTERS ; ; "INCLUDE" HAS BEEN FOUND. NOW GET THE ARGUMENT (SHOULD BE IN SINGLE ; QUOTES) AND SAVE IT. ; MOV #ERM2,R1 ;SET POSSIBLE ERROR MESSAGE 60$: CMPB (R3)+,#'' ;FOUND LEADING QUOTE? BEQ 61$ ;IF EQ, YES SOB R2,60$ ;KEEP CHECKING BR 97$ ;ERROR - NO LEADING QUOTE 61$: MOV #FILENM,R4 ;GET ADDRESS TO STORE STRING 62$: CMPB (R3),#'' ;FOUND TERMINATOR? BEQ 70$ ;IF EQ, YES MOVB (R3)+,(R4)+ ;SAVE CHARACTER SOB R2,62$ ; BR 97$ ;ERROR - NO TERMINATING QUOTE 70$: CLRB (R4) ;TERMINATE WITH A NULL SUB #FILENM,R4 ;GET LENGTH OF STRING MOV R4,CSIBLK+C.CMLD ;SAVE LENGTH OF STRING MOV #FILENM,CSIBLK+C.CMLD+2 ;SAVE ADDRESS OF STRING CMP INCLVL,#MAXLVL ;NESTED TOO DEEP? BLT 80$ ;IF LT, NO MOV #ERM3,R1 ;GET ERROR MESSAGE BR 97$ ;EXIT ; ; THE STRING IS SAVED. NOW RESTRUCTURE THE LINE WITH A "C" IN ; COLUMN 1 AND THE INCLUDE LEVEL IN COLUMN 2. ; 80$: MOV #FLXFDB,R0 ;RESTORE FDB ADDRESS MOV F.NRBD(R0),R2 ;GET STRING LENGTH MOV R2,R5 ;COPY LENGTH INTO R5 ADD #2,R5 ;COMPUTE NEW LENGTH (SAVE FOR LATER) MOV F.URBD+2(R0),R3 ;GET STRING ADDRESS ADD R2,R3 ;POINT TO THE END OF THE STRING MOV R3,R4 ;COPY END OF STRING ADDRESS ADD #2,R4 ;POINT 2 BYTES PAST END OF STRING 82$: MOVB -(R3),-(R4) ;MOVE ENTIRE STRING UP 2 BYTES SOB R2,82$ ; ... MOV INCLVL,R2 ;GET THE NESTING LEVEL ADD #'1,R2 ;CONVERT IT TO ASCII MOVB R2,-(R4) ;STORE IT MOVB #'C,-(R4) ;STORE LEADING CHARACTER ; ; NOW SAVE THE CONTEXT OF THE CURRENT FILE ; AND CLOSE IT. ; MOV SAVPTR,R4 ;GET POINTER TO SAVE AREA MOV R0,R3 ;COPY FDB ADDRESS ADD #F.FNB,R3 ;COMPUTE ADDRESS OF FNB MOV #S.FNB/2,R2 ;GET SIZE OF FNB IN WORDS 85$: MOV (R3)+,(R4)+ ;COPY FNB INTO SAVE AREA SOB R2,85$ ; ... CALL .MARK ;GET CURRENT POSITION IN FILE MOV R1,(R4)+ ;STORE IN SAVE AREA MOV R2,(R4)+ ; ... MOV R3,(R4)+ ; ... MOV LSTFLG,(R4)+ ;SAVE LISTING FLAG MOV R4,SAVPTR ;SAVE NEW SAVE AREA POINTER CLOSE$ ;CLOSE CURRENT INPUT FILE ; ; NOW TRY TO OPEN THE INCLUDE FILE. ; MOV #ERM2,R1 ;INIT FOR POSSIBLE ERROR MOV R0,R4 ;COPY FDB ADDRESS CSI$1 #CSIBLK ;CHECK SYNTAX BCS 97$ ;ERROR CSI$2 ,OUTPUT,#SWTAB ;PARSE AND GET SWITCHES BCS 97$ ;ERROR OPEN$R R4,,#CSIBLK+C.DSDS ;TRY TO OPEN FILE MOV #ERM1,R1 ;INIT ERROR MESSAGE BCS 97$ ;IF CS, ERROR ; ; THE INCLUDE FILE HAS BEEN SUCCESSFULLY OPENED. ; READ THE FIRST RECORD AND CALL OURSELF TO CHECK FOR ; ERRORS AND INCLUDE LINES. ; MOV R5,FLXFDB+F.NRBD ;SET THE LINE LENGTH OF THE "INCLUDE" LINE TST LSTFLG ;OLD LIST FLAG ON? BNE 95$ ;IF NE, DON'T LIST THIS LINE INC FIRSTF ;SET TO LIST THIS LINE 95$: BIS CSIBLK+C.MKW1,LSTFLG ;SET THE LISTING FLAG INC INCLVL ;BUMP NESTING LEVEL BR 99$ ;EXIT 97$: SEC ;ERROR BR 99$ ;EXIT 98$: CLC ;NO ERROR 99$: JMP CHKRTN ;RETURN .DSABL LSB .SBTTL RSTINC - RESTORE FROM INCLUDE PROCESSING .ENABL LSB ; ; AT THIS POINT, THERE WAS AN ERROR IN READING THE INPUT FILE, ; BUT WE DON'T KNOW WHAT IT WAS. IF IT WAS EOF, WE CAN HANDLE ; IT. IF IT WASN'T, WE CAN'T. ; RSTINC: CLR FIRSTF ;INIT FIRST-LINE LISTING FLAG CLR R1 ;ASSUME EOF AT TOP LEVEL TST INCLVL ;AT TOP LEVEL? BLE 97$ ;IF LE, YES - LEAVE WITH CARRY SET MOV #ERM4,R1 ;SET POSSIBLE ERROR MESSAGE CMPB F.ERR(R0),#IE.EOF ;WAS ERROR EOF? BNE 97$ ;IF NE, NO ; ; WE HAVE REACHED EOF IN THE CURRENT INCLUDE FILE. CLOSE IT ; AND RESTORE THE CONTEXT FOR THE PREVIOUS LEVEL. ; CLOSE$ ;CLOSE THE CURRENT INCLUDE FILE DEC INCLVL ;DECR CURRENT LEVEL MOV SAVPTR,R4 ;GET POINTER TO SAVE AREA SUB #S.VSIZ,R4 ;COMPUTE BEGINNING OF BLOCK MOV R4,SAVPTR ;SAVE NEW POINTER MOV R0,R3 ;COPY FDB ADDRESS ADD #F.FNB,R3 ;POINT TO FNB IN FDB MOV #S.FNB/2,R2 ;GET SIZE IN WORDS 10$: MOV (R4)+,(R3)+ ;RESTORE FNB SOB R2,10$ ; ... ; ; OPEN THE PREVIOUS FILE AND GO BACK TO WHERE WE WERE IN IT. ; OFNB$R ;OPEN THE FILE BCS 97$ ;IF CS, SOMETHING IS VERY WRONG MOV (R4)+,R1 ;GET POSITION CONTEXT MOV (R4)+,R2 ; SAVED BY .MARK MOV (R4)+,R3 ; ... MOV (R4)+,LSTFLG ;RESTORE LISTING FLAG CALL .POINT ;POSITION THE FILE MOV #ERM4,R1 ;CHECK FOR ERROR BCS RSTINC ;IF CS, PROBABLY HIT EOF GET$ ;READ NEXT RECORD IN PREVIOUS FILE CALL CHKINC ;CALL OURSELVES TO CHECK IT BCC 99$ ;IF CC, PROCEED 97$: MOV #SAVBLK,SAVPTR ;FATAL ERROR - RESET POINTERS CLR INCLVL ;BACK TO LEVEL 1 CLR LSTFLG ;RE-ENABLE LISTING SEC ;ERROR INDICATION BR 99$ ;EXIT 98$: CLC ;NO ERROR 99$: CHKRTN: ROL R0 ;SAVE CARRY MOV INCLVL,R2 ;GET THE INCLUDE LEVEL SWAB R2 ;PUT IN HIGH BYTE TST FIRSTF ;FORCE LISTING OF THIS LINE? BNE 999$ ;IF NE, YES - LEAVE LOW BYTE ZERO BISB LSTFLG,R2 ;PUT LIST FLAG IN LOW BYTE 999$: ROR R0 ;RESTORE CARRY MOV #FLXFDB,R0 ;RESTORE FDB ADDRESS RETURN ;RETURN TO FLECS .DSABL LSB .END