Scott,

That exchange between John and I (around April 7) was about calling C library 
functions directly from COBOL.  It works if you use a static call (COBOL 
literal for the entry point name in UPPER CASE, NODYNAM COBOL compiler option) 
because the C library function load modules (in CEE.SCEELKED) have an external 
reference to the LE initialization subroutine CEESG003 which will do C language 
startup initialization in the enclave.  A dynamic COBOL CALL to a C library 
function (variable name in the CALL or DYNAM COBOL compiler option) will not 
work unless you manually use an INCLUDE SYSLIB(CEESG003) link edit control card 
for your link step to get the C language initialization performed, and include 
CEE.SCEELKED in the link edit SYSLIB DD.

Your code example below should "just work" in terms of getting the C language 
initialization done because your C subroutine will have an external reference 
to CEESG003, but passing strings and integers is trickier, because the C 
language uses (mostly) "pass by VALUE" instead of the COBOL default of "pass by 
REFERENCE (i.e., pointers)".  You have to carefully use the BY REFERENCE and BY 
VALUE attributes for the COBOL USING variables.  Integers (and probably 
floats/doubles as well) must be BY VALUE.  Any structures or arrays (including 
strings!) or function pointers must be BY REFERENCE.

COBOL does have PICTURE usage type "Z" for zero-terminated strings, so you 
don't have to use the STRING verb to construct constant strings with a 
zero-byte terminator to call C modules.  I haven't experimented with moving 
"normal" COBOL strings (PIC X) to a PIC Z variable, so I do not know if that 
would work properly.

HTH

Peter

-----Original Message-----
From: IBM Mainframe Discussion List [mailto:[email protected]] On Behalf 
Of scott Ford
Sent: Tuesday, May 30, 2017 2:27 PM
To: [email protected]
Subject: Re: A slight regression

John,

I didnt realize you could call C library functions directly, very cool  , here 
is what i would like to do:

     FILE SECTION.
       WORKING-STORAGE SECTION.
       77 TESTSTR   PIC X(30) VALUE SPACES.
       77 VAR1      PIC S9(9) BINARY VALUE 5.
       PROCEDURE DIVISION.
       0000-MAIN.
      *     MOVE 1 TO P1.
      *     DISPLAY 'P1: ' P1
      *     CALL 'CFUNC' USING P1 RETURNING P2
      *     DISPLAY 'P1: ' P1
      *     DISPLAY 'P2: ' P2
            STRING 'TEST STRING' ,
               LOW-VALUE
                DELIMITED BY SIZE INTO TESTSTR
            DISPLAY 'CALL CENTRY USING: ' TESTSTR
            CALL 'CENTRY' USING  TESTSTR.
            GOBACK.

<c>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void CENTRY(char* mystring)
{
  printf("my string: %s \n",mystring);
}

I am trying to understand how to perform the call and pass a string and or a 
integer ...

Thanks John..

Regards.
Scott

On Tue, May 30, 2017 at 2:19 PM, John McKown <[email protected]>
wrote:

> On Tue, May 30, 2017 at 1:07 PM, scott Ford <[email protected]> wrote:
>
> > All:
> >
> > I saw a thread between Peter Fairley and John  in April, this year
> speaking
> > about a cobol program calling C ..I am in the same board but did not 
> > see the C code. Can some one help me out and point me to the C 
> > routine or function ?
> >
>
> ​Minor example at:
> https://gist.github.com/JohnArchieMckown/5b973d46108bd24e0c6f9233c9617
> 6b0
>
> Calls the C subroutines: cuserid(), strlen(). and sscanf(). I don't 
> have a C compiler, so I don't have an example of any "user written" C code.
>
>
>
> >
> > Thanks and I appreciate it
> >
> > --
> >
> > *IDMWORKS *
> >
> > Scott Ford
> >
> > z/OS Dev.
> >
>
>
> --
> Windows. A funny name for a operating system that doesn't let you see 
> anything.
>
> Maranatha! <><
> John McKown
>
-- 


This message and any attachments are intended only for the use of the addressee 
and may contain information that is privileged and confidential. If the reader 
of the message is not the intended recipient or an authorized representative of 
the intended recipient, you are hereby notified that any dissemination of this 
communication is strictly prohibited. If you have received this communication 
in error, please notify us immediately by e-mail and delete the message and any 
attachments from your system.


----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN

Reply via email to