拡張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 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>