[next] [previous] [contents]
Example 20-3: Calling System Services
10 !This function attempts to translate a logical name while searching
!through all of the tables defined in LNM$DCL_LOGICAL. If the translation
!is successful, $TRNLNM returns the equivalence name string.
FUNCTION STRING Translate(STRING Logical_name)
EXTERNAL LONG FUNCTION SYS$TRNLNM (LONG, STRING, STRING, LONG, ITEM_LIST)
EXTERNAL LONG CONSTANT LNM$M_CASE_BLIND, LNM$_STRING, SS$_NORMAL
!Declare the parameters
DECLARE LONG attributes, &
trans_status
DECLARE WORD equiv_len
!Declare the value returned by the function.
DECLARE LONG CONSTANT Buffer_length = 255
RECORD item_list
GROUP item (1)
VARIANT
CASE
WORD Buf_len
WORD Code
LONG Buffer_address
LONG Length_address
CASE
LONG Terminator
END VARIANT
END GROUP item
END RECORD item_list
!Declare an instance of the record
DECLARE ITEM_LIST TRNLNM_ITEMS
!Define a common area for Translation_buffer
COMMON (Trans_buffer) &
STRING Translation_buffer = Buffer_length
!Setting TRN$LNM to not distinguish between uppercase and lowercase
!letters in the logical name to be translated.
Attributes = LNM$M_CASE_BLIND
!Assign values to each record item.
TRNLNM_ITEMS::item(0)::Buf_len = Buffer_length
TRNLNM_ITEMS::item(0)::Code = LNM$_STRING
TRNLNM_ITEMS::item(0)::Buffer_address = LOC(Translation_buffer)
TRNLNM_ITEMS::item(0)::Length_address = LOC(Equiv_len)
TRNLNM_ITEMS::item(1)::Terminator = 0%
!Invoke the function
TRANS_STATUS = SYS$TRNLNM(attributes,"LNM$DCL_LOGICAL", logical_name, &
,trnlnm_items)
!Check the condition value
IF trans_status AND SS$_NORMAL
THEN
Translate = LEFT(Translation_buffer, Equiv_len)
ELSE
Translate = ""
END IF
END FUNCTION