拡張COBOL

本付録では、拡張COBOLの変換について説明します。

1. 拡張COBOLの要素

拡張COBOLは、システム内部でCOBOL構文に変換されて処理されます。拡張COBOLは、--expandedオプションを使用した場合にのみ処理されます。

以下では、拡張COBOLの変換と拡張COBOLで使用される要素について説明します。

  • EVALUATEステートメント

    以下は、拡張COBOLのEVALUATEステートメントの実行例です。

    EVALUATE WK
       WHEN 28
       WHEN OTHER
         DISPLAY 'WNE OTHER'
    END-EVALUATE.

    以下は、上記の拡張COBOLの変換後の結果ソースです。

    EVALUATE WK
       WHEN 28
         DISPLAY 'WHEN OTHER'
       WHEN OTHER
         DISPLAY 'WHEN OTHER'
    END-EVALUATE.
  • VALUE節でのtruncateの使用

    VALUE節にPICTURE文字列のサイズを超える値が使用された場合にはtruncateします。

    以下は、拡張COBOLのVALUE節でtruncateする例です。

    01 WK PIC X(10) VALUE '1234567890*'.

    以下は、上記の拡張COBOLの変換後の結果ソースです。

    01 WK PIC X(10) VALUE '1234567890'.
  • INSPECTステートメントのTRAILING句

    INSPECTステートメントでTRAILING句を使用して、右側から指定した文字が使用された回数を計算します。

    以下は、拡張COBOLのINSPECTステートメントでTRAILING句を使用した例です。

    WORKING-STORAGE SECTION.
    01 TARGET-FIELD PIC X(10) VALUE '123   '.
    01 WS-TALLY-LEN PIC 9999.
    
    PROCEDURE DIVISION.
        INSPECT TARGET-FIELD TALLYING
            WS-TALLY-LEN FOR TRAILING SPACE.
        DISPLAY WS-TALLY-LEN.

    以下は、上記例の実行結果です。

    3
  • SEARCHステートメント

    SEARCHステートメントでは、AT ENDのすぐ後にWHEN句を使用します。

    SEARCH WS-ARH-TBL
    AT END
    WHEN WK = ZEROES
    DISPLAY 'WK :' WK
    END-SEARCH.
  • COMMITステートメント

    OpenFrameで実行した場合にtext_commit関数を呼び出すCOMMITステートメントを使用できるようにします。

    COMMIT.
  • ゼロ除算例外

    除算の演算時に除数(Divisor)が0である場合に、ランタイム・アサーションを発生させず、商(quotient)に0を設定します。

           WORKING-STORAGE SECTION.
           01 RESULT1 PIC 9999.
           01 RESULT2 PIC 9999.
           01 DIVISOR PIC 9999 VALUE 0.
           PROCEDURE      DIVISION.
    
           DIVIDE DIVISOR INTO RESULT1.
           DISPLAY "RESULT1 : " RESULT1.
    
           COMPUTE RESULT2 = 10 / 0.
           DISPLAY "RESULT2 : " RESULT2.

    以下は、上記例の実行結果です。

    RESULT1 : 0
    RESULT2 : 0
  • ゾーン10進数のゾーン部

    文字列をゾーン10進数に移動する場合、ゾーン10進数の4ビットの符号無し値で置き換えずに文字列のまま移動します。

    以下は、拡張COBOLのゾーン10進数のゾーン部の例です。

           WORKING-STORAGE SECTION.
           01 ZONED PIC S9(4).
           01 STR   PIC X(4) VALUE 'AAAA'.
           PROCEDURE DIVISION.
               MOVE STR TO ZONED.
               CALL 'ofcob_hexdump' USING ZONED VALUE LENGTH OF ZONED.

    以下は、上記例の実行結果です。

    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    HEXA VALUE : 41414141
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  • LINKAGEセクションの変数のライフサイクル

    LINKAGEセクションで作成された変数をローカル変数として使用するようにします。

    以下は、拡張COBOLのLINKAGEセクションの変数のライフサイクルの例です。

           IDENTIFICATION DIVISION.
           PROGRAM-ID.    TESTCOB.
           DATA           DIVISION.
           WORKING-STORAGE SECTION.
           PROCEDURE       DIVISION.
               CALL 'SUBCOB'.
    IDENTIFICATION DIVISION.
           PROGRAM-ID.    SUBCOB.
           DATA           DIVISION.
           WORKING-STORAGE SECTION.
           01 F PIC 9(1) COMP.
           01 WK-VAR PIC X(8).
           LINKAGE          SECTION.
           01 LK-VAR PIC X(8).
           PROCEDURE       DIVISION.
    
               DISPLAY "ADDRESS OF LK-VAR : " ADDRESS OF LK-VAR.
    
               ADD 1 TO F.
               IF F = 1 THEN
                 SET ADDRESS OF LK-VAR TO ADDRESS OF WK-VAR
                 CALL 'SUBCOB'.

    以下は、上記の実行結果です。

    ADDRESS OF LK-VAR : 0000000000
    ADDRESS OF LK-VAR : 0000000000
  • 参照変更のためのターゲット・タイプの拡張

    USAGE節の設定に関係なく、参照修飾子を使用できるようにします。

    以下は、拡張COBOLの参照変更のためのターゲット・タイプの拡張の例です。

           IDENTIFICATION      DIVISION.
           PROGRAM-ID.         TESTCOB.
           ENVIRONMENT            DIVISION.
           CONFIGURATION          SECTION.
           DATA                   DIVISION.
           WORKING-STORAGE        SECTION.
           01 Z PIC 9(8).
           01 S PIC X(8) VALUE 'ZZZZZZZZ'.
           01 C PIC 9(15) COMP-3.
           01 B PIC 9(16) COMP.
           PROCEDURE       DIVISION.
               MOVE S(1:4) TO Z(1:4).
               CALL 'ofcob_hexdump' USING Z VALUE LENGTH OF Z.
               MOVE S(1:4) TO C(1:4).
               CALL 'ofcob_hexdump' USING C VALUE LENGTH OF C.
               MOVE S(1:4) TO B(1:4).
               CALL 'ofcob_hexdump' USING B VALUE LENGTH OF B.

    以下は、上記の実行結果です。

    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    HEXA VALUE : 5a5a5a5a00000000
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    HEXA VALUE : 5a5a5a5a00000000
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    HEXA VALUE : 5a5a5a5a00000000
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>