Google
 

Trailing-Edge - PDP-10 Archives - RMS-10_T10_704_FT2_880425 - 10,7/rms10/rmssrc/rmsrsu.b36
There are 6 other files named rmsrsu.b36 in the archive. Click here to see a list.
MODULE  RSETUP =


BEGIN

GLOBAL BIND	RSETV = 1^24 + 0^18 + 4;	!EDIT DATE: 21-JUN-77

%([

THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.

!COPYRIGHT (C) 1977, 1979 BY DIGITAL EQUIPMENT CORPORATION


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 *****




])%



	%([ EXTERNAL DECLARATIONS ])%

EXTERNAL
    CRASH,
    DUMP,			
    GMEM,
    GPAGE,
    PMEM,
    PPAGE;



REQUIRE 'RMSREQ';
EXTDECLARATIONS;



! 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

])%

GLOBAL ROUTINE RSETUP ( FACBIT ): NOVALUE =
BEGIN
	ARGUMENT (FACBIT,VALUE);		! THIS BIT MUST BE SET IN FAC FIELD

REGISTER
    RABPTR,				! FOR SPEED, WE WILL USE REGISTERS FOR THESE BLOCKS
    ERRORCODE,			! KEEP CODE HERE
    FSTPTR,
    RSTPTR;
LABEL LOOP;

MAP
    RABPTR:	POINTER,
    FSTPTR:	POINTER,
    RSTPTR:	POINTER;

	TRACE ('RSETUP');
	ERRORCODE = ZERO;			! CLEAR THIS VARIABLE
	ERRORBLOCK (RAB);			! ALL ERRORS GO TO RAB
	RABPTR = .RAB;				! SET UP REGISTERS
	FAB = .RAB [RABFAB];			!GET FAB PTR FROM RAB
	FSTPTR = .FAB [FABIFI];			!GET FST ADDR FROM FAB

	IF .FAB EQL 0 OR .FST EQL 0		! FILE NOT OPEN?
	THEN USERERROR (ER$IFI);		! FRAID SO
	IF .FSTPTR [FLINK] EQL .FSTPTR		!ANYTHING CONNECTED?
	THEN USERERROR (ER$ISI);		! NOT CONNECTED

	RSTPTR = .RABPTR [ RABISI ];		! GET ISI
	FST = .FSTPTR;				! STORE IS ALSO IN GLOBAL
	RST = .RSTPTR;

	%([ SET UP THE POINTER TO THE CURRENT BUCKET DESCRIPTOR IN THE RST ])%

	CBD = .RST + RSTCBDOFFSET;

	%([ BEGINNING OF BLOCK WHICH WILL CHECK FOR ERRORS.
	   THE FIRST ERROR WHICH IS FOUND WILL CAUSE AN EXIT
	   TO THE END OF THE BLOCK ])%

LOOP:	BEGIN
	IF .RABPTR [ BLOCKLENGTH ] LSS V1RABSIZE THEN ( LEAVE LOOP WITH ERRORCODE =  ER$BLN );
	IF .RABPTR [ BLOCKTYPE ] ISNT RABCODE THEN (LEAVE LOOP WITH ERRORCODE = ER$RAB );
	IF	(.FSTPTR [ BLOCKTYPE ] ISNT FSTCODE)
				OR
		(.RSTPTR [ BLOCKTYPE ] ISNT RSTCODE)
		THEN ( LEAVE LOOP WITH ERRORCODE = ER$ISI);		! BAD ISI

	%([ 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 ISNT TRUE 
	THEN	%(DO THESE ERROR CHECKS)%

		BEGIN
		IF .RABPTR [ RABRAC ] GTR RACRFA
			THEN ( LEAVE LOOP WITH ERRORCODE = ER$RAC);

		%([ CHECK THAT FILE IS NOT IN AN UNDEFINED STATE ])%
		%([ **THIS CODE IS DIS-ABLED CURRENTLY***])%

!		IF ( .FST [ FSTFLAGS ] AND FLGUNDEF ) ISON
!		THEN
!			( LEAVE LOOP WITH ERRORCODE _  ERUDF );


		%([ THIS NEXT CHECK WILL BE ELIMINATED FOR NOW ( SPEED ) ])%
!		IF (.RABPTR [ RABROP ] AND ROPUNUSED) ISNT ZERO
!			THEN ( LEAVE LOOP WITH ERRORCODE _ ERIRO);

		IF (FILEACCESS AND .FACBIT) IS ZERO
			THEN ( LEAVE LOOP WITH ERRORCODE = ER$FAC);	! CHECK FOR FAC BIT

		CASE RECORDACCESS FROM 0 TO 2 OF			! CHECK VARIOUS THINGS
			SET
			[0]:	%(SEQ)%	0;		! NO CHECKS HERE
			[1]:	%(KEY)%	BEGIN		! CHECK KEY BUFFER

					IF FILEORG LSS ORGREL THEN ( LEAVE LOOP WITH ERRORCODE = ER$RAC);
					END;	%( OF CASE KEY )%

			[2]:	%(RFA)%	BEGIN
					IF (DASD IS FALSE)
						OR
					(ASCIIFILE)
					THEN ( LEAVE LOOP WITH ERRORCODE = ER$RAC)
					END	%( OF CASE RFA )%
			TES	%( END OF CASE RECORDACCESS )%
			END %(OF IF .FACBIT ISNT TRUE)%

		END; %(OF BLOCK USED TO CHECK FOR ERRORS)%

	%([ DID WE FIND AN ERROR? ])%

	IF .ERRORCODE ISNT ZERO
	THEN USERERROR (.ERRORCODE);

	%([ CHECK TO SEE IF THE LAST OPERATION WAS SUCCESSFUL ])%

	IF NOT SUCCESS THEN RST [ RSTLASTOPER ] = ZERO;		! IF NOT, DONT REMEMBER IT
	CLEARSUCCESS;						! CLEAR FLAG

	RETURN

END;	%( OF RSETUP )%


! 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>

GLOBAL ROUTINE FSETUP: NOVALUE  =
BEGIN

REGISTER
    ERRORCODE;

	TRACE ( 'FSETUP');
	ERRORBLOCK ( FAB );			! ERRORS GO TO THE FAB
	ERRORCODE = ZERO;			! INIT ERROR CODE

	%([ CHECK IF THIS IS A FAB ])%

	IF .FAB [ BLOCKTYPE ] ISNT FABCODE THEN ERRORCODE = ER$FAB;
	IF .FAB [ BLOCKLENGTH ] ISNT V1FABSIZE THEN ERRORCODE = ER$BLN;
	IF ( FST = .FAB [ FABIFI ] ) IS ZERO THEN ERRORCODE = ER$IFI;

	%([ CHECK FOR ERRORS ])%

	IF .ERRORCODE ISNT ZERO
	THEN
		BEGIN
		USRSTS = .ERRORCODE;		! STORE ERROR CODE
		USEREXIT			! RETURN TO USER
		END; %( OF IF ERRORCODE IS NON-ZERO)%

	RETURN
END; %( OF FSETUP)%
END
ELUDOM