Description
A sample of how C program call a COBOL program (COBOL program is compiled into .gnt format)
1. C program is trying to read a record from a variable-length data set.
2. COBOL gnt is used to read out the record, and return back to C caller.
(In this sample, we only read the first record, but it can be enhanced to read any given record)
Code snippet: TESTMAIN.cpp
#include <stdio.h>
#if defined(COBOL_MICROFOCUS)
#include <cobcall.h>
typedef cobrtncode_t COB_RETURN_CODE;
typedef cobchar_t COB_CHAR;
typedef cobchar_t COB_VOID;
#define COB_INIT()
#elif defined(COBOL_COBOLIT)
#include <libcob.h>
typedef long COB_RETURN_CODE;
typedef char COB_CHAR;
typedef void COB_VOID;
#define COB_INIT() COB_RTD = cob_get_rtd(); cob_init (rtd, 0, NULL);
#endif
int main(int argc, char * argv[]) {
COB_INIT();
int length; // the returned record length
COB_CHAR buffer[65535]; // the returned record content
COB_VOID * cobargv[3];
cobargv[0] = (COB_CHAR *)&length;
cobargv[1] = buffer;
cobargv[2] = NULL;
int ret = cobcall((COB_CHAR *)"COBRDREC", 2, cobargv);
buffer[length]='\0';
printf("Read: len[%d]=[%s]\n", length, buffer);
return 0;
}
Code snippet: COBRDREC.cbl
IDENTIFICATION DIVISION.
PROGRAM-ID. COBRDREC.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INPUTFILE ASSIGN TO DATAFILE
ORGANIZATION IS SEQUENTIAL
FILE STATUS IS IO-STATUS.
DATA DIVISION.
FILE SECTION.
FD INPUTFILE
RECORD is VARYING in SIZE from 1 to 65535
DEPENDING ON DATA-LEN.
01 DATA-REC PIC X(65535).
WORKING-STORAGE SECTION.
01 DATA-LEN PIC 9(6).
01 IO-STATUS.
03 STATUS-KEY-1 PIC X.
03 STATUS-KEY-2 PIC X.
03 BINARY-STATUS REDEFINES STATUS-KEY-2 PIC 99 COMP-X.
LINKAGE SECTION.
01 PARM-LENGTH PIC 9(6) COMP-5.
01 PARM-CONTENT PIC X(65535).
PROCEDURE DIVISION USING PARM-LENGTH PARM-CONTENT.
* * DISPLAY "ENTRY OF COBRDREC".
OPEN INPUT INPUTFILE.
IF IO-STATUS NOT = "00"
DISPLAY "READ OPEN FAILED IO-STATUS = [" IO-STATUS "]"
GO TO FIN-REL
END-IF.
MOVE ZEROS TO DATA-LEN.
MOVE SPACES TO DATA-REC.
READ INPUTFILE NEXT
AT END GO TO NO-DATA
END-READ.
IF IO-STATUS NOT = "00"
DISPLAY "READ INPUT FAILED"
IF STATUS-KEY-1 = '9'
DISPLAY "FILE ERROR, STATUS: 9/" BINARY-STATUS
ELSE
DISPLAY "FILE ERROR, STATUS: " IO-STATUS
END-IF
GO TO FIN-REL
END-IF.
* * DISPLAY "L=[" DATA-LEN "],D=[" DATA-REC(1:DATA-LEN) "]".
CLOSE INPUTFILE.
MOVE DATA-LEN TO PARM-LENGTH.
MOVE DATA-REC(1:DATA-LEN) TO PARM-CONTENT.
MOVE 0 TO RETURN-CODE.
* * DISPLAY "EXIT OF COBRDREC".
GOBACK.
NO-DATA.
DISPLAY "NO DATA FOUND".
FIN-REL.
CLOSE INPUTFILE.
MOVE 1 TO RETURN-CODE.
DISPLAY "EXIT OF COBRDREC WITH FAILURE".
GOBACK.
The end
本文介绍了一个C程序如何调用一个COBOL程序(.gnt格式)的具体实例。该示例展示了从可变长度数据集中读取记录的过程,其中C程序通过调用COBOL程序来完成数据读取并返回结果。

被折叠的 条评论
为什么被折叠?



