Best to show not tell. What I do with this kind of API is create a C
header file and wrap the external function calls to make them C friendly.
for example
#pragma linkage( foo, "OS" )
// API function with explicit lengths
int foo( const char * instr, size_t instr_len, char * outstr, size_t *
oustr_len );
// C wrapper function that handles null-terminators
inline int cfoo( const char * instr, size_t outstr_len, char * outstr )
{
int rc = foo( instr, strlen( instr ), outstr, &outstr_len );
if ( rc == 0 )
{
outstr[outstr_len] = '\0';
}
return rc;
}
#define BUFFER_LEN 100
char buffer[BUFFER_LEN + 1];
cfoo("bar", sizeof buffer, buffer );
printf("buffer length=%d\n", strlen(buffer));
On 29/06/2013 10:30 AM, zMan wrote:
Require both? That irritates BOTH groups, and seems to have the weaknesses
of both. I must be missing what you're saying...
On Fri, Jun 28, 2013 at 9:40 PM, David Crayford <[email protected]> wrote:
Why not do both? Use lengths and make sure the string is null terminated.
That's how std::string works in C++ where you can call c_str() to return a
null terminated string.
On 29/06/2013, at 9:15 AM, zMan <[email protected]> wrote:
Right, but these kids don't seem to be. The argument I'm getting is "OK,
but even if we pass an explicit length, people will assume the return is
null-terminated". I say, "They'll learn"...
On Fri, Jun 28, 2013 at 8:29 PM, Charles Mills <[email protected]> wrote:
Yes, character arrays and an explicit length. C programmers are quite
used
to this, viz. memcpy() etc.
Charles
-----Original Message-----
From: IBM Mainframe Discussion List [mailto:[email protected]]
On
Behalf Of zMan
Sent: Friday, June 28, 2013 12:53 PM
To: [email protected]
Subject: Theology question: Parameter formats
Suppose you're defining an API, to be callable from multiple languages,
including C. You believe/assume that C will be the most common language
on
non-z platforms (probably reasonable, FSVO "reasonable"), but you also
need
to be callable on z.
Would you:
a) Design the API to pass data/length pairs
b) Use null-terminated strings to keep the C people happy, and have to
create some sort of layer for languages like COBOL to keep usage from
that
world sane?
(Yes, I know about z' variables in COBOL, but people aren't used to and
in
my experience aren't fond of those. And there are a lot of languages out
there to consider besides COBOL!)
My contention is that C folks can surely understand the concept of
passing
a
length, especially since C validates parameters -- that is, if a C
person
might expect to call SOMEFUNCTION(char*, char*)
and instead the function definition is
SOMEFUNCTION(char*, int*, char*, int*)
they shouldn't exactly be confused. Surely they understand the
*concept* of
a length.
But people are whining: "But this is how C works -- that's what strings
are!".
How do most other APIs deal with this? I've not really written
applications
this century (or, to be honest, the last one) -- always done systems
stuff.
As part of this discussion, I've had the epiphany that people don't
*expect* to be able to call existing code from random languages--they
think
there will need to be some kind of shim layer. So they're quite
surprised
that as z folks, we expect an API to be callable from pretty well any
language (modulo pathologies like COBOL's inability to do dynamic memory
allocation).
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN
--
zMan -- "I've got a mainframe and I'm not afraid to use it"
----------------------------------------------------------------------
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
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN