C   ---------------------------------------------------------------------------
C   LOGTRANS - The function of this routine is to translate a logical name
C	until no more translations are possible.
C
C	LOG - Must contain the string to be translated.
C
C	LENGTH - On exit will contain the length of the translated string.
C   ---------------------------------------------------------------------------
C
	CHARACTER*(*) FUNCTION LOGTRANS (LOG,LENGTH)
C
	IMPLICIT INTEGER*4 (A-Z)
C
	EXTERNAL	SS$_NOTRAN
C
	PARAMETER	COLON=':'
C
	CHARACTER	ESCNULCHAR*2
	CHARACTER	LOG*(*)
C
	BYTE		ESCNUL(2) /'1B'x,'00'x/
C
	EQUIVALENCE	(ESCNUL, ESCNULCHAR)
C
C   ---------------------------------------------------------------------------
C
C   Translate the logical names to device names.
C
	LOGTRANS = LOG
	CALL STR$TRIM( LOGTRANS, LOGTRANS, LENGTH )
D		PRINT *,'LENGTH OF LOGTRANS IS: ',LEN(LOGTRANS)
D		PRINT *,'IN LOGTRANS WITH: '//LOGTRANS( 1:LENGTH )
	IF ( INDEX( LOGTRANS, COLON ) .EQ. LENGTH ) THEN
		LENGTH = LENGTH - 1
	END IF
	STATUS = 1
	DO WHILE (STATUS .NE. %LOC(SS$_NOTRAN))
D		PRINT *,'LENGTH OF LOGTRANS IS: ',LEN(LOGTRANS)
D		PRINT *,'IN LOGTRANS WITH: '//LOGTRANS( 1:LENGTH )
		STATUS = SYS$TRNLOG (LOGTRANS(1:LENGTH),LENGTH,LOGTRANS,,,)
		IF (.NOT.STATUS) CALL LIB$SIGNAL( %VAL( STATUS ) )
		IF ( INDEX( LOGTRANS, COLON ) .EQ. LENGTH ) THEN
			LENGTH = LENGTH - 1
		END IF
	END DO
C
C   See if this is a process preminate file.
C
	IF (ESCNULCHAR .EQ. LOGTRANS(1:2) ) THEN
		LOGTRANS = LOGTRANS(5:LENGTH)
		LENGTH = LENGTH - 4
	END IF
C
C   Return.
C
	LOGTRANS = LOGTRANS(1:LENGTH)
D	PRINT *,'RETURNING FROM LOGTRANS WITH: '//LOGTRANS( 1:LENGTH )
	RETURN
	END
