|
Jevgeni,
There is a table in the C reference that equates RPG data types to C data
types.
You will still use main(int argc, char *argv).
But the differences is in how RPG treats stuff and how C treats stuff. In
particular, character data.
RPG does NOT deal with null terminated strings. And most of the C functions
expect null terminated strings. So you will have to be carefull about
translating those.
In general, you RPG passes a pointer to the data. And it does not receive a
return value (This changes with V4 ILE, but you probably must assume OPM
RPG).
Below is a wrapper function for one of my C functions:
void rSend(int *ReturnCode,
struct ccSocketsData *ccs,
int *OpClass,
int *OpSubClass,
const void *lpBuf,
int *nBufLen)
{
BYTE wOpClass = (BYTE)*OpClass;
BYTE wOpSubClass = (BYTE)*OpSubClass;
*ReturnCode = ccsSend(ccs, wOpClass, wOpSubClass, lpBuf, *nBufLen);
}
Prototype of the "C" version of this function:
int ccsSend(struct ccSocketsData *ccs,
BYTE OpClass,
BYTE OpSubClass,
const void *lpBuf,
int nBufLen)
RPG Code that calls this:
C CallB 'rSend'
C parm rc
C parm CSS
C parm IPClass
C parm IPSubClass
C parm DSCOMMAND
C parm szData
Note that the RPG is actually ILE, but it is V3R1 compatible ILE so doesn't
have all of the "fancy" stuff that RPG has these days.
Since I am calling procedures, the C side can use varible names and
prototypes. Since you will actually be calling programs, then your c will
more like:
void main(int argc, char *argv)
{
char *myParm1;
int *myParm2;
if (argc < 3)
{
printf("life is pretty mucked up...not enough parms");
Abort.....
};
myParm1 = argv[1]; //I think arg[0] will be your program name, but
I might
be wrong!
MyParm2 = (int *)argv[2];
// Now convert myParm1 to null terminated string.
...... Rest of program
// convert myParm1 back to non-null terminated
return;
}
-----Original Message-----
From: owner-c400-l@midrange.com [mailto:owner-c400-l@midrange.com]On Behalf
Of Jevgeni Astanovski
Sent: Tuesday, September 26, 2000 4:26 AM
To: C400-L@midrange.com
Subject: How to write a C program, that is to be called from RPG?
The system, I work with, contain a set of RPG programs (not ILE, I
think).
When I write my ILE/C program, I call them for example like that :
#pragma map(theirapi, "THEIRPROG")
#pragma linkage(theirapi, OS)
void theirapi ( char *, /* ERCOD */
char *, /* ERPRM */
char *, /* empty */
char *, /* DSAIF */
char *, /* DSAIR */
char *, /* BEGIN */
decimal(5,0) *, /* NOREQ */
decimal(5,0) * /* NORET */
);
int main (int argc, char *argv)
{
char DSAIF[3000];
char DSAIR[3000];
char ERCOD[2];
char ERPRM[10];
char BEGIN;
char DUMMY[14] = " ";
decimal(5,0) NOREQ;
decimal(5,0) NORET;
/* Some initialization */
........
/* ------------------- */
theirapi (ERCOD, ERPRM, DUMMY, DSAIF, DSAIR, &BEGIN, &NOREQ, &NORET);
return(0) ;
}
But these programs are also called from inside the system from other
RPG modules (sources unavailable). Now what I want to do, is to write
my own C program, that can substitute completely one of original
programs - thus being undestinctable from the viewpoint of calling RPG
program. My question is, how should the program access the parameters?
I normally write
int main (int argc, char *argv)
So are there any formal rules for obtaining arguments in C program,
when they are passed from RPG?
Any help will be apreciated,
TIA,
Eugene Astanovsky.
Jevgeni Astanovski,
IT Hooldusosakonna juhataja
Optiva Pank.
+---
| This is the C/400 Mailing List!
| To submit a new message, send your mail to C400-L@midrange.com.
| To subscribe to this list send email to C400-L-SUB@midrange.com.
| To unsubscribe from this list send email to C400-L-UNSUB@midrange.com.
| Questions should be directed to the list owner/operator:
bob@cstoneindy.com
+---
+---
| This is the C/400 Mailing List!
| To submit a new message, send your mail to C400-L@midrange.com.
| To subscribe to this list send email to C400-L-SUB@midrange.com.
| To unsubscribe from this list send email to C400-L-UNSUB@midrange.com.
| Questions should be directed to the list owner/operator: bob@cstoneindy.com
+---
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.