Sample C++ to PL/I ILC applications
PL/I main routine calling a C++ subroutine
/*COMPILATION UNIT: IBMPCX */
/**Process lc(101),opt(0),s,map,list,stmt,a(f),ag;*/
CEPLI2C: PROC OPTIONS(MAIN);
/***************************************************************/
/* FUNCTION : Interlanguage communications call to *
/* a C++ program. *
/* *
/* This example illustrates an interlanguage call from *
/* a PL/I main program to a C++ subroutine. *
/* The parameters passed across the call from PL/I to *
/* C++ have the following declarations: *
/* *
/* PL/I fixed bin(15,0) to C++ short as pointer to BIN *
/* PL/I fixed bin(31,0) to C++ int *
/* PL/I float bin(53) to C++ double *
/* PL/I float bin(109) to C++ long double *
/* PL/I characters to C++ as pointer to pointer to CHAR *
/***************************************************************/
/***************************************************************/
/* DECLARES FOR THE CALL TO C++ *
/***************************************************************/
DCL ADDR BUILTIN;
DCL J FIXED BIN(31,0);
DCL CECFPLI EXTERNAL ENTRY RETURNS(FIXED BIN(31,0));
DCL PL1_SHORT FIXED BIN(15,0) INIT(15);
DCL PL1_INT FIXED BIN(31,0) INIT(31);
DCL PL1_DOUBLE FLOAT BIN(53) INIT (53.99999);
DCL PL1_LONG_DOUBLE FLOAT BIN(109) INIT(3.14151617);
DCL PL1_POINTER PTR;
DCL CHARSTRING CHAR(23) INIT('PASSED CHARACTER STRING');
/**************************************************************/
/* PROCESS STARTS HERE *
/**************************************************************/
PUT SKIP LIST ('**********************************');
PUT SKIP LIST ('PL/I CALLING C++ EXAMPLE STARTED');
PUT SKIP LIST ('**********************************');
PL1_POINTER = ADDR(CHARSTRING);
PUT SKIP LIST ('Calling C/370 subroutine');
J = CECFPLI( ADDR(PL1_SHORT), PL1_INT, PL1_DOUBLE,
PL1_LONG_DOUBLE, ADDR(PL1_POINTER));
PUT SKIP LIST ('Returned from C/370 subroutine');
IF (J ¬= 999) THEN
PUT SKIP LIST ('Error in return code from C/370');
PUT SKIP LIST ('**********************************');
PUT SKIP LIST ('PL/I CALLING C++ EXAMPLE ENDED ');
PUT SKIP LIST ('**********************************');
END CEPLI2C;
C++ routine called by PL/I main routine
/*COMPILATION UNIT: EDCPCX */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern "PLI" int CECFPLI(short **c_short, int *c_int, double *c_double,
long double *c_long_double, char ***c_character_string);
/**********************************************************************
*This is an example of a C++ program invoked by a PL/I program. *
*CECFPLI is called from PL/I program CEPLI2C with the following *
*list of arguments: *
* *
* PL/I fixed bin(15,0) to C/C++ short as pointer to BIN *
* PL/I fixed bin(31,0) to C/C++ int *
* PL/I float bin(53) to C/C++ double *
* PL/I float bin(109) to C/C++ long double *
* PL/I characters to C/C++ as pointer to pointer to CHAR *
* *
* This example is using C++ as a better C. It is illustrating the *
* minimum number of changes required. *
**********************************************************************/
int CECFPLI (short **c_short,
int *c_int,
double *c_double,
long double *c_long_double,
char *** c_character_string
)
{
int ret=999; /* pli is expecting 999 returned */
fprintf(stderr,"CECFPLI STARTED\n");
/********************************************************************
* Compare each passed argument against the C++ value. *
* Issue an error message for any incorrectly passed parameter. *
********************************************************************/
if (**c_short != 15)
{
fprintf(stderr,"**c_short not = 15\n");
--ret;
}
if (*c_int != 31)
{
fprintf(stderr,"*c_int not = 31\n");
--ret;
}
if ((53.99999 - *c_double) >1.0E-14)
{
fprintf(stderr,
"53.99999 - *c_double not >1.0E-14\n");
--ret;
}
if ((3.14151617 - *c_long_double) >1.0E-16)
{
fprintf(stderr,
"3.14151617 - *c_long_double not >1.0E-16\n");
--ret;
}
if (memcmp(**c_character_string,"PASSED CHARACTER STRING",23)
!= 0)
{
fprintf(stderr,"**c_character_string not %s\n",
"\"PASSED CHARACTER STRING\"");
--ret;
}
/*******************************************************************
* PL/I will check for a correct return code. *
*******************************************************************/
fprintf(stderr,"CECFPLI ENDED\n");
return(ret);
}