Trailing-Edge
-
PDP-10 Archives
-
BB-H138F-BM_1988
-
7-sources/rmsrsu.b36
There are 6 other files named rmsrsu.b36 in the archive. Click here to see a list.
%TITLE 'R S E T U P -- initiate record operation'
!<BLF/REQUIRE 'RMSBLF.REQ'>
MODULE rsetup (IDENT = '2.0'
) =
BEGIN
GLOBAL BIND! 3 . 0 ( )
rsetv = 3^24 + 0^18 + 536; ! Edit date: 14-Dec-84
!+
!
!
!
! COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1977, 1986.
! ALL RIGHTS RESERVED.
!
! THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND
! COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH
! THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR
! ANY OTHER COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE
! AVAILABLE TO ANY OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE
! SOFTWARE IS HEREBY TRANSFERRED.
!
! THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT
! NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL
! EQUIPMENT CORPORATION.
!
! DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF
! ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.
!
!
!
! FUNCTION: THIS MODULE IS USED ONLY TO INITIATE THE PROCESSING
! OF A RECORD OPERATION ( E.G. GET, PUT,... ). IT IS CALLED
! AT THE BEGINNING OF EACH SUCH OPERATION IN ORDER TO CHECK
! FOR ERRORS AND TO SET UP THE RELEVANT DATA STRUCTURE POINTERS.
! IT EXISTS AS A SELF-CONTAINED MODULE TO ALLOW IT TO BE PLACED
! ANYWHERE IN ORDER TO MINIMIZE PAGE FAULTS.
!
! AUTHOR: S. BLOUNT
!
!
!
! REVISION HISTORY:
!
! EDIT DATE WHO PURPOSE
! ==== ==== ==== =======
!
! 1 21-JUL-76 SB ADD FSETUP /SB
! 2 22-DEC-76 SB CHANGE ER$IOP TO ER$FAC
! 3 16-MAY-77 SB DELETE CHECK FOR KBF ERROR
! 4 21-JUN-77 SB MAKE RSETUP NOT CHECK ERRORS IF FACBIT=TRUE
!
! *************************************************
! * *
! * NEW REVISION HISTORY *
! * *
! *************************************************
!
! PRODUCT MODULE SPR
! EDIT EDIT QAR DESCRIPTION
! ====== ====== ===== ===========
!
!
! ***** END OF REVISION HISTORY *****
!
! ***** BEGIN VERSION 2 DEVELOPMENT *****
!
!
! PRODUCT MODULE SPR
! EDIT EDIT QAR DESCRIPTION
! ====== ====== ===== ===========
!
! 301 300 XXXXX SUPPORT EXTENDED ADDRESSING.
!
! 400 400 xxxxx Clean up BLISS code (RL,22-Apr-83)
! 401 401 xxxxx Fix CBD initialization (RL, 1-May-83)
! 403 403 Add Stream RFA access
!
! 536 536 Change range check for RAC
!
!
!-
REQUIRE 'RMSREQ';
%SBTTL 'RSETUP - setup for record verb'
GLOBAL ROUTINE rsetup (facbit) : NOVALUE =
! RSETUP
! ======
!
! THIS ROUTINE PERFORMS ALL SET UP REQUIRED FOR EACH
! RECORD-RELATED VERB.
!
! INPUT:
! FACBIT = FILE-ACCESS BIT TO CHECK
! (IF FACBIT = TRUE, THEN ANY FAC VALUE IS TO
! BE ACCEPTED, AND NO ERROR CHECKS ON RAC, ETC.
! ARE TO BE DONE)
!
! OUTPUT:
! <NO VALUE RETURNED>
!
! NOTES:
!
! 1. ON AN ERROR, THIS ROUTINE WILL EXIT DIRECTLY TO USER.
!+
!
! THIS ROUTINE CHECKS THE FOLLOWING THINGS:
!
! 1. RAB MUST BE PROPERLY STRUCTURED
! A. BLOCK-CODE VALID
! 2. RECORD-ACCESS VALUE IS LEGAL FOR FILE AND DEVICE
! 3. OPERATION WAS GIVEN IN FAC FIELD
! 4. UNUSED OPTIONS ARE 0
! 5. KBF NOT 0 IF KEY ADDRESSING
! 6. RFA ADDRESSING IS USED ONLY FOR RMS DISK FILES
!
!
!-
BEGIN
REGISTER
errorcode, ! Keep code here
rabptr : REF $Rab_decl, ! For speed, !m536
fstptr : REF $Rms_Fst, ! use registers !m536
rstptr : REF $Rms_Rst; ! !m536
LABEL
errchk;
TRACE ('RSETUP');
errorcode = 0; ! Clear this variable
errorblock (rab); ! All errors go to RAB
rabptr = .rab; ! Set up registers
!+
! Beginning of block which will check for errors.
! The first error which is found will cause an exit
! to the end of the block.
!-
errchk :
BEGIN
IF .rabptr [blocklength] LSS v1rabsize ! RAB right length?
THEN
(LEAVE errchk WITH errorcode = er$bln);
IF .rabptr [blocktype] NEQ rabcode ! Really a RAB?
THEN
(LEAVE errchk WITH errorcode = er$rab);
IF (fab = .rab [rabfab, 0]) EQL 0 ! Check FAB pointer
THEN
(LEAVE errchk WITH errorcode = er$ifi); ! Bad FAB pointer
fab = .fab OR .blksec; ! Get global address of FAB
IF (fstptr = .fab [fabifi, 0]) EQL 0 ! File not open?
THEN
(LEAVE errchk WITH errorcode = er$ifi); ! Afraid so
IF .fstptr [flink] EQL .fstptr ! Anything connected?
THEN
(LEAVE errchk WITH errorcode = er$isi); ! Not connected
rstptr = .rabptr [rabisi, 0]; ! Get ISI
IF (.fstptr [blocktype] NEQ fstcode) OR (.rstptr [blocktype] NEQ rstcode)
THEN
(LEAVE errchk WITH errorcode = er$isi); ! Bad ISI
!+
! Set up the global pointers.
!-
fst = .fstptr; ! Store IFI (FST address)
rst = .rstptr; ! Store ISI (RST address)
cbd = .rstptr + rstcbdoffset; ! Current bucket descriptor
![401] Fix CBD initialization
!+
! If this is a $DISCONNECT (i.e., FACBIT=TRUE),
! then we don't want to do any checks on the content
! of the RAB fields such as RAC, etc.
!-
IF .facbit NEQ true
THEN
BEGIN ! Do these error checks
IF .rabptr[rab$b_rac] GTR rab$k_bft ! Invalid access code !m536
THEN
( LEAVE errchk WITH errorcode = Rms$_Rac );
%IF 0
%THEN
!+
! Check that file is not in an undefined state.
! **This code is dis-abled currently***
!-
IF (.fstptr [fstflags] AND flgundef) NEQ 0 ! Unused bits
THEN
(LEAVE errchk WITH errorcode = er$udf);
!+
! This next check will be eliminated for now ( speed )
!-
IF (.rabptr [rabrop, 0] AND ropunused) NEQ 0 ! Unused bits
THEN
(LEAVE errchk WITH errorcode = er$iro);
%FI
IF (.fstptr [fstfac] AND .facbit) EQL 0 ! Legal file access requested?
THEN
(LEAVE errchk WITH errorcode = er$fac); ! Check for FAC bit
CASE .rabptr [rab$b_rac] !
FROM rab$k_seq TO rab$k_bft OF ! Check various things !m536
SET
[OUTRANGE, INRANGE] :
( LEAVE errchk WITH errorcode = Rms$_Rac ); ! Bad access
[Rab$k_Seq,
Rab$k_Tra] : !a536
0; ! Sequential: No checks here
[Rab$k_Blk, ! Block Mode !a536vv
Rab$k_Bft] :
BEGIN
0
%( Test removed
IF ( .Fst[Fst$b_Fac] AND (Fab$m_Bio+Fab$m_Bro) ) EQL 0
THEN
( LEAVE errchk WITH errorcode = Rms$_Rac );
)%
END; !a536^^
[Rab$k_Key] :
BEGIN ! Key access : Check key buffer
IF (fileorg LSS fab$k_Rel) ! Key access to seq files
AND (NOT fixedlength) ! is only legal for !m567
THEN ! fixed length records
( LEAVE errchk WITH errorcode = Rms$_Rac );
END;
[Rab$k_Rfa] :
BEGIN ! RFA access
![401] ASCII check removed
IF (dasd EQL false) ! Non-disk?
AND (.Fst[Fst$v_Remote] EQL false) ! non-remote !a577
THEN
(LEAVE errchk WITH errorcode = er$rac)
END;
TES
END
END;
!+
! Did we find an error?
!-
IF .errorcode NEQ 0 THEN usererror (.errorcode);
!+
! Check to see if the last operation was successful.
!-
IF NOT success THEN rst [rstlastoper] = 0; ! If not, don't remember it
clearsuccess; ! Clear flag
RETURN
END; ! End routine RSETUP
%SBTTL 'FSETUP - setup for file operation'
GLOBAL ROUTINE fsetup : NOVALUE =
! FSETUP
! ======
! ROUTINE TO SET UP FOR FILE OPERATIONS.
! THIS ROUTINE IS USED FOR FILE OPERATIONS TO SET UP
! POINTERS TO THE RELEVANT INTERNAL BLOCKS, AND TO
! CHECK THAT THE USER IS ACCESSING A VALID FILE, ETC.
! THIS ROUTINE DOES NOT CHECK IF THE FILE-STATUS TABLE
! IS CORRECT, BECAUSE $OPEN/$CREATE DO NOT REQUIRE THIS.
! INPUT:
! <NONE>
! OUTPUT:
! <NO STATUS RETURNED>
BEGIN
REGISTER
errorcode;
TRACE ('FSETUP');
errorblock (fab); ! Errors go to the FAB
errorcode = 0; ! Init error code
!+
! Check if this is a FAB
!-
IF .fab [blocktype] NEQ fabcode THEN errorcode = er$fab;
IF .fab [blocklength] NEQ v1fabsize THEN errorcode = er$bln;
IF (fst = .fab [fabifi, 0]) EQL 0 THEN errorcode = er$ifi;
!+
! Check for errors
!-
IF .errorcode NEQ 0
THEN
BEGIN
usrsts = .errorcode; ! Store error code
usrret () ! Return to user
END;
RETURN
END; ! End routine FSETUP
END
ELUDOM