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

  1. MODULE KMT_SP_MODULE;
  2.  
  3. @******************************************************************************@
  4. @*                                                                            *@
  5. @* Mode definitions                                                           *@
  6. @*                                                                            *@
  7. @******************************************************************************@
  8.  
  9. MODE
  10. KMT_DH_DEVICE_DETAILS_S IS STRUCT (
  11.    BOOL FILE_OPEN,
  12.    WORD MAX_INPUT_LENGTH,
  13.         MAX_OUTPUT_LENGTH,
  14.         INPUT_PARITY,
  15.         OUTPUT_PARITY,
  16.         PAUSE);
  17.  
  18. MODE
  19. KMT_FH_RECORD_DETAILS_S IS STRUCT (
  20.    BOOL        FILE_OPEN,
  21.                NEW_RECORD,
  22.                END_OF_FILE,
  23.    WORD        TEXT_TYPE,                        @ 0 = EBCDIC                  @
  24.                                                  @ 1 = IA5                     @
  25.                                                  @ 2 = BINARY                  @
  26.    INT         MAX_RECORD_LENGTH,
  27.                RECORD_LENGTH,
  28.    (4098) BYTE RECORD);                          @ Maximum record size of 4096 @
  29.                                                  @ plus 2 bytes for CRLF pair  @
  30.                                                  @ when constructing output    @
  31.                                                  @ records                     @
  32.  
  33. MODE
  34. KMT_FH_FILE_STATISTICS_S IS STRUCT (
  35.    INT INPUT_TOTAL,
  36.    INT OUTPUT_TOTAL);
  37.  
  38. MODE
  39. KMT_PP_CONFG_PARAMS_S IS STRUCT (
  40.    BYTE   MARK,
  41.           MAXL,
  42.           TIME,
  43.           NPAD,
  44.           PADC,
  45.           EOL,
  46.           QCTL,
  47.           QBIN,
  48.           CHKT,
  49.           REPT,
  50.    4-BYTE CAPAS);
  51.  
  52. MODE
  53. KMT_PP_PACKET_STATISTICS_S IS STRUCT (
  54.    INT INPUT_TOTAL,
  55.        OUTPUT_TOTAL);
  56.  
  57. MODE
  58. KMT_TRACE_FLAGS_S IS WORD STRUCT (
  59.    BIT    PH_TRACING,
  60.           PP_TRACING,
  61.           FH_TRACING,
  62.           DH_TRACING,
  63.    28-BIT SPARE);
  64.  
  65. MODE
  66. KMT_MTM_VALUES IS ANY (
  67.    LONG WORD          LW_VALUE,
  68.    LONG INT           LI_VALUE,
  69.    REF WORD           RW_VALUE,
  70.    REF INT            RI_VALUE,
  71.    REF LONG WORD      RLW_VALUE,
  72.    REF LONG INT       RLI_VALUE,
  73.    REF () BYTE        RVB_VALUE,
  74.    REF () REF () BYTE RVRVB_VALUE);
  75.  
  76. MODE
  77. KMT_BUFFER IS (96) BYTE;
  78.  
  79. MODE
  80. KMT_STRING IS REF () BYTE;
  81.  
  82. MODE
  83. KMT_WORD IS REF () BYTE;
  84.  
  85. ***PAGE
  86.  
  87. @******************************************************************************@
  88. @*                                                                            *@
  89. @* External procedure references                                              *@
  90. @*                                                                            *@
  91. @******************************************************************************@
  92.  
  93. EXT (<PREFIX "ICLCTM">)
  94. PROC
  95.    (RESPONSE                                     @ RESPONSE                    @
  96.    )                                   CTM_JS_BEGIN;
  97.  
  98. EXT (<PREFIX "ICLCTM">)
  99. PROC
  100.    (RESPONSE                                     @ RESPONSE                    @
  101.    )                                   CTM_JS_END;
  102.  
  103. EXT (<PREFIX "ICLCTM">)
  104. PROC
  105.    (REF () BYTE,                                 @ PROMPT                      @
  106.     REF () BYTE,                                 @ MESSAGE                     @
  107.     REF LONG INT,                                @ LENGTH_MESSAGE              @
  108.     RESPONSE                                     @ RESPONSE                    @
  109.    )                                   ASK_MESSAGE;
  110.  
  111. EXT (<PREFIX "ICLCTM">)
  112. PROC
  113.    (WORD,                                        @ TYPE                        @
  114.     WORD,                                        @ DESTINATION                 @
  115.     REF () BYTE,                                 @ MESSAGE                     @
  116.     RESPONSE                                     @ RESPONSE                    @
  117.    )                                   CTM_LOG;
  118.  
  119. EXT (<PREFIX "ICLMACROS">)
  120. PROC
  121.    (REF () REF () BYTE,                          @ NAMES                       @
  122.     REF () BYTE,                                 @ JOURNAL_LIST                @
  123.     RESPONSE                                     @ RESPONSE                    @
  124.    )                                   SET_OPTIONS;
  125.  
  126. EXT
  127. PROC
  128.    (INT,                                         @ TEXT_NUMBER                 @
  129.     REF () KMT_MTM_VALUES                        @ PARAMS                      @
  130.    ) INT                               KMT_SP_MTM;
  131.  
  132. ***PAGE
  133.  
  134. @******************************************************************************@
  135. @*                                                                            *@
  136. @* External data references                                                   *@
  137. @*                                                                            *@
  138. @******************************************************************************@
  139.  
  140. @ Constants: @
  141. @ ********** @
  142.  
  143. EXT
  144. INT UNSET;
  145.  
  146. EXT
  147. INT VME_TERM, @ 0 @                             @forms of name standardisation @
  148.     VME_STD,  @ 1 @
  149.     KMT_STD;  @ 2 @
  150.  
  151. ***LINES(4)
  152.  
  153. @ Variables: @
  154. @ ********** @
  155.  
  156. EXT (<CASCADE>)
  157. REF BOOL TRANSLATE_FILENAME;
  158.  
  159. EXT REF INT EXIT_STATE,
  160.             FILE_OPTION,
  161.             MAXTRY,
  162.             RETRY_COUNT,
  163.             RETRY_TOTAL,
  164.             TIMEOUT_TOTAL;
  165.  
  166. EXT REF WORD DELAY;
  167.  
  168. EXT REF BOOL ASG_ROUTE,
  169.              DELAY_TIMER,
  170.              SAVE_INCOMPLETE_FILE;
  171.  
  172. EXT (<CASCADE>)
  173. REF KMT_DH_DEVICE_DETAILS_S KMT_DH_DEVICE_DETAILS;
  174.  
  175. EXT (<CASCADE>)
  176. REF KMT_FH_RECORD_DETAILS_S KMT_FH_RECORD_DETAILS;
  177.  
  178. EXT (<CASCADE>)
  179. REF KMT_FH_FILE_STATISTICS_S KMT_FH_FILE_STATISTICS;
  180.  
  181. EXT (<CASCADE>)
  182. REF KMT_PP_CONFG_PARAMS_S KMT_PP_LOCAL_CONFG_PARAMS;
  183.  
  184. EXT (<CASCADE>)
  185. REF KMT_PP_CONFG_PARAMS_S KMT_PP_REMOTE_CONFG_PARAMS;
  186.  
  187. EXT (<CASCADE>)
  188. REF KMT_PP_PACKET_STATISTICS_S KMT_PP_PACKET_STATISTICS;
  189.  
  190. EXT (<CASCADE>)
  191. REF KMT_TRACE_FLAGS_S KMT_TRACE_FLAGS;
  192.  
  193. ***LINES(4)
  194.  
  195. @ Results: @
  196. @ ******** @
  197.  
  198. ***PAGE
  199.  
  200. @******************************************************************************@
  201. @*                                                                            *@
  202. @* Procedure declarations                                                     *@
  203. @*                                                                            *@
  204. @******************************************************************************@
  205.  
  206. GLOBAL
  207. STATIC (<STATUS 5>)
  208. PROC
  209.    KMT_SP_SET_DEFAULTS IS ():
  210.  
  211. @******************************************************************************@
  212. @*                                                                            *@
  213. @* This procedure is used to set default values for certain global variables. *@
  214. @*                                                                            *@
  215. @******************************************************************************@
  216.  
  217. BEGIN
  218.    EXIT_STATE := UNSET;
  219.    FILE_OPTION := 1;                            @ create mode                  @
  220.    DELAY := 30;
  221.    DELAY_TIMER := FALSE;
  222.    SAVE_INCOMPLETE_FILE := FALSE;
  223.    TRANSLATE_FILENAME := TRUE;
  224.    MAXTRY := 5;
  225.    RETRY_COUNT := 0;
  226.    RETRY_TOTAL := 0;
  227.    TIMEOUT_TOTAL := 0;
  228.  
  229.    KMT_TRACE_FLAGS := 0;                         @ No tracing                  @
  230.  
  231.    KMT_DH_DEVICE_DETAILS.FILE_OPEN := FALSE;     @ No file open initially      @
  232.    KMT_DH_DEVICE_DETAILS.INPUT_PARITY := 4;      @ No parity                   @
  233.    KMT_DH_DEVICE_DETAILS.OUTPUT_PARITY := 4;     @ NO parity                   @
  234.    KMT_DH_DEVICE_DETAILS.PAUSE := 0;             @ NO pause                    @
  235.  
  236.    KMT_FH_RECORD_DETAILS.FILE_OPEN := FALSE;     @ No file open initially      @
  237.    KMT_FH_RECORD_DETAILS.TEXT_TYPE := 0;         @ EBCDIC text                 @
  238.  
  239.    KMT_FH_FILE_STATISTICS := (0,0);              @ Zero record transfers       @
  240.  
  241.    KMT_PP_LOCAL_CONFG_PARAMS := (X"1E",          @ MARK  - Record Seperator    @
  242.                                  80,             @ MAXL                        @
  243.                                  0,              @ TIME  - No timeout          @
  244.                                  0,              @ NPAD  - No padding          @
  245.                                  X"00",          @ PADC  - Null                @
  246.                                  X"0D",          @ EOL   - Carriage Return     @
  247.                                  X"23",          @ QCTL  - Hash #              @
  248.                                  X"26",          @ QBIN  - Ampersand &         @
  249.                                  X"31",          @ CHKT  - Single check sum    @
  250.                                  X"00",          @ REPT  - Not supported       @
  251.                                  X'00');         @ CAPAS - Not supported       @
  252.  
  253.    KMT_PP_REMOTE_CONFG_PARAMS := (X"1E",         @ MARK  - Record Seperator    @
  254.                                   80,            @ MAXL                        @
  255.                                   0,             @ TIME  - No timeout          @
  256.                                   0,             @ NPAD  - No padding          @
  257.                                   X"00",         @ PADC  - Null                @
  258.                                   X"0D",         @ EOL   - Carriage Return     @
  259.                                   X"23",         @ QCTL  - Hash #              @
  260.                                   X"26",         @ QBIN  - Ampersand &         @
  261.                                   X"31",         @ CHKT  - Single check sum    @
  262.                                   X"00",         @ REPT  - Not supported       @
  263.                                   X'00');        @ CAPAS - Not supported       @
  264.  
  265.    KMT_PP_PACKET_STATISTICS := (0,0);            @ Zero packet transfers       @
  266.  
  267. END;                                   @ KMT_SP_SET_DEFAULTS                   @
  268.  
  269. ***PAGE
  270.  
  271. GLOBAL
  272. STATIC (<STATUS 5>)
  273. PROC
  274.    KMT_SP_CHAR_TO_HEX IS (
  275.    REF () BYTE HEX_DIGITS,
  276.    REF () BYTE HEX_STRING,
  277.    REF INT     HEX_STRING_LENGTH,
  278.    RESPONSE    RESULT):
  279.  
  280. @******************************************************************************@
  281. @*                                                                            *@
  282. @* This procedure is used to convert a string representing hexadecimal digits *@
  283. @* from character to the hexadecimal notation.                                *@
  284. @* The area referenced by HEX_DIGITS contains the string representing the     *@
  285. @* hexadecimal digits and HEX_STRING references an area to contain the        *@
  286. @* hexadecimal string.                                                        *@
  287. @* The number of hexadecimal characters returned in HEX_STRING is returned    *@
  288. @* in the area referenced by HEX_STRING_LENGTH.                               *@
  289. @* If a non hexadecimal digit is detected then HEX_STRING_LENGTH is returned  *@
  290. @* zero and resultcode KMT_SP_NOT_HEX is returned.                            *@
  291. @* If the area referenced by HEX_STRING is not large enough to contain the    *@
  292. @* hexadecimal string then HEX_STRING_LENGTH is returned containing the size  *@
  293. @* required and resultcode KMT_SP_STRING_TOO_BIG is returned                  *@
  294. @*                                                                            *@
  295. @******************************************************************************@
  296.  
  297.  
  298. BEGIN
  299.  
  300. ***PAGE
  301.  
  302. SIM
  303. PROC
  304.    KMT_SP_HEX IS (
  305.    2-BYTE HEX_DIGITS) BYTE:
  306.  
  307. @******************************************************************************@
  308. @*                                                                            *@
  309. @* This procedure is used to return a hexadecimal string from the two byte    *@
  310. @* hexadecimal representation supplied in HEX_STRING.                         *@
  311. @*                                                                            *@
  312. @******************************************************************************@
  313.  
  314. BEGIN
  315.    (2) BYTE HEX_DIGITS_COPY := HEX_DIGITS;
  316.  
  317.    FOR I
  318.    TO  1
  319.    DO
  320.       REF BYTE HEX_DIGIT IS HEX_DIGITS_COPY (I);
  321.  
  322.       IF
  323.          (HEX_DIGIT GE "A")  AND  (HEX_DIGIT LE "F")
  324.  
  325.       THEN                                       @ In range "A" to "F"         @
  326.          HEX_DIGIT := HEX_DIGIT + X"09"
  327.       FI;
  328.  
  329.       HEX_DIGIT := HEX_DIGIT & X"0F";            @ In range X"00" to X"0F"     @
  330.    REPEAT;
  331.  
  332.    (W'PACKS (0,
  333.              HEX_DIGITS_COPY,
  334.              0,
  335.              NIL)) SCALE -4
  336. END;                                   @ KMT_SP_HEX                            @
  337.  
  338. ***PAGE
  339.  
  340.    INT KMT_SP_NOT_HEX        IS 80050,
  341.        KMT_SP_STRING_TOO_BIG IS 80051;
  342.  
  343.    INT HEX_DIGITS_LENGTH IS LENGTH HEX_DIGITS;
  344.  
  345.    RESULT := UNLESS
  346.                (
  347.                 () BYTE NON_HEX_BIT_MAP IS (X"FFFFFFFF FFFFFFFF"
  348.                                             X"FFFFFFFF FFFFFFFF"
  349.                                             X"81FFFFFF FFFFFFFF"
  350.                                             X"81FFFFFF FFFF003F");
  351.                                                  @ Allow lower and upper case  @
  352.  
  353.                 CHECK (NON_HEX_BIT_MAP,
  354.                        HEX_DIGITS,
  355.                        0,
  356.                        NIL)
  357.                )
  358.              THEN                                @ Non hex digit in string     @
  359.                 HEX_STRING_LENGTH := 0;
  360.                 KMT_SP_NOT_HEX
  361.              ELSF
  362.                (
  363.                 HEX_STRING_LENGTH := (HEX_DIGITS_LENGTH + 1) / 2;
  364.                 HEX_STRING_LENGTH GT LENGTH HEX_STRING
  365.                )
  366.              THEN                                @ Return string too small     @
  367.                 KMT_SP_STRING_TOO_BIG
  368.              ELSE                                @ Convert to hex              @
  369.                 INT HEX_DIGITS_INDEX := IF
  370.                                            ((WORD:HEX_DIGITS_LENGTH) & 1) EQ 1
  371.                                         THEN     @ Odd number of hex digits    @
  372.                                            HEX_STRING(0) := KMT_SP_HEX (
  373.                                                                HEX_DIGITS(0));
  374.                                            1
  375.                                         ELSE
  376.                                            0
  377.                                         FI;
  378.  
  379.              FOR  I
  380.              FROM HEX_DIGITS_INDEX
  381.              UNTIL
  382.                 HEX_DIGITS_INDEX GE HEX_DIGITS_LENGTH
  383.              DO
  384.                 HEX_STRING (I) := KMT_SP_HEX (HEX_DIGITS(HEX_DIGITS_INDEX
  385.                                                          SIZE 2));
  386.                 HEX_DIGITS_INDEX := HEX_DIGITS_INDEX + 2
  387.              REPEAT;
  388.  
  389.              0
  390.    FI
  391. END;                                   @ KMT_SP_CHAR_TO_HEX                    @
  392.  
  393. ***PAGE
  394.  
  395. GLOBAL
  396. STATIC (<STATUS 5>)
  397. PROC
  398.    KMT_SP_CONVERT_TO_BINARY IS (REF KMT_WORD W) WORD:
  399.  
  400.    @ Converts Kermit word or string to a binary number @
  401.  
  402.    IF W REF NIL
  403.    THEN @ not given @
  404.       -1
  405.    ELSF
  406.       (() BYTE BIT_MAP IS X"FFFFFFFF FFFFFFFF"
  407.                           X"FFFFFFFF FFFFFFFF"
  408.                           X"FFFFFFFF FFFFFFFF"
  409.                           X"FFFFFFFF FFFF003F";
  410.  
  411.       CHECK(BIT_MAP,W,0,NIL)
  412.      )
  413.    THEN @ numeric @
  414.       I'PACKS(0,W,0,NIL)
  415.    ELSF
  416.       LENGTH W < 2 OR W(0) NE "X"
  417.    THEN @ not hex - invalid @
  418.       -1
  419.    ELSE
  420.       (4) BYTE HEX;
  421.       INT HEX_LEN,RESULT;
  422.  
  423.       KMT_SP_CHAR_TO_HEX(W(1::),HEX,HEX_LEN,RESULT);
  424.  
  425.       IF RESULT NE 0 OR HEX_LEN < 1
  426.       THEN @ invalid hex digits @
  427.          -1
  428.       ELSE @ VALID HEX NUMBER @
  429.          HEX(SIZE HEX_LEN)
  430.       FI
  431.    FI
  432.  
  433.    ;  @ KMT_SP_CONVERT_TO_BINARY @
  434.  
  435. ***PAGE
  436.  
  437. GLOBAL
  438. STATIC (<STATUS 5>)
  439. PROC
  440.    KMT_SP_CONVERT_TO_UPPER_CASE IS (
  441.    REF () BYTE BUFFER):
  442.  
  443. @******************************************************************************@
  444. @*                                                                            *@
  445. @* This procedure is used to convert lowercase EBCDIC alphabetic characters   *@
  446. @* to uppercase EBCDIC.                                                       *@
  447. @* The characters to be case converted are read from and the case converted   *@
  448. @* characters are written to the area referenced by BUFFER.                   *@
  449. @*                                                                            *@
  450. @******************************************************************************@
  451.  
  452. UNLESS (BUFFER IS NIL) OR (LENGTH BUFFER EQ 0)
  453. DO
  454.    (256) BYTE UPPER_CASE_TT IS X"00010203 04050607 08090A0B 0C0D0E0F"
  455.                                X"10111213 14151617 18191A1B 1C1D1E1F"
  456.                                X"20212223 24252627 28292A2B 2C2D2E2F"
  457.                                X"30313233 34353637 38393A3B 3C3D3E3F"
  458.                                X"40414243 44454647 48494A4B 4C4D4E4F"
  459.                                X"50515253 54555657 58595A5B 5C5D5E5F"
  460.                                X"60616263 64656667 68696A6B 6C6D6E6F"
  461.                                X"70717273 74757677 78797A7B 7C7D7E7F"
  462.                                X"80C1C2C3 C4C5C6C7 C8C98A8B 8C8D8E8F"
  463.                                X"90D1D2D3 D4D5D6D7 D8D99A9B 9C9D9E9F"
  464.                                X"A0A1E2E3 E4E5E6E7 E8E9AAAB ACADAEAF"
  465.                                X"B0B1B2B3 B4B5B6B7 B8B9BABB BCBDBEBF"
  466.                                X"C0C1C2C3 C4C5C6C7 C8C9CACB CCCDCECF"
  467.                                X"D0D1D2D3 D4D5D6D7 D8D9DADB DCDDDEDF"
  468.                                X"E0E1E2E3 E4E5E6E7 E8E9EAEB ECEDEEEF"
  469.                                X"F0F1F2F3 F4F5F6F7 F8F9FAFB FCFDFEFF";
  470.  
  471.    TRANSLATE (UPPER_CASE_TT,BUFFER,0,NIL);
  472. FI
  473.  
  474. ;                                      @ KMT_SP_CONVERT_TO_UPPERCASE           @
  475.  
  476. ***PAGE
  477.  
  478. GLOBAL
  479. STATIC (<STATUS 5>)
  480. PROC
  481.    KMT_SP_ASK_MESSAGE IS (
  482.    REF () BYTE  PROMPT,
  483.    REF () BYTE  MESSAGE,
  484.    REF LONG INT LENGTH_MESSAGE,
  485.    BOOL         LOG_PROMPT,
  486.    RESPONSE     RESULT):
  487.  
  488. @******************************************************************************@
  489. @*                                                                            *@
  490. @* This procedure is used to output a prompt to the users terminal and read a *@
  491. @* reply to the prompt. Logging of the prompt and reply to the journal is     *@
  492. @* turned off.                                                                *@
  493. @*                                                                            *@
  494. @******************************************************************************@
  495.  
  496. BEGIN
  497.    INT RC_DISCARDED;
  498.  
  499.    CTM_JS_BEGIN (RESULT);
  500.    IF RESULT LE 0
  501.    THEN                                          @ Resource block created      @
  502.       UNLESS LOG_PROMPT
  503.       DO
  504.          () BYTE NAME := "NOLASKS";
  505.          () REF () BYTE NAMES := DISPLAY(NAME);
  506.          (0) BYTE ZLR;
  507.          SET_OPTIONS (NAMES,ZLR,RC_DISCARDED)
  508.       FI;
  509.       ASK_MESSAGE (PROMPT,MESSAGE,LENGTH_MESSAGE,RESULT);
  510.       CTM_JS_END (RC_DISCARDED)                  @ End resource block          @
  511.    FI
  512. END;                                   @ KMT_SP_ASK_MESSAGE                    @
  513.  
  514. ***PAGE
  515.  
  516. GLOBAL
  517. STATIC (<STATUS 5>)
  518. PROC
  519.    KMT_SP_LOG_TRACE_MESSAGE IS (
  520.    INT                    TYPE,
  521.    REF () KMT_MTM_VALUES PARAMS):
  522.  
  523. @******************************************************************************@
  524. @*                                                                            *@
  525. @* This procedure is used to log a trace message (printed in hex) to the job  *@
  526. @* journal.                                                                   *@
  527. @* TYPE specifies the type of trace message and PARAMS references a list of   *@
  528. @* parameters to be used in the expansion of the message.                     *@
  529. @*                                                                            *@
  530. @******************************************************************************@
  531.  
  532. BEGIN
  533.    INT PARAMS_LENGTH IS IF
  534.                            PARAMS IS NIL
  535.                         THEN
  536.                            0
  537.                         ELSE
  538.                            LENGTH PARAMS
  539.                         FI;
  540.  
  541.    INT MTM_AREA_LENGTH IS 4 + PARAMS_LENGTH;
  542.  
  543.    (MTM_AREA_LENGTH) KMT_MTM_VALUES MTM_AREA;
  544.  
  545.    INT MTM_TEXT_NUMBER := TYPE,
  546.        MTM_REPLY,
  547.        MTM_MESSAGE_LENGTH;
  548.  
  549.    (100) BYTE MTM_MESSAGE;
  550.  
  551.    (2) REF () BYTE MTM_RECALL_DATA;
  552.  
  553.    MTM_AREA(SIZE 4) := (MTM_MESSAGE
  554.                         AS KMT_MTM_VALUES.RVB_VALUE,
  555.                         MTM_MESSAGE_LENGTH
  556.                         AS KMT_MTM_VALUES.RI_VALUE,
  557.                         MTM_RECALL_DATA
  558.                         AS KMT_MTM_VALUES.RVRVB_VALUE,
  559.                         (L'PARAMS_LENGTH)
  560.                         AS KMT_MTM_VALUES.LI_VALUE);
  561.  
  562.    IF
  563.       PARAMS_LENGTH GT 0
  564.  
  565.    THEN
  566.       MTM_AREA(4::) := PARAMS
  567.    FI;
  568.  
  569.    WHILE
  570.      (
  571.       INT RC_DISCARDED;
  572.  
  573.       MTM_REPLY := KMT_SP_MTM (MTM_TEXT_NUMBER,MTM_AREA);
  574.  
  575.       IF
  576.          MTM_REPLY NE -2
  577.  
  578.       THEN                             @ Expanded message returned             @
  579.          REF () BYTE MESSAGE IS IF
  580.                                    MTM_REPLY EQ -3
  581.                                 THEN   @ Returned in recall data               @
  582.                                    MTM_TEXT_NUMBER := 0;
  583.                                    MTM_RECALL_DATA(0)
  584.                                 ELSE   @  Returned in message buffer           @
  585.                                    MTM_TEXT_NUMBER := MTM_REPLY;
  586.                                    MTM_MESSAGE(SIZE MTM_MESSAGE_LENGTH)
  587.                                 FI;
  588.  
  589.          CTM_LOG (3,
  590.                   2,                   @ Log to journal only                   @
  591.                   MESSAGE,
  592.                   RC_DISCARDED)
  593.  
  594.       ELSE                                       @ No message data             @
  595.          MTM_TEXT_NUMBER := 0
  596.       FI;
  597.  
  598.       MTM_TEXT_NUMBER NE 0
  599.      )
  600.    DO
  601.       SKIP
  602.    REPEAT
  603. END;                                   @ KMT_SP_LOG_TRACE_MESSAGE              @
  604.  
  605. ***PAGE
  606.  
  607. GLOBAL
  608. STATIC (<STATUS 5>)
  609. PROC
  610.    KMT_SP_STANDARDISE_FILENAME IS (REF KMT_WORD FILENAME,
  611.                                    INT STD_FORM):
  612.  
  613.    @ standardises filenames (if reqd) according to STD_FORM:                   @
  614.    @                                                                           @
  615.    @    VME_TERM - terminal name of filename, i.e. part after rightmost dot    @
  616.    @    VME_STD  - remove suffix from filename which should be in Kermit       @
  617.    @               normal form as sent in packet by remote Kermit              @
  618.    @    KMT_STD  - convert filename to Kermit normal form, i.e. name.type      @
  619.    @                                                                           @
  620.    @ in each case any file generation number will be removed and all lower     @
  621.    @ case alphabetic characters converted to upper case. any non-alphanumeric  @
  622.    @ characters (except fullstop) will be converted to X                       @
  623.  
  624.    BEGIN
  625.  
  626.       IF TRANSLATE_FILENAME
  627.       THEN @ filename translation required @
  628.          REF () BYTE NAME,REM;
  629.          NAME := FILENAME;
  630.          REM := FILENAME;
  631.  
  632.          UNTIL SCANUNQ(".",REM,0,REM)                     @ locate fullstop    @
  633.          DO
  634.             INT NAME_LEN IS LENGTH NAME,
  635.                 REM_LEN  IS LENGTH REM;
  636.  
  637.             REM :=  IF REM_LEN > 1
  638.                     THEN REM(1::)                         @ strip off fullstop @
  639.                     ELSE REM(SIZE 0)                      @ "." last character @
  640.                     FI;
  641.  
  642.             NAME := IF NOT SCANUNQ(".",REM,0,NIL)         @ if more fullstops  @
  643.                     THEN REM                              @ continue           @
  644.                     ELSF STD_FORM = VME_TERM
  645.                     THEN REM                              @ bit after fullstop @
  646.                     ELSF STD_FORM = VME_STD
  647.                     THEN NAME(SIZE(NAME_LEN-REM_LEN))     @ bit before fullstop@
  648.                     ELSE NAME     @ KMT_STD @             @ i.e. name.type     @
  649.                     FI
  650.          REPEAT;
  651.  
  652.          SCANUNQ("(",NAME,0,REM);      @ locate generation number (if present) @
  653.          FILENAME := NAME(SIZE (LENGTH NAME - LENGTH REM));    @ remove gen no @
  654.  
  655.          IF LENGTH FILENAME > 0
  656.          THEN                                         @ standardise characters @
  657.             (256) BYTE STD_CHAR_TT IS X"E7E7E7E7 E7E7E7E7 E7E7E7E7 E7E7E7E7"
  658.                                       X"E7E7E7E7 E7E7E7E7 E7E7E7E7 E7E7E7E7"
  659.                                       X"E7E7E7E7 E7E7E7E7 E7E7E7E7 E7E7E7E7"
  660.                                       X"E7E7E7E7 E7E7E7E7 E7E7E7E7 E7E7E7E7"
  661.                                       X"E7E7E7E7 E7E7E7E7 E7E7E74B E7E7E7E7"
  662.                                       X"E7E7E7E7 E7E7E7E7 E7E7E7E7 E7E7E7E7"
  663.                                       X"E7E7E7E7 E7E7E7E7 E7E7E7E7 E7E7E7E7"
  664.                                       X"E7E7E7E7 E7E7E7E7 E7E7E7E7 E7E7E7E7"
  665.                                       X"E7C1C2C3 C4C5C6C7 C8C9E7E7 E7E7E7E7"
  666.                                       X"E7D1D2D3 D4D5D6D7 D8D9E7E7 E7E7E7E7"
  667.                                       X"E7E7E2E3 E4E5E6E7 E8E9E7E7 E7E7E7E7"
  668.                                       X"E7E7E7E7 E7E7E7E7 E7E7E7E7 E7E7E7E7"
  669.                                       X"E7C1C2C3 C4C5C6C7 C8C9E7E7 E7E7E7E7"
  670.                                       X"E7D1D2D3 D4D5D6D7 D8D9E7E7 E7E7E7E7"
  671.                                       X"E7E7E2E3 E4E5E6E7 E8E9E7E7 E7E7E7E7"
  672.                                       X"F0F1F2F3 F4F5F6F7 F8F9E7E7 E7E7E7E7";
  673.  
  674.             TRANSLATE(STD_CHAR_TT,FILENAME,0,NIL)
  675.          ELSE                                                   @ invalid name @
  676.             FILENAME := NIL
  677.          FI
  678.       FI
  679.    END
  680.  
  681.    ; @ KMT_SP_STANDARDISE_FILENAME @
  682.  
  683. ***PAGE
  684.  
  685. GLOBAL
  686. STATIC (<STATUS 5>)
  687. PROC
  688.    KMT_SP_GET_WORD IS (REF KMT_STRING S) KMT_WORD:
  689.  
  690.    @ extract word (delimited by spaces) from string, advance pointer over word @
  691.  
  692.    BEGIN
  693.       KMT_STRING S1,S2;
  694.       IF SCANEQ(" ",S,0,S1)                    @ skip leading spaces           @
  695.       THEN NIL                                 @ end of line, return null word @
  696.       ELSE
  697.          SCANUNQ(" ",S1,0,S2);                 @ find next space (end of word) @
  698.          S := S2;                              @ advance pointer               @
  699.          S1(SIZE LENGTH S1 - LENGTH S2)        @ return word                   @
  700.       FI
  701.    END
  702.  
  703.    ; @ KMT_SP_GET_WORD @
  704.  
  705. ***PAGE
  706.  
  707. GLOBAL
  708. STATIC (<STATUS 5>)
  709. PROC
  710.    KMT_SP_CHECK_VME_CHAR IS (WORD CHAR,WORD IO_FLAG,RESPONSE RESULT):
  711.  
  712.    @ check that CHAR is acceptable for VME I/O                                 @
  713.  
  714.    BEGIN
  715.       IF CHAR = 127                                                @ ASCII DEL @
  716.       THEN
  717.          RESULT := 0
  718.       ELSE
  719.          ()BYTE X := DISPLAY (CHAR);
  720.          REF () BYTE B := X;
  721.          () BYTE CHECK_BITS IS
  722.             IF ASG_ROUTE AND IO_FLAG = 0 THEN X"FFFF0FFF" @ in via ASG         @
  723.             ELSF ASG_ROUTE               THEN X"A7DFFFFF" @ out via ASG        @
  724.             ELSF IO_FLAG = 0             THEN X"0183087F" @ in via CSC or NIC  @
  725.             ELSE                              X"A7DFFFFF" @ out via CSC or NIC @
  726.             FI;
  727.          RESULT := IF CHECK(CHECK_BITS,B,1,NIL) THEN 85936 ELSE 0 FI
  728.       FI
  729.    END
  730.  
  731.  ; @ KMT_SP_CHECK_VME_CHAR @
  732.  
  733. ENDMODULE                              @ KMT_SP_MODULE                         @
  734.  
  735.