	.TITLE	TRNLOG - TRANSLATE LOGICAL NAME TO ITS LOWEST LEVEL
	.IDENT	/01/

;	COPYRIGHT (C) 1980
;	MANAGEMENT SCIENCE ASSOCIATES, INC.
;	5100 CENTRE AVENUE
;	PITTSBURGH, PENNA. 15232
;
;	AUTHOR:	MARK PILANT
;		FEBRUARY 1980

; OFFSETS INTO ARG BLOCK

	LOG=	4			;LOGICAL NAME
	EQV=	8			;EQUIVALENCT NAME
	LEN=	12			;LENGTH

; NEEDED STORAGE

EQVDSC:	.LONG	512
	.ADDRESS	EQVBUF
EQVBUF:	.BLKB	512

TMPDSC:	.LONG	512
	.ADDRESS	TMPBUF
NAMDSC:	.LONG	512
	.ADDRESS	TMPBUF
TMPBUF:	.BLKB	512

SCRDSC:	.LONG	512
	.ADDRESS	SCRBUF
OUTDSC:	.LONG	512
	.ADDRESS	SCRBUF
SCRBUF:	.BLKB	512

; FORMAT CONTROL STRING

FMTDSC:	.ASCID	\!AD!AS\
CFMT:	.ASCID	\!AS:!AS\
NCFMT:	.ASCID	\!AS!AS\

	.PAGE
	.SBTTL	TRNLOG - TRANSLATE LOGICAL NAME

; ROUTINE:	TRNLOG
;
; CALL:		CALL TRNLOG(LOGICAL_NAME,EQUIVALENT_STRING,LENGTH)
;
; WHERE:	LOGICAL_NAME - THE LOGICAL NAME TO TRANSLATE
;		EQUIVALENT_STRING - THE FULLY TRANSLATED LOGICAL NAME
;		LENGTH - THE LENGTH OF THE EQUIVALENT NAME STRING

	.ENTRY	TRNLOG,^M<R2,R3,R4,R5,R6,R7,R8,R9,R10>

; START THINGS OFF...

	CLRW	EQVDSC			;SET LENGTH TO ZERO
	MOVAL	@LOG(AP),R6		;GET ADDR OF LOGICAL NAME DESCR
10$:	$TRNLOG_S	LOGNAM=(R6),-	;DO INITIAL TRANSLATION
			RSLLEN=NAMDSC,-
			RSLBUF=TMPDSC,-
			DSBMSK=#0
	BLBS	R0,20$			;XFER IF NO ERRORS
	$EXIT_S	R0			;ELSE EXIT WITH STATUS IN R0
20$:	CMPW	R0,#SS$_NOTRAN		;ANY TRANSLATION DONE?
	BEQL	30$			;XFER IF NONE
	MOVAL	NAMDSC,R6		;ELSE SET ADDR OF LOGICAL NAME
	BRB	10$			; AND TRANSLATE AGAIN
30$:	LOCC	#^A/:/,NAMDSC,TMPBUF	;LOCATE ANY COLON IN NAME
	BEQL	TRNDUN			;XFER IF NO COLON...TRANSLATE DONE
	PUSHR	#^M<R0,R1>		;SAVE LENGTH AND ADDR
	PUSHAL	EQVDSC			;ADDR OF INPUT
	PUSHAB	1(R1)			;ADDR OF ADDITIONAL TEXT
	SUBL3	#1,R0,-(SP)		;NUMBER OF BYTES IN ADDITIONAL TEXT
	PUSHAQ	OUTDSC			;WHERE TO PUT OUTPUT
	PUSHAW	SCRDSC			;WHERE TO PUT LENGTH
	PUSHAQ	FMTDSC			;ADDR OF CONTROL STRING
	CALLS	#6,SYS$FAO		;FORMAT STRING
	BLBS	R0,40$			;XFER IF ALL OK
	$EXIT_S	R0			;ELSE EXIT WITH STATUS
40$:	MOVW	SCRDSC,EQVDSC		;XFER SIZE
	MOVC3	EQVDSC,SCRBUF,EQVBUF	;XFER TEXT
	POPR	#^M<R0,R1>		;RESTORE LENGTH AND ADDR
	SUBL3	#TMPBUF,R1,NAMDSC	;SET NEW LENGTH
	$TRNLOG_S	LOGNAM=NAMDSC,-	;TRANSLATE NEW NAME
			RSLLEN=NAMDSC,-
			RSLBUF=TMPDSC,-
			DSBMSK=#0
	CMPW	R0,#SS$_NOTRAN		;TRANSLATION DONE?
	BEQL	TRNDUN			;XFER IF NOT
	BLBS	R0,30$			;XFER IF ALL ELSE OK
	$EXIT_S	R0			;ELSE EXIT WITH STATUS
TRNDUN:	MOVAL	CFMT,R2			;SET TO ADD COLON
	$GETDEV_S	DEVNAM=NAMDSC,-	;SEE IF REAL DEVICE
			PRIBUF=OUTDSC,-
			SCDBUF=OUTDSC
	BLBS	R0,10$			;XFER IF REAL DEVICE
	MOVAL	NCFMT,R2		;ELSE NO COLON
10$:	PUSHAQ	EQVDSC			;GET ADDR OF SECOND PART
	PUSHAQ	NAMDSC			;GET ADDR OF FIRST PART
	PUSHAQ	@EQV(AP)		;WHERE TO PUT RESULT
	PUSHAW	@LEN(AP)		;WHERE TO PUT LENGTH
	PUSHAQ	(R2)			;GET ADDR OF CONTROL STRING
	CALLS	#5,SYS$FAO		;FORMAT STRING
	BLBS	R0,20$			;XFER IF NO ERRORS
	$EXIT_S	R0
20$:	RET

	.END
