	.TITLE 	TRNALL ROUTINE TO TRANSLATE LOGICAL TO NO TRANSLATE CONDITION.
;
;		CALLING SEQUENCE IS:
;
;		ISTAT = TRNALL (LOGNAME,EQUINAME)
;			OR
;		CALL TRNALL (LOGNAME,EQUINAME)
;			OR
;		PUSHAL	EQUINAME
;		PUSHAL	LOGNAME
;		CALLS	#2,TRNALL
;
;		ARGUMENTS ARE:
;		LOGNAME	ADDRESS OF A CHARACTER DESCRIPTOR WHICH CONTAINS
;			THE LOGICAL NAME TO BE TRANSLATED.
;		EQUINAME  THE ADDRESS OF A CHARACTER DESCRIPTOR WHICH
;			  CONTAINS THE TRANSLATED EQUIVALENCE NAME.
;		ISTAT	SYSTEM STATUS RETURNED FROM TRNALL.
;
	$SSDEF
;
TRANSLATE::	$TRNLOG	LOGNAM=TRN_INSTR,RSLBUF=TRN_OUTSTR,-
			RSLLEN=TRN_NBYTES
;
;
	.ENTRY	TRNALL,^M<R2,R3,R4,R5,R6,R7,R8,R9,R10>
;
;			SET UP THE TRANSLATION BY FINDING THE LAST CHARACTER
;			IN THE INPUT STRING AND SET THAT INTO THE LOCAL
;			CHAR. DESCRIPTOR.  PUT THE DESCRIPTOR INTO THE
;			CALL AND THEN TRANSLATE
;
	MOVAL	TRN_INSTR,TRANSLATE+TRNLOG$_LOGNAM	; PUT THE ADDR OF THE
							; INPUT DESCRIPTOR INTO
							; THE CALL.
	MOVL	TRN_OUTSTR+4,R6		; OUTPUT STRING ADDRESS.
;
	MOVL	#1,R2			; SET UP INDEX.
	MOVL	@4(AP)[R2],TRN_INSTR+4	; GET THE ADDRESS OF THE STRING
					; TO TRANSLATE INTO THE LOCAL DESCRIPT.
;
	MOVL	@4(AP)[R2],R10		; GET TARGET ADDRESS.
	MOVZWL	@4(AP),R9		; GET TARGET LENGTH
;			SEARCH THE STRING FOR A ":" FIRST AND, IF NOT FOUND,
;			THEN SEARCH FOR A " ".  IF NO SPACE, THEN STRING
;			FILLS SPACE - USE THE LENGTH IN THE ARGUMENT.
	LOCC	#^X3A,R9,(R10)		; SEARCH FOR A ":".
	TSTL	R0			; TEST TO SEE IF ":" FOUND AND IF <> 0
	BNEQ	TRN_LEN			; BRANCH TO CALCULAT LENGTH.
;
	LOCC	#^X20,R9,(R10) 		; FIND THE FIRST <SP> IN STRING
	TSTL	R0			; IF R0 = 0 THEN NO SPACE -- 
	BEQL	TRN_100			; USE ORIGINAL STRING LENGTH.
;
;			COLON OR SPACE FOUND - CALCULATE STRING LENGTH.
TRN_LEN:
	MOVZWL	@4(AP),R3		; GET THE LENGTH PART OF THE DESCRIPTOR
	SUBL3	R0,R3,TRN_INSTR		; CALCULATE LENGTH AND PUT IN DESCRIPT.
	BRW	TRN_150
;			NO SPACE IN STRING - MOVE IN ORIGINAL LENGTH.
TRN_100:
	MOVZWL	@4(AP),TRN_INSTR	; MOVE THE ORIGINAL LENGTH TO DESCRIPT.
;
TRN_150:
	$TRNLOG_G	TRANSLATE
;
TRN1:	MOVL	R0,R8			; SAVE STATUS.
	CMPL	R0,#SS$_NOTRAN		; CHECK FOR NO TRANSLATION
	BEQL	GOTDEV			; AND BRANCH IF FOUND.
;
	MOVL	TRN_OUTSTR+4,TRN_INSTR+4	; MOVE THE ADDRESS OF THE OUT
					; STRING TO THE INSTRING.  USE SAME
					; BUFFER FOR INPUT AND OUTPUT.
TRNALL_10:
	MOVL	TRN_NBYTES,TRN_INSTR	; SET THE NEW STRING LENGTH.
;
	CMPB	#^X5F,TRN_OUTSTR+8	; CHECK FOR "_" AS FIRST CHAR.
	BNEQ	10$			; IF NOT - CONTINUE TRANSLATING.
	JMP	GOTDEV			; IF FOUND - EXIT.
;
10$:	MOVL	R0,R8
	CMPL	R0,#SS$_NORMAL		; CHECK FOR NORMAL END ON PREVIOUS AND
	BNEQ	OUT_TRN			; TRANSLATION AND IF NOT, EXIT.
;
;		CONTINUE TRANSLATING UNTIL WE GET A NO_TRAN.
;
	$TRNLOG_G	TRANSLATE
;
TRN2:	CMPL	R0,#SS$_NOTRAN		; CHECK FOR NO TRANSLATION AND
	BNEQ	TRNALL_10		; IF NOT, BRANCH TO TRY AGAIN.
;
GOTDEV:	MOVL	#SS$_NORMAL,R8		; SET UP NORMAL EXIT CODE.
;
	CMPW	#^X001B,(R6)		; CHECK FOR <ESC> SEQ. AS START OF
					; STRING.  THIS IS AT THE BEGINNING OF
					; TERMINAL NAMES ONLY (I THINK).
	BNEQ	OUT_TRN			; IF NOT = THEN SKIP.
;			<ESC> SEQ. FOUND - DELETE THIS FROM THE STRING
;			BEFORE PASSING TO THE USER.
TRN3:	ADDL2	#4,R6			; INCREMENT ADDRESS TO BYPASS.
	SUBL2	#4,TRN_NBYTES		; DECREMENT NUMBER OF CHARACTERS.
;
;			COPY THE STRING INTO THE USER'S BUFFER.
OUT_TRN:
	MOVL	#1,R7			; SET UP INDEX TO COPY STRING TO USER
	MOVZWL	@8(AP),R9		; GET THE NUMBER OF CHARACTERS IN TARG.
	MOVL	@8(AP)[R7],R10		; GET THE ADDRESS OF TARGET.
	MOVC5	TRN_NBYTES,(R6),#^X20,R9,(R10)
	MOVL	R8,R0			; SET UP RETRUN CODE.
	RET				; RETURN.
;
TRN_INSTR:	.QUAD	0		; LOCAL DESCRIPTOR FOR USER'S INPUT
;
TRN_OUTSTR:	.LONG	256		; LOCAL CHARACTER DESCRIPTOR AND BUFFER
		.LONG	TRN_OUTSTR+8
		.BLKB	256
;
TRN_NBYTES:	.LONG	0		; THE NUMBER OF BYTES RETURNED FROM 
					; THE TRANSLATION IN TRNLOG.
;
	.END
