.TITLE LOCATE .IDENT /V01/ .SBTTL DESCRIPTION ; ; ; COMPONENT: LOCATE ; ; DATE: 04-JUN-79 ; ; AUTHOR: GR JOHNSON ; BATTELLE NORTHWEST ; P O BOX 999 ; RICHLAND WA 99352 ; ; SOURCE: MACRO-11 ; ; CALLER: FORTRAN IV-PLUS ; ; CALLING SEQUENCE: ; ; CALL LOCATE(STRING,SBSTRG,IPOS) ; ; STRING = ASCII STRING TO BE SCANNED FOR AN OCCURANCE OF ; A SUB-STRING. THE STRING MUST BE TERMINATED ; BY AN ASCII NULL CHARACTER. ; ; SBSTRG = THE ASCII SUB-STRING TO BE LOCATED. THE STRING ; MUST BE TERMINATED BY AN ASCII NULL CHARACTER. ; ; IPOS = INTEGER VARIABLE TO RECEIVE CHARACTER POSITION ; OF THE SUB-STRING WITHIN THE STRING. ZERO IS ; RETURNED IF THE SEARCH FAILS TO FIND ANY OCCUR- ; ANCES OF THE SUB-STRING. ; ; ; DESCRIPTION: ; ; "LOCATE" SCANS AN ASCII STRING FOR THE FIRST OCCURANCE OF A SPECIFIED ; ASCII SUB-STRING. IF NO OCCURANCES ARE FOUND THE ROUTINE RETURNS A ; CHARACTER POSITION OF ZERO. ; ; EXAMPLES: ; ; CALL LOCATE('ABCDEF','D', N1) ; CALL LOCATE('ABCDEF','EFG',N2) ; CALL LOCATE('ABCDEF','ABC',N3) ; CALL LOCATE('AB ABC','ABC',N4) ; ; N1=4 ; N2=0 ; N3=1 ; N4=4 ; ; .SBTTL ENTRY POINT -- LOCATE SUB-STRING ; ; .PSECT ; ; LOCATE:: ; ; CLR R0 ; CLEAR POSITION COUNT MOV 2(R5),R1 ; ADDR OF STRING TO R1 MOV 4(R5),R2 ; ADDR OF SBSTRG TO R2 ; ; M A J O R L O O P ; 2$: TSTB (R1) ; TEST STRING CHARACTER BNE 4$ ; END-OF-STRING? CLR R0 ; YES, CLEAR POSITION COUNT BR RTN ; AND RETURN TO CALLER 4$: INC R0 ; NO, INCREMENT POSITION COUNT CMPB (R1)+,(R2) ; COMPARE CHARACTERS BNE 2$ ; NOT-EQUAL, NEXT CHARACTER ; ; S U B - S T R I N G L O O P ; MOV R1,R3 ; CURRENT CHARACTER ADDRESS TO R3 MOV R2,R4 ; SUB-STRING ADDRESS TO R4 INC R4 ; INCREMENT R4 6$: TSTB (R4) ; SUB-STRING EOS? BEQ RTN ; YES, (SUB-STRING FOUND), RETURN CMPB (R3)+,(R4)+ ; COMPARE CHARACTERS BEQ 6$ ; EQUAL, NEXT CHARACTER BR 2$ ; NOT-EQUAL, BACK TO MAJOR LOOP ; RTN: MOV R0,@6(R5) ; CHARACTER COUNT TO IPOS RTS PC ; RETURN TO CALLER (R0 = IPOS) .END ;