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

Passing data using record layouts.

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 ライブラリルーチンを持っています。