*DECK DB$NEED 
USETEXT CDCSCTX 
      FUNC DB$NEED  I;
      BEGIN 
 #
* *   DB$NEED -- COMPUTE NUMBER OF FITS NEEDED   PAGE  1
* *   R L MCALLESTER                             DATE 07/06/86
* 
* DC  PURPOSE 
* 
*     COMPUTE THE INCREASE/DECREASE IN THE NUMBER OF FITS TO BE USED. 
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$FLOP;     # GENERATE A FLOW POINT                   #
# 
* DC  NON LOCAL VARIABLES 
* 
*     CDCS COMMON 
* 
 #
# 
*     LOCAL VARIABLES 
# 
      ITEM FITSC;            # NUMBER OF FITS CURRENTLY ALLOCATED.     #
      ITEM FITSD;            # NUMBER OF FITS DESIRED.                 #
      ITEM XA;               # INDEX VARIABLE                          #
  
  
  
#     B E G I N   D B $ N E E D   E X E C U T A B L E   C O D E .      #
  
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("NEED   "); 
      CONTROL ENDIF;
  
 #
*     COMPUTE THE NUMBER OF FITS DESIRED FOR THE NUMBER OF OPENS. 
 #
      IF OFOPENS[0] EQ 0
      THEN
        BEGIN 
        FITSD = 0;                 # NO INSTANCES OF OPEN, NO FITS     #
        END 
      ELSE
        BEGIN 
                                   # FITSD = LOG(OFOPENS) + K          #
        FITSD = FCADJUST; 
        FOR XA = OFOPENS[0] WHILE XA NQ 1 
        DO
          BEGIN 
          FITSD = FITSD +1; 
          XA = XA/2;
          END 
        IF FITSD LS 1 
        THEN
          BEGIN 
          FITSD = 1;               # SET MINIMUM NUMBER OF FITS        #
          END 
        IF FITSD GR OFOPENS[0] +1 
        THEN
          BEGIN 
          FITSD = OFOPENS[0] +1;   # SET MAXIMUM                       #
          END 
        END 
 #
*     COUNT THE CURRENT NUMBER OF FITS. 
 #
      P<UFT> = LOC(OFUFT[0]); 
      XA     = LOC(OFUFT[0]); 
      FITSC = 0;
      IF UFWORD[0] NQ DFNPTR
      THEN
        BEGIN 
        CONTROL FASTLOOP;          # GUARANTEE ONE EXECUTION OF LOOP   #
        FOR XA = XA WHILE P<UFT> NQ XA
        DO
          BEGIN 
          FITSC = FITSC + 1;
          P<UFT> = UFNEXT[0]; 
          END 
        END 
        CONTROL SLOWLOOP; 
      DB$NEED = FITSD - FITSC;
      RETURN; 
  
      END 
      TERM; 
