*DECK NVFOROC
USETEXT TEXTNVF
USETEXT TEXTSS
USETEXT TXCMDNV
USETEXT TXTAPSS
PROC NVFOROC;
# TITLE NVFOROC - RECOGNIZE OPERATOR COMMAND. #
BEGIN # NVFOROC #
#
** NVFOROC - RECOGNIZE OPERATOR COMMAND.
*
* A. LIM. 82/03/17.
*
* THIS PROCEDURE-S MAIN FUNCTION IS TO RECOGNIZE OPERATOR TYPEINS.
* IT CALLS COMMAND RECOGNIZER TO VALIDATE THE COMMAND. IT MAY
* DISPATCH THE RETURNED PARAMETERIZED COMAND TO THE *NVFODHC*
* ROUTINE, OR IT MAY GENERATE A MESSAGE TO THE OPERATOR IN THE
* EVENT OF AN ERRONEOUS COMMAND. IT IS CALLED INTO EXECUTION
* WHENEVER THERE IS DATA IN OPERATOR-TYPEIN-QUEUE *OPTQ*.
*
* PROC NVFOROC
*
* ENTRY OPERATOR TYPEIN ENTRIES IN *OPTQ*.
*
* EXIT IN THE EVENT OF VALID COMMAND, IT CALLS *NVFODHC* WITH
* PARAMETERIZED COMMAND IN *WCBUF[1]*, *HDRCMD[1]*, AND
* *PARMS[0]*. OTHERWISE, A TERMINAL-TEXT IS SENT TO
* THE CONNECTION-TRAFFIC-QUEUE, *CTQ*.
*
* METHOD THIS PROCEDURE CONSISTS PRIMARY A LARGE LOOP, EACH TIME
* THROGH THE LOOP, AN OPERATOR TYPEIN ENTRY WILL BE
* REMOVED FROM THE *OPTQ*.
* IF HOP/END-WARNING, DISCARD THE CURRENT ENTRY, AND
* SEND A NULL TERMINAL-TEXT TO *CTQ*.
* IF HOP/BRK, CALL *NVFOPHC* TO PROCESS IT.
* ELSE, IT CALLS *SSRRCS* TO RECOGNIZE THE COMMAND.
* IF VALID COMMAND, IT CALLS *NVFODHC* TO DO FURTHER
* PROCESSING OF THE COMMAND, ELSE IT SENDS A TERMINAL
* -TEXT TO THE CONNECTION TRAFFIC QUEUE *CTQ*.
* IT TERMINATES WHEN *OPTQ* IS EXHAUSTED.
*
#
#
**** PROC NVFOROC XREF LIST
#
XREF
BEGIN
PROC ABORT; # MACREL- ABORT TASK MACRO #
PROC MESSAGE; # MACREL- MESSAGE MACRO #
PROC NVFODHC; # DISPATCH HOP COMMAND #
PROC SSRRCS; # RECOGNIZE A COMMAND STRING #
PROC SSTAQE; # ACCEPT A QUEUE ENTRY #
PROC SSTRQE; # REMOVE A QUEUE ENTRY #
END
#
****
#
DEF DF$ # 0 #; # MESSAGE OPTION FOR DAYFILE MESSAGE #
DEF CSTSIZ$ # 14 #; # CST SIZE= 14 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 #
#
** CST- COMMAND SYNTAX TABLE.
*
* THIS IS THE COMMAND SYNTAX TABLE FOR NVF. 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) =
["ENA@APL,<ENABLE_EN>,\!<APPL_AP>=@APP?^\$",
"IDA@APL,<IDLE_ID>,\!<APPL_AP>=@APP?^\$",
"IDH@HST,<IDLE_ID>,\!<HOST_HO>@HO0^\$",
"DIA@APL,<DISABLE_DI>,\!<APPL_AP>=@APP?^\$",
"DIH@HST,<DISABLE_DI>,\!<HOST_HO>@HO0^\$",
"STA@APL,<STATUS_ST>,\!<APPL_AP>=@APP?^\$",
"STT@STA,<STATUS_ST>,\!<TERM_TE>=@TER?^\$",
"STU@STA,<STATUS_ST>,\!<UNAME_UN>=@USR?^\$",
"STS@APL,<STATUS_ST>,\![<APPLS_APS>@APS^\\[AC@AC0^\$",
"SSA@APL,<STATUS_ST>,\![<TERMS_TES>@TES^\\![<APPL_AP>=@APP?^\
$",
"SSU@STA,<STATUS_ST>,\![<TERMS_TES>@TES^\\![<UNAME_UN>=@USR?^
\$",
"SUA@APL,<STATUS_ST>,\![<UNAMES_UNS>@USS^\\![<APPL_AP>=@APP?^
\$",
"HIL@HIS,<HISTORY_HI>^\ALL@ALL^\$",
"$"];
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
$BEGIN
ARRAY PLSMSG[00:00] S(4);
BEGIN
ITEM PLS$MSG C(00,00,36) =
[" NVFOROC- PARAMETER LIST TOO SHORT."];
ITEM PLS$ZERO U(03,36,24) = [0];
END
$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 FROM *SSRRCS* #
CONTROL EJECT;
#
* PROCESS ALL ENTRIES IN *OPTQ*, FOR EACH ENTRY:
* 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.
#
FOR I = 0 WHILE OPQL NQ 0
DO
BEGIN
WCB$WORD[1] = 0; # CLEAR WC WORD 1 #
HDR$WORD[1] = 0; # CLEAR HDR CMD WORD 1 #
WCB$IAF[1] = TRUE; # PRESET IAF TO TRUE #
WCB$HAF[1] = FALSE; # PRESET HAF TO FALSE #
SSTRQE(P<OPTQ>,WCBUF[0],HDRCMD[0],PARMS[0]); # REMOVE 1 ENTRY #
IF HOPENDWF
THEN
BEGIN # HOP/END-WARNING, DISCARD ENTRY #
WCB$WC[1] = 2; # AND SEND A NULL TEXT TO *CTQ* #
ABHABT[1] = HOPTX$;
SSTAQE(P<CTQ>,WCBUF[1],ABHBUF[1],MSGBUF[0]);
GOTO ENDCASE;
END
IF HDR$BOF[0]
THEN
BEGIN # HOP/BRK #
IF CMDINPGF
THEN
BEGIN
ABORTCMDF = TRUE;
END
GOTO ENDCASE;
END
MAX = MCMDL$ - (WCB$WC[0] - 2); # MAX NO OF CMD IN PARM LIST #
SSRRCS(CST,PARMS[0],HDR$TXCCNT[0],PARMS[WCB$WC[0]-2],MAX,PCNT,
EC,ET);
HDR$OPORD[1] = HDR$OPORD[0]; # SET OPERATOR ORDINAL #
ABHWORD[1] = 0;
ABHABT[1] = HOPTX$;
GOTO ERRSWT[EC]; # ERROR SWITCH BY EC #
LLNOERR: # VALID COMMAND, CALL *NVFODHC* #
CRNT$CMD = PAR$ELNAME[WCB$WC[0]-2]; # SAVE CURRENT COMMAND ID #
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 #
NVFODHC; # DISPATCH HOP COMMAND #
GOTO ENDCASE;
LLPRMLNG: # EC= "PARAMETER TOO LONG." #
WCB$WC[1] = LMSG30$/10 + 2;
SSTAQE(P<CTQ>,WCBUF[1],ABHBUF[1],PLGMSG[0]);
GOTO ENDCASE;
LLEXPRD: # EC= "EXPECTING PERIOD." #
WCB$WC[1] = LMSG20$/10 + 2;
SSTAQE(P<CTQ>,WCBUF[1],ABHBUF[1],EPDMSG[0]);
GOTO ENDCASE;
LLEXPDCMA: # EC= "EXPECTING PERIOD OR COMMA." #
WCB$WC[1] = LMSG30$/10 + 2;
SSTAQE(P<CTQ>,WCBUF[1],ABHBUF[1],EPCMSG[0]);
GOTO ENDCASE;
LLUNRGCMD: # EC= "UNRECOGNIZED COMMAND." #
WCB$WC[1] = LMSG30$/10 + 2;
SSTAQE(P<CTQ>,WCBUF[1],ABHBUF[1],URCMSG[0]);
GOTO ENDCASE;
LLINVCMPRM: # EC= "INVALID COMBINATION OF PARAMETERS."#
WCB$WC[1] = LMSG40$/10 + 2;
SSTAQE(P<CTQ>,WCBUF[1],ABHBUF[1],ICPMSG[0]);
GOTO ENDCASE;
LLCMDMSPRM: # EC= "COMMAND MISSING PARAMETER." #
WCB$WC[1] = LMSG30$/10 + 2;
SSTAQE(P<CTQ>,WCBUF[1],ABHBUF[1],CMPMSG[0]);
GOTO ENDCASE;
LLPRMSH: # EC= "PARAMETER LIST TOO SHORT." #
$BEGIN
MESSAGE(PLSMSG[0], DF$); # SEND MESSAGE TO DAYFILE #
ABORT; # AND ABORT NVF #
$END
LLMSGLNG: # EC= "INPUT MESSAGE TOO LONG." #
WCB$WC[1] = LMSG30$/10 + 2;
SSTAQE(P<CTQ>,WCBUF[1],ABHBUF[1],IMLMSG[0]);
ENDCASE:
END # FOR I LOOP #
END # NVFOROC #
TERM