.TITLE VERIFY .SBTTL VERIFY FUNCTION FOR FORTRAN (OPTIMIZED) .GLOBL VERIFY ; ; CALL: ; ; INTEGER VERIFY ; I = VERIFY(S1,S2,L1,L2) ;OR CALL VERIFY(S1,S2,L1,L2,I) ; ; WHERE S1 AND S2 ARE THE USUAL STRING ARGUMENTS; ; L1 AND L2 ARE OPTIONAL LENGTH ARGUMENTS FOR S1 AND S2, ; RESPECTIVELY. IF L1 OR L2 IS OMITTED OR IS ZERO, THE CORRESPONDING ; STRING IS EXPECTED TO END WITH A NULL BYTE ; VERIFY: CLR R2 ;CLEAR COUNT REGISTERS CLR R3 CMPB @R5,#2 ;MORE THAN 2 ARGS? BEQ LEN1 ;NO - NO LENGTH FOR S1 BIT #1,6(R5) ;3RD ARG NULL? BNE LEN1 ;YES - DITTO MOV @6(R5),R2 ;NO - GET LENGTH BGT SLEN2 ;IF POSITIVE, CHECK FOR L2 LEN1: MOV 2(R5),R0 ;POINT TO S1 1$: INC R2 ;COUNT TSTB (R0)+ ;AND TEST BNE 1$ DEC R2 ;ADJUST COUNT SLEN2: CMPB @R5,#3 ;MORE THAN 3? BLE LEN2 ;NO - NO LENGTH FOR S2 BIT #1,10(R5) ;4TH ARG NULL? BNE LEN2 MOV @10(R5),R3 ;GET LENGTH OF S2 BGT SPTR1 ;IF POSITIVE, GO SEARCH LEN2: MOV 4(R5),R1 ;POINT TO S2 1$: INC R3 ;COUNT TSTB (R1)+ ;AND TEST BNE 1$ DEC R3 ;ADJUST BLT NOFD ;ZERO LENGTH ; ; R0 POINTS TO CURRENT BYTE OF S1 ; R1 POINTS TO CURRENT BYTE OF S2 ; R2 UNTESTED LENGTH OF S1 ; R3 LENGTH OF S2 ; R4 UNTESTED LENGTH OF S2 ; ; SET POINTERS AND SEARCH ; SPTR1: MOV 2(R5),R0 .30: MOV 4(R5),R1 MOV R3,R4 ;COPY LENGTH OF S2 .31: CMPB @R0,(R1)+ ;COMPARE EACH CHAR OF S2 TO CURRENT S1 BEQ .40 SOB R4,.31 ; ; CURRENT S1 NOT IN S2 - RETURN INDEX SUB 2(R5),R0 ;OFFSET INC R0 ;+1 RETURN: CMP @R5,#5 ;5-ARGUMENT FORM? BNE RET MOV R0,@12(R5) ;YES--RETURN VALUE RET: RTS PC ; ; CURRENT S1 IS IN S2 - TRY NEXT .40: INC R0 ;INCREMENT POINTER SOB R2,.30 ;COUNT AND LOOP ; ; COUNT IS EXHAUSTED - RETURN 0 NOFD: CLR R0 BR RETURN .END