*DECK DB$OPNM 
USETEXT CDGDFTX 
USETEXT CUGDFTX 
      PROC DB$OPNM(FIT,P2); 
      BEGIN 
 #
* *   DB$OPNM -- INTERFACE TO CRM OPEN FUNCTION  PAGE  1
* *   BOB MCALLESTER                             DATE  04/19/82 
* 
* DC  PURPOSE 
* 
*     IF AN ERROR OCCURS ON AN OPEN, ASSURE THAT THE FILE IS LEFT IN
*     A USABLE STATUS.
*     IF A CRM MEMORY ERROR OCCURS, TRY TO RELEASE SOME CDCS MEMORY 
*     AND TRY THE OPEN AGAIN. 
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETERS
* 
*     FIT                    THE FILE INFO TABLE TO BE OPENED.
*     P2                     AN ADDITIONAL OPENM PARAMETER -
*                            USUALLY DB$RA0.  PASSED TO OPENM, AS IS. 
* 
* DC  EXIT CONDITIONS 
* 
*     NORMAL
*       RETURN TO THE CALLING PROCEDURE.
* 
*     ON ERROR CONDITION
*       CALL THE PROCEDURE SPECIFIED IN FITEX.
* 
* DC  CALLING PROCEDURES
* 
*     DB$CPRO                CONSTRAINT PROCESSOR 
*     DB$OPN$                OPEN SYMBIONT
*     DB$RFIN                OPEN RESTART IDENTIFIER FILE (RIF) 
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC CLOSEM;      # CRM CLOSE PROCEDURE                     #
      XREF ITEM CMM$SBL I;   # CMM SMALL BLOCK LIMIT  (CMM.SBL)        #
      XREF PROC DB$CALL;     # CALL A VARIABLE PROCEDURE (FITEX)       #
      XREF PROC DB$CMOH;     # CDCS MEMORY OVERFLOW HANDLER            #
      XREF FUNC DB$COCT C(10);  # CONVERT INTEGER TO OCTAL DISPLAY     #
      XREF PROC DB$FLOP;     # RECORD A FLOW POINT                     #
      XREF ARRAY DB$RA0;;    # TERMINATE PARAMETER LIST                #
      XREF PROC OPENM;       # CRM OPEN PROCEDURE                      #
# 
* DC  DESCRIPTION 
* 
*     SAVE THE EX FIELD FROM THE FIT AND ZERO IT. 
* 
*     CALL OPENM TO OPEN THE FILE.
*     IF THERE IS NO ERROR ON THE OPEN, RESTORE THE EX FIELD AND RETURN.
* 
*     ERROR PROCESSING -- 
*       SAVE THE OPENM ERROR CODE.
*       IF IT WAS AN 'OPEN NEW' FUNCTION
*         CHANGE THE OC CODE TO OPENED. 
*       IF THE OC CODE IS OPENED
*         CLOSE THE FILE. 
*       IF THE CRM ERROR ON OPEN WAS 345 (INSUFFICIENT MEMORY)
*         CALL DB$CMOH TO RELEASE SOME CDCS MEMORY
*         AND REPEAT THE OPEN.
*         THIS LOOP IS REPEATED FOUR TIMES WITH FOUR DIFFERENT
*         LEVELS OF DB$CMOH CALLS.
* 
*       FINALLY RESTORE THE FITES AND FITEX.
*       CALL THE PROCEDURE SPECIFIED IN FITEX.
* 
*     NOTE -
*       THE REASON FOR THE SPECIAL PROCESSING ON AN 'OPEN NEW' IS THAT
*       CRM FLAGS THE FILE AS MODIFIED.  THE MODIFIED STATUS REMAINS
*       EVEN THOUGH OPEN PROCESSING IS NOT COMPLETED. 
*       IF THE FILE IS NOT CLOSED, ANY SUBSEQUENT OPEN ATTEMPT RESULTS
*       IN A CRM ERROR 052. 
 #
# 
*     PARAMETER DEFINITIONS 
# 
      ARRAY FIT;
*CALL FITDCLS 
  
      ARRAY P2;;
  
# 
*     LOCAL VARIABLES 
# 
      ITEM CMOHL   I;        # DB$CMOH CALL LEVEL                      #
      ITEM SAVEES  I;        # SAVE FITES                              #
      ITEM SAVEEX  I;        # SAVE FITEX                              #
      ITEM SAVSBL  I;        # SAVE CMM.SBL                            #
  
  
  
#     B E G I N   D B $ O P N M   E X E C U T A B L E   C O D E .      #
  
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("OPNM");
      CONTROL ENDIF;
  
      SAVEEX = FITEX[0];
      FITEX[0] = 0; 
  
      FOR CMOHL = 1 STEP 1 UNTIL 4
      DO
        BEGIN 
        SAVSBL = CMM$SBL;          # SAVE CURRENT SMALL BLOCK LIMIT    #
        CMM$SBL = O"377700";       # EXEMPT OPENM FROM SMALL BLOCK LIM #
  
        OPENM(FIT,P2,DB$RA0); 
  
        CMM$SBL = SAVSBL;          # RESTORE CURRENT SMALL BLOCK LIMIT #
        IF FITES[0] EQ 0
        THEN
          BEGIN 
          FITEX[0] = SAVEEX;
          RETURN;            # NORMAL RETURN                           #
  
          END 
        SAVEES = FITES[0];
  
        CONTROL IFGR DFFLOP,0;
          ITEM OPNMFLOP C(10) = "OPNM000   "; 
          C<4,3>OPNMFLOP = DB$COCT(SAVEES,3); 
          DB$FLOP(OPNMFLOP);  # FLOW POINT CONTAINS ERROR CODE         #
        CONTROL ENDIF;
  
        IF FITPD[0] EQ DFFITPDO 
          AND SAVEES EQ O"345"
        THEN
          BEGIN              # ON OPEN-OUTPUT CHANGE OPEN/CLOSE CODE   #
          FITOC[0] = DFFITOCOPEN; 
          FITFNF[0] = FALSE;
          END 
        IF FITOC[0] EQ DFFITOCOPEN
        THEN
          BEGIN              # WHEN OPEN, CLOSE THE FILE               #
          FITES[0] = 0; 
          CLOSEM(FIT,DFFITCFDET,DB$RA0);
          END 
        FITES[0] = 0; 
  
        IF SAVEES EQ O"345" 
        THEN
          BEGIN 
          DB$CMOH(CMOHL,0); 
          END 
        ELSE
          BEGIN 
          CMOHL = 4;         # FORCE COMPLETION OF THE FOR-LOOP        #
          END 
        END 
  
      FITES[0] = SAVEES;
      FITEX[0] = SAVEEX;
      IF SAVEEX NQ 0
      THEN
        BEGIN 
        DB$CALL(SAVEEX);
        END 
      END 
      TERM
