*DECK,CMDDIS
USETEXT COMCBEG 
USETEXT COMQDEF 
USETEXT COMQKDS 
USETEXT COMQPAR 
USETEXT COMQPID 
USETEXT COMQSCH 
USETEXT COMQSEL 
    PROC CMDDIS((DISAB)); 
      BEGIN  # CMDDIS # 
# 
**    CMDDIS     PROCESS *DISABLE*/*ENABLE* COMMANDS. 
* 
*     PROCESSES THE OPERATOR *DISABLE*/*ENABLE* COMMANDS. 
* 
*     DISABLE,PID=PIDNAME 
*     DISABLE,SC=SELCLASS 
*     DISABLE,SC=SELCKASS,PID=PIDNAME 
*     ENABLE,PID=PIDNAME
*     ENABLE,SC=SELCLASS
*     ENABLE,SC=SELCKASS,PID=PIDNAME
* 
*     PROC CMDDIS ((DISAB)) 
* 
*     ENTRY      PARMS = PARSED COMMAND PARAMETERS. 
*                DISAB = TRUE, IF *DISABLE* COMMAND,
*                        FALSE, IF *ENABLE* COMMAND.
* 
*     EXIT       PARAMETERS PROCESSED.
* 
# 
  
      ITEM DISAB      B;           # TRUE, IF *DISABLE* COMMAND # 
  
# 
****  XREF
# 
      XREF
        BEGIN 
        PROC NAME;                 # DEBUG CODE # 
        PROC SETPLTA;              # FIND PLT ENTRY FOR PID # 
        FUNC YCDZ       C(10);     # CONVERT INTEGER TO DISPLAY CODE #
        END 
  
# 
****  XREF END
# 
  
      STATUS KEYST
         SC                        # SC= #
        ,PID                       # PID= # 
        ,UNKNOWN                   # *UNKNOWN* #
        ; 
  
      ARRAY FP [KEYST"SC":KEYST"UNKNOWN"] S(1); 
        BEGIN 
        ITEM FP$KEY     C(00,00,07) = 
          [ "SC", "PID", "*******"];
        ITEM FP$MIN     U(00,42,06) = 
          [    1,     1,         1];
        ITEM FP$KEYST   S:KEYST(00,54,06) = 
          [S"SC",S"PID",S"UNKNOWN"];
        END 
  
      SWITCH SW$FP:KEYST
         SW$SC     :SC             # SC= #
        ,SW$PID    :PID            # PID= # 
        ,SW$UNKNOWN:UNKNOWN        # *UNKNOWN* #
        ; 
  
      ITEM FPORD      S:KEYST;     # PARAMETER ORDINAL #
      ITEM PCNT       U;           # PARAMETER COUNT #
      ITEM DISFSC     U;           # FIRST SELECTION CLASS ORDINAL #
      ITEM DISNSC     U;           # NUMBER OF SELECTION CLASSES #
      ITEM DISLPID    U;           # POINTER TO PLT ENTRY # 
      ITEM DISNPID    U;           # NUMBER OF PIDS TO MODIFY # 
      ITEM SCSET      U;           # SELECTION CLASS SET #
      ARRAY [0:0] S(1); 
        BEGIN 
        ITEM DISPID     C(00,42,03); # PID NAME # 
        ITEM DISPIDU    U(00,42,18); # PID NAME (BINARY) #
        END 
  
        $BEGIN
        NAME("CMDDIS");            # DEBUG CODE # 
        $END
  
      DISNSC = 0;                  # NO SC YET #
      DISNPID = 0;                 # NO PID YET # 
      SLOWFOR PCNT = 1 STEP 1 WHILE (PCNT LE PARM$PCNT) 
                                AND (PARM$STAT EQ S"OK")
      DO
        BEGIN 
        IF PARM$PLEN[PCNT] EQ 0 
        THEN
          BEGIN 
          PARM$STAT = S"PARMERR"; 
          PARM$ECOL = PARM$COL[PCNT]; 
          CYCLE PCNT; 
          END 
  
        IF PARM$PLEN[PCNT] GT 7 
        THEN
          BEGIN 
          PARM$PLEN[PCNT] = 7;
          END 
  
        FP$KEY[KEYST"UNKNOWN"] = PARM$KEY[PCNT];
        FPORD = S"SC";
        ASLONGAS (C<0,PARM$PLEN[PCNT]>FP$KEY[FPORD] 
                    NE C<0,PARM$PLEN[PCNT]>PARM$KEY[PCNT])
              OR (PARM$PLEN[PCNT] LT FP$MIN[FPORD]) 
        DO
          BEGIN 
          FPORD = FPORD + 1;
          END 
  
        GOTO SW$FP[FP$KEYST[FPORD] ];  # CASE STATEMENT # 
  
SW$SC:                             # SC= #
          IF (PARM$VTYPE[PCNT] EQ S"NAME")
            AND (PARM$VLEN[PCNT] EQ 1)
          THEN
            BEGIN 
            SEL$NAME[MXSEL] = PARM$NAME[PCNT];
            DISFSC = 0; 
            ASLONGAS SEL$NAME[DISFSC] NE SEL$NAME[MXSEL]
            DO
              BEGIN 
              DISFSC = DISFSC + 1;
              END 
  
            IF DISFSC EQ MXSEL
            THEN
              BEGIN 
              PARM$STAT = S"SCERROR"; 
              END 
  
            ELSE
              BEGIN 
              DISNSC = 1; 
              END 
  
            END 
  
          ELSE
            BEGIN 
            IF PARM$VTYPE[PCNT] EQ S"ASTERISK"
            THEN
              BEGIN 
              DISFSC = 0; 
              DISNSC = MXSEL; 
              END 
  
            ELSE
              BEGIN 
              PARM$STAT = S"SCERROR"; 
              END 
  
            END 
  
          GOTO SW$END;
  
SW$PID:                            # PID= # 
          IF (PARM$VTYPE[PCNT] EQ S"INTEGER") 
            AND (PARM$VLEN[PCNT] EQ 3)
          THEN
            BEGIN 
            PARM$VTYPE[PCNT] = S"NAME"; 
            PARM$NAME[PCNT] = YCDZ(PARM$INT[PCNT], 3);
            END 
  
          IF (PARM$VTYPE[PCNT] EQ S"NAME")
            AND (PARM$VLEN[PCNT] EQ 3)
          THEN
            BEGIN 
            DISPID = PARM$NAME[PCNT]; 
            SETPLTA(DISPIDU); 
            DISLPID = P<PLTHDR>;
            DISNPID = 1;
            IF PLTWD1 EQ 0
            THEN
              BEGIN 
              PARM$STAT = S"PIDERROR";
              END 
  
            END 
  
          ELSE
            BEGIN 
            IF PARM$VTYPE[PCNT] EQ S"ASTERISK"
            THEN
              BEGIN 
              DISLPID = PIDLPID;
              DISNPID = PIDNPID;
              END 
  
            ELSE
              BEGIN 
              PARM$STAT = S"PARMERR"; 
              END 
  
            END 
  
          GOTO SW$END;
  
SW$UNKNOWN:                        # *UNKNOWN* #
          PARM$STAT = S"PARMERR"; 
          GOTO SW$END;
  
SW$END:                            # END OF CASE #
        IF PARM$STAT NE S"OK" 
        THEN
          BEGIN 
          PARM$ECOL = PARM$COL[PCNT]; 
          END 
  
        END 
  
      IF (      (DISNSC  EQ 0)
            AND (DISNPID EQ 0) )
      THEN
        BEGIN 
        PARM$STAT = S"PARMERR"; 
        END 
  
      IF PARM$STAT NE S"OK" 
      THEN
        BEGIN 
        RETURN; 
        END 
  
      IF DISNSC NE 0               # IF SELECTION CLASS SPECIFIED # 
      THEN
        BEGIN 
        IF DISNPID EQ 0            # IF SC= ONLY #
        THEN
          BEGIN 
          ASLONGAS DISNSC GT 0
          DO
            BEGIN 
            SEL$DISABL[DISFSC] = DISAB; 
            DISFSC = DISFSC + 1;
            DISNSC = DISNSC - 1;
            END 
  
          KS$UPDATE[KDIS"SC"] = TRUE; 
          END 
  
        ELSE
          BEGIN 
          IF DISNSC GT 1
          THEN
            BEGIN 
            SCSET = (2**MXSEL) - 1;  # SC=* => EN/DISABLE ALL SC #
            END 
  
          ELSE
            BEGIN 
            SCSET = 2**DISFSC;     # ONE SELECTION CLASS #
            END 
  
          ASLONGAS DISNPID NE 0 
          DO
            BEGIN 
            IF DISAB
            THEN
              BEGIN 
              PLTSCDISAB = PLTSCDISAB LOR SCSET;
              END 
  
            ELSE
              BEGIN 
              PLTSCDISAB = PLTSCDISAB LAN ( ( (2**MXSEL)-1) LXR SCSET); 
              END 
  
            P<PLTHDR> = PLTNXTPID;
            DISNPID = DISNPID - 1;
            END 
  
          KS$UPDATE[KDIS"PID"] = TRUE;
          END 
  
        TIMSELSECS = 0;            # RESCHEDULE FILE SELECTION #
        RETURN; 
        END 
  
      ASLONGAS DISNPID NE 0        # ONLY *PID=* SPECIFIED #
      DO
        BEGIN 
        IF DISAB
        THEN
          BEGIN 
          PLTDISOPR = TRUE; 
          END 
  
        ELSE
          BEGIN 
          PLTDISERR = FALSE;
          PLTDISOPR = FALSE;
          PLTDISTIME = 0; 
          END 
  
        P<PLTHDR> = PLTNXTPID;
        DISNPID = DISNPID - 1;
        END 
  
      TIMSELSECS = 0;            # RESCHEDULE FILE SELECTION #
      KS$UPDATE[KDIS"PID"] = TRUE;
  
      END    # CMDDIS # 
    TERM
