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);                                                          
 }