Calling a C Function with arguments from LANSA
| Date: | 29 November 2004 |
|---|---|
| Product/Release: | LANSA for iSeries |
| Abstract: | Calling a C Function with arguments from LANSA |
| Submitted By: | LANSA Technical Support |
| Last Review: | November 2010 |
Description:
To call a C function (3GL) with arguments using LANSA.
Solution:
The solution is to specify the parameters in the LANSA function. The important part is to ensure the called 3GL program has been correctly setup to receive them.
This is a simple example of calling a C program from a LANSA RDML function. The C Program that is called is named MYCPGM.
The arguments it expects are :
- a char(10) and
- packed(7,0) number as arguments.
The C program listed below swaps the first 2 characters of the char(10) argument and adds 3 to the second argument.
This demonstrates information being passed into the program and returned by it.
/* Standard includes for all platforms */
#include <string.h>
#include <decimal.h>
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <time.h>
#include <math.h>
#include <float.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <ctype.h>
#include <ctype.h>
#include <iconv.h>
#include <errno.h>
#include <dirent.h>
/*==================================================================*/
/*==================================================================*/
/*=================== M A I N L I N E - iSeries ==================*/
/*==================================================================*/
/*==================================================================*/
void main(int argc, char * argv[])
{
char * pArgument1 = argv[1]; /* Argument 1 is an alpha 10 */
decimal(7,0) * pArgument2 = (decimal(7,0) *) argv[2]; /* Argument 2 is a packed 7,0 */
char chTemp;
/* Swap the first 2 characters of argument 1 */
chTemp = pArgument1[0];
pArgument1[0] = pArgument1[1];
pArgument1[1] = chTemp;
/* Increment argument 2 by 3 */
*(pArgument2) += 3;
/* Finished */
return;
}
Depending on the location of the file the function can be compiled in the following ways:
If on IFS:
CRTCMOD MODULE(<some library>/MYCPGM) SRCSTMF('< location of the MYPGM.C file on the IFS>') OUTPUT(*PRINT) OPTIMIZE(40) INLINE(*ON *AUTO) TGTRLS(V4R5M0)
If using source file:
CRTCMOD MODULE(<some library>/MYCPGM) SRCFILE(<some library>/<source file>) OUTPUT(*PRINT) OPTIMIZE(40) INLINE(*ON *AUTO) TGTRLS(V4R5M0)
and then
CRTPGM PGM(<some library>/MYCPGM) ACTGRP(*CALLER) TGTRLS(V4R5M0)
The following RDML function can be used to test the above:
FUNCTION OPTIONS(*DIRECT) DEFINE #arg1 *char 10 DEFINE #arg2 *dec 7 decimals(0) BEGIN_LOOP REQUEST (#Arg1 #arg2) CALL PGM(MYCPGM) PARM(#arg1 #arg2) NUM_LEN(*Defined) END_LOOP