169 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			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;
 | |
| }
 | |
| 
 | |
| 
 |