home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / iclvme2900 / kmt_ui_module < prev    next >
Text File  |  2020-01-01  |  35KB  |  915 lines

  1. MODULE KMT_UI_MODULE;
  2.  
  3.  
  4. @ Mode declarations @
  5.  
  6. MODE KMT_BUFFER IS (96)BYTE;
  7. MODE KMT_STRING IS REF()BYTE;
  8. MODE KMT_WORD   IS REF()BYTE;
  9.  
  10. MODE KMT_MTM_VALUES IS ANY
  11.   (LONG WORD      LW_VALUE,
  12.    LONG INT       LI_VALUE,
  13.    REF WORD       RW_VALUE,
  14.    REF INT        RI_VALUE,
  15.    REF LONG WORD  RLW_VALUE,
  16.    REF LONG INT   RLI_VALUE,
  17.    REF()BYTE      RVB_VALUE,
  18.    REF()REF()BYTE RVRVB_VALUE);
  19.  
  20. MODE
  21. KMT_DH_DEVICE_DETAILS_S IS STRUCT
  22.   (BOOL FILE_OPEN,
  23.    WORD MAX_INPUT_LENGTH,
  24.         MAX_OUTPUT_LENGTH,
  25.         INPUT_PARITY,
  26.         OUTPUT_PARITY,
  27.         PAUSE);
  28.  
  29. MODE
  30. KMT_FH_RECORD_DETAILS_S IS STRUCT
  31.   (BOOL        FILE_OPEN,
  32.                NEW_RECORD,
  33.                END_OF_FILE,
  34.    WORD        TEXT_TYPE,                        @ 0 = EBCDIC                  @
  35.                                                  @ 1 = IA5                     @
  36.                                                  @ 2 = BINARY                  @
  37.    INT         MAX_RECORD_LENGTH,
  38.                RECORD_LENGTH,
  39.    (4098) BYTE RECORD);                          @ Maximum record size of 4096 @
  40.                                                  @ plus 2 bytes for CRLF pair  @
  41.                                                  @ when constructing output    @
  42.                                                  @ records                     @
  43.  
  44. MODE
  45. KMT_PP_CONFG_PARAMS_S IS STRUCT
  46.   (BYTE   MARK,
  47.           MAXL,
  48.           TIME,
  49.           NPAD,
  50.           PADC,
  51.           EOL,
  52.           QCTL,
  53.           QBIN,
  54.           CHKT,
  55.           REPT,
  56.    4-BYTE CAPAS);
  57.  
  58. MODE
  59. KMT_TRACE_FLAGS_S IS WORD STRUCT
  60.   (BIT    PH_TRACING,
  61.           PP_TRACING,
  62.           FH_TRACING,
  63.           DH_TRACING,
  64.    28-BIT SPARE);
  65.  
  66. MODE KMT_FH_FILE_STATISTICS_S IS STRUCT
  67.   (INT INPUT_TOTAL,
  68.    INT OUTPUT_TOTAL);
  69.  
  70. MODE KMT_PP_PACKET_STATISTICS_S IS STRUCT
  71.   (INT INPUT_TOTAL,
  72.    INT OUTPUT_TOTAL);
  73.  
  74. MODE KMT_STATISTICS_S IS STRUCT
  75.   (REF KMT_FH_FILE_STATISTICS_S   FH_FILE_STATISTICS,
  76.    REF KMT_PP_PACKET_STATISTICS_S PACKET_STATISTICS);
  77.  
  78.  
  79. @ External procedures @
  80.  
  81. EXT PROC (INT,RESPONSE)                           KMT_MESSAGE;
  82.  
  83. EXT PROC (INT,REF()KMT_MTM_VALUES) INT            KMT_HELP_MTM;
  84.  
  85. EXT PROC (INT,REF()KMT_MTM_VALUES) INT            KMT_SP_MTM;
  86.  
  87. EXT PROC (REF KMT_STRING) KMT_WORD                KMT_SP_GET_WORD,
  88.     PROC (REF () BYTE)                            KMT_SP_CONVERT_TO_UPPER_CASE,
  89.     PROC (()BYTE,REF()BYTE,REF LONG INT,BOOL,RESPONSE)
  90.                                                   KMT_SP_ASK_MESSAGE,
  91.     PROC (REF KMT_WORD) WORD                      KMT_SP_CONVERT_TO_BINARY,
  92.     PROC (WORD,WORD,RESPONSE)                     KMT_SP_CHECK_VME_CHAR;
  93.  
  94. EXT PROC (WORD,WORD,REF()BYTE,RESPONSE)           CTM_LOG;
  95.  
  96.  
  97. @ External constants @
  98.  
  99. EXT INT UNSET,EXIT;                     @ miscellaneous constants @
  100.  
  101. EXT INT SERVER_MODE,RECEIVE_MODE,SEND_MODE,COMMAND_MODE;
  102.  
  103. EXT INT REC_SERVER_IDLE,REC_INIT,SEND_INIT,COMPLETE,ABORT; @ protocol handler  @
  104.                                                            @ states            @
  105.  
  106. EXT REF INT EXIT_STATE,               @ controls main Kermit loop @
  107.             KMT_CURRENT_MODE,         @ Server/Receive/Send/Command @
  108.             KMT_PH_STATE;             @ Protocol Handler state @
  109.  
  110. EXT (256) BYTE
  111.    EBCDIC_TO_ASCII,                         @ Translation tables @
  112.    ASCII_TO_EBCDIC;
  113.  
  114. EXT REF KMT_STRING KMT_PH_INPUT_PACKET_DATA;
  115.  
  116. EXT REF KMT_BUFFER KMT_VME_FILE_BUF,KMT_REM_FILE_BUF,KMT_INPUT_BUF;
  117. EXT REF KMT_WORD KMT_VME_FILE,KMT_REM_FILE;
  118.  
  119. EXT REF()KMT_MTM_VALUES KMT_MTM_AREA;
  120.  
  121. EXT REF INT MAXTRY,RETRY_COUNT,RETRY_TOTAL,TIMEOUT_TOTAL;
  122.  
  123. EXT REF INT FILE_OPTION;
  124.  
  125. EXT REF WORD DELAY;
  126.  
  127. EXT REF BOOL TRANSLATE_FILENAME;
  128.  
  129. EXT REF BOOL SAVE_INCOMPLETE_FILE;
  130.  
  131. EXT REF KMT_DH_DEVICE_DETAILS_S KMT_DH_DEVICE_DETAILS;
  132.  
  133. EXT REF KMT_FH_RECORD_DETAILS_S KMT_FH_RECORD_DETAILS;
  134.  
  135. EXT REF KMT_PP_CONFG_PARAMS_S KMT_PP_LOCAL_CONFG_PARAMS,
  136.                               KMT_PP_REMOTE_CONFG_PARAMS;
  137.  
  138. EXT REF KMT_TRACE_FLAGS_S KMT_TRACE_FLAGS;
  139.  
  140. EXT REF KMT_STATISTICS_S KMT_STATISTICS;
  141.  
  142.  
  143.  
  144. GLOBAL STATIC (<STATUS 5>) PROC KMT_UI IS (RESPONSE RESULT):
  145.  
  146.    @ requests command from user and executes command @
  147.  
  148.    BEGIN
  149.       LONG INT STRLEN;        @ length of input @
  150.       INT RC_IGNORED;         @ response variable @
  151.       KMT_STRING KMT_CMD_BUF, @ command input string @
  152.                  KMT_PARSE;   @ pointer for parsing command string @
  153.  
  154.       (10)KMT_MTM_VALUES HELP_MTM_AREA;
  155.       (80)BYTE HELP_TEXT;
  156.       INT HELP_TEXT_LEN;
  157.       (2)REF()BYTE HELP_RECALL_DATA;
  158.  
  159.       INT MARK_PARAM IS 0,
  160.           EOL_PARAM  IS 1,
  161.           PADC_PARAM IS 2;
  162.  
  163.       @ support procs @
  164.  
  165.       SIM PROC CHECK_AND_SET_PARAM IS (INT PARAM_CODE, WORD VALUE, WORD P_FLAG,
  166.                                        RESPONSE RESULT):
  167.  
  168.          @ checks new value for MARK/EOL/PADC doesn't conflict with EOL/PADC/  @
  169.          @ MARK (as appropriate) and that the value is acceptable to VME I/O   @
  170.  
  171.          BEGIN
  172.             IF VALUE > 31 AND VALUE NE 127
  173.             THEN @ not a control character @
  174.                RESULT := 85935
  175.             ELSE
  176.                INT PMATCH;
  177.                REF KMT_PP_CONFG_PARAMS_S
  178.                   CONFG_PARAMS IS IF P_FLAG = 0
  179.                                   THEN KMT_PP_REMOTE_CONFG_PARAMS    @ receive @
  180.                                   ELSE KMT_PP_LOCAL_CONFG_PARAMS     @ send    @
  181.                                   FI;
  182.                RESULT := UNSET;
  183.  
  184.                IF VALUE = CONFG_PARAMS.MARK @ check if value matches any param @
  185.                THEN PMATCH := MARK_PARAM
  186.                ELSF VALUE = CONFG_PARAMS.EOL
  187.                THEN PMATCH := EOL_PARAM
  188.                ELSF VALUE = CONFG_PARAMS.PADC
  189.                THEN PMATCH := PADC_PARAM
  190.                ELSF KMT_SP_CHECK_VME_CHAR(VALUE,P_FLAG,RESULT);
  191.                     RESULT = 0
  192.                THEN                @ character ok for VME I/O so set parameter @
  193.                   CASE PARAM_CODE
  194.                   THEN CONFG_PARAMS.MARK := VALUE
  195.                   ELSE CONFG_PARAMS.EOL := VALUE
  196.                   ELSE CONFG_PARAMS.PADC := VALUE
  197.                   ESAC;
  198.                   RESULT := 0
  199.                FI;
  200.  
  201.                IF RESULT = UNSET
  202.                THEN
  203.                   IF PMATCH = PARAM_CODE
  204.                   THEN                         @ matched current value, ignore @
  205.                      RESULT := 0
  206.                   ELSE                       @ conflict with another parameter @
  207.                      KMT_MTM_AREA(7) := PMATCH AS KMT_MTM_VALUES.RI_VALUE;
  208.                      RESULT := 85937
  209.                   FI
  210.                FI
  211.             FI
  212.          END
  213.  
  214.          ; @ CHECK_AND_SET_PARAM @
  215.  
  216.  
  217.       SIM PROC EXPAND_HELP IS (INT MSG_NO) INT:
  218.  
  219.          @ expand help text until reply is -2 (no message found) or 0 (halted  @
  220.          @ at end of message) or > 0 (halt code returned). @
  221.  
  222.          BEGIN
  223.             INT M := MSG_NO,
  224.                 REPLY := UNSET; @ -1 @
  225.  
  226.             WHILE REPLY = UNSET
  227.             DO
  228.                REPLY := KMT_HELP_MTM(M,HELP_MTM_AREA);
  229.                IF REPLY = -1 OR REPLY = 0
  230.                THEN
  231.                   M := REPLY;
  232.                   CTM_LOG(3,10,HELP_TEXT(SIZE HELP_TEXT_LEN),RC_IGNORED)
  233.                FI
  234.             REPEAT;
  235.  
  236.             REPLY @ return last reply @
  237.  
  238.          END
  239.  
  240.          ; @ EXPAND_HELP @
  241.  
  242.       @ procedures for executing commands @
  243.  
  244.       SIM PROC KMT_UI_SERVER IS GROUP KMT_UI_EXEC(RESPONSE RESULT):
  245.  
  246.          @ SERVER command, Syntax: SERVER @
  247.  
  248.          @ selects Kermit Server mode @
  249.          @ (not implemented in Server mode) @
  250.  
  251.             IF KMT_CURRENT_MODE NE SERVER_MODE
  252.             THEN
  253.                KMT_CURRENT_MODE := SERVER_MODE;
  254.                KMT_PH_STATE := REC_SERVER_IDLE;
  255.                RETRY_COUNT := RETRY_TOTAL := TIMEOUT_TOTAL := 0;
  256.                VAL KMT_STATISTICS.PACKET_STATISTICS := (0,0);
  257.                RESULT := 0
  258.             ELSE
  259.                RESULT := 89021 @ not implemented in Server mode @
  260.             FI
  261.  
  262.          ; @ KMT_UI_SERVER @
  263.  
  264.  
  265.       SIM PROC KMT_UI_RECEIVE IS GROUP KMT_UI_EXEC(RESPONSE RESULT):
  266.  
  267.          @ RECEIVE command, Syntax: RECEIVE [VME-filename] @
  268.  
  269.          @ prepares VME kermit for the arrival of a file which will be @
  270.          @ saved with VME filename if specified, or with the filename sent @
  271.          @ by the remote Kermit @
  272.          @ (not implemented in Server mode) @
  273.  
  274.             IF KMT_CURRENT_MODE NE SERVER_MODE
  275.             THEN
  276.                @ check for optional filename @
  277.                KMT_VME_FILE := KMT_SP_GET_WORD(KMT_PARSE);
  278.                @ if present, copy to filename buffer @
  279.                UNLESS KMT_VME_FILE REF NIL
  280.                DO
  281.                   KMT_VME_FILE :=
  282.                      KMT_VME_FILE_BUF(SIZE LENGTH KMT_VME_FILE) :=
  283.                         KMT_VME_FILE
  284.                FI;
  285.                @ set Receive mode and initial protocol handler state @
  286.                KMT_CURRENT_MODE := RECEIVE_MODE;
  287.                KMT_PH_STATE := REC_INIT;
  288.                RETRY_COUNT := RETRY_TOTAL := TIMEOUT_TOTAL := 0;
  289.                VAL KMT_STATISTICS.PACKET_STATISTICS := (0,0);
  290.                RESULT := 0
  291.             ELSE
  292.                RESULT := 89021 @ not implemented in Server mode @
  293.             FI
  294.  
  295.          ; @ KMT_UI_RECEIVE @
  296.  
  297.  
  298.       SIM PROC KMT_UI_SEND IS GROUP KMT_UI_EXEC(RESPONSE RESULT):
  299.  
  300.          @ SEND command, Syntax: SEND VME-filename [remote-filename] @
  301.  
  302.          @ sends the VME file to the remote Kermit with remote filename if @
  303.          @ specified otherwise with VME filename @
  304.          @ (not implemented in Server mode) @
  305.  
  306.             IF KMT_CURRENT_MODE NE SERVER_MODE
  307.             THEN
  308.                @ check for mandatory filename @
  309.                KMT_VME_FILE := KMT_SP_GET_WORD(KMT_PARSE);
  310.                IF NOT (KMT_VME_FILE REF NIL)
  311.                THEN
  312.                   @ copy to filename buffer @
  313.                   KMT_VME_FILE :=
  314.                      KMT_VME_FILE_BUF(SIZE LENGTH KMT_VME_FILE) :=
  315.                         KMT_VME_FILE;
  316.                   @ check for optional remote filename @
  317.                   KMT_REM_FILE := KMT_SP_GET_WORD(KMT_PARSE);
  318.                   @ if present copy to buffer @
  319.                   UNLESS KMT_REM_FILE REF NIL
  320.                   DO
  321.                      KMT_REM_FILE :=
  322.                         KMT_REM_FILE_BUF(SIZE LENGTH KMT_REM_FILE) :=
  323.                            KMT_REM_FILE
  324.                   FI;
  325.                   @ set Send mode and initial protocol handler state @
  326.                   KMT_CURRENT_MODE := SEND_MODE;
  327.                   KMT_PH_STATE := SEND_INIT;
  328.                   RETRY_COUNT := RETRY_TOTAL := TIMEOUT_TOTAL := 0;
  329.                   VAL KMT_STATISTICS.PACKET_STATISTICS := (0,0);
  330.                   RESULT := 0
  331.                ELSE
  332.                   RESULT := -85010 @ VME filename must be present @
  333.                FI
  334.             ELSE
  335.                RESULT := 89021 @ not implemented in Server mode @
  336.             FI
  337.  
  338.          ; @ KMT_UI_SEND @
  339.  
  340.  
  341.       SIM PROC KMT_UI_HELP IS GROUP KMT_UI_EXEC(RESPONSE RESULT):
  342.  
  343.          @ HELP command, Syntax: HELP [command [argument(s)] ] @
  344.  
  345.          @ provides on-line help for Kermit commands @
  346.          @ (not implemented in Server mode) @
  347.  
  348.             IF KMT_CURRENT_MODE NE SERVER_MODE
  349.             THEN
  350.                INT HELP_MSG_NO := 1, @ start of help info @
  351.                    P1 := 0,          @ indicates mtm call with command params @
  352.                    HELP_REPLY;
  353.  
  354.                @ set up message text parameter area @
  355.                HELP_MTM_AREA(SIZE 4) :=
  356.                  (HELP_TEXT AS KMT_MTM_VALUES.RVB_VALUE,
  357.                   HELP_TEXT_LEN AS KMT_MTM_VALUES.RI_VALUE,
  358.                   HELP_RECALL_DATA AS KMT_MTM_VALUES.RVRVB_VALUE,
  359.                   P1 AS KMT_MTM_VALUES.RI_VALUE);
  360.  
  361.                @ obtain any command line parameters @
  362.                FOR I FROM 4 TO 9
  363.                DO
  364.                   KMT_WORD HELP_ARG := KMT_SP_GET_WORD(KMT_PARSE);
  365.                   KMT_SP_CONVERT_TO_UPPER_CASE(HELP_ARG);
  366.                   HELP_MTM_AREA(I) :=
  367.                      HELP_ARG AS KMT_MTM_VALUES.RVB_VALUE
  368.                REPEAT;
  369.  
  370.                @ expand help until all done (0) or none found (-2) @
  371.                WHILE HELP_REPLY := EXPAND_HELP(HELP_MSG_NO);
  372.                      HELP_REPLY > 0
  373.                DO
  374.                   @ halt code returned, text is prompt, get response @
  375.                   KMT_SP_ASK_MESSAGE(HELP_TEXT(SIZE HELP_TEXT_LEN),
  376.                                      KMT_INPUT_BUF,STRLEN,FALSE,RC_IGNORED);
  377.                   P1 := 1;      @ indicates mtm call with menu selection @
  378.                   HELP_MTM_AREA(3) := P1 AS KMT_MTM_VALUES.RI_VALUE;
  379.                   HELP_MTM_AREA(4) :=
  380.                      KMT_INPUT_BUF(SIZE S'STRLEN) AS KMT_MTM_VALUES.RVB_VALUE;
  381.                   HELP_MSG_NO := HELP_REPLY
  382.                REPEAT;
  383.                RESULT := 0
  384.             ELSE
  385.                RESULT := 89021 @ not implemented in Server mode @
  386.             FI
  387.  
  388.          ; @ KMT_UI_HELP @
  389.  
  390.  
  391.       SIM PROC KMT_UI_EXIT IS GROUP KMT_UI_EXEC(RESPONSE RESULT):
  392.  
  393.          @ EXIT command, Syntax: EXIT @
  394.  
  395.          @ terminates Kermit execution @
  396.  
  397.          BEGIN
  398.             EXIT_STATE := EXIT; @ set exit state @
  399.             IF KMT_CURRENT_MODE = SERVER_MODE
  400.             THEN
  401.                KMT_PH_STATE := COMPLETE
  402.             FI;
  403.             RESULT := 0
  404.          END
  405.  
  406.          ; @ KMT_UI_EXIT @
  407.  
  408.  
  409.       SIM PROC KMT_UI_SET IS GROUP KMT_UI_EXEC(RESPONSE RESULT):
  410.  
  411.          @ SET command, Syntax: SET [{SEND/RECEIVE}] parameter value @
  412.  
  413.          @ sets Kermit parameters @
  414.  
  415.          BEGIN
  416.             KMT_WORD ARG;
  417.             WORD P_FLAG,PARAM,OPTION;
  418.  
  419.             RESULT := 0;
  420.             ARG := KMT_SP_GET_WORD(KMT_PARSE);
  421.  
  422.             IF ARG REF NIL
  423.             THEN @ incomplete command @
  424.                RESULT := 85932
  425.             ELSF
  426.                KMT_SP_CONVERT_TO_UPPER_CASE(ARG);
  427.                KMT_MTM_AREA(4) := ARG AS KMT_MTM_VALUES.RVB_VALUE;
  428.                P_FLAG := KMT_SP_MTM(5100,KMT_MTM_AREA);
  429.                P_FLAG NE W'UNSET
  430.             THEN @ SET SEND/RECEIVE command @
  431.                ARG := KMT_SP_GET_WORD(KMT_PARSE);
  432.  
  433.                IF ARG REF NIL
  434.                THEN @ incomplete command @
  435.                   RESULT := 85932
  436.                ELSF
  437.                   KMT_SP_CONVERT_TO_UPPER_CASE(ARG);
  438.                   KMT_MTM_AREA(5) := ARG AS KMT_MTM_VALUES.RVB_VALUE;
  439.                   PARAM := KMT_SP_MTM(5120,KMT_MTM_AREA);
  440.                   PARAM = 921
  441.                THEN @ invalid SEND/RECEIVE parameter @
  442.                   RESULT := 85921
  443.                ELSF
  444.                   ARG := KMT_SP_GET_WORD(KMT_PARSE);
  445.                   ARG REF NIL
  446.                THEN @ incomplete command @
  447.                   RESULT := 85932
  448.                ELSE
  449.                   KMT_SP_CONVERT_TO_UPPER_CASE(ARG);
  450.                   KMT_MTM_AREA(6) := ARG AS KMT_MTM_VALUES.RVB_VALUE;
  451.  
  452.                   CASE PARAM
  453.                   THEN @ 0 - START-OF-PACKET @
  454.                      OPTION := KMT_SP_CONVERT_TO_BINARY(ARG);
  455.                      CHECK_AND_SET_PARAM(MARK_PARAM,OPTION,P_FLAG,RESULT)
  456.                   ELSE @ 1 - PACKET-LENGTH @
  457.                      WORD DH_LEN,NPAD;
  458.                      IF P_FLAG = 0
  459.                      THEN @ RECEIVE @
  460.                         DH_LEN := KMT_DH_DEVICE_DETAILS.MAX_INPUT_LENGTH;
  461.                         NPAD := KMT_PP_LOCAL_CONFG_PARAMS.NPAD
  462.                      ELSE
  463.                         DH_LEN := KMT_DH_DEVICE_DETAILS.MAX_OUTPUT_LENGTH;
  464.                         NPAD := KMT_PP_REMOTE_CONFG_PARAMS.NPAD
  465.                      FI;
  466.                      OPTION := KMT_SP_CONVERT_TO_BINARY(ARG);
  467.  
  468.                      IF OPTION < 30 OR OPTION > 94 OR OPTION > DH_LEN
  469.                      THEN @ invalid PACKET-LENGTH @
  470.                         RESULT := 85931
  471.                      ELSF
  472.                          (OPTION + NPAD) > DH_LEN
  473.                      THEN @ padding + packet length exceeds device line length @
  474.                         RESULT := 85934
  475.                      ELSF @ set parameter @
  476.                         P_FLAG = 0
  477.                      THEN @ RECEIVE @
  478.                         KMT_PP_LOCAL_CONFG_PARAMS.MAXL := OPTION
  479.                      ELSE @ SEND @
  480.                         KMT_PP_REMOTE_CONFG_PARAMS.MAXL := OPTION
  481.                      FI
  482.                   ELSE @ 2 - TIMEOUT @
  483.                      OPTION := KMT_SP_CONVERT_TO_BINARY(ARG);
  484.  
  485.                      IF OPTION > 94
  486.                      THEN @ invalid TIMEOUT @
  487.                         RESULT := 85931
  488.                      ELSF @ set parameter @
  489.                         P_FLAG = 0
  490.                      THEN @ RECEIVE @
  491.                         KMT_PP_REMOTE_CONFG_PARAMS.TIME := OPTION
  492.                      ELSE @ SEND @
  493.                         KMT_PP_LOCAL_CONFG_PARAMS.TIME := OPTION
  494.                      FI
  495.                   ELSE @ 3 - END-OF-LINE @
  496.                      OPTION := KMT_SP_CONVERT_TO_BINARY(ARG);
  497.                      CHECK_AND_SET_PARAM(EOL_PARAM,OPTION,P_FLAG,RESULT)
  498.                   ELSE @ 4 - PADDING @
  499.                      WORD DH_LEN,MAXL;
  500.                      IF P_FLAG = 0
  501.                      THEN @ RECEIVE @
  502.                         DH_LEN := KMT_DH_DEVICE_DETAILS.MAX_INPUT_LENGTH;
  503.                         MAXL := KMT_PP_LOCAL_CONFG_PARAMS.MAXL
  504.                      ELSE @ SEND @
  505.                         DH_LEN := KMT_DH_DEVICE_DETAILS.MAX_OUTPUT_LENGTH;
  506.                         MAXL := KMT_PP_REMOTE_CONFG_PARAMS.MAXL
  507.                      FI;
  508.                      OPTION := KMT_SP_CONVERT_TO_BINARY(ARG);
  509.  
  510.                      IF OPTION > 94 OR OPTION > DH_LEN
  511.                      THEN @ invalid PADDING @
  512.                         RESULT := 85931
  513.                      ELSF
  514.                          (OPTION + MAXL) > DH_LEN
  515.                      THEN @ padding + packet length exceeds device line length @
  516.                         RESULT := 85934
  517.                      ELSF @ set parameter @
  518.                         P_FLAG = 0
  519.                      THEN @ RECEIVE @
  520.                         KMT_PP_LOCAL_CONFG_PARAMS.NPAD := OPTION
  521.                      ELSE @ SEND @
  522.                         KMT_PP_REMOTE_CONFG_PARAMS.NPAD := OPTION
  523.                      FI
  524.                   ELSE @ 5 - PAD-CHARACTER @
  525.                      OPTION := KMT_SP_CONVERT_TO_BINARY(ARG);
  526.                      CHECK_AND_SET_PARAM(PADC_PARAM,OPTION,P_FLAG,RESULT)
  527.                   ELSE @ 6 - QUOTE @
  528.                      REF KMT_PP_CONFG_PARAMS_S CONFG_PARAMS IS
  529.                          IF P_FLAG = 0
  530.                          THEN @ RECEIVE @
  531.                             KMT_PP_REMOTE_CONFG_PARAMS
  532.                          ELSE @ SEND @
  533.                             KMT_PP_LOCAL_CONFG_PARAMS
  534.                          FI;
  535.  
  536.                      OPTION := IF LENGTH ARG > 1
  537.                                THEN @ may be decimal or hex @
  538.                                   KMT_SP_CONVERT_TO_BINARY(ARG)
  539.                                ELSE @ EBCDIC character @
  540.                                   EBCDIC_TO_ASCII(ARG)
  541.                                FI;
  542.  
  543.                      IF OPTION < 32 OR OPTION > 126
  544.                      THEN @ not a printable character @
  545.                         RESULT := 85931
  546.                      ELSF CONFG_PARAMS.QBIN = OPTION
  547.                      THEN @ QUOTE and EIGTH-BIT-PREFIX characters equal @
  548.                         RESULT := 85933
  549.                      ELSE @ set parameter @
  550.                         CONFG_PARAMS.QCTL := OPTION
  551.                      FI
  552.                   ELSE @ 7 - EIGTH-BIT-PREFIX @
  553.                      REF KMT_PP_CONFG_PARAMS_S CONFG_PARAMS IS
  554.                          IF P_FLAG = 0
  555.                          THEN @ RECEIVE @
  556.                             KMT_PP_REMOTE_CONFG_PARAMS
  557.                          ELSE @ SEND @
  558.                             KMT_PP_LOCAL_CONFG_PARAMS
  559.                          FI;
  560.  
  561.                      OPTION := IF LENGTH ARG > 1
  562.                                THEN @ may be decimal or hex @
  563.                                   KMT_SP_CONVERT_TO_BINARY(ARG)
  564.                                ELSE @ EBCDIC character @
  565.                                   EBCDIC_TO_ASCII(ARG)
  566.                                FI;
  567.  
  568.                      IF OPTION < 32 OR OPTION > 126
  569.                         OR (OPTION > 62 AND OPTION < 96)
  570.                      THEN @ not a printable character @
  571.                         RESULT := 85931
  572.                      ELSF CONFG_PARAMS.QCTL = OPTION
  573.                      THEN @ QUOTE and EIGTH-BIT-PREFIX characters equal @
  574.                         RESULT := 85933
  575.                      ELSE @ set parameter @
  576.                         CONFG_PARAMS.QBIN := OPTION
  577.                      FI
  578.                   DEFAULT @ invalid SEND/RECEIVE parameter @
  579.                      RESULT := 85921
  580.                   ESAC
  581.                FI
  582.             ELSF
  583.                P_FLAG := KMT_SP_MTM(5110,KMT_MTM_AREA);
  584.                P_FLAG = 920
  585.             THEN @ invalid SET parameter @
  586.                RESULT := 85920
  587.             ELSF @ SET DEBUG/DELAY/FILE/RETRY/PAUSE @
  588.                ARG := KMT_SP_GET_WORD(KMT_PARSE);
  589.                ARG REF NIL
  590.             THEN @ incomplete command @
  591.                RESULT := 85932
  592.             ELSE
  593.                KMT_SP_CONVERT_TO_UPPER_CASE(ARG);
  594.                KMT_MTM_AREA(5) := ARG AS KMT_MTM_VALUES.RVB_VALUE;
  595.  
  596.                CASE P_FLAG
  597.                THEN @ 0 - DEBUG @
  598.                   PARAM := KMT_SP_MTM(5130,KMT_MTM_AREA);
  599.  
  600.                   IF PARAM = 921
  601.                   THEN @ invalid DEBUG parameter @
  602.                      RESULT := 85921
  603.                   ELSF
  604.                      ARG := KMT_SP_GET_WORD(KMT_PARSE);
  605.                      ARG REF NIL
  606.                   THEN @ incomplete command @
  607.                      RESULT := 85932
  608.                   ELSF
  609.                      KMT_SP_CONVERT_TO_UPPER_CASE(ARG);
  610.                      KMT_MTM_AREA(6) := ARG AS KMT_MTM_VALUES.RVB_VALUE;
  611.                      OPTION := KMT_SP_MTM(5150,KMT_MTM_AREA);
  612.                      OPTION = 931
  613.                   THEN @ invalid option @
  614.                      RESULT := 85931
  615.                   ELSE @ set parameter @
  616.  
  617.                      CASE PARAM
  618.                      THEN @ 0 - ALL @
  619.                         KMT_TRACE_FLAGS := IF OPTION = 0
  620.                                            THEN @ OFF @
  621.                                               0
  622.                                            ELSE @ ON @
  623.                                               -1
  624.                                            FI
  625.                      ELSE @ 1 - FILE @
  626.                         KMT_TRACE_FLAGS.FH_TRACING := OPTION
  627.                      ELSE @ 2 - PROTOCOL @
  628.                         KMT_TRACE_FLAGS.PH_TRACING := OPTION
  629.                      ELSE @ 3 - PACKET @
  630.                         KMT_TRACE_FLAGS.PP_TRACING := OPTION
  631.                      ELSE @ 4 - DEVICE @
  632.                         KMT_TRACE_FLAGS.DH_TRACING := OPTION
  633.                      DEFAULT @ invalid option @
  634.                         RESULT := 85931
  635.                      ESAC
  636.                   FI
  637.                ELSE @ 1 - DELAY @
  638.                   KMT_SP_CONVERT_TO_UPPER_CASE(ARG);
  639.                   KMT_MTM_AREA(5) := ARG AS KMT_MTM_VALUES.RVB_VALUE;
  640.                   OPTION := KMT_SP_CONVERT_TO_BINARY(ARG);
  641.  
  642.                   IF OPTION < 5 OR OPTION > 300
  643.                   THEN @ invalid DELAY parameter @
  644.                      RESULT := 85930
  645.                   ELSE @ set parameter @
  646.                      DELAY := I'(OPTION)
  647.                   FI
  648.                ELSE @ 2 - FILE @
  649.                   KMT_SP_CONVERT_TO_UPPER_CASE(ARG);
  650.                   KMT_MTM_AREA(5) := ARG AS KMT_MTM_VALUES.RVB_VALUE;
  651.                   ARG := KMT_SP_GET_WORD(KMT_PARSE);
  652.  
  653.                   IF ARG REF NIL
  654.                   THEN @ incomplete command @
  655.                      RESULT := 85932
  656.                   ELSF
  657.                      KMT_SP_CONVERT_TO_UPPER_CASE(ARG);
  658.                      KMT_MTM_AREA(6) := ARG AS KMT_MTM_VALUES.RVB_VALUE;
  659.                      OPTION := KMT_SP_MTM(5140,KMT_MTM_AREA);
  660.                      OPTION = 921 OR OPTION = 931
  661.                   THEN @ invalid FILE parameter or option @
  662.                      RESULT := 85000 + OPTION
  663.                   ELSF OPTION < 3
  664.                   THEN @ TYPE - EBCDIC, ASCII, BINARY @
  665.                      KMT_FH_RECORD_DETAILS.TEXT_TYPE := OPTION
  666.                   ELSF OPTION < 5
  667.                   THEN @ NAMING @
  668.                      TRANSLATE_FILENAME := (OPTION = 4)
  669.                   ELSF OPTION < 7
  670.                   THEN @ OVERWRITE @
  671.                      FILE_OPTION := IF OPTION = 5
  672.                                     THEN @ create mode @
  673.                                        1
  674.                                     ELSE @ create replace mode @
  675.                                        2
  676.                                     FI
  677.                   ELSF OPTION < 9
  678.                   THEN @ INCOMPLETE @
  679.                      SAVE_INCOMPLETE_FILE := (OPTION = 8)
  680.                   ELSE @ invalid FILE parameter @
  681.                      RESULT := 85931
  682.                   FI
  683.                ELSE @ 3 - RETRY @
  684.                   KMT_SP_CONVERT_TO_UPPER_CASE(ARG);
  685.                   KMT_MTM_AREA(5) := ARG AS KMT_MTM_VALUES.RVB_VALUE;
  686.                   OPTION := KMT_SP_CONVERT_TO_BINARY(ARG);
  687.  
  688.                   IF OPTION > 10
  689.                   THEN @ invalid RETRY @
  690.                      RESULT := 85930
  691.                   ELSE @ set parameter @
  692.                      MAXTRY := OPTION + 1
  693.                   FI
  694.                ELSE @ 4 - PAUSE @
  695.                   KMT_SP_CONVERT_TO_UPPER_CASE(ARG);
  696.                   KMT_MTM_AREA(5) := ARG AS KMT_MTM_VALUES.RVB_VALUE;
  697.                   OPTION := KMT_SP_CONVERT_TO_BINARY(ARG);
  698.  
  699.                   IF OPTION > 50
  700.                   THEN @ invalid PAUSE @
  701.                      RESULT := 85930
  702.                   ELSE @ set parameter @
  703.                      KMT_DH_DEVICE_DETAILS.PAUSE := (I'OPTION) * 100
  704.                   FI
  705.                DEFAULT @ invalid SET parameter @
  706.                   RESULT := 85920
  707.                ESAC
  708.             FI;
  709.  
  710.             IF KMT_CURRENT_MODE NE SERVER_MODE AND RESULT > 0
  711.             THEN @ don't send error packet if not in server mode @
  712.                RESULT := -RESULT
  713.             FI
  714.          END
  715.          ; @ KMT_UI_SET @
  716.  
  717.  
  718.       SIM PROC KMT_UI_SHOW IS GROUP KMT_UI_EXEC(RESPONSE RESULT):
  719.  
  720.          @ SHOW command, Syntax: SHOW @
  721.  
  722.          @ displays the current values of all Kermit parameters @
  723.          @ (this variant not implemented in Server mode @
  724.  
  725.             IF KMT_CURRENT_MODE NE SERVER_MODE
  726.             THEN
  727.                BYTE
  728.                    REM_QCTL := ASCII_TO_EBCDIC(KMT_PP_REMOTE_CONFG_PARAMS.QCTL),
  729.                    REM_QBIN := ASCII_TO_EBCDIC(KMT_PP_REMOTE_CONFG_PARAMS.QBIN),
  730.                    LOC_QCTL := ASCII_TO_EBCDIC(KMT_PP_LOCAL_CONFG_PARAMS.QCTL),
  731.                    LOC_QBIN := ASCII_TO_EBCDIC(KMT_PP_LOCAL_CONFG_PARAMS.QBIN);
  732.  
  733.                KMT_MTM_AREA(3 SIZE 3) :=
  734.                                      ((L'(I'DELAY)) AS
  735.                                       KMT_MTM_VALUES.LW_VALUE,
  736.                                       (L'(I'KMT_DH_DEVICE_DETAILS.PAUSE)/100) AS
  737.                                       KMT_MTM_VALUES.LW_VALUE,
  738.                                       (L'(MAXTRY-1)) AS
  739.                                       KMT_MTM_VALUES.LI_VALUE);
  740.                KMT_MESSAGE(-85821,RC_IGNORED);
  741.  
  742.                KMT_MTM_AREA(3 SIZE 8) :=
  743.                             (KMT_PP_REMOTE_CONFG_PARAMS.MARK AS
  744.                              KMT_MTM_VALUES.RVB_VALUE,
  745.                              (L'KMT_PP_LOCAL_CONFG_PARAMS.MAXL) AS
  746.                              KMT_MTM_VALUES.LW_VALUE,
  747.                              (L'KMT_PP_REMOTE_CONFG_PARAMS.TIME) AS
  748.                              KMT_MTM_VALUES.LW_VALUE,
  749.                              (L'KMT_PP_LOCAL_CONFG_PARAMS.NPAD) AS
  750.                              KMT_MTM_VALUES.LW_VALUE,
  751.                              KMT_PP_LOCAL_CONFG_PARAMS.PADC AS
  752.                              KMT_MTM_VALUES.RVB_VALUE,
  753.                              KMT_PP_LOCAL_CONFG_PARAMS.EOL AS
  754.                              KMT_MTM_VALUES.RVB_VALUE,
  755.                              REM_QCTL AS
  756.                              KMT_MTM_VALUES.RVB_VALUE,
  757.                              REM_QBIN AS
  758.                              KMT_MTM_VALUES.RVB_VALUE);
  759.                KMT_MESSAGE(-85822,RC_IGNORED);
  760.  
  761.                KMT_MTM_AREA(3 SIZE 8) :=
  762.                              (KMT_PP_LOCAL_CONFG_PARAMS.MARK AS
  763.                               KMT_MTM_VALUES.RVB_VALUE,
  764.                               (L'KMT_PP_REMOTE_CONFG_PARAMS.MAXL) AS
  765.                               KMT_MTM_VALUES.LW_VALUE,
  766.                               (L'KMT_PP_LOCAL_CONFG_PARAMS.TIME) AS
  767.                               KMT_MTM_VALUES.LW_VALUE,
  768.                               (L'KMT_PP_REMOTE_CONFG_PARAMS.NPAD) AS
  769.                               KMT_MTM_VALUES.LW_VALUE,
  770.                               KMT_PP_REMOTE_CONFG_PARAMS.PADC AS
  771.                               KMT_MTM_VALUES.RVB_VALUE,
  772.                               KMT_PP_REMOTE_CONFG_PARAMS.EOL AS
  773.                               KMT_MTM_VALUES.RVB_VALUE,
  774.                               LOC_QCTL AS
  775.                               KMT_MTM_VALUES.RVB_VALUE,
  776.                               LOC_QBIN AS
  777.                               KMT_MTM_VALUES.RVB_VALUE);
  778.                KMT_MESSAGE(-85823,RC_IGNORED);
  779.  
  780.                KMT_MTM_AREA(3 SIZE 4) :=
  781.                                      (KMT_FH_RECORD_DETAILS.TEXT_TYPE AS
  782.                                       KMT_MTM_VALUES.RW_VALUE,
  783.                                       FILE_OPTION AS
  784.                                       KMT_MTM_VALUES.RI_VALUE,
  785.                                       (L'(WORD: (BIT: SAVE_INCOMPLETE_FILE))) AS
  786.                                       KMT_MTM_VALUES.LW_VALUE,
  787.                                       (L'(WORD: (BIT: TRANSLATE_FILENAME))) AS
  788.                                       KMT_MTM_VALUES.LW_VALUE);
  789.                KMT_MESSAGE(-85825,RC_IGNORED);
  790.  
  791.                KMT_MTM_AREA(3 SIZE 2) :=
  792.                                      (KMT_DH_DEVICE_DETAILS.MAX_INPUT_LENGTH AS
  793.                                       KMT_MTM_VALUES.RW_VALUE,
  794.                                       KMT_DH_DEVICE_DETAILS.MAX_OUTPUT_LENGTH AS
  795.                                       KMT_MTM_VALUES.RW_VALUE);
  796.                KMT_MESSAGE(-85826,RC_IGNORED);
  797.  
  798.                KMT_MTM_AREA(3 SIZE 4) :=
  799.                                       ((L'(WORD: KMT_TRACE_FLAGS.FH_TRACING)) AS
  800.                                        KMT_MTM_VALUES.LW_VALUE,
  801.                                        (L'(WORD: KMT_TRACE_FLAGS.PH_TRACING)) AS
  802.                                        KMT_MTM_VALUES.LW_VALUE,
  803.                                        (L'(WORD: KMT_TRACE_FLAGS.PP_TRACING)) AS
  804.                                        KMT_MTM_VALUES.LW_VALUE,
  805.                                        (L'(WORD: KMT_TRACE_FLAGS.DH_TRACING)) AS
  806.                                        KMT_MTM_VALUES.LW_VALUE);
  807.                KMT_MESSAGE(-85827,RC_IGNORED);
  808.                RESULT := 0
  809.             ELSE
  810.                RESULT := 85911 @ not yet implemented in Server mode @
  811.             FI
  812.  
  813.          ; @ KMT_UI_SHOW @
  814.  
  815.  
  816.       SIM PROC KMT_UI_STATISTICS IS GROUP KMT_UI_EXEC(RESPONSE RESULT):
  817.  
  818.          @ STATISTICS command, Syntax: STATISTICS @
  819.  
  820.          @ displays statistics of last file transfer @
  821.  
  822.             IF KMT_CURRENT_MODE NE SERVER_MODE
  823.             THEN
  824.                REF KMT_FH_FILE_STATISTICS_S FILE_STATS IS
  825.                                             KMT_STATISTICS.FH_FILE_STATISTICS;
  826.  
  827.                REF KMT_PP_PACKET_STATISTICS_S PACKET_STATS IS
  828.                                               KMT_STATISTICS.PACKET_STATISTICS;
  829.  
  830.                KMT_MTM_AREA(3 SIZE 6) := (PACKET_STATS.INPUT_TOTAL AS
  831.                                           KMT_MTM_VALUES.RI_VALUE,
  832.                                           PACKET_STATS.OUTPUT_TOTAL AS
  833.                                           KMT_MTM_VALUES.RI_VALUE,
  834.                                           RETRY_TOTAL AS
  835.                                           KMT_MTM_VALUES.RI_VALUE,
  836.                                           TIMEOUT_TOTAL AS
  837.                                           KMT_MTM_VALUES.RI_VALUE,
  838.                                           FILE_STATS.INPUT_TOTAL AS
  839.                                           KMT_MTM_VALUES.RI_VALUE,
  840.                                           FILE_STATS.OUTPUT_TOTAL AS
  841.                                           KMT_MTM_VALUES.RI_VALUE);
  842.                KMT_MESSAGE(-85820,RC_IGNORED);
  843.                RESULT := 0
  844.             ELSE
  845.                RESULT := 85911 @ not yet implemented in Server mode @
  846.             FI
  847.  
  848.          ; @ KMT_UI_STATISTICS @
  849.  
  850.       SIM PROC KMT_UI_UNRECOGNISED IS GROUP KMT_UI_EXEC(RESPONSE RESULT):
  851.  
  852.          @ command no recognised @
  853.  
  854.             IF KMT_CURRENT_MODE NE SERVER_MODE
  855.             THEN
  856.                RESULT := -85910
  857.             ELSE
  858.                RESULT := 85910
  859.             FI
  860.  
  861.          ; @ KMT_UI_UNRECOGNISED @
  862.  
  863.  
  864.       @ command execution procedure selector: @
  865.  
  866.       ()SIM PROC GROUP KMT_UI_EXEC(RESPONSE) KMT_UI_CMD IS
  867.                       (KMT_UI_SERVER,
  868.                        KMT_UI_RECEIVE,
  869.                        KMT_UI_SEND,
  870.                        KMT_UI_HELP,
  871.                        KMT_UI_EXIT,
  872.                        KMT_UI_SET,
  873.                        KMT_UI_SHOW,
  874.                        KMT_UI_STATISTICS,
  875.                        KMT_UI_UNRECOGNISED);
  876.  
  877.  
  878.       KMT_WORD KMT_CMD;       @ current command @
  879.       INT CMD;                @ current command code @
  880.  
  881.       RESULT := 0;
  882.  
  883.       IF KMT_CURRENT_MODE = COMMAND_MODE
  884.       THEN
  885.          @ prompt for command input @
  886.          KMT_SP_ASK_MESSAGE(X"15E5D4C540D285999489A36E40",   @ " VME Kermit> " @
  887.                             KMT_INPUT_BUF,STRLEN,TRUE,RESULT);
  888.          KMT_CMD_BUF := KMT_PARSE := KMT_INPUT_BUF(SIZE S'STRLEN);
  889.       ELSF LENGTH KMT_PH_INPUT_PACKET_DATA > 0
  890.       THEN
  891.          @ Server mode, command in packet @
  892.          KMT_CMD_BUF := KMT_PARSE := KMT_PH_INPUT_PACKET_DATA
  893.       ELSE
  894.          RESULT := 89022 @ no command specified in Server mode @
  895.       FI;
  896.  
  897.       IF RESULT = 0
  898.       THEN
  899.          KMT_CMD := KMT_SP_GET_WORD(KMT_PARSE); @ extract command @
  900.          UNLESS KMT_CMD REF NIL
  901.          DO
  902.             @ convert command name to upper case, validate and execute command @
  903.             KMT_SP_CONVERT_TO_UPPER_CASE(KMT_CMD);
  904.             KMT_MTM_AREA(3) := KMT_CMD AS KMT_MTM_VALUES.RVB_VALUE;
  905.             CMD := KMT_SP_MTM(5010,KMT_MTM_AREA(SIZE 4));
  906.             KMT_UI_CMD(CMD)(RESULT)
  907.          FI
  908.       FI
  909.  
  910.    END
  911.  
  912.    ;                                                                  @ KMT_UI @
  913.  
  914. ENDMODULE                                                      @ KMT_UI_MODULE @
  915.