[next] [previous] [contents]
Example 14-1: Creating a USEROPEN Routine
%TITLE "Example USEROPEN"
%SBTTL "Useropen Routine to obtain RAB address"
%IDENT "Version 1.1"
FUNCTION LONG Get_rab_address ( Fabdef User_fab, Rabdef User_rab, LONG Channel )
!++
! FUNCTIONAL DESCRIPTION:
!
! Save the address of the RMS Record Access Block allocated by the caller
! in a global symbol. Open the file and return the status from RMS.
!
! FORMAL PARAMETERS (Standard for all BASIC USEROPEN procedures)
!
! User_fab Address of RMS File Access Block
! User_rab Address of RMS Record Access Block
! Channel Logical Unit assigned to file by caller.
!
! RETURN VALUE: RMS Status value
!
! GLOBAL COMMON USAGE
!
! RAB_ptr Single longword PSECT used to pass RAB address to caller.
!
!--
OPTION INACTIVE = SETUP, &
CONSTANT TYPE = INTEGER, &
TYPE = EXPLICIT
%NOLIST
%INCLUDE "$FABDEF" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
%INCLUDE "$RABDEF" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
%INCLUDE "$RMSDEF" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
%INCLUDE "STARLET" %FROM %LIBRARY "SYS$LIBRARY:BASIC$STARLET"
%LIST
!+
! Common area used to pass RAB address to caller.
!-
COMMON (RAB_ptr) LONG rab_address
DECLARE LONG Rms_status
!+
! Save RAB address in global symbol known to caller.
! Perform standard RMS open sequence
!-
Rab_address = LOC(User_rab::rab$b_bid)
Rms_status = Sys$open( User_fab )
IF Rms_status AND Rms$_normal
THEN
Rms_status = Sys$connect( User_rab )
END IF
END FUNCTION Rms_status