If I understood what you were saying correctly, one specifies a field at the end of the string and moves LOW-VALUES to it. This effectively sets that byte to X'00' which is the "zero" I think you are looking for.

Or one defines a byte containing LOW-VALUE and then STRINGs it to the end of string of data.

HTHs
Steve Thompson


On 05/31/2017 09:23 AM, Clark Morris wrote:
[Default] On 30 May 2017 12:35:46 -0700, in bit.listserv.ibm-main
[email protected] (Farley, Peter x23353) wrote:

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.

Picture type Z is for zero suppression so in a PIC ZZZZZ, if 00000 is
moved to it the result is 5 blanks, if 01234 is moved the result is
blank1234 and if 12345 is moved the result is 12345.  I don't know oof
anyway to specify a zero terminated field.

Clark Morris


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


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


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

Reply via email to