.MCALL .MODULE .MODULE POSIT,VERSION=02,IDENT=NO ; Copyright (c) 1998 by Mentec, Inc., Nashua, NH. ; All rights reserved ; ; This software is furnished under a license for use only on a ; single computer system and may be copied only with the ; inclusion of the above copyright notice. This software, or ; any other copies thereof, may not be provided or otherwise ; made available to any other person except for use on such ; system and to one who agrees to these license terms. Title ; to and ownership of the software shall at all times remain ; in Mentec, Inc. ; ; The information in this document is subject to change without ; notice and should not be construed as a commitment by Digital ; Equipment Corporation, or Mentec, Inc. ; ; Digital and Mentec assume no responsibility for the use or ; reliability of its software on equipment which is not supplied ; by Digital or Mentec, and listed in the Software Product ; Description. ; Edit History: ; ; 001 08-Aug-80 02:51 PM Kent, Jeff [240,94] ; Redifine W level user error traps for slp. ; (001) ; 002 10-Aug-80 04:04 PM Kent, Jeff [240,94] ; "?SLP-F-Line number error" not generating properly ; (002) ; ; VERSION 06 ; ; D.N. CUTLER 4-JAN-72 ; ; MODIFICATIONS: ; ; C. MONIA 11-SEP-75 ; ; CM001 -- REWRITE ENTIRE MODULE TO ADD IMPROVED LINE ; LOCATING FACILITY AND USER-SPECIFIED AUDIT ; TRAIL. ; ; ; POSITION/DELETE LINES IN CORRECTION INPUT FILE ; ; LOCAL DATA ; ; ; COMMAND LINE DESCRIPTOR ; ;- CMLD: .BLKW 1 ; LENGTH OF LINE .WORD CMLN ; ADDRESS OF LINE ; ; COMMAND LINE BUFFER ; CMLN: .BLKW 45. ; ; ; CURRENT SEARCH STRING DESCRIPTOR BEING BUILT ; CURST: .BLKW 1 ; ; ; END OF LINE NUMBER RANGE ; ENDLN: .BLKW 1 ; ; ; COMMAND LINE ERROR FLAG ; ERROR: .BLKW 1 ; ; ; ADDRESS OF ROUTINE TO COPY/DELETE NEXT LINE ; NXTLN: .BLKW 1 ; ; ; PERIOD COUNTER ; PERCT: .BLKW 1 ; ; ; SEARCH STRING DESCRIPTOR 1 ; SRC1: .BLKW 2 ; ; ; SEARCH STRING DESCRIPTOR 2 ; SRC2: .BLKW 2 ; ; ; STATE TABLE TO PARSE THE FOLLOWING SYNTAX ; ; -[LOCATE][,LOCATE][,AUDIT] ; ; WHERE: ; ; LOCATE:=DNUMBER/STRING/EXP ; AUDIT:=STRING ; ; DNUMBER:=0/1/2/3/4...9 ; STRING:='/'!CHARACTER!'/' ; EXP:=.!+!DNUMBER ; ; INITIALIZE STATE TABLE PARAMETERS ; ISTAT$ PSTAT,PKEY ; ; PARSE FIELD 0 LOCATION DESCRIPTOR ; STATE$ FLD0 ; TRAN$ <';>,$EXIT ; EXIT ON END OF STRING TRAN$ <',>,ENDFL1 ; TEST FOR FIELD 1 END CONDITIONS TRAN$ $EOS,$EXIT ; EXIT ON NULL LINE TRAN$ $LAMDA,,SFLD0 ; TRANSIT TO NEXT STATE STATE$ ; TRAN$ !FIELD ; PARSE ONE FIELD STATE$ ; TRAN$ <',>,FLD1 ; SET FIELD 1 CONDITIONS TRAN$ <';>,$EXIT,EXFL0 ; FLUSH CURRENT LINE TRAN$ $EOS,$EXIT,EXFL0 ; FLUSH CURRENT LINE ; ; PARSE FIELD 1 LOCATION DESCRIPTOR ; STATE$ FLD1 ; TRAN$ <',>,AUDIT,EXFL0 ; FLUSH CURRENT LINE IF NOP TRAN$ $LAMDA,,SFLD1 ; SET FIELD 1 CONDITIONS STATE$ ; TRAN$ !FIELD ; PROCESS FIELD 1 STATE$ ENDFL1 ; TRAN$ <',>,AUDIT ; TEST FOR AUDIT TRAN$ $LAMDA,EXIT ; ELSE EXIT ; ; PARSE AUDIT STRING FIELD ; STATE$ AUDIT ; TRAN$ '/,CPAUD,INAUD ; COPY AUDIT STRING TRAN$ $LAMDA,EXIT ; TEST FOR EXIT CONDITIONS STATE$ CPAUD ; TRAN$ '/,AUOUT,ENBS ; EXIT ON STRING TERMINATOR TRAN$ $EOS,$EXIT,ENBS ; EXIT ON END-OF-STRING TRAN$ $ANY,CPAUD,STAUD ; STORE AUDIT STRING STATE$ AUOUT ; TRAN$ $LAMDA,EXIT ; TEST FOR PROPER EXIT CONDITIONS ; ; CONDITIONAL EXIT FROM PARSER ; STATE$ EXIT ; TRAN$ <';>,$EXIT ; EXIT ON SEMICOLON TERMINATOR TRAN$ $EOS,$EXIT ; EXIT ON END-OF-STRING ; ; PARSE A SINGLE LOCATION FIELD ; STATE$ FIELD ; TRAN$ '/,STRING,SETCH ; SETUP TO COLLECT A STRING TRAN$ <'.>,EXPR,STCUR ; MARK CURRENT LOCATION TRAN$ $DNUMB,$EXIT,NUMB ; PROCESS LINE NUMBER TRAN$ $LAMDA,$EXIT ; EXIT IF ANYTHING ELSE ; ; COPY AND LOCATE STRING ; STATE$ STRING ; TRAN$ '/,STRG2,FNDST ; FIND LINE CONTAINING STRING TRAN$ <'.>,STRING,ELIPS ; CHECK FOR ELLIPSES TRAN$ $EOS,$EXIT,FNDST ; FIND LINE CONTAINING STRING, EXIT TRAN$ $ANY,STRING,MOVCH ; COPY CHARACTER STATE$ STRG2 ; COMPUTE LINE OFFSET AND LOCATE TRAN$ '+,EXP1,EXFL0 ; COMPUTE AN OFFSET, FLUSH CURRENT LINE TRAN$ $LAMDA,$EXIT ; EXIT ON ANYTHING ELSE ; ; PROCESS EXPRESSION ; STATE$ EXPR ; TRAN$ '+,EXP1 ; TRANSIT TO NEXT STATE ON + TRAN$ $EOS,$EXIT,OPER ; PERFORM OPERATION IF EOS TRAN$ $LAMDA,$EXIT,OPER ; PERFORM OPERATION IF ANYTHING ELSE STATE$ EXP1 ; TRAN$ $DNUMBR,$EXIT,OPER ; OPERATE ON NUMBER STATE$ ;+ ; **-$POSIT-POSITION/DELETE LINE IN CORRECTION FILE ; ; THIS ROUTINE IS CALLED TO POSITION OR DELETE LINES FROM THE ; CORRECTION INPUT FILE AND CONDITIONALLY ALTER THE AUDIT STRING ; THAT IS OUTPUT WITH EACH NEW LINE. ; ; POSITIONING OR DELETION IS PERFORMED IN ACCORDANCE WITH THE ; CONTENTS OF EACH LOCATION FIELD. THIS FIELD IDENTIFIES THE ; LINE TO BE LOCATED OR A RANGE OF LINES TO BE DELETED AS FOLLOWS: ; ; A) A NUMBER WITHIN THE FIELD SPECIFIES A LINE NUMBER; ; ; B) AN EXPRESSION OF THE FORM '.'[+NNN] SPECIFIES AN OFFSET ; FROM THE CURRENT LINE; ; ; C) A STRING OF THE FORM '/ABCD.../' SPECIFIES A ; CHARACTER STRING THAT IS USED TO LOCATE THE NEXT LINE ; TO BE OPERATED UPON. ; ; INPUTS: ; ; $LNADR POINTS TO THE CURRENT COMMAND LINE, $LNDES CONTAINS ; THE BYTE COUNT OF THE LINE. ; $POSIT:: ; SAVRG ; SAVE THE NON-VOLATILE REGISTERS CLRB @$AUBEG ; TRUNCATE AUDIT TRAIL MOV #CMLN,R0 ; GET ADDRESS OF COMMAND LINE BUFFER MOV R0,R4 ; SAVE COMMAND LINE ADDRESS INC R4 ; STEP PAST '-' MOV $LNADR,R1 ; GET ADDRESS OF LINE BUFFER CLR R3 ; INITIALIZE COUNT 10$: ; INC R3 ; INCREMENT BYTE COUNT MOVB (R1)+,(R0)+ ; COPY COMMAND LINE BNE 10$ ; IF NE CONTINUE DEC R3 ; CORRECT FOR NULL MOV #PKEY,R2 ; GET ADDRESS OF KEYWORD TABLE MOV R3,CMLD ; SET BYTE COUNT DEC R3 ; ACCOUNT FOR DELETED CHARACTER (-) MOV #PSTAT,R5 ; GET STATETABLE ADDRESS CLR R1 ; SURPRESS BLANKS CALL .TPARS ; PARSE THE LINE BCC 20$ ; IF C/C OK MOV #CMLN, R0 ; point R0 to erroneous command line FATAL E$CSYN ; command syntax error ;001 20$: ; RETURN ; ; ; ACTION SUBROUTINES ; ; COPY A LINE OF TEXT TO SOURCE AND LISTING FILES ; .ENABL LSB COPY: ; CALL $GTCFL ; READ ONE LINE OF INPUT BCS 10$ ; IF C/S EOF OR ERROR CALL @(SP)+ ; TEST IF LOCATION CRITERIA SATISFIED BCC 20$ ; IF C/C YES, TERMINATE COPY CALL EXFL0 ; WRITE CURRENT LINE TO OUTPUT FILES BR COPY ; READ NEXT CORRECTION INPUT LINE 10$: ; REPORT PREMATURE EOF MOV #CMLN, R0 ; point R0 to erroneous command line FATAL E$SEOF ; source EOF 20$: ; RETURN ; ; ; DELETE A LINE OF CORRECTION FILE TEXT ; DELET: ; INC $LNDEL ; INCREMENT COUNT OF LINES DELETED BCC 20$ ; IF C/C REACHED END OF DELETE RANGE CALL $GTCFL ; COPY OVER CURRENT LINE BCS 10$ ; IF C/S ERROR CALL @(SP)+ ; CALL THE CALLER BR DELET ; GO AGAIN .DSABL LSB ; ; RECOGNIZE ELIPSES (...) ; ELIPS: ; MOV #CURST,R1 ; GET ADDRESS OF CURRENT SEARCH DESCRIPTOR CMP #SRC2,(R1) ; SEEN ONE SET OF ELIPSES? BEQ MOVC1 ; IF EQ YES INC PERCT ; INCREMENT PERIOD COUNTER CMP PERCT,#3 ; SEEN THREE IN A ROW? BLT MOVC1 ; IF LT NO RETURN ; ; ; ENABLE BLANK SURPRESSION ; ENBS: ; CLR .PFLAG ; ENABLE BLANK SURPRESSION RETURN ; ; ; FIND A LINE WITH MATCHING STRING ; FNDST: ; CLR .PFLAG ; ALLOW BLANK SURPRESSION TST ERROR ; COMMAND LINE ERROR DETECTED? BNE 70$ ; IF NE YES SAVRG ; SAVE VOLATILE REGISTERS MOV NXTLN,-(SP) ; SET COPY/DELET SUBROUTINE ADDRESS SEC ; FORCE READ OF NEXT LINE 10$: ; CALL @(SP)+ ; CALL COPY/DELET ROUTINE ADC ERROR ; POSSIBLY SET ERROR CONDITION BNE 70$ ; IF NE ERROR MOV #SRC1,R1 ; GET ADDRESS OF SEARCH FIELD 1 MOV $LNADR,R4 ; GET LINE BUFFER ADDRESS CALL 30$ ; SEARCH FOR STRING INC (SP)+ ; REMOVE RETURN ADDRESS BCC 20$ ; IF C/C SEARCH STRING 1 MATCHED BR 10$ ; GET NEXT LINE 20$: ; MOV #SRC2,R1 ; GET ADDRESS OF STRING 2 DESCRIPTOR 30$: ; MOV R4,R5 ; COPY CURRENT LINE BUFFER POINTER 40$: ; MOV (R1),R2 ; GET DESCRIPTOR BYTE COUNT MOV 2(R1),R3 ; GET STRING ADDRESS 50$: ; DEC R2 ; DECREMENT STRING COUNT CLC ; ASSUME MATCH BLT 60$ ; IF LT HAVE MATCH TSTB (R4) ; END OF STRING? SEC ; ASSUME YES BEQ 10$ ; CALL CALLER CMPB (R3)+,(R4)+ ; TEST STRING BEQ 50$ ; IF EQ POSSIBLE MATCH INC R5 ; INCREMENT POINTER MOV R5,R4 ; RESET STRING POINTER BR 40$ ; GO AGAIN 60$: ; MOV $CFNMB,ENDLN ; SET END LINE NUMBER CLR .PNUMB ; CLEAR LINE NUMBER CALL @(SP)+ ; CALL THE CALLER 70$: ; RETURN ; ; ; FLUSH CORRECTION FILE INPUT BUFFER AT END OF FIELD 0 ; EXFL0: ; BIT #AP$ND,$SWTCH ; COMRESS LINE? BNE 10$ ; IF NE NO CALL $CMPRS ; COMPRESS CURRENT LINE 10$: ; CLR $LNDEL ; CLEAR COUNT OF SUCCESIVE DELETIONS CALLR $PUTLN ; WRITE LINE TO OUTPUT FILES ; ; INITIALIZE FOR COLLECTION OF AUDIT STRING ; INAUD: ; INC .PFLAG ; RESET BLANK SUPRESSION MOV $AULGH,R1 ; GET LENGTH OF FIELD MOV #SRC1,R2 ; GET ADDRESS OF STRING DESCRIPTOR MOV R1,(R2)+ ; SAVE MAX STRING SIZE MOV $NEW,(R2) ; SAVE ADDRESS OF AUDIT BUFFER MOV (R2),R2 ; SET BUFFER ADDRESS 10$: ; CLRB (R2)+ ; CLEAR AUDIT STRING DEC R1 ; DECREMENT MAX AUDIT TRAIL SIZE BGE 10$ ; IF GE GO AGAIN RETURN ; ; ; BUILD CHARACTER STRING FOR SEARCH ; MOVCH: ; MOV #CURST,R1 ; GET POINTER TO STRING DESCRIPTOR MOV #PERCT,R0 ; GET ADDRESS OF PERIOD COUNTER CMP (R0),#3 ; SEEN ELLIPSES? BLO MOVC1 ; IF LO NO SUB #2,@(R1)+ ; BACK-UP SEARCH STRING MOV #SRC2,-(R1) ; SET ADDRESS OF NEW STRING MOV .PSTPT,SRC2+2 ; SET ADDRESS OF START OF STRING CLR (R0) ; RESET PERIOD COUNT MOVC1: ; INC @(R1)+ ; INCREMENT STRING COUNT RETURN ; ; ; FIND SPECIFIED LINE NUMBER ; NUMB: ; TST ERROR ; COMMAND LINE ERROR DETECTED? BNE 40$ ; IF NE YES MOV NXTLN,-(SP) ; PUSH ADDRESS OF LINE PROCESSOR CMP $CFNMB,.PNUMB ; LEGAL LINE NUMBER? BHI 30$ ; IF HI NO ;002 BNE 10$ ; IF NE OK ;**-1 CMP (SP),#DELET ; IN FIELD 1? BEQ 20$ ; IF EQ YES BR 30$ ; ELSE ERROR 10$: ; CALL @(SP)+ ; CALL LINE PROCESSOR BCS 40$ ; IF C/S ERROR READING CORRECTION INPUT FILE CMP $CFNMB,.PNUMB ; HAVE SPECIFIED LINE? BLO 10$ ; IF LO NO 20$: ; CALL @(SP)+ ; SET DELETE COUNT BR 40$ ; EXIT 30$: ; TST (SP)+ ; CLEAN STACK MOV #CMLN, R0 ; point R0 to erroneous command line FATAL E$LNER ; line number error ;001 SEC ; SET LINE ERROR CONDITION 40$: ; ADC ERROR ; UPDATE ERROR STATUS RETURN ; ; ; COMPUTE NEXT LINE NUMBER AND PROCESS IT ; OPER: ; ADD ENDLN,.PNUMB ; COMPUTE LINE NUMBER TO BE FOUND BR NUMB ; SEARCH FOR SPECIFIED LINE ; ; SETUP CHARACTER STRING DESCRIPTORS FOR SEARCH ; SETCH: ; INC .PFLAG ; DISABLE BLANK SUPRESSION CLR PERCT ; CLEAR PERIOD COUNT MOV #SRC1,R1 ; GET STRING DESCRIPTOR ADDRESS MOV R1,CURST ; SET ADDRESS OF CURRENT STRING CLR (R1)+ ; ZERO COUNT MOV .PSTPT,(R1) ; SET ADDRESS OF FIRST CHARACTER INC (R1) ; ... MOV (R1)+,R2 ; GET ADDRESS OF FIRST CHARACTER CLR (R1)+ ; CLEAR STRING 2 COUNT MOV R2,(R1) ; SAVE STRING ADDRESS RETURN ; ; ; SETUP FOR PROCESSING FIELD 0 INPUT ; SFLD0: ; CLR ERROR ; RESET LINE NUMBER ERROR FLAG MOV #COPY,NXTLN ; SET FOR COPY LINE OPERATION RETURN ; ; ; SETUP FOR PROCESSING FIELD 1 INPUT ; SFLD1: ; MOV #DELET,NXTLN ; SET FOR LINE DELETION OPERATION RETURN ; ; ; STORE AN AUDIT CHARACTER ; STAUD: ; MOV #SRC1,R1 ; GET ADDRESS OF AUDIT STRING DESCRIPTOR TST (R1) ; ROOM FOR MORE? BEQ 10$ ; IF EQ NO DEC (R1)+ ; DECREMENT AUDIT COUNT MOVB .PCHAR,@(R1)+ ; STORE AUDIT CHARACTER INC -(R1) ; POINT TO NEXT OUTPUT BYTE 10$: ; RETURN ; ; ; POSITION CORRECTION INPUT FILE TO NEXT LINE ; STCUR: ; CLR .PNUMB ; CLEAR LINE NUMBER INCREMENT MOV $CFNMB,ENDLN ; SET END LINE NUMBER CMP #DELET,NXTLN ; IN DELETE MODE? BEQ 10$ ; IF EQ YES INC ENDLN ; FORCE READ OF NEXT LINE 10$: ; RETURN ; .END