*DECK OPENSIO
PROC OPENSIO( (FET),(OPTION), STATIS );
BEGIN # OPENSIO #
CONTROL NOLIST; # EXECUSRS #
CONTROL LIST;
*IF DEF,IMS
#
**
*
* 1. PROC NAME AUTHOR DATE
* OPENSIO M. D. PICKARD 77/01/10
*
* 2. FUNCTIONAL DESCRIPTION
* OPENSIO WILL OPEN AN EXISTING SUPIO RANDOM FILE OR CREATE
* A NEW SUPIO RANDOM FILE.
*
* 3. METHOD USED
* IF THE FET IS RANDOM, THE FILE IS OPENED W/ ALTER IF THE
* OPTION IS NEW OR W/ THE OPTION IF OPTION IS NOT NEW. IF THE
* OPEN IS SUCCESSFUL AND THE OPTION WAS NEW, THE INITIAL SUPIO
* INDEX IS BUILT. IF THE OPTION WAS NOT NEW THE INDEX IS
* CHECKED TO SEE IF IT IS A SUPIO INDEX AND THAT THE INDEX
* AREA LENGTH IS LARGE ENOUGH. IF THE AREA IS NOT LARGE
* ENOUGH, THE NEEDED LENGTH IS PLACE IN THE FIRST WORD OF THE
* INDEX AREA
*
* 4. ENTRY PARAMETERS
* FET ADDRESS OF THE FET
* THE FET MUST CONTAIN THE INDEX BUFFER
* FWA AND LENGTH IN WORD FET+7
* OPTION OPEN OPTION
* 0 - READ/WRITE WITH REWIND
* "NEW" - OPEN W/ ALTER AS NEW FILE
* "ALTER" - READ/WRITE, REWIND
* "ALTERNR" - READ/WRITE, NO REWIND
* "NR" - NO REWIND
* "READ" - READ, REWIND
* "READNR" - READ, NO REWIND
* "WRITE" - WRITE, REWIND
* "WRITENR" - WRITE, NO REWIND
*
* 5. EXIT PARAMETERS
* STATIS RETURN STATUS
* 0 = OPEN SUCCESSFUL
* NOTSIOF - NOT A SUPIO FILE
* INDXSML - INDEX AREA TO SMALL
* INDXERR - INDEX POINTER IN ERROR
* RANRSEQ - RANDOM REQ. ON SEQ. FILE
*
* 6. COMDECKS CALLED
* SIODEFS SUPIO SYMPL DEFS
* SIOBASE SUPIO BASED ARRAY DEFINITIONS
*
* 7. ROUTINES CALLED
* OPEN MACREL OPEN SYMPL INTERFACE
* RECALL MACREL CPU RECALL SYMPL INTERFACE
*
* 8. DAYFILE MESSAGES
* NONE.
*
#
*ENDIF
*CALL SIODEFS
*CALL SIOBASE
ITEM
FET U, # FET ADDRESS #
OPTION C(10), # OPEN OPTION #
STATIS U, # RETURN STATUS #
TEMP C(10); # FOR INTEGER TO CHARACTER CONVERSION #
XREF
BEGIN
PROC ABORT;
PROC MESSAGE;
PROC OPEN;
PROC RECALL;
FUNC XCOD C(10);
END
DEF INDXAT # O"23" #; # INDEX BUFFER TOO SMALL ABN. TERM. CODE #
ARRAY ABNTMSG [0:0] S(4);
BEGIN
ITEM ABNTMSG1 C(0,0,33) = ["OPEN ERROR, ABN. TERM. CODE = XX."];
ITEM ABNTMSG2 C(3,0,2);
ITEM ABNTMSGZ U(3,18,42) = [ 0 ];
END
P<SIOFET> = FET; # FORMAT FET #
IF FETRAN[0]
THEN # FET IS A RANDOM FET #
BEGIN # SEE IF INDEX POINTERS ARE OK #
IF ( FETINDX[0] GQ 2 ) AND ( FETINDL GQ MINSIOI )
THEN # INDEX POINTERS OK #
BEGIN # SEE IF OPTION IS NEW #
P<SIOINDX> = FETINDX[0]; # FORMAT INDEX AREA #
FETFST[0] = FETINDX[0]; # SET CIRCULAR BUFFER PARAMS FOR #
# EXISTING FILES #
FETIN[0] = FETINDX[0];
FETOUT[0] = FETINDX[0];
FETLMT[0] = FETINDX[0] + FETINDL[0] + 1;
FETEP[0] = TRUE;
IF OPTION EQ "NEW"
THEN
OPEN(SIOFET,"ALTER"); # OPEN W/ ALTER #
ELSE
OPEN(SIOFET,OPTION); # OPEN W/ SPECIFIED OPTION #
RECALL(SIOFET); # WAIT TIL COMPLETE BIT SET #
FETEP[0] = FALSE;
IF FETABNT[0] EQ INDXAT
THEN # INDEX BUFFER TOO SMALL #
BEGIN
FETABNT[0] = 0; # CLEAR FOR NEXT USER OF FET #
STATIS = INDXSML; # INDEX AREA TOO SMALL #
RETINDL[0] = (LINDX[0] + 1) * 2; # NEEDED SIZE #
RETURN; # ***** EXIT ***** #
END
IF FETABNT[0] NQ 0
THEN # OPEN ERROR #
BEGIN
TEMP = XCOD(FETABNT[0]);
ABNTMSG2[0] = C<8,2>TEMP;
MESSAGE(ABNTMSG,3);
ABORT;
END
IF FETRAN[0]
THEN # OPEN WAS SUCCESSFUL #
BEGIN # SEE IF OPTION WAS NEW #
IF OPTION EQ "NEW"
THEN # OPTION IS NEW #
BEGIN # OPTION IS NEW, INITIALIZE SUPIO INDEX #
SIONAME[0] = "SUPIOINDEX"; # SUPIO INDEX NAME IN HEADER #
CINDX[0] = 0; # INITIALIZE CURRENT POSITION #
LINDX[0] = 0; # INITIALIZE LAST INDEX ORDINAL USED #
HDRRSV[0] = 0; # CLEAR HEADER RESERVED #
STATIS = 0; # SUCCESSFUL COMPLETE #
END
ELSE # OPTION WAS NOT NEW #
BEGIN # SEE IF FILE WAS A SUPIO FILE #
IF SIONAME[0] NQ "SUPIOINDEX"
THEN # NOT A SUPIO INDEX #
BEGIN
STATIS = NOTSIOF; # NOT A SUPIO FILE #
END
ELSE # FILE IS SUPIO FILE #
BEGIN # SEE IF INDEX BUFFER WAS BIG ENOUGH #
IF ( ( LINDX[0] + 1 ) * SIOINDL ) GR FETINDL[0]
THEN # INDEX TOO SMALL #
BEGIN
STATIS = INDXSML; # INDEX AREA TOO SMALL #
RETINDL[0] = ( LINDX[0] + 1 ) * 2; # NEEDED SIZE #
END
ELSE
STATIS = 0; # EVERYTHING IS OK. #
END
END
END
ELSE # FILE NOT SUPIO FILE, RANDOM BIT CLEARED #
STATIS = RANRSEQ; # RANDOM REQUEST ON SEQUENTIAL FILE #
END
ELSE # INDEX POINTERS NOT GOOD #
STATIS = INDXERR; # INDEX POINTER ERROR ON OPEN #
END
ELSE # FET IS NOT A RANDOM FET #
STATIS = RANRSEQ; # RANDOM REQUEST ON SEQUENTIAL FILE #
RETURN;
END
TERM # OPENSIO #