C サブルーチンを INT/GNT から CALL する方法を教えてください
Server Expressでは、「呼び出し可能共有オブジェクト」というファイル形式が新たにサポートされました。これは、UNIXの共有オブジェクト (.so、.sl) でありながら、同時に COBOL言語のCALL文による動的ローディングを可能にするファイル形式です。これを使用すると、COBOL V4.1 J 以前の版では面倒であった COBOLからの Cルーチン呼び出しが簡略化されます。
以下にその方式を説明します:
1) 例として、以下のようなCOBOLプログラムを用意します。
$ cat demopgm.cbl
IDENTIFICATION DIVISION.
PROGRAM-ID. DEMOPGM.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 ITEM-1 PIC X(10).
01 ITEM-2 PIC 9(9) USAGE COMP-5.
PROCEDURE DIVISION.
1.
MOVE "ABCDE" & X"00"
TO ITEM-1.
MOVE 1234 TO ITEM-2.
CALL "c_sub" USING
BY REFERENCE ITEM-1
BY VALUE ITEM-2.
STOP RUN.
$
2) サブルーチン c_sub を CALLしています。第1パラメタは C の String型で受けるために、PIC X型で宣言しておき、末尾に X"00" (NULL文字) を付加しています。第2パラメタは C の int型で受けるために、USAGE COMP-5 で宣言し、BY VALUE で渡しています。
3) 呼ばれる Cサブルーチンを以下のように用意します。
$ cat c_sub.c
#include <stdio.h>
c_sub(char *item_1, int item_2) {
printf("c_sub is called.\n item_1 = %s, item_2 = %d\n", item_1, item_2);
return(0);
}
$
4) これは COBOLから渡されたパラメタを printf()関数で表示しています。
5) Cサブルーチンを呼び出し可能共有ライブラリにリンクします。-z フラグは、通常の共有オブジェクトではなく、Server Expressランタイムシステムから動的ロード可能な「呼び出し可能共有オブジェクト」にリンクすることを指示します。
$ cob -z c_sub.c
これで、c_sub.so (HP-UXの場合は c_sub.sl) が作製されます。
6) COBOLメインを -u フラグで GNTにコンパイルします。
$ cob -u demoprg.cbl
7) 通常にCOBOLメインを実行すると、以下のように c_sub.so が動的にロードされ、実行されます。
$ cobrun demoprg.gnt
c_sub is called.
item_1 = ABCDE, item_2 = 1234
$
8) 次に、COBOLメインをアニメータ用に GNT へコンパイルします。
$ cob -ug demoprg.cbl
9) 通常にこの GNTコードをアニメートすると Cを CALLする部分も含めてデバッグできます。
$ anim demoprg.gnt