13.7 COBOL入出力サービスルーチンの使用例

COBOL入出力サービスルーチンの使用例を,次に示します。

(例1)サービスルーチンを使ってファイルを読み込むCプログラム

  :
#include "CBL85fl.h"   /* COBOL提供ヘッダファイルの取り込み */
  :
CBLCOMFL   com ;         /* 管理情報インタフェース領域 */
CBLPARMFL  parm ;        /* パラメタインタフェース領域 */
char  filename[100] ;    /* ファイル名称 */
int   end_flg ;

memset(&com, 0x00, sizeof(CBLCOMFL)) ; /* テーブル0クリア */
memset(&parm, 0x00, sizeof(CBLPARMFL)) ;
/* OPENパラメタを設定する */
strcpy(filename, "/tmp/outfile") ;
com.cblcom_pathname = filename ;
com.cblcom_flopt    = CBLCOM_NOCHK ;
                                   /*属性チェックをしない*/
com.cblcom_openmode = CBLCOM_OPEN_INPUT ;
                                   /*OPENモードはINPUT*/
parm.cblparm_lock   = CBLPARM_NOLOCK ;     /*施錠なし*/
if (CBLOPEN(&com, &parm) != 0) {
                              /*CBLOPENサービスルーチン実行*/
ERROUT(&com) ;          /*エラー情報出力用サブルーチン呼び出し*/
return(-1) ;
}
if (memcmp(com.cblcom_form, "SAMV", 4) != 0) {
  printf("ファイルはCOBOL順可変長形式ではない。¥n") ;
  return(-1) ;
}
/* READパラメタを設定する */
parm.cblparm_lock = CBLPARM_NOLOCK ;        /*施錠なし*/
/* OPENのリターン情報に従い入出力バッファ取得 */
if ((parm.cblparm_read_buf = malloc(com.cblcom_maxrec))
     == NULL) {
  :        /* 必要なメモリが取得できない場合のエラー処理 */
}
end_flg = 0 ;
while(end_flg == 0) {              /*レコード終了までループ*/
if (CBLREAD(&com , &parm) == 0) {
                              /*CBLREADサービスルーチン実行*/
  :                                /* READ成功時の処理 */
} else {
  end_flg = 1 ;                /*読み込み終了フラグ オン */
    if (com.cblcom_fs == 10) {  /*入出力状態値10:ファイル終了*/
      :                        /* ファイル終了時の処理 */
  } else {
     ERROUT(&com) ;             /*エラー処理*/
    }
 }
}
/* 終了処理 */
if (CBLCLOSE(&com, &parm) != 0) {
                            /*CBLCLOSEサービスルーチン実行*/
ERROUT(&com) ;
}

(例2)エラー情報を出力するC副プログラム

extern void ERROUT(p1)
CBLCOMFL *p1 ;
{
  if ((p1->cblcom_msgno >= 3701)
       && (p1->cblcom_msgno <= 3703)) {
    printf("パラメタエラー(詳細情報番号=%d)¥n",
                  p1->cblcom_cbldetail) ;
  } else {
    printf("メッセージ番号=%d¥n",p1->cblcom_msgno) ;
    if (p1->cblcom_sysinf == CBLCOM_ERR_SYSTEM) {
       /* システムエラー情報がある時 */
       printf("システムコール番号=%dエラーコード=%d¥n",
                  p1->cblcom_funcno, p1->cblcom_errno) ;
   }
 }
}