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

  1. MODULE KMT_FH_MODULE;
  2.  
  3. @******************************************************************************@
  4. @*                                                                            *@
  5. @* Mode definitions                                                           *@
  6. @*                                                                            *@
  7. @******************************************************************************@
  8.  
  9. MODE
  10. CTM_ACCESS_1 IS GPROC (
  11.    REF () CTM_PARAMETER_PAIRS,
  12.    RESPONSE);
  13.  
  14. MODE
  15. CTM_ACCESS_2 IS GPROC (
  16.    RESPONSE);
  17.  
  18. MODE
  19. CTM_PARAMETER_VALUES IS ANY (
  20.    INT              INT_VALUE,
  21.    LONG WORD        LONG_WORD_VALUE,
  22.    REF INT          REF_INT_VALUE,
  23.    REF () BYTE      STRING_VALUE,
  24.    REF CTM_ACCESS_1 REF_ACCESS_1_VALUE,
  25.    REF CTM_ACCESS_2 REF_ACCESS_2_VALUE);
  26.  
  27. MODE
  28. CTM_PARAMETER_PAIRS IS WSTRUCT (
  29.    INT                  TYPE,
  30.    CTM_PARAMETER_VALUES VALUE);
  31.  
  32. MODE
  33. KMT_TRACE_FLAGS_S IS WORD STRUCT (
  34.    BIT    PH_TRACING,
  35.           PP_TRACING,
  36.           FH_TRACING,
  37.           DH_TRACING,
  38.    28-BIT SPARE);
  39.  
  40. MODE
  41. KMT_FH_FILE_OPTIONS_S IS BYTE STRUCT (
  42.    BIT APPEND_CREATE,
  43.        APPEND,
  44.        REPLACE_CREATE,
  45.        REPLACE,
  46.        CREATE_APPEND,
  47.        CREATE_REPLACE,
  48.        CREATE,
  49.        READ);
  50.  
  51. MODE
  52. KMT_FH_RECORD_DETAILS_S IS STRUCT (
  53.    BOOL        FILE_OPEN,
  54.                NEW_RECORD,
  55.                END_OF_FILE,
  56.    WORD        TEXT_TYPE,                        @ 0 = EBCDIC                  @
  57.                                                  @ 1 = IA5                     @
  58.                                                  @ 2 = BINARY                  @
  59.    INT         MAX_RECORD_LENGTH,
  60.                RECORD_LENGTH,
  61.    (4098) BYTE RECORD);                          @ Maximum record size of 4096 @
  62.                                                  @ plus 2 bytes for CRLF pair  @
  63.                                                  @ when constructing output    @
  64.                                                  @ records                     @
  65.  
  66. MODE
  67. KMT_FH_FILE_STATISTICS_S IS STRUCT (
  68.    INT INPUT_TOTAL,
  69.    INT OUTPUT_TOTAL);
  70.  
  71. MODE
  72. KMT_FH_FILE_DETAILS_S IS STRUCT (
  73.    LONG WORD                    FILE_CURRENCY,
  74.    BOOL                         NEW_FILE,
  75.    KMT_FH_FILE_OPTIONS_S        FILE_OPTION,
  76.    CTM_ACCESS_1                 ACCESS_1,
  77.    CTM_ACCESS_2                 ACCESS_2);
  78.  
  79. MODE
  80. KMT_MTM_VALUES IS ANY (
  81.    LONG WORD          LW_VALUE,
  82.    LONG INT           LI_VALUE,
  83.    REF WORD           RW_VALUE,
  84.    REF INT            RI_VALUE,
  85.    REF LONG WORD      RLW_VALUE,
  86.    REF LONG INT       RLI_VALUE,
  87.    REF () BYTE        RVB_VALUE,
  88.    REF () REF () BYTE RVRVB_VALUE);
  89.  
  90. ***PAGE
  91.  
  92. @******************************************************************************@
  93. @*                                                                            *@
  94. @* External procedure references                                              *@
  95. @*                                                                            *@
  96. @******************************************************************************@
  97.  
  98. EXT (<PREFIX "ICLCTM">)
  99. PROC
  100.    (REF LONG WORD,                               @ FILE_CURRENCY               @
  101.     REF () BYTE,                                 @ FILE_LOCAL_NAME             @
  102.     REF () BYTE,                                 @ FULL_FILE_NAME              @
  103.     RESPONSE                                     @ RESPONSE                    @
  104.    )                                   CTM_ASSIGN_FILE;
  105.  
  106. EXT (<PREFIX "ICLCTM">)
  107. PROC
  108.    (REF LONG WORD,                               @ NEW_FILE_CURRENCY           @
  109.     REF () BYTE,                                 @ NEW_FILE_LOCAL_NAME         @
  110.     LONG WORD,                                   @ FILE_CURRENCY,              @
  111.     REF () BYTE,                                 @ FILE_LOCAL_NAME             @
  112.     REF () BYTE,                                 @ FULL_FILE_NAME              @
  113.     LONG WORD,                                   @ DESCRIPTION_CURRENCY        @
  114.     REF () BYTE,                                 @ DESCRIPTION_LOCAL_NAME      @
  115.     REF () BYTE,                                 @ FULL_DESCRIPTION_NAME       @
  116.     INT,                                         @ INITIAL_SIZE                @
  117.     INT,                                         @ MAXIMUM_SIZE                @
  118.     INT,                                         @ OPTION                      @
  119.     RESPONSE                                     @ RESPONSE                    @
  120.    )                                   CTM_GET_FILE;
  121.  
  122. EXT (<PREFIX "ICLCTM">)
  123. PROC
  124.    (LONG WORD,                                   @ FILE_CURRENCY               @
  125.     REF () BYTE,                                 @ FILE_LOCAL_NAME             @
  126.     RESPONSE                                     @ RESPONSE                    @
  127.    )                                   CTM_SAVE_FILE;
  128.  
  129. EXT (<PREFIX "ICLCTM">)
  130. PROC
  131.    (LONG WORD,                                   @ FILE_CURRENCY               @
  132.     REF () BYTE,                                 @ FILE_LOCAL_NAME             @
  133.     REF () BYTE,                                 @ FULL_FILE_NAME              @
  134.     REF () WORD,                                 @ PROPERTIES                  @
  135.     RESPONSE                                     @ RESPONSE                    @
  136.    )                                   CTM_READ_DESC;
  137.  
  138. EXT (<PREFIX "ICLCTM">)
  139. PROC
  140.    (RESPONSE                                     @ RESPONSE                    @
  141.    )                                   CTM_SCHEDULE;
  142.  
  143. EXT (<PREFIX "ICLCTM">)
  144. PROC
  145.    (LONG WORD,                                   @ FILE_CURRENCY               @
  146.     REF () BYTE,                                 @ FILE_LOCAL_NAME             @
  147.     REF () CTM_PARAMETER_PAIRS,                  @ PARAMETER_PAIRS             @
  148.     RESPONSE                                     @ RESPONSE                    @
  149.    )                                   CTM_SELECT_RAM;
  150.  
  151. EXT (<PREFIX "ICLCTM">)
  152. PROC
  153.    (LONG WORD,                                   @ FILE_CURRENCY               @
  154.     REF () BYTE,                                 @ FILE_LOCAL_CURRENCY         @
  155.     REF () BYTE,                                 @ FULL_FILE_NAME              @
  156.     REF INT,                                     @ NAME_LENGTH                 @
  157.     RESPONSE                                     @ RESPONSE                    @
  158.    )                                   CTM_GIVE_NAME;
  159.  
  160. EXT
  161. PROC
  162.    (INT,                                         @ TYPE                        @
  163.     REF () KMT_MTM_VALUES                        @ PARAMS                      @
  164.    )                                   KMT_SP_LOG_TRACE_MESSAGE;
  165.  
  166. EXT
  167. PROC
  168.    (INT,                                         @ RESULT_CODE                 @
  169.     WORD,                                        @ DESTINATION                 @
  170.     REF () KMT_MTM_VALUES,                       @ PARAMS                      @
  171.     LONG WORD,                                   @ PE_CONTINGENCY_MESSAGE      @
  172.     BOOL,                                        @ DUMP                        @
  173.     BOOL                                         @ UNRECOVERABLE               @
  174.    )                                   KMT_EH_LOG_ERROR;
  175.  
  176. ***PAGE
  177.  
  178. @******************************************************************************@
  179. @*                                                                            *@
  180. @* External data references                                                   *@
  181. @*                                                                            *@
  182. @******************************************************************************@
  183.  
  184. @ Constants: @
  185. @ ********** @
  186.  
  187. ***LINES(4)
  188.  
  189. @ Variables: @
  190. @ ********** @
  191.  
  192. EXT (<CASCADE>)
  193. REF KMT_TRACE_FLAGS_S KMT_TRACE_FLAGS;
  194.  
  195. EXT (<CASCADE>)
  196. REF KMT_FH_RECORD_DETAILS_S KMT_FH_RECORD_DETAILS;
  197.  
  198. EXT (<CASCADE>)
  199. REF KMT_FH_FILE_STATISTICS_S KMT_FH_FILE_STATISTICS;
  200.  
  201. ***LINES(4)
  202.  
  203. @ Results: @
  204. @ ******** @
  205.  
  206. ***LINES(4)
  207.  
  208. ***PAGE
  209.  
  210. @******************************************************************************@
  211. @*                                                                            *@
  212. @* Static data declarations                                                   *@
  213. @*                                                                            *@
  214. @******************************************************************************@
  215.  
  216. @ Constants: @
  217. @ ********** @
  218.  
  219. ***LINES(4)
  220.  
  221. @ Variables: @
  222. @ ********** @
  223.  
  224. STATIC
  225. KMT_FH_FILE_DETAILS_S KMT_FH_FILE_DETAILS;
  226.  
  227. ***LINES(4)
  228.  
  229. @ Results: @
  230. @ ******** @
  231.  
  232. ***LINES(4)
  233.  
  234. ***PAGE
  235.  
  236. @******************************************************************************@
  237. @*                                                                            *@
  238. @* Procedure declarations                                                     *@
  239. @*                                                                            *@
  240. @******************************************************************************@
  241.  
  242. GLOBAL
  243. STATIC (<STATUS 5>)
  244. PROC
  245.    KMT_FH_OPEN_FILE IS (
  246.    REF () BYTE FILE_NAME,
  247.    WORD        OPTION,
  248.    RESPONSE    RESULT):
  249.  
  250. @******************************************************************************@
  251. @*                                                                            *@
  252. @* This procedure is used to create (if required), assign and open the data   *@
  253. @* file specified by FILE_NAME for read or write access depending upon the    *@
  254. @* value of OPTION.                                                           *@
  255. @*                                                                            *@
  256. @******************************************************************************@
  257.  
  258. BEGIN
  259.    INT FC_CTM_FILE_ALREADY_EXISTS IS 9113,
  260.        FC_CTM_FILE_DOES_NOT_EXIST IS 9114,
  261.        FC_CTM_NEW_FILE_WARNING    IS -44900;
  262.  
  263.    INT KMT_EH_SOFTWARE_ERROR IS 80101;
  264.  
  265.    REF LONG WORD FILE_CURRENCY IS KMT_FH_FILE_DETAILS.FILE_CURRENCY;
  266.  
  267.    REF KMT_FH_FILE_OPTIONS_S FILE_OPTION IS KMT_FH_FILE_DETAILS.FILE_OPTION;
  268.  
  269.    FILE_OPTION := (WORD: X'01') SCALE OPTION;
  270.  
  271.    IF
  272.      (
  273.       IF
  274.          FILE_OPTION.READ
  275.  
  276.       THEN                                       @ Read                        @
  277.          CTM_ASSIGN_FILE (FILE_CURRENCY,
  278.                           NIL,
  279.                           FILE_NAME,
  280.                           RESULT)
  281.  
  282.       ELSE                                       @ Write                       @
  283.          CTM_GET_FILE (FILE_CURRENCY,
  284.                        NIL,
  285.                        0,
  286.                        NIL,
  287.                        FILE_NAME,
  288.                        0,
  289.                        NIL,
  290.                        NIL,
  291.                        -1,
  292.                        -1,
  293.                        (IF
  294.                            (FILE_OPTION & X"0E") NE 0
  295.                         THEN                     @ Create, create_replace or   @
  296.                                                  @ create_append               @
  297.                            0
  298.                         ELSE                     @ Replace, replace_create,    @
  299.                                                  @ append or append_create     @
  300.                            2
  301.                         FI),
  302.                        RESULT);
  303.  
  304.          IF
  305.             (RESULT EQ 0)  AND  FILE_OPTION.CREATE
  306.  
  307.          THEN                                    @ Create but file already     @
  308.                                                  @ exists                      @
  309.             RESULT := FC_CTM_FILE_ALREADY_EXISTS
  310.  
  311.          ELSF
  312.             (RESULT EQ FC_CTM_NEW_FILE_WARNING)  AND  (FILE_OPTION & X"50" NE 0)
  313.  
  314.          THEN                                    @ Replace or append but file  @
  315.                                                  @ does not exist              @
  316.             RESULT := FC_CTM_FILE_DOES_NOT_EXIST
  317.          FI
  318.       FI;
  319.  
  320.       KMT_FH_FILE_DETAILS.NEW_FILE := (RESULT EQ FC_CTM_NEW_FILE_WARNING);
  321.  
  322.       RESULT LE 0
  323.      )
  324.  
  325.    AND
  326.      (
  327.       CTM_SCHEDULE (RESULT);
  328.       RESULT LE 0
  329.      )
  330.  
  331.    AND
  332.      (
  333.       () CTM_PARAMETER_PAIRS PARAMETER_PAIRS :=
  334.          ((7,  KMT_FH_RECORD_DETAILS.RECORD
  335.                AS CTM_PARAMETER_VALUES.STRING_VALUE),
  336.           (9,  KMT_FH_RECORD_DETAILS.RECORD_LENGTH
  337.                AS CTM_PARAMETER_VALUES.REF_INT_VALUE),
  338.           (12, (IF
  339.                    FILE_OPTION.READ
  340.                 THEN                             @ Read                        @
  341.                    1                             @ Select and read             @
  342.                 ELSE                             @ Write                       @
  343.                    2                             @ Select and new write        @
  344.                 FI)
  345.                AS CTM_PARAMETER_VALUES.INT_VALUE),
  346.           (19, KMT_FH_FILE_DETAILS.ACCESS_2
  347.                AS CTM_PARAMETER_VALUES.REF_ACCESS_2_VALUE),
  348.           (24, KMT_FH_FILE_DETAILS.ACCESS_1
  349.                AS CTM_PARAMETER_VALUES.REF_ACCESS_1_VALUE),
  350.           (29, (IF
  351.                    (FILE_OPTION & X"C8") NE 0
  352.                 THEN                             @ Append                      @
  353.                    3                             @ End of file                 @
  354.                 ELSE                             @ Read, create or replace     @
  355.                    2                             @ Beginning of file           @
  356.                 FI)
  357.                AS CTM_PARAMETER_VALUES.INT_VALUE)
  358.          );
  359.  
  360.       CTM_SELECT_RAM (FILE_CURRENCY,
  361.                       NIL,
  362.                       PARAMETER_PAIRS,
  363.                       RESULT);
  364.       RESULT LE 0
  365.      )
  366.  
  367.    AND
  368.      (
  369.       IF
  370.          (FILE_OPTION & X"34") NE 0
  371.  
  372.       THEN                                       @ Replacing file,             @
  373.                                                  @ destroy file contents       @
  374.          () CTM_PARAMETER_PAIRS PARAMETER_PAIRS :=
  375.             DISPLAY((0, 11                       @ Extended destroy            @
  376.                         AS CTM_PARAMETER_VALUES.INT_VALUE)
  377.                    );
  378.  
  379.          KMT_FH_FILE_DETAILS.ACCESS_1 (PARAMETER_PAIRS,
  380.                                        RESULT)
  381.        FI;
  382.  
  383.        RESULT LE 0
  384.       )
  385.  
  386.    THEN
  387.       WORD R_LEN IS LENGTH KMT_FH_RECORD_DETAILS.RECORD - 2;
  388.                                                  @ Allows for CRLF end of      @
  389.                                                  @ record terminator           @
  390.       () WORD PROPERTIES := (104,                @ Maximum record size         @
  391.                              0,
  392.                              0);
  393.  
  394.       KMT_FH_RECORD_DETAILS.MAX_RECORD_LENGTH := IF
  395.                                                    (
  396.                                                     CTM_READ_DESC (
  397.                                                                   FILE_CURRENCY,
  398.                                                                   NIL,
  399.                                                                   NIL,
  400.                                                                   PROPERTIES,
  401.                                                                   RESULT);
  402.                                                     RESULT EQ 0
  403.                                                    )
  404.                                                  AND
  405.                                                     PROPERTIES(1) LT R_LEN
  406.                                                  THEN
  407.                                                     PROPERTIES(1)
  408.                                                  ELSE
  409.                                                     R_LEN
  410.                                                  FI
  411.    FI;
  412.  
  413.    IF
  414.       RESULT LE 0
  415.  
  416.    THEN                                          @ File opened successfully    @
  417.       KMT_FH_RECORD_DETAILS.FILE_OPEN := TRUE;
  418.       KMT_FH_RECORD_DETAILS.NEW_RECORD := TRUE;
  419.       KMT_FH_RECORD_DETAILS.END_OF_FILE := FALSE;
  420.       KMT_FH_FILE_STATISTICS := (0,0);
  421.       RESULT := 0                                @ Ignore warnings             @
  422.  
  423.    ELSE (<RARELY>)                               @ Open error                  @
  424.      (
  425.       () BYTE PROC_NAME := "KMT_FH_OPEN_FILE";
  426.  
  427.       () KMT_MTM_VALUES PARAMS := DISPLAY(PROC_NAME
  428.                                           AS KMT_MTM_VALUES.RVB_VALUE);
  429.  
  430.       KMT_FH_RECORD_DETAILS.FILE_OPEN := FALSE;
  431.       KMT_EH_LOG_ERROR (RESULT,
  432.                         2,
  433.                         PARAMS,
  434.                         0,
  435.                         FALSE,
  436.                         FALSE);
  437.       RESULT := KMT_EH_SOFTWARE_ERROR
  438.      )
  439.    FI
  440. END;                                   @ KMT_FH_OPEN_FILE                      @
  441.  
  442. ***PAGE
  443.  
  444. GLOBAL
  445. STATIC (<STATUS 5>)
  446. PROC
  447.    KMT_FH_CLOSE_FILE IS (
  448.    RESPONSE RESULT):
  449.  
  450. @******************************************************************************@
  451. @*                                                                            *@
  452. @* This procedure is used to close the file previously opened by the          *@
  453. @* KMT_FH_OPEN_FILE.                                                          *@
  454. @*                                                                            *@
  455. @******************************************************************************@
  456.  
  457. BEGIN
  458.    INT KMT_EH_SOFTWARE_ERROR IS 80101;
  459.  
  460.    REF BOOL FILE_OPEN IS KMT_FH_RECORD_DETAILS.FILE_OPEN;
  461.  
  462.    RESULT := 0;
  463.  
  464.    IF
  465.       FILE_OPEN
  466.  
  467.    THEN                                          @ File open, close it         @
  468.       INT RC;
  469.  
  470.       () CTM_PARAMETER_PAIRS PARAMETER_PAIRS :=
  471.          DISPLAY((0, 12                          @ Deselect RAM                @
  472.                      AS CTM_PARAMETER_VALUES.INT_VALUE)
  473.                 );
  474.  
  475.                                                  @ When receiving a binary     @
  476.                                                  @ file, must output last      @
  477.                                                  @ record to file              @
  478.       IF
  479.          KMT_FH_FILE_DETAILS.FILE_OPTION.READ
  480.       OR
  481.          KMT_FH_RECORD_DETAILS.TEXT_TYPE NE 2
  482.       OR
  483.          KMT_FH_RECORD_DETAILS.NEW_RECORD
  484.  
  485.       THEN                                       @ File open for reading, not  @
  486.                                                  @ a binary file or            @
  487.          RC := 0                                 @ no record to output         @
  488.  
  489.       ELSE                                       @ Flush remaining buffer      @
  490.          KMT_FH_WRITE (RC)
  491.       FI;
  492.  
  493.       IF
  494.         (
  495.          KMT_FH_FILE_DETAILS.ACCESS_1 (PARAMETER_PAIRS,
  496.                                        RESULT);
  497.          RESULT GT 0
  498.         )
  499.  
  500.       THEN (<RARELY>)                            @ Close error                 @
  501.         (
  502.          () BYTE PROC_NAME := "KMT_FH_CLOSE_FILE";
  503.  
  504.          () KMT_MTM_VALUES PARAMS := DISPLAY(PROC_NAME
  505.                                              AS KMT_MTM_VALUES.RVB_VALUE);
  506.  
  507.          KMT_EH_LOG_ERROR (RESULT,
  508.                            2,
  509.                            PARAMS,
  510.                            0,
  511.                            FALSE,
  512.                            FALSE);
  513.          RESULT := KMT_EH_SOFTWARE_ERROR
  514.         )
  515.  
  516.       ELSE
  517.          RESULT := RC
  518.       FI;
  519.  
  520.       FILE_OPEN := FALSE
  521.    FI
  522. END;                                   @ KMT_FH_CLOSE_FILE                     @
  523.  
  524. ***PAGE
  525.  
  526. GLOBAL
  527. STATIC (<STATUS 5>)
  528. PROC
  529.    KMT_FH_READ IS (
  530.    RESPONSE RESULT):
  531.  
  532. @******************************************************************************@
  533. @*                                                                            *@
  534. @* This procedure is used to read a record from the file previously opened    *@
  535. @* (for read access) by the procedure KMT_FH_OPEN_FILE.                       *@
  536. @* The record and length are returned in the areas                            *@
  537. @* KMT_FH_RECORD_DETAILS.RECORD and KMT_FH_RECORD.DETAILS.RECORD_LENGTH       *@
  538. @* respectively.                                                              *@
  539. @*                                                                            *@
  540. @******************************************************************************@
  541.  
  542. BEGIN
  543.    INT DML_READ_PSEUDO_NODE IS 9034;
  544.  
  545.    INT KMT_FH_RECORD_IN_MSG  IS 200,
  546.        KMT_EH_SOFTWARE_ERROR IS 80101,
  547.        KMT_FH_RECORD_TOO_BIG IS 80200;
  548.  
  549.    REF INT RECORD_LENGTH IS KMT_FH_RECORD_DETAILS.RECORD_LENGTH;
  550.  
  551.    REF () BYTE RECORD IS KMT_FH_RECORD_DETAILS.RECORD;
  552.  
  553.    IF
  554.      (
  555.       KMT_FH_FILE_DETAILS.ACCESS_2 (RESULT);
  556.       RESULT LE 0
  557.      )
  558.  
  559.    THEN                                          @ Read successful             @
  560.       REF INT MAX_RECORD_LENGTH IS KMT_FH_RECORD_DETAILS.MAX_RECORD_LENGTH;
  561.  
  562.       BOOL TRACING IS KMT_TRACE_FLAGS.FH_TRACING;
  563.  
  564.       REF INT STATISTICS IS KMT_FH_FILE_STATISTICS.INPUT_TOTAL;
  565.  
  566.       STATISTICS := STATISTICS + 1;
  567.  
  568.       IF
  569.          RECORD_LENGTH GT MAX_RECORD_LENGTH
  570.  
  571.       THEN (<RARELY>)                            @ Record exceeds buffer size  @
  572.         (
  573.          () KMT_MTM_VALUES PARAMS := (RECORD_LENGTH
  574.                                       AS KMT_MTM_VALUES.RI_VALUE,
  575.                                       MAX_RECORD_LENGTH
  576.                                       AS KMT_MTM_VALUES.RI_VALUE);
  577.  
  578.          RESULT := KMT_FH_RECORD_TOO_BIG;
  579.          KMT_EH_LOG_ERROR (RESULT,
  580.                            2,
  581.                            PARAMS,
  582.                            0,
  583.                            FALSE,
  584.                            FALSE);
  585.          RECORD_LENGTH := MAX_RECORD_LENGTH
  586.         )
  587.  
  588.       ELSE                                       @ Ignore warnings             @
  589.          RESULT := 0
  590.       FI;
  591.  
  592.       IF
  593.          TRACING
  594.  
  595.       THEN (<RARELY>)
  596.         (
  597.          () KMT_MTM_VALUES PARAMS := DISPLAY(RECORD(SIZE RECORD_LENGTH)
  598.                                              AS KMT_MTM_VALUES.RVB_VALUE);
  599.  
  600.          KMT_SP_LOG_TRACE_MESSAGE (KMT_FH_RECORD_IN_MSG,
  601.                                    PARAMS)
  602.         )
  603.       FI
  604.  
  605.    ELSF
  606.      (
  607.       RECORD_LENGTH := 0;
  608.       RESULT EQ DML_READ_PSEUDO_NODE
  609.      )
  610.  
  611.    THEN                                          @ End of file reached         @
  612.       SKIP
  613.  
  614.    ELSE (<RARELY>)                               @ Read error                  @
  615.      (
  616.       () BYTE PROC_NAME := "KMT_FH_READ";
  617.  
  618.       () BYTE ERROR_TEXT := "     WHILST READING FROM FILE";
  619.  
  620.       () KMT_MTM_VALUES PARAMS := (PROC_NAME
  621.                                    AS KMT_MTM_VALUES.RVB_VALUE,
  622.                                    ERROR_TEXT
  623.                                     AS KMT_MTM_VALUES.RVB_VALUE);
  624.  
  625.       KMT_EH_LOG_ERROR (RESULT,
  626.                         2,
  627.                         PARAMS,
  628.                         0,
  629.                         FALSE,
  630.                         FALSE);
  631.       RESULT := KMT_EH_SOFTWARE_ERROR
  632.      )
  633.    FI
  634. END;                                   @ KMT_FH_READ                           @
  635.  
  636. ***PAGE
  637.  
  638. GLOBAL
  639. STATIC (<STATUS 5>)
  640. PROC
  641.    KMT_FH_WRITE IS (
  642.    RESPONSE RESULT):
  643.  
  644. @******************************************************************************@
  645. @*                                                                            *@
  646. @* This procedure is used to write a record to the file previously opened     *@
  647. @* (for write access) by the procedure KMT_FH_OPEN_FILE.                      *@
  648. @* The record to be output and length are contained in the areas              *@
  649. @* KMT_FH_RECORD_DETAILS.RECORD and KMT_FH_RECORD_DETAILS.RECORD_LENGTH       *@
  650. @* respectively.                                                              *@
  651. @*                                                                            *@
  652. @******************************************************************************@
  653.  
  654. BEGIN
  655.  
  656.    INT KMT_FH_RECORD_OUT_MSG IS 201,
  657.        KMT_EH_SOFTWARE_ERROR IS 80101;
  658.  
  659.    IF
  660.      (
  661.       KMT_FH_FILE_DETAILS.ACCESS_2 (RESULT);
  662.       RESULT LE 0
  663.      )
  664.  
  665.    THEN                                          @ Write successful            @
  666.       BOOL TRACING IS KMT_TRACE_FLAGS.FH_TRACING;
  667.  
  668.       REF INT STATISTICS IS KMT_FH_FILE_STATISTICS.OUTPUT_TOTAL;
  669.  
  670.       STATISTICS := STATISTICS + 1;
  671.  
  672.       IF
  673.          TRACING
  674.  
  675.       THEN (<RARELY>)
  676.         (
  677.          () KMT_MTM_VALUES PARAMS := DISPLAY(
  678.                                         KMT_FH_RECORD_DETAILS.RECORD(SIZE
  679.                                            KMT_FH_RECORD_DETAILS.RECORD_LENGTH)
  680.                                         AS KMT_MTM_VALUES.RVB_VALUE);
  681.  
  682.          KMT_SP_LOG_TRACE_MESSAGE (KMT_FH_RECORD_OUT_MSG,
  683.                                    PARAMS)
  684.         )
  685.       FI;
  686.  
  687.       RESULT := 0                                @ Ignore warnings             @
  688.  
  689.    ELSE (<RARELY>)                               @ Write error                 @
  690.      (
  691.       () BYTE PROC_NAME := "KMT_FH_WRITE";
  692.  
  693.       () BYTE ERROR_TEXT := "     WHILST WRITING TO FILE";
  694.  
  695.       () KMT_MTM_VALUES PARAMS := (PROC_NAME
  696.                                    AS KMT_MTM_VALUES.RVB_VALUE,
  697.                                    ERROR_TEXT
  698.                                    AS KMT_MTM_VALUES.RVB_VALUE);
  699.  
  700.       KMT_EH_LOG_ERROR (RESULT,
  701.                         2,
  702.                         PARAMS,
  703.                         0,
  704.                         FALSE,
  705.                         FALSE);
  706.       RESULT := KMT_EH_SOFTWARE_ERROR
  707.      )
  708.    FI
  709. END;                                   @ KMT_FH_WRITE                          @
  710.  
  711. ***PAGE
  712.  
  713. GLOBAL
  714. STATIC (<STATUS 5>)
  715. PROC
  716.    KMT_FH_SAVE_FILE IS (
  717.    RESPONSE RESULT):
  718.  
  719. @******************************************************************************@
  720. @*                                                                            *@
  721. @* This procedure is used to save the file previously opened by the procedure *@
  722. @* KMT_FH_OPEN_FILE.                                                          *@
  723. @*                                                                            *@
  724. @******************************************************************************@
  725.  
  726. BEGIN
  727.  
  728.    INT KMT_EH_SOFTWARE_ERROR IS 80101;
  729.  
  730.    IF
  731.       KMT_FH_FILE_DETAILS.NEW_FILE
  732.    AND
  733.  
  734.      (
  735.       CTM_SAVE_FILE (KMT_FH_FILE_DETAILS.FILE_CURRENCY,
  736.                      NIL,
  737.                      RESULT);
  738.       RESULT GT 0
  739.      )
  740.  
  741.    THEN (<RARELY>)                               @ Save error                  @
  742.      (
  743.       () BYTE PROC_NAME := "KMT_FH_SAVE_FILE";
  744.  
  745.       () KMT_MTM_VALUES PARAMS := DISPLAY(PROC_NAME
  746.                                           AS KMT_MTM_VALUES.RVB_VALUE);
  747.  
  748.       KMT_EH_LOG_ERROR (RESULT,
  749.                         2,
  750.                         PARAMS,
  751.                         0,
  752.                         FALSE,
  753.                         FALSE);
  754.       RESULT := KMT_EH_SOFTWARE_ERROR
  755.      )
  756.  
  757.    ELSE                                          @ Ignore warnings             @
  758.       RESULT := 0
  759.    FI
  760. END;                                   @ KMT_FH_SAVE_FILE                      @
  761.  
  762. ***PAGE
  763.  
  764. GLOBAL
  765. STATIC (<STATUS 5>)
  766. PROC
  767.    KMT_FH_GIVE_NAME IS (
  768.    REF () BYTE NAME,
  769.    REF INT     NAME_LENGTH,
  770.    BOOL        FULL_NAME,
  771.    RESPONSE    RESULT):
  772.  
  773. @******************************************************************************@
  774. @*                                                                            *@
  775. @* This procedure is used to obtain either the full file name or the terminal *@
  776. @* file name of the file previously opened by KMT_FH_OPEN_FILE.               *@
  777. @* The name of the file and length are returned in the areas referenced by    *@
  778. @* NAME and NAME_LENGTH respectively.                                         *@
  779. @* If FULL_NAME is set TRUE then the full file name will be returned,         *@
  780. @* otherwise the terminal file name will be returned.                         *@
  781. @* If the area referenced by NAME is too small to contain the file name then  *@
  782. @* the file name will be truncated and resultcode FC_CTM_BUFFER_TOO_SHORT     *@
  783. @* returned.                                                                  *@
  784. @*                                                                            *@
  785. @******************************************************************************@
  786.  
  787. BEGIN
  788.    INT KMT_EH_SOFTWARE_ERROR IS 80101;
  789.  
  790.    IF
  791.      (
  792.       CTM_GIVE_NAME (KMT_FH_FILE_DETAILS.FILE_CURRENCY,
  793.                      NIL,
  794.                      NAME,
  795.                      NAME_LENGTH,
  796.                      RESULT);
  797.       RESULT GT 0
  798.      )
  799.  
  800.    THEN (<RARELY>)                               @ Error                       @
  801.      (
  802.       () BYTE PROC_NAME := "KMT_FH_GIVE_NAME";
  803.  
  804.       () KMT_MTM_VALUES PARAMS := DISPLAY(PROC_NAME
  805.                                           AS KMT_MTM_VALUES.RVB_VALUE);
  806.  
  807.       KMT_EH_LOG_ERROR (RESULT,
  808.                         2,
  809.                         PARAMS,
  810.                         0,
  811.                         FALSE,
  812.                         FALSE);
  813.       RESULT := KMT_EH_SOFTWARE_ERROR
  814.      )
  815.  
  816.    ELSF
  817.       FULL_NAME
  818.  
  819.    THEN                                          @ Full file name required     @
  820.                                                  @ Exit                        @
  821.       SKIP
  822.  
  823.    ELSF
  824.       NAME_LENGTH EQ 0
  825.  
  826.    THEN                                          @ No file name returned, exit @
  827.       SKIP
  828.  
  829.    ELSE                                          @ Terminal file name required @
  830.       () BYTE NAME_COPY := NAME(SIZE NAME_LENGTH);
  831.  
  832.       REF () BYTE TERMINAL_NAME,
  833.                   REM;
  834.  
  835.       TERMINAL_NAME := NAME_COPY;
  836.       REM := TERMINAL_NAME;
  837.  
  838.       UNTIL                                      @ Search for part of name     @
  839.          SCANUNQ (".",                           @ after last dot              @
  840.                   REM,
  841.                   0,
  842.                   REM)
  843.       DO
  844.          REM := REM(1::);
  845.          TERMINAL_NAME := REM
  846.       REPEAT;
  847.  
  848.       SCANUNQ ("(",                              @ Remove generation number    @
  849.                TERMINAL_NAME,
  850.                0,
  851.                REM);
  852.       NAME_LENGTH := LENGTH TERMINAL_NAME - LENGTH REM;
  853.       NAME(SIZE NAME_LENGTH) := TERMINAL_NAME(SIZE NAME_LENGTH);
  854.       RESULT := 0
  855.    FI;
  856. END;                                   @ KMT_FH_GIVE_NAME                      @
  857. ENDMODULE                              @ KMT_FH_MODULE                         @
  858.