C と COBOL プログラム間のデータの受け渡し

レコード レイアウトを使用したデータの渡し方について説明します。

COBOL レコード配置は、文字配列を含む C 構造と似ています。 コンパイラが COBOL レコード配置を割り当てる場合、特定のハードウェアで必要とされるバイナリやポインターデータ項目の整列、バイナリ (COMP-X) データ項目のバイト順を考慮しません。このため COBOL アプリケーションは非常に移植可能なものです。 しかし、この移植性は、混合言語のアプリケーションで問題を発生します。 C 構造の配置は、COBOL レコード配置では厳密に定義できないし、オペレーティング システム毎に変わります。 たとえば、COBOL で、次の構造は、

01  mystruct is typedef.
            05  mystruct-key-1     pic x occurs 2.
            05  mystruct-bin-1     pic x(4) comp-5.

は、どのプラットフォームでコンパイルしても、6 バイト長です。 しかし、多くのオペレーティング システムで提供されている C コンパイラでは、C でのレコード配置の表現は、異なる結果をもたらします。たとえば、

struct mystruct
 {
             char               mystruct_key_1[2];
             long               mystruct_bin_1;
         };

これは、データの整列とパディングのために、32 ビットのオペレーティング システムでは 8 バイト長の構造に、64 ビットのオペレーティング システムでは 16 バイト長になります。 解決策としては、COBOL レコード mystruct を C 構造で表現することです。

struct mystruct
 {
             char               mystruct_key_1[2];
             char               mystruct_bin_1[4];
         };

混合言語のアプリケーションに対して COBOL データレコードを C データ型に変換可能にするために、Net Express 製品は、COBOL アプリケーションや CBL_ ライブラリ ルーチンのインタフェースで使用される多くの基本型を持った C インクルードファイル \include\cbltypes.h (Windows) または $COBDIR/include/cbltypes.h (UNIX) を持っています。 これらのデータ型は、コピーファイル cpylib\cbltypes.cpy (Windows) または $COBDIR/source/cbltypes.cpy (UNIX) に含まれる型に直接的に対応しています。

上記の例で、次の COBOL レコード配置は、

01  mystruct is typedef.
     05  mystruct-key-1  cblt_x1 occurs 2. *> aka. "PIC X"
     05  mystruct-bin-1  cblt_x4_comp5.    *> aka.
#                                       "PIC X(4) COMP-5"

cbltypes.h を使用して、C で正しく表現できます。

#include "cbltypes.h"

        struct mystruct
 {
                cbl_x1_t          mystruct_key_1[2];
                cbl_x4_comp5_t    mystruct_bin_1;
        };

cbltypes.h で使用される型名変換は、対応する COBOL 型定義の PICTURE 文字列を反映したものです。 このインクルードファイルで提供される基本型は、次のようになります。

cbl_x1_t  cobol character position - basis for all types

cbl_pointer_t   Equivalent to: USAGE POINTER
cbl_ppointer_t  Equivalent to: USAGE PROCEDURE-POINTER

cbl_sx1_comp5_t Equivalent to: PIC s9(n) COMP-5
                                         ここで n=1 あるいは 2 です。
cbl_sx2_comp5_t Equivalent to: PIC s9(n) COMP-5
                                         ここで n=3 あるいは 4 です。
cbl_sx4_comp5_t Equivalent to: PIC s9(n) COMP-5
                                         ここで n=7 から 9 です。
cbl_sx8_comp5_t Equivalent to: PIC s9(18) COMP-5

cbl_x1_comp5_t  Equivalent to: PIC X(1) COMP-5
cbl_x2_comp5_t  Equivalent to: PIC X(2) COMP-5
cbl_x4_comp5_t  Equivalent to: PIC X(4) COMP-5
cbl_x8_comp5_t  Equivalent to: PIC X(8) COMP-5

cbl_x1_compx_t  Equivalent to: PIC X(1) COMP-X
cbl_x2_compx_t  Equivalent to: PIC X(2) COMP-X
cbl_x4_compx_t  Equivalent to: PIC X(4) COMP-X
cbl_x8_compx_t  Equivalent to: PIC X(8) COMP-X

COBOL データを C 言語で移植可能な形で宣言できますが、C コンテキストでデータを操作する必要があります。 これを可能にするために、多くの COBOL ベースのデータ型を C アプリケーションのコンポーネントのコンテキストでの使用に適した形式へ変換する C ライブラリ ルーチンを持っています。