	.TITLE FT_LOCC LOCATE BYTE WITHIN BYTE STRING.
	.IDENT	/V1.0 21-SEP-1984/
;
;	ROUTINE TO LOCATE A SPECIFIC BYTE WITHIN A BYTE STRING.
;
;	Calling sequence is:
;		INDEX = FT_LOCC (BYTE,ADDR,LEN)
;		OR
;		INDEX = FT_LOCC (BYTE,STRING)
;
;	where:
;		INDEX -
;		  >0	This is the offset from the beginning of the string
;			to the byte desired.  The beginning of the string is
;			byte number 1.
;		  =0	Byte is not in string.
;		  -1	String length is invalid.
;		  -2	Incorrect number of arguments.
;
;		BYTE - 	The address of the byte to be located.
;		ADDR -	The starting address of the byte string.  Use this
;			when dealing with logical*1 variables.
;		LEN -	The length of the byte string.
;		STRING -
;			The address of a character string descriptor which
;			contains the starting address and length of the byte
;			string to be searched.
;
;	NOTE:	Use either the STRING or the ADDR and LEN arguments but
;		not both.  Mixing the types of calls will produce strange
;		results.
;
;
	.ENTRY	FT_LOCC,^M<R2,R3,R4,R5,R6,R7,R8>
;
	CMPL	(AP),#3		; CHECK THE NUMBER OF ARGUMENTS.
	BEQL	THREE		; THREE ARGS. 
;
;		TWO ARGUMENTS - NEED TO GET THE ADDRESS AND THE LENGTH
;		OF THE STRING FROM THE DESCRIPTOR.
;
TWO:	CMPL	(AP),#2		; CHECK TO BE SURE THERE ARE TWO ARGS.
	BNEQ	ERR3
;
	MOVL	8(AP),R2	; GET THE ADDRESS OF THE DESCRIPTOR.
	MOVZWL	(R2),R3		; GET THE LENGTH OF THE STRING.
	MOVL	4(R2),R4	; GET THE STARTING ADDRESS.
;
	BRB	START
;
;		THREE ARGUMENTS - NEED TO GET THEM INTO THE REGISTERS
;		FOR THE LOCATE.
;
THREE:	MOVL	8(AP),R4	; GET THE START OF THE STRING.
	MOVL	@12(AP),R3	; GET THE LENGTH OF THE STRING.
;
;
;		START THE LOCATE BY FIRST TESTING FOR 0 LENGTH STRING AND
;		THEN DO THE LOCATE.
;
START:	TSTL	R3		; CHECK FOR ZERO LENGTH.
	BEQL	ERR1
;
	LOCC	@4(AP),R3,(R4)	; LOCATE THE DESIRED CHARACTER.
	SUBL3	R4,R1,R0	; SUBTRACT THE ADDR. OF THE START OF THE
				; STRING FROM THE ADDR. LOCATED TO GET THE
				; INDEX TO THE CHARACTER.
	INCL	R0
;
	CMPL	R0,R3		; CHECK THE LENGTH TO BE SURE IT IS
				; WITHIN LIMITS OF THE STRING.
	BGTR	ERR2
;
	RET			; NORMAL RETURN.
;
;		CHARACTER COULD NOT BE FOUND.
ERR2:	CLRL	R0
	RET
;
;		INVALID STRING LENGTH.
ERR1:	MOVL	#-1,R0
	RET
;
;		ARGUMENTS NOT CORRECT.
ERR3:	MOVL	#-2,R0
	RET
;
	.END
