*DECK     CSSROC
USETEXT    TEXTCS 
USETEXT    TEXTSS 
USETEXT    TXCMDCS
PROC CSSROC;
# TITLE CSSROC - RECOGNIZE OPERATOR COMMAND.                          # 
  
      BEGIN    # CSSROC # 
# 
**    CSSROC - RECOGNIZE OPERATOR COMMAND.
* 
*     A. LIM.    82/03/08.
* 
*     THIS PROCEDURE-S MAIN FUNCTION IS TO RECOGNIZE OPERATOR TYPEINS.
*     AT FIRST, AN OPERATOR TYPEIN ENTRY IS REMOVED FROM THE OPERATOR-
*     TYPEIN-QUEUE, THEN FORMAT THE TEXT PORTION OF THE ENTRY INTO A
*     COMMAND STRING, AND CALL COMMAND-RECOGNIZER TO VALIDATE THE 
*     COMMAND.  THIS PROCEDURE MAY GENERATE A MESSAGE TO THE OPERATOR 
*     IN THE EVENT OF AN ERRONEOUS COMMAND ENTRY, OR IT MAY DISPATCH
*     THE RETURNED PARAMETERIZED COMMAND TO THE COMMAND PREPROCESSOR
*     FOR FURTHER REFINEMENT. 
* 
*     PROC CSSROC 
* 
*     ENTRY    OPERATOR TYPEIN ENTRIES IN OPERATOR TYPEIN QUEUE(OPTQ).
* 
*     EXIT     VALID COMMAND SENT TO VALID-COMMAND-QUEUE(VCQ), OR 
*              TERMINAL TEXT SENT TO CONNECTION-TRAFFIC-QUEUE(CNQ). 
* 
*     METHOD   THIS PROCEDURE CONSISTS PRIMARY A LARGE LOOP, EACH 
*              TIME THROUGH THE LOOP, AN OPERATOR TYPEIN ENTRY WILL 
*              BE PROCESSED, AND IT TERMINATES WHEN OPTQ BECOMES EMPTY. 
* 
# 
  
  
  
  
  
  
# 
****  PROC CSSROC XREF LIST 
# 
      XREF
        BEGIN 
        PROC ABORT;          # MACREL- ABORT TASK MACRO                #
        PROC MESSAGE;        # MACREL- MESSAGE MACRO                   #
        PROC SSRRCS;         # RECOGNIZE A COMMAND STRING              #
        PROC SSTAQE;         # ACCEPT A QUEUE ENTRY                    #
        PROC SSTRQE;         # REMOVE A QUEUE ENTRY                    #
        END 
# 
****
# 
  
  
#     DEFS FOR MESSAGE LENGTH INCLUDING ZERO BYTE TERMINATOR.(X 10)    #
  
      DEF LMSG20$    # 20 #;
      DEF LMSG30$    # 30 #;
      DEF LMSG40$    # 40 #;
  
      DEF DF$        #  0 #;  # MESSAGE OPTION FOR DAYFILE MESSAGE     #
      DEF CSTSIZ$    # 31 #;  # CST SIZE = 29 ENTRY + 1 TERMINATE ENTRY#
      DEF CSSIZ$     # 14 #;  # CMD STRING SIZE= 139 + 1 TERMINATE CHAR#
  
  
#     THIS IS THE SWITCH LIST FOR ERROR CODE RETURNING FROM *SSRRCS*   #
  
      SWITCH ERRSWT                 # ERROR SWITCH BY ERROR CODE       #
               LLNOERR,             # 0- NO ERROR                      #
               LLPRMLNG,            # 1- PARAMETER TOO LONG            #
               LLEXPRD,             # 2- EXPECTING PERIOD              #
               LLEXPDCMA,           # 3- EXPECTING PERIOD OR COMMA     #
               LLUNRGCMD,           # 4- UNRECOGNIZED COMMAND          #
               LLINVCMPRM,          # 5- INVALID COMBINATION OF PARMS  #
               LLCMDMSPRM,          # 6- COMMAND MISSING PARAMETER     #
               LLPRMSH,             # 7- PARAMETER LIST TOO SHORT      #
               LLMSGLNG,            # 8- INPUT MESSAGE TOO LONG        #
               LLVALOUT;            # 9- VALUE OUT-OF-RANGE            #
  
  
# 
*     CST- COMMAND SYNTAX TABLE.
* 
*     THIS IS THE COMMAND SYNTAX TABLE FOR CS.  IT IS INPUT TO
*     THE COMMAND RECOGNIZER TO DEFINE THE SYNTAX AND THE SEMANTICS 
*     OF THE ALLOWABLE COMMANDS.
*     THE TABLE IS ORDERED(SCANNED TOP TO BOTTOM) AND CONTAINS FLAG 
*     CHARACTERS TO DEFINE THE ORDER AND MEANING OF THE CHARACTERS
*     TO BE ENTERED TO SELECT THE ACTION TO BE PERFORMED. 
*     EACH SYNTAX LINE IS TERMINATED BY AN END-OF-LINE($) TERMINATOR, 
*     AND THE TABLE IS TERMINATED BY AN END-OF-LINE ENTRY.
# 
  
      ARRAY CST[00:CSTSIZ$] S(CSSIZ$);
        BEGIN 
        ITEM CST$LINE   C(00,00,140) =
          ["CO0@NOP,<CONTROL_CO>,\![<NPU_NP>=@NP0?^[<NPUS_NPS>@NPS^[<AUT
O_AU>@AU0^\\[ON!@ON0^[OFF@OFF^\$",
           "GO0@NP,GO,\![<NPU_NP>=@NP0?^[<NPUS_NPS>@NPS^\$",
           "DI0@NOP,<DISABLE_DI>,\![<TRUNK_TR>=@TR0?^[<LLINK_LL>=@LL0?^[
<LINE_LI>=@LI0?^[<TERM_TE>=@TE0?^\[LD@LD0^\$",
           "DI0@NOP,<DISABLE_DI>,\![<SVC_SV>=@VC0?^\\![<NCIR_NC>=@NC0?^\
$", 
           "EN0@NOP,<ENABLE_EN>,\![<TRUNK_TR>=@TR0?^[<LLINK_LL>=@LL0?^[<
LINE_LI>=@LI0?^[<TERM_TE>=@TE0?^\[LD@LD0^\$", 
           "EN0@NOP,<ENABLE_EN>,\![<LINES_LIS>@LIS^[<TERMS_TES>@TES^[<LL
INKS_LLS>@LLS^[<TRUNKS_TRS>@TRS^\\![<NPU_NP>=@NP0?^[<NPUS_NPS>@NPS^\$", 
           "EN0@NOP,<ENABLE_EN>,\![<TERMS_TES>@TES^\\![<LINE_LI>=@LIN?^\
$", 
           "EN0@NOP,<ENABLE_EN>,\![<SVC_SV>=@VC0?^\\![<NCIR_NC>=@NC0?^\$
",
           "DU0@NOP,<DUMP_DU>,\![<NPU_NP>=@NP0?^[<NPUS_NPS>@NPS^\\[ON!@O
N0^[OFF@OFF^\$",
           "LO0@NOP,<LOAD_LO>,\![<NPU_NP>=@NP0?^[<NPUS_NPS>@NPS^\\[<DUMP
_DU>@ON0^[<NDMP_ND>@OFF^\$",
           "SE0@NOP,<SEND_SE>,\![<LINE_LI>=@LI0?^[<LLINK_LL>=@LL0?^[<NPU
_NP>=@NP0?^[<TERM_TE>=@TE0?^[<NPUS_NPS>@NPS^[<HOST_HO>@HO0^\\![<MSG_MS>=
@MS0&\$", 
           "RE0,<REPORT_RE>,\![<NPU_NP>=@NP0?^[<NPUS_NPS>@NPS^\\[ON!@ON0
^[OFF@OFF^\$",
           "ST0,<STATUS_ST>,\![<NPU_NP>=@NP0?^[<CPLER_CP>=@CP0?^[<TRUNK_
TR>=@TR0?^[<LLINK_LL>=@LL0?^[<LINE_LI>=@LI0?^[<TERM_TE>=@TE0?^[<NPUS_NPS
>@NPS^\$",
           "ST0,<STATUS_ST>,\![<SVC_SV>=@VC0?^\$",
           "ST0,<STATUS_ST>,\![<CPLERS_CPS>@CPS^[<TRUNKS_TRS>@TRS^\\![<N
PU_NP>=@NP0?^[<NPUS_NPS>@NPS^\\[DI@DI1^[EN@EN1^[AC@AC0^[DN@DN0^\$", 
           "ST0,<STATUS_ST>,\![<LLINKS_LLS>@LLS^[<LINES_LIS>@LIS^\\![<NP
U_NP>=@NP0?^[<NPUS_NPS>@NPS^\\[DI@DI1^[EN@EN1^[AC@AC0^[DN@DN0^\$",
           "ST0,<STATUS_ST>,\![<TERMS_TES>@TES^\\![<NPU_NP>=@NP0?^[<NPUS
_NPS>@NPS^[<LINE_LI>=@LI0?^\\[DI@DI1^[EN@EN1^[AC@AC0^[DN@DN0^\$", 
           "ST0,<STATUS_ST>,\![<TERMS_TES>@TES^\\![<LLINK_LL>=@LL0?^\$",
           "ST0,<STATUS_ST>,\![<SVCS_SVS>@VCS^\\![<NPU_NP>=@NP0?^[<NPUS_
NPS>@NPS^[<LINE_LI>=@LI0?^\$",
           "TS0,<TST_TS>,\![<NPU_NP>=@NP0?^\\[<REQUEST_RE>@RE0^[<DROP_DR
>@DR0^[<MSG_MS>=@MS0&\$", 
           "AL0@NOP,<ALERT_AL>,\[CP=@CP1?^\\[BU=@BU0?^\\![<NPU_NP>=@NP0?
^[<NPUS_NPS>@NPS^\$", 
           "END,END[^\@NAP?^\$",
           "HEL,<HELLO_LOGIN>^$", 
           "BYE,<BYE_LOGOUT_GOODBYE>^$",
           "HI0,<HISTORY_HI>^\ALL@ALL^\$",
           "IN0,<INFO_IN>^$", 
             "(", 
             ")", 
           "$"];
        END 
  
  
# 
*     THE FOLLOWING ARE MESSAGE ARRAYS EITHER FOR OUTBOUND TERMINAL 
*     TEXT OR DESTINED FOR SYSTEM DAYFILE.
# 
  
      ARRAY PLGMSG[00:00] S(3); 
        BEGIN 
        ITEM PLG$MSG    C(00,00,19) = 
                          ["PARAMETER TOO LONG."];
        ITEM PLG$ZERO   U(01,54,06) = [0];
        ITEM PLG$ZERO1  U(02,00,60) = [0];
        END 
  
  
      ARRAY EPDMSG[00:00] S(2); 
        BEGIN 
        ITEM EPD$MSG    C(00,00,17) = 
                          ["EXPECTING PERIOD."];
        ITEM EPD$ZERO   U(01,42,18) = [0];
        END 
  
  
      ARRAY EPCMSG[00:00] S(3); 
        BEGIN 
        ITEM EPC$MSG    C(00,00,26) = 
                          ["EXPECTING PERIOD OR COMMA."]; 
        ITEM EPC$ZERO   U(02,36,24) = [0];
        END 
  
  
      ARRAY URCMSG[00:00] S(3); 
        BEGIN 
        ITEM URC$MSG    C(00,00,21) = 
                          ["UNRECOGNIZED COMMAND."];
        ITEM URC$ZERO   U(02,06,54) = [0];
        END 
  
  
      ARRAY ICPMSG[00:00] S(4); 
        BEGIN 
        ITEM ICP$MSG    C(00,00,34) = 
                          ["INVALID COMBINATION OF PARAMETERS."]; 
        ITEM ICP$ZERO   U(03,24,36) = [0];
        END 
  
  
      ARRAY CMPMSG[00:00] S(3); 
        BEGIN 
        ITEM CMP$MSG    C(00,00,26) = 
                          ["COMMAND MISSING PARAMETER."]; 
        ITEM CMP$ZERO   U(02,36,24) = [0];
        END 
  
  
      ARRAY IMLMSG[00:00] S(3); 
        BEGIN 
        ITEM IML$MSG    C(00,00,23) = 
                          ["INPUT MESSAGE TOO LONG."];
        ITEM IML$ZERO   U(02,18,42) = [0];
        END 
  
  
      ARRAY PLSMSG[00:00] S(4); 
        BEGIN 
        ITEM PLS$MSG    C(00,00,35) = 
                          ["  CSSROC- PARAMETER LIST TOO SHORT."];
        ITEM PLS$ZERO   U(03,30,30) = [0];
        END 
  
  
      ARRAY VALMSG[00:00] S(3); 
        BEGIN 
        ITEM VAL$MSG    C(00,00,19) = 
                          ["VALUE OUT-OF-RANGE."];
        ITEM VAL$ZERO1  U(01,54,06) = [0];
        ITEM VAL$ZERO2  U(02,00,60) = [0];
        END 
  
  
      ITEM EC         U;     # ERROR CODE RETURNING FROM *SSRRCS*      #
      ITEM ET         U;     # ERROR TEXT RETURNING FROM *SSRRCS*      #
      ITEM I          I;     # DUMMY LOOP INDUCTION VAR                #
      ITEM MAX        U;     # MAX NO OF CMD PARMS IN PARAMETER LIST   #
      ITEM PCNT       U;     # PARM COUNT RETURNING FROM *SSRRCS*      #
  
  
CONTROL EJECT;
  
# 
*     PROCESS ALL OPERATOR TYPEIN ENTRIES IN OPERATOR TYPEIN QUEUE. 
# 
  
      FOR I = 0 WHILE OPQL NQ 0 
      DO
        BEGIN 
        WCB$WORD[1] = 0;               # CLEAR WC WORD 1               #
        HDR$WORD[1] = 0;               # CLEAR HDRCMD WORD 1           #
        SSTRQE(P<OPTQ>,WCBUF[0],HDRCMD[0],PARMS[0]);   # GET AN ENTRY  #
        # 
        *  IF OPERATOR TYPEIN IS HOP/BRK, SPECIAL CASE IT.
        *  I.E. DO NOT CALL COMMAND RECOGNIZER, INSTEAD BUILD 
        *  OUR OWN ONE-WORD PARAMETER LIST, AND SEND THE VALID
        *  COMMAND TO *VCQ*.
        # 
        IF HDR$BOF[0] 
        THEN
          BEGIN                        # BREAK OCCURRED                #
          PAR$ELNAME[0] = "BRK";
          PAR$PCODE[0] = "VEB"; 
          PCNT = 1; 
          HDR$OPORD[1] = HDR$OPORD[0];
          GOTO LLNOERR; 
          END 
        MAX = MCMDL$ - (WCB$WC[0] - 2);   # MAX NO OF CMD IN PARM LIST #
        # 
        *  CALL COMMAND RECOGNIZER WITH COMMAND SYNTAX TABLE, COMMAND 
        *  STRING, STRING LENGTH IN CHARACTERS, AND MAXIMUM NUMBER OF 
        *  COMMAND PARAMETERS ALLOWABLE IN PARAMETER LIST.  IT RETURNS
        *  THE PARAMETER LIST, PARAMETER LIST COUNT, ERROR CODE AND 
        *  ERROR TEXT IF ANY. 
        # 
        SSRRCS(CST,PARMS[0],HDR$TXCCNT[0],PARMS[WCB$WC[0]-2],MAX,PCNT,
        EC,ET); 
        WCB$IAF[1] = TRUE;                  # PRESET IAF TO TRUE       #
        WCB$SMID[1] = SMID"TTEXT";     # SET SMID TO TERMINAL TEXT     #
        HDR$OPORD[1] = HDR$OPORD[0];        # SET OPERATOR ORDINAL     #
        GOTO ERRSWT[EC];                    # ERROR SWITCH BY EC       #
  
LLNOERR:                     # NO ERROR, BUILD VALID COMMAND ENTRY     #
  
        WCB$IAF[1] = FALSE;                 # TURN IAF OFF             #
        WCB$SMID[1] = 0;                    # SET SMID TO 0            #
        WCB$WC[1] = WCB$WC[0] + PCNT;       # CALCULATE WORD COUNT     #
        HDR$SPCNT[1] = PCNT;                # SYNTAX PARAMETER COUNT   #
        HDR$APCNT[1] = 0;                   # ADDR PARAMETER COUNT     #
        HDR$TXWCNT[1] = WCB$WC[0] - 2;      # TEXT WORD COUNT          #
        HDR$VERB[1] = PAR$ELNAME[WCB$WC[0]-2];    # COMMAND VERB       #
        HDR$TXCCNT[1] = HDR$TXCCNT[0];      # TEXT LEN IN CHARS        #
        SSTAQE(P<VCQ>,WCBUF[1],HDRCMD[1],PARMS[0]);   # SEND VALID CMD #
        GOTO ENDCASE; 
  
LLPRMLNG:                    # EC= "PARAMETER TOO LONG."               #
  
        WCB$WC[1] = LMSG30$/10 + 2; 
        HDR$TXCCNT[1] = LMSG30$;
        SSTAQE(P<CNQ>,WCBUF[1],HDRCMD[1],PLGMSG[0]);
        GOTO ENDCASE; 
  
LLEXPRD:                     # EC= "EXPECTING PERIOD."                 #
  
        WCB$WC[1] = LMSG20$/10 + 2; 
        HDR$TXCCNT[1] = LMSG20$;
        SSTAQE(P<CNQ>,WCBUF[1],HDRCMD[1],EPDMSG[0]);
        GOTO ENDCASE; 
  
LLEXPDCMA:                   # EC= "EXPECTING PERIOD OR COMMA."        #
  
        WCB$WC[1] = LMSG30$/10 + 2; 
        HDR$TXCCNT[1] = LMSG30$;
        SSTAQE(P<CNQ>,WCBUF[1],HDRCMD[1],EPCMSG[0]);
        GOTO ENDCASE; 
  
LLUNRGCMD:                   # EC= "UNRECOGNIZED COMMAND."             #
  
        WCB$WC[1] = LMSG30$/10 + 2; 
        HDR$TXCCNT[1] = LMSG30$;
        SSTAQE(P<CNQ>,WCBUF[1],HDRCMD[1],URCMSG[0]);
        GOTO  ENDCASE;
  
LLINVCMPRM:                  # EC= "INVALID COMBINATION OF PARAMETERS."#
  
        WCB$WC[1] = LMSG40$/10 + 2; 
        HDR$TXCCNT[1] = LMSG40$;
        SSTAQE(P<CNQ>,WCBUF[1],HDRCMD[1],ICPMSG[0]);
        GOTO ENDCASE; 
  
LLCMDMSPRM:                  # EC= "COMMAND MISSING PARAMETER."        #
  
        WCB$WC[1] =LMSG30$/10 + 2;
        HDR$TXCCNT[1] = LMSG30$;
        SSTAQE(P<CNQ>,WCBUF[1],HDRCMD[1],CMPMSG[0]);
        GOTO ENDCASE; 
  
LLPRMSH:                     # EC= "PARAMETER LIST TOO SHORT."         #
  
        $BEGIN
        MESSAGE(PLSMSG[0], DF$);       # SEND MESSAGE TO DAYFILE       #
        ABORT;                         #   AND ABORT CS                #
        $END
  
LLVALOUT:                    # EC= "VALUE OUT-OF-RANGE                 #
  
        WCB$WC[1] = LMSG30$/10 + 2; 
        HDR$TXCCNT[1] = LMSG30$;
        SSTAQE(P<CNQ>,WCBUF[1],HDRCMD[1],VALMSG[0]);
        GOTO ENDCASE; 
  
LLMSGLNG:                    # EC= "INPUT MESSAGE TOO LONG."           #
  
        WCB$WC[1] = LMSG30$/10 + 2; 
        HDR$TXCCNT[1] = LMSG30$;
        SSTAQE(P<CNQ>,WCBUF[1],HDRCMD[1],IMLMSG[0]);
  
ENDCASE:  
  
        END                  # END PROCESSING OPTQ                     #
  
      END    # CSSROC # 
  
      TERM
