I've been playing with OpenCOBOL today. In particular, I wanted to figure out two things: 1) how to access environment variables, and 2) how to call an external C function and pass parameters. Here is an example. First, the COBOL code (Updated 2019/07/20, to work with GNU Cobol 1.1.0):
IDENTIFICATION DIVISION. PROGRAM-ID. CALLENV. DATA DIVISION. WORKING-STORAGE SECTION. 01 ENVVAR.
05 PIC X(1024).
05 PIC X X"00".
01 RETVAL PIC 9(9).
01 RETVALZ PIC Z(08)9. 01 TIMESVAL USAGE BINARY-LONG VALUE 111. PROCEDURE DIVISION. ACCEPT ENVVAR FROM ENVIRONMENT "COBENV". CALL "print" USING ENVVAR, BY VALUE TIMESVAL RETURNING RETVAL.
MOVE RETVAL TO RETVALZ. DISPLAY 'Return value is ' FUNCTION TRIM(RETVALZ,LEADING) '.'. STOP RUN RETURNING 0.
Next, the external C function:
#include <stdio.h> #include <string.h> extern int print(char *what, int times) { while (strlen(what) > 0 && what[strlen(what) - 1] == ' ') what[strlen(what) - 1] = 0; printf("%s, %d times.\n", what, times); return 123; }
The two can be compiled and linked together (and tested) as in the following make file:
callenv: callenv.cob cobprint.c cc -c cobprint.c cobc -x -o callenv callenv.cob cobprint.o rm cobprint.o COBENV="THIS IS A TEST" callenv
I am impressed by OpenCOBOL 1.0. Version 1.1 will be even nicer, I expect.
Incidentally, OpenCOBOL also has an awesome reference manual.