[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