*DECK,GETSELC 
USETEXT COMCBEG 
USETEXT COMQDEF 
USETEXT COMQSEL 
      PROC GETSELC((SEARCHSET),(SLOTSFREE),(CURRENT),NEXTSC,NOSELAVAIL);
        BEGIN    # GETSELC #
# 
**    GETSELC    GET NEXT AVAILABLE SELECTION CLASS.
* 
*     DETERMINES THE NEXT SUITABLE SELECTION CLASS, IF ANY, FOR WHICH 
*     A FILE CAN BE SCHEDULED.
* 
*     PROC GETSELC((SEARCHSET),(SLOTSFREE),(CURRENT),NEXTSC,NOSELAVAIL) 
* 
*     ENTRY      SEARCHSET = SET OF SELECTION CLASSES TO SEARCH 
*                SLOTSFREE = NUMBER OF FREE CONNECTION SLOTS
*                CURRENT = CURRENT SELECTION CLASS ORDINAL. 
* 
*     EXIT       NEXTSC = NEXT AVAILABLE SELECTION CLASS ORDINAL
*                         (UNDEFINED IF NOSELAVAIL TRUE). 
*                NOSELAVAIL = TRUE IF NO SELECTION CLASS AVAILABLE. 
* 
*     PROCESS    SET NO-CLASS-AVAILABLE TO TRUE 
*                FOR EACH SELECTION-CLASS BEFORE CURRENT: 
*                  ADJUST SLOTSFREE FOR RESERVED, UNUSED SLOTS. 
*                FOR EACH SELECTION-CLASS FROM CURRENT: 
*                  IF SELECTION.CLASS.NOT-DEFINED 
*                      OR SELECTION.CLASS.DISABLED: 
*                    CYCLE /FOR/. 
*                  IF (SELECTION-CLASS IN SEARCH-SET) 
*                      AND (EITHER NO SELECTION-CLASS.MAXIMUM 
*                           OR .IN-USE-COUNT < .MAXIMUM): 
*                    SET NEXT-SELECTION-CLASS TO THIS ONE 
*                    SET NO-CLASS-AVAILABLE TO FALSE
*                    RETURN.
*                  ADJUST SLOTSFREE FOR RESERVED, UNUSED SLOTS. 
*                  IF NO SLOTSFREE: 
*                    EXIT /FOR/.
* 
# 
  
      ITEM SEARCHSET  U;           # SET OF CLASSES TO SEARCH # 
      ITEM SLOTSFREE  I;           # NUMBER OF FREE SLOTS # 
      ITEM CURRENT    U;           # STARTING CLASS ORDINAL # 
      ITEM NEXTSC     U;           # AVAILABLE CLASS ORDINAL #
      ITEM NOSELAVAIL B;           # TRUE IF NO CLASS SUITABLE #
  
# 
****  XREF
# 
      XREF
        BEGIN 
        PROC NAME;                 # DEBUG CODE # 
        END 
  
# 
****  XREF END
# 
  
      ITEM REMAINSET  U;           # SET OF CLASSES REMAINING # 
      ITEM SELCLASS   U;           # SELECTION CLASS ORDINAL #
  
        $BEGIN
        NAME("GETSELC");           # DEBUG CODE # 
        $END
  
      NOSELAVAIL = TRUE;           # ASSUME NO CLASS AVAILABLE #
      IF (CURRENT LT 0) 
        OR (CURRENT GE MXSEL) 
      THEN
        BEGIN 
        RETURN; 
        END 
  
      SLOWFOR SELCLASS = 0 STEP 1 UNTIL (CURRENT - 1) 
      DO
        BEGIN 
        IF (NOT SEL$IGNORE[SELCLASS]) 
          AND ( (SEL$RSVCNT[SELCLASS] - SEL$INUCNT[SELCLASS]) GT 0) 
        THEN
          BEGIN 
          SLOTSFREE = SLOTSFREE - 
                        (SEL$RSVCNT[SELCLASS] - SEL$INUCNT[SELCLASS]);
          END 
  
        END 
  
      SELCLASS = CURRENT; 
      REMAINSET = (SEARCHSET LAN ( (2**MXSEL) - 1) ) / (2**CURRENT);
      ASLONGAS (REMAINSET NE 0) 
           AND (SLOTSFREE GT 0) 
      DO
        BEGIN 
        IF (NOT SEL$IGNORE[SELCLASS]) 
        THEN
          BEGIN 
          IF ( (REMAINSET LAN 1) NE 0) # IF CLASS IN SEARCHSET #
            AND  ( (SEL$MAXCNT[SELCLASS] EQ 0)
                OR (SEL$INUCNT[SELCLASS] LT SEL$MAXCNT[SELCLASS]) ) 
          THEN
            BEGIN 
            NOSELAVAIL = FALSE; 
            NEXTSC = SELCLASS;
            RETURN; 
            END 
  
          IF (SEL$RSVCNT[SELCLASS] - SEL$INUCNT[SELCLASS]) GT 0 
          THEN
            BEGIN 
            SLOTSFREE = SLOTSFREE - 
                          (SEL$RSVCNT[SELCLASS] - SEL$INUCNT[SELCLASS]);
            END 
  
          END 
  
        SELCLASS = SELCLASS + 1;
        REMAINSET = REMAINSET / 2;
        END 
  
      END  # GETSELC #
    TERM
