rexx-things/modules/api/classic/windows/rexxexit/rexxexit.c
2025-03-12 20:50:48 +00:00

169 lines
8.1 KiB
C

/*----------------------------------------------------------------------------*/
/* */
/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */
/* Copyright (c) 2005-2018 Rexx Language Association. All rights reserved. */
/* */
/* This program and the accompanying materials are made available under */
/* the terms of the Common Public License v1.0 which accompanies this */
/* distribution. A copy is also available at the following address: */
/* https://www.oorexx.org/license.html */
/* */
/* Redistribution and use in source and binary forms, with or */
/* without modification, are permitted provided that the following */
/* conditions are met: */
/* */
/* Redistributions of source code must retain the above copyright */
/* notice, this list of conditions and the following disclaimer. */
/* Redistributions in binary form must reproduce the above copyright */
/* notice, this list of conditions and the following disclaimer in */
/* the documentation and/or other materials provided with the distribution. */
/* */
/* Neither the name of Rexx Language Association nor the names */
/* of its contributors may be used to endorse or promote products */
/* derived from this software without specific prior written permission. */
/* */
/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */
/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */
/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */
/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */
/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */
/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */
/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */
/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */
/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */
/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
/* */
/*----------------------------------------------------------------------------*/
/*********************************************************************/
/* */
/* File Name: REXXEXIT.C */
/* */
/* Description: Provides a sample call to the REXX */
/* interpreter, passing in an environment name, */
/* a file name, and a single argument string. */
/* */
/* Entry Points: main - main entry point */
/* */
/* Input: None */
/* */
/* Output: returns 0 in all cases. */
/* */
/*********************************************************************/
#include <windows.h>
#include <rexx.h> /* needed for RexxStart() */
#include <stdio.h> /* needed for printf() */
#include <string.h> /* needed for strlen() */
//
// Prototypes
//
int __cdecl main(int argc, char *argv[]); /* main entry point */
RexxReturnCode REXXENTRY MY_IOEXIT( int ExitNumber, int Subfunction, PEXIT ParmBlock);
//
// MAIN program
//
int __cdecl main(int argc, char *argv[])
{
RXSYSEXIT exit_list[9]; /* Exit list array */
short rexxrc = 0; /* return code from rexx */
int rc; /* actually running program RC */
CONSTRXSTRING argument; /* rexxstart argument */
RXSTRING rxretbuf; // program return buffer
rc = 0; /* set default return */
/* just one argument is accepted by this program */
if ((argc < 2) || (argc > 3))
{
printf("Wrong arguments: REXXEXIT program [argument]\n");
exit(-1);
}
/*
* Convert the input array into a single string for the Object REXX
* argument string. Initialize the RXSTRING variable to point to this
* string. Keep the string null terminated so we can print it for debug.
* First argument is name of the REXX program
* Next argument(s) are parameters to be passed
*/
/* By setting the strlength of the output RXSTRING to zero, we */
/* force the interpreter to allocate memory and return it to us. */
/* We could provide a buffer for the interpreter to use instead. */
rxretbuf.strlength = 0L; /* initialize return to empty*/
if (argc == 3)
{
MAKERXSTRING(argument, argv[2], strlen(argv[2]));/* create input argument */
}
else
MAKERXSTRING(argument, "", 0);/* create blank argument */
// register IO exit
rc = RexxRegisterExitExe("MY_IOC", (REXXPFN)&MY_IOEXIT, NULL);
/* run this via RexxStart */
exit_list[0].sysexit_name = "MY_IOC";
exit_list[0].sysexit_code = RXSIO;
exit_list[1].sysexit_code = RXENDLST;
/* Here we call the interpreter. */
rc=REXXSTART(1, /* number of arguments */
&argument, /* array of arguments */
argv[1], /* name of REXX file */
NULL, /* No INSTORE used */
"CMD", /* Command env. name */
RXCOMMAND, /* Code for how invoked */
exit_list, /* exits for this call */
&rexxrc, /* Rexx program output */
&rxretbuf ); /* Rexx program output */
/* free memory allocated for the return result */
if (rc==0)
{
RexxFreeMemory(rxretbuf.strptr);
}
RexxDeregisterExit("MY_IOC",NULL); // remove the exit in exe exit list
// return interpeter or rexx program return code
return rc ? rc : rexxrc;
}
RexxReturnCode REXXENTRY MY_IOEXIT(int ExitNumber, int Subfunction, PEXIT parmblock)
{
RXSIOSAY_PARM *sparm;
RXSIOTRC_PARM *tparm;
RXSIOTRD_PARM *rparm;
RXSIODTR_PARM *dparm;
switch (Subfunction)
{
case RXSIOSAY:
sparm = ( RXSIOSAY_PARM * )parmblock ;
printf("%s\n",sparm->rxsio_string.strptr);
break;
case RXSIOTRC:
tparm = ( RXSIOTRC_PARM * )parmblock ;
printf("%s\n",tparm->rxsio_string.strptr);
break;
case RXSIOTRD:
rparm = (RXSIOTRD_PARM * )parmblock ;
gets_s(rparm->rxsiotrd_retc.strptr, rparm->rxsiotrd_retc.strlength);
rparm->rxsiotrd_retc.strlength=strlen(rparm->rxsiotrd_retc.strptr);
break;
case RXSIODTR:
dparm = (RXSIODTR_PARM * )parmblock ;
gets_s(dparm->rxsiodtr_retc.strptr, dparm->rxsiodtr_retc.strlength);
dparm->rxsiodtr_retc.strlength=strlen(dparm->rxsiodtr_retc.strptr);
break;
default:
break;
}
return RXEXIT_HANDLED;
}