.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 ; ; 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 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 SEQ. AS START OF ; STRING. THIS IS AT THE BEGINNING OF ; TERMINAL NAMES ONLY (I THINK). BNEQ OUT_TRN ; IF NOT = THEN SKIP. ; 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