.TITLE LSTRNG ; FUNCTION LSTRNG(S1,K1,N1,S2,K2,N2) ; ; IN LSTRNG, A STRING IS SEARCHED, LEFT-TO-RIGHT OR RIGHT-TO-LEFT, ; LOOKING FOR A SECOND, DESIRED STRING OF CHARACTERS. WHEN THE DESIRED ; STRING IS FOUND, ITS POSITION IN THE FIRST STRING IS RETURNED TO THE ; CALLING PROGRAM. ; ; ; ARGUMENTS --- ; S1 - THE ARRAY CONTAINING THE STRING OF CHARACTERS TO BE SEARCHED ; FOR THE DESIRED STRING S2. ALL OF STRING S1 WILL BE COMPARED ; WITH THE DESIRED STRING S2. ; K1 - IF A LEFT-TO-RIGHT SCAN IS REQUESTED, K1 IS THE CHARACTER ; POSITION OF THE LEFT-MOST CHARACTER IN S1 TO BE COMPARED WITH ; THE LEFT-MOST CHARACTER IN THE DESIRED STRING. IF A RIGHT-TO- ; LEFT SCAN IS REQUESTED, K1 IS THE CHARACTER POSITION OF THE ; RIGHT-MOST CHARACTER IN S1 TO BE COMPARED WITH THE RIGHT-MOST ; CHARACTER IN THE DESIRED STRING. ; N1 - NUMBER OF CHARACTERS TO BE SEARCHED IN S1. IF N1 IS NEGATIVE, ; A RIGHT-TO-LEFT SCAN IN S1 WILL BE MADE. ; S2 - AN ARRAY CONTAINING THE DESIRED STRING OF CHARACTERS TO BE ; FOUND IN S1. ; K2 - INTEGER SPECIFYING THE CHARACTER POSITION IN ARRAY S2 OF THE ; LEFT-MOST CHARACTER OF THE DESIRED STRING. ; N2 - NUMBER OF CHARACTERS IN THE DESIRED STRING (NUMBER OF ; CHARACTERS TO USE FROM S2). N2 MUST BE .LE. /N1/. ; LSTRNG - INTEGER VALUE OF THE FUNCTION WHICH GIVES THE LOCATION OF ; THE FIRST OCCURRENCE IN S1 OF THE DESIRED STRING. IT WILL BE ; THE LOCATION OF THE LEFT-MOST CHARACTER OF THE DESIRED STRING ; WITHIN S1. ; ; LSTRNG::MOV @4(R5),R0 ;K1=KK1 BLE SETM1 ;ERROR IF K1.LE.0 TST @12(R5) ;K2 BLE SETM1 ;ERROR IF K2.LE.0 MOV @14(R5),-(SP) ;N2 BLE SETM1 ;ERROR IF N2.LE.0 DEC (SP) ;N2-1 MOV #1,INCR ;S1 ADDRESS INCREMENT MOV @6(R5),R1 ;N1=N BEQ SETM1 ;ERROR IF N1=0 BGT AA05 NEG INCR ;MAKE INCR - NEG R1 ;MAKE N + SUB (SP),R0 ;KK1=K1-N2+1 AA05: CMP @14(R5),R1 BGT SETM1 ;ERROR IF N2.GT.N SUB (SP),R1 ;N=N-N2+1 MOV 10(R5),S2K2 ADD @12(R5),S2K2 DEC S2K2 ;ADDRESS(S2(K2)) MOV 2(R5),S1KK1 ADD R0,S1KK1 DEC S1KK1 ;ADDRESS(S1(KK1)) AA60: CMPB @S2K2,@S1KK1 ;CHECK FOR A MATCH WITH FIRST CHAR. BNE END60 ;OF DESIRED STRING MOV (SP),R2 ;MATCH WAS FOUND BEQ RETURN ;DONE IF N2=1 MOV S1KK1,R4 INC R4 ;ADDRESS(S1(KK1+1)) MOV S2K2,R3 INC R3 ;ADDRESS(S2(K2+1)) AA40: CMPB (R4)+,(R3)+ ;COMPARE SUCCESSIVE CHARACTERS IN BNE END60 ;BOTH STRINGS SOB R2,AA40 BR RETURN ;SUCCESSFUL STRING MATCH. LSTRNG=KK1 END60: ADD INCR,R0 ;NO STRING MATCH. TRY THE NEXT ADD INCR,S1KK1 ;CHARACTER IN S1. SOB R1,AA60 CLR R0 ;UNSUCCESSFUL STRING MATCH BR RETURN ;LSTRNG=0 ;ERROR IN CALLING SEQUENCE SETM1: MOV #-1,R0 ;LSTRNG=-1 RETURN: TST (SP)+ ;RESET SP RTS PC INCR: .WORD 0 S1KK1: .WORD 0 S2K2: .WORD 0 .END