Sample PL/I to COBOL applications
PL/I routine calling COBOL subroutine
*PROCESS MACRO;
PL1CBL: PROC OPTIONS(MAIN);
/*Module/File Name: IBMPCB
/*********************************************************************/
/* FUNCTION : Interlanguage communications call to a *
/* a COBOL program. *
/* *
/* This example illustrates an interlanguage call from *
/* a PL/I main program to a COBOL subroutine. *
/* The parameters passed across the call from PL/I to *
/* COBOL have the following characteristics: *
/* *
/* Data Type PL/I Attributes COBOL Data Description *
/* ---------------- -------------------- ---------------------- *
/* Halfword Integer REAL FIXED BIN(15,0) PIC S9999 USAGE COMP *
/* Fullword Integer REAL FIXED BIN(31,0) PIC S9(9) USAGE COMP *
/* Packed Decimal REAL FIXED DEC(m,n) PIC S9(m-n).9(n) COMP-3 *
/* Short Floating REAL FLOAT DEC(6) USAGE COMP-1 *
/* or REAL FLOAT BIN(21) *
/* Long Floating REAL FLOAT DEC(16) USAGE COMP-2 *
/* or REAL FLOAT BIN(53) *
/* Character string CHARACTER(n) PIC X(n) USAGE DISPLAY *
/* DBCS string GRAPHIC(n) PIC G(n) USAGE DISPLAY-1 *
/* *
/* Note 1: in COBOL, the usages COMPUTATIONAL-1 and COMP-1 *
/* are equivalent. *
/* Note 2: in COBOL, the usages COMPUTATIONAL-2 and COMP-2 *
/* are equivalent. *
/* Note 3: in COBOL, the usages FIXED-DECIMAL, COMP-3, and *
/* COMPUTATIONAL-3 are all equivalent. *
/* Note 4: in COBOL, the usages COMP, COMPUTATIONAL, COMP-4, *
/* COMPUTATIONAL-4, and BINARY are all equivalent. *
/* Note 5: character strings passed must NOT have the VARYING *
/* attribute in PL/I (both SBCS and DBCS). *
/* Note 6: in COBOL, the reserved word USAGE is optional. *
/* Note 7: in PL/I, the attributes BIN and BINARY are equivalent. *
/* Note 8: in PL/I, the attributes DEC and DECIMAL are equivalent. *
/* Note 9: in PL/I, attributes CHAR and CHARACTER are equivalent. *
/* *
/*********************************************************************/
%INCLUDE CEEIBMAW;
%INCLUDE CEEIBMCT;
/**********************************************************/
/* DECLARE ENTRY FOR THE CALL TO COBOL */
/**********************************************************/
DCL PL1CBSB EXTERNAL ENTRY(
/*1*/ FIXED BINARY(15,0),
/*2*/ FIXED BINARY(31,0),
/*3*/ FIXED DECIMAL(5,3),
/*4*/ FLOAT DECIMAL(6),
/*5*/ FLOAT DECIMAL(16),
/*6*/ CHARACTER(23),
/*7*/ GRAPHIC(2) )
OPTIONS(COBOL);
/**********************************************************/
/* Declare parameters: */
/**********************************************************/
DCL PLI_INT2 FIXED BINARY(15,0) INIT(15);
DCL PLI_INT4 FIXED BINARY(31,0) INIT(31);
DCL PLI_PD53 FIXED DECIMAL(5,3) INIT(-12.345);
DCL PLI_FLOAT4 FLOAT DECIMAL(6) INIT(53.99999);
DCL PLI_FLOAT8 FLOAT DECIMAL(16) INIT(3.14151617);
DCL PLI_CHAR23 CHARACTER(23) INIT('PASSED CHARACTER STRING');
DCL PLI_DBCS GRAPHIC(2) INIT('40404040'GX);
/**********************************************************/
/* PROCESS STARTS HERE */
/**********************************************************/
PUT SKIP LIST( '*******************************************');
PUT SKIP LIST( 'PL/I Calling COBOL example is now in motion');
PUT SKIP LIST( '*******************************************');
PUT SKIP;
CALL PL1CBSB( PLI_INT2, PLI_INT4, PLI_PD53,
PLI_FLOAT4, PLI_FLOAT8, PLI_CHAR23, PLI_DBCS);
PUT SKIP LIST( 'PL/I calling COBOL subroutine example ended');
END PL1CBL;
COBOL program called by a PL/I main
CBL LIB,QUOTE,NODYNAM
*************************************************
* *
* IBM Language Environment for MVS & VM *
* *
* Licensed Materials - Property of IBM *
* *
* 5645-001 5688-198 *
* (C) Copyright IBM Corp. 1991, 1998 *
* All Rights Reserved *
* *
* US Government Users Restricted Rights - Use, *
* duplication or disclosure restricted by GSA *
* ADP Schedule Contract with IBM Corp. *
* *
*************************************************
*Module/File Name: IGZTPCB
****************************************************************
** PL1CBSB - COBOL language subroutine invoked by the ***
** PL/I program PL1CBL. ***
** ***
** This is an example of a COBOL subroutine that is called ***
** from a PL/I main program. See the calling PL/I program ***
** for a table of the PL/I data formats and corresponding ***
** COBOL data formats. The arguments received are compared ***
** to their expected values, and any discrepancies reported. ***
** ***
****************************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. PL1CBSB.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
77 COBOL-INT2 PIC S9999 BINARY VALUE 15.
77 COBOL-INT4 PIC S9(9) BINARY VALUE 31.
77 COBOL-PD53 PIC S9(2)V9(3) COMP-3 VALUE -12.345.
77 COBOL-FLOAT4 COMP-1 VALUE 53.99999E0.
77 COBOL-FLOAT8 COMP-2 VALUE 3.14151617E0.
77 COBOL-CHAR23 PIC X(23) DISPLAY
VALUE "PASSED CHARACTER STRING".
77 COBOL-DBCS PIC G(2) DISPLAY-1 VALUE SPACES.
77 FLOAT8-DIFF COMP-2.
LINKAGE SECTION.
01 INT2-ARG PIC S9999 BINARY.
01 INT4-ARG PIC S9(9) BINARY.
01 PD53-ARG PIC S9(2)V9(3) COMP-3.
01 FLOAT4-ARG COMP-1.
01 FLOAT8-ARG COMP-2.
01 CHAR23-ARG PIC X(23) DISPLAY.
01 DBCS-ARG PIC G(2) DISPLAY-1.
**
PROCEDURE DIVISION USING INT2-ARG, INT4-ARG, PD53-ARG,
FLOAT4-ARG, FLOAT8-ARG,
CHAR23-ARG, DBCS-ARG.
0001-ENTRY-FROM-PL1.
DISPLAY "***************************************".
DISPLAY "COBOL PROGRAM ENTERED FROM PL/I PROGRAM".
DISPLAY "***************************************".
****************************************************************
** Compare passed arguments to initialized values. **
****************************************************************
IF (INT2-ARG NOT = COBOL-INT2) THEN
DISPLAY "Error passing PL/I FIXED BIN(15,0) to COBOL:"
DISPLAY "Actual argument value is " INT2-ARG
DISPLAY "Expected value is " COBOL-INT2
END-IF.
IF (INT4-ARG NOT = COBOL-INT4) THEN
DISPLAY "Error passing PL/I FIXED BIN(31,0) to COBOL:"
DISPLAY "Actual argument value is " INT4-ARG
DISPLAY "Expected value is " COBOL-INT4
END-IF.
IF (PD53-ARG NOT = COBOL-PD53) THEN
DISPLAY "Error passing PL/I FIXED DEC(5,3) to COBOL:"
DISPLAY "Actual argument value is " PD53-ARG
DISPLAY "Expected value is " COBOL-PD53
END-IF.
IF (FLOAT4-ARG NOT = COBOL-FLOAT4) THEN
****************************************************************
* Calculate absolute difference between short float value *
****************************************************************
COMPUTE FLOAT8-DIFF = COBOL-FLOAT4 - FLOAT4-ARG
IF (FLOAT8-DIFF < 0) THEN
COMPUTE FLOAT8-DIFF = - FLOAT8-DIFF
END-IF
IF (FLOAT8-DIFF > .00001E0) THEN
DISPLAY "Error passing PL/I FLOAT DEC(6) to COBOL:"
ELSE
DISPLAY "Warning: slight difference found when "
"passing PL/I FLOAT DEC(6) to COBOL:"
END-IF
DISPLAY "Actual argument value is " FLOAT4-ARG
DISPLAY "Expected value is " COBOL-FLOAT4
END-IF.
IF (FLOAT8-ARG NOT = COBOL-FLOAT8) THEN
****************************************************************
* Calculate absolute difference between long float values *
****************************************************************
COMPUTE FLOAT8-DIFF = COBOL-FLOAT8 - FLOAT8-ARG
IF (FLOAT8-DIFF < 0) THEN
COMPUTE FLOAT8-DIFF = - FLOAT8-DIFF
END-IF
IF (FLOAT8-DIFF > .000000001E0) THEN
DISPLAY "Error passing PL/I FLOAT DEC(16) to COBOL:"
ELSE
DISPLAY "Warning: slight difference found when "
"passing PL/I FLOAT DEC(16) to COBOL:"
END-IF
DISPLAY "Actual argument value is " FLOAT8-ARG
DISPLAY "Expected value is " COBOL-FLOAT8
END-IF.
IF (CHAR23-ARG NOT = COBOL-CHAR23) THEN
DISPLAY "Error passing PL/I CHAR(23) to COBOL:"
DISPLAY "Actual argument value is '" CHAR23-ARG "'"
DISPLAY "Expected value is '" COBOL-CHAR23 "'"
END-IF.
IF (DBCS-ARG NOT = COBOL-DBCS) THEN
DISPLAY "Error passing PL/I GRAPHIC(23) to COBOL:"
DISPLAY "Actual argument value is '" DBCS-ARG "'"
DISPLAY "Expected value is '" COBOL-DBCS "'"
END-IF.
GOBACK.