.TITLE STFIND .IDENT /V02/ .ENABLE LC ; ; This module searches one ASCII string for another ASCII string ; ; Author: V01 16-Mar-79 Mark Woolfson ; V02 28-Jan-80 Phil Stephensen-Payne ; ; Calling Sequence: ; ; This subroutine is called via the standard FORTRAN calling sequence as:- ; ; CALL STFIND (SEASTR,SEALEN,DEASTR,DEALEN,IADDR [,STATUS]) ; or ; STATUS = STFIND (SEASTR,SEALEN,DEASTR,DEALEN,IADDR) ; ; Where:- ; SEASTR = Address of pattern to be searched for ; SEALEN = Length of pattern to be searched for ; DEASTR = Address of pattern to be searched ; DEALEN = Length of pattern to be searched ; IADDR = Position of first match located ; STATUS = Optional error return ; ; Errors Returned: ; ; STATUS = 0 if the string was found successfully ; = +1 if the string was not found ; = -1 if there was a parameter error ; ; External References: ; ; This module calls the subroutine PRMCHK. ; STRADR: .WORD STRLEN: .WORD STFIND:: MOV #6.,R0 ;SET UP NUMBER OF PARAMS CALL PRMCHK ;CHECK ON PARAMETERS BCS 30$ ;If CS parameter error - exit MOV #-1,R0 ; Assume parameter error BIT #1,10.(R5) ; Return value word-aligned? BNE 30$ ; If ne no - exit with parameter error MOV #1,R0 ; Assume string not found CLR @10.(R5) ;STORE NOT FOUND MESSAGE MOV 6(R5), STRADR ;COPY STRING ADDRESS MOVB @8.(R5), STRLEN ;COPY STRING LENGTH BEQ 30$ ; If eq no string - exit ; 10$: MOV 2(R5), R4 ;GET SEARCH STRING MOVB @4(R5), R3 ;GET LENGTH OF SEARCH STRING BIC #177400,R3 ; Remove any sign extension BEQ 30$ ; If eq no search string - exit MOV STRADR, R2 ;GET STRING ADDRESS INC STRADR ;INC IN PREPARATION FOR NEXT SEARCH MOV STRLEN, R1 ;GET LENGTH OF STRING DEC STRLEN ;DEC IN PREPARATION FOR NEXT SEARCH CMP R1, R3 ;CHECK FOR STRING LENGTH > SUB-STRING LENGTH BLT 30$ ;QUIT IF NOT ; 20$: CMPB (R2)+, (R4)+ ;COMPARE BYTES BNE 10$ ;GO ROUND IF NOT EQUAL SOB R3, 20$ ;CHECK IF ANY SUB-STRING LEFT ; SUB @4(R5), R2 ;WE HAVE FOUND A MATCH SUB 6(R5), R2 ;CALCULATE OFFSET OF STRING INC R2 ;CONVERT TO CHARACTER NUMBER MOV R2, @10.(R5) ;STORE IN ANSWER PLACE CLR R0 ; Show Success ; 30$: RETURN ;QUIT .END