From: <bi...@us...> - 2008-11-16 15:08:57
|
Revision: 3696 http://oorexx.svn.sourceforge.net/oorexx/?rev=3696&view=rev Author: bigrixx Date: 2008-11-16 15:08:50 +0000 (Sun, 16 Nov 2008) Log Message: ----------- Add new process invocation tests Modified Paths: -------------- test/trunk/external/API/Makefile.aix test/trunk/external/API/Makefile.linux test/trunk/external/API/Makefile.windows test/trunk/external/API/orxclassicexits.cpp test/trunk/external/API/orxclassicexits.def test/trunk/external/API/orxexits.hpp test/trunk/external/API/orxinstance.cpp test/trunk/external/API/orxinvocation.cpp test/trunk/external/API/orxmethod.cpp test/trunk/ooRexx/API/oo/INVOCATION.testGroup test/trunk/ooRexx/API/oo/INVOCATIONTester.cls test/trunk/ooRexx/API/oo/RexxStart.testGroup Added Paths: ----------- test/trunk/external/API/orxinvocation.def test/trunk/external/API/rexxinstance.cpp test/trunk/ooRexx/API/oo/ProcessInvocation.testGroup test/trunk/ooRexx/API/oo/ProcessRexxStart.testGroup test/trunk/ooRexx/API/oo/path/ test/trunk/ooRexx/API/oo/path/test1.test1 test/trunk/ooRexx/API/oo/path/test2.test2 test/trunk/ooRexx/API/oo/tests/callPath.rex Property Changed: ---------------- test/trunk/external/API/orxclassicexits.cpp test/trunk/external/API/orxclassicexits.def test/trunk/external/API/orxexits.hpp test/trunk/external/API/orxinstance.cpp test/trunk/external/API/orxinvocation.cpp Modified: test/trunk/external/API/Makefile.aix =================================================================== --- test/trunk/external/API/Makefile.aix 2008-11-15 15:53:42 UTC (rev 3695) +++ test/trunk/external/API/Makefile.aix 2008-11-16 15:08:50 UTC (rev 3696) @@ -61,25 +61,28 @@ # Build the libraries all: $(OOTEST_BIN_DIR)/liborxfunction.so $(OOTEST_BIN_DIR)/liborxmethod.so \ - $(OOTEST_BIN_DIR)/liborxclassic.so $(OOTEST_BIN_DIR)/liborxclassic1.so + $(OOTEST_BIN_DIR)/liborxclassic.so $(OOTEST_BIN_DIR)/liborxclassic1.so \ + $(OOTEST_BIN_DIR)/orxexits.so $(OOTEST_BIN_DIR)/orxinvocation.so $(OOTEST_BIN_DIR)/liborxfunction.so: liborxfunction.so - slibclean cp liborxfunction.so $(OOTEST_BIN_DIR) $(OOTEST_BIN_DIR)/liborxmethod.so: liborxmethod.so - slibclean cp liborxmethod.so $(OOTEST_BIN_DIR) $(OOTEST_BIN_DIR)/liborxclassic.so: liborxclassic.so - slibclean cp liborxclassic.so $(OOTEST_BIN_DIR) $(OOTEST_BIN_DIR)/liborxclassic1.so: liborxclassic1.so - slibclean cp liborxclassic1.so $(OOTEST_BIN_DIR) +$(OOTEST_BIN_DIR)/orxexits.so: orxexits.so + cp orxexits.so $(OOTEST_BIN_DIR) +$(OOTEST_BIN_DIR)/orxinvocation.so: orxinvocation.so + cp orxinvocation.so $(OOTEST_BIN_DIR) + + # Build the shared library liborxfunction.so: orxfunction.o xlC_r $(ORXLFLAGS) $(REXX_LIBS) -lrexx -lrexxapi -o liborxfunction.so orxfunction.o @@ -98,6 +101,18 @@ xlC_r -c $(ORXCXXFLAGS) $(REXX_INCLUDES) orxmethod.cpp +# Build the objects +orxclassicexits.o: orxclassicexits.cpp + xlC_r -c $(ORXCXXFLAGS) $(REXX_INCLUDES) orxclassicexits.cpp + +# Build the objects +orxinstance.o: orxinstance.cpp + xlC_r -c $(ORXCXXFLAGS) $(REXX_INCLUDES) orxinstance.cpp + +# Build the objects +orxinvocation.o: orxinvocation.cpp + xlC_r -c $(ORXCXXFLAGS) $(REXX_INCLUDES) orxinvocation.cpp + # Build the shared library liborxclassic.so: orxclassic.o xlC_r $(ORXLFLAGS) $(REXX_LIBS) -lrexx -lrexxapi -o liborxclassic.so orxclassic.o @@ -115,6 +130,14 @@ orxclassic1.o: orxclassic1.c $(FUNCTION_SRC_DEPS) xlc_r -c $(ORXCFLAGS) $(REXX_INCLUDES) orxclassic1.c +# Build the shared library +orxexits.so: orxclassicexits.o orxinstance.o + xlC_r $(ORXLFLAGS) $(REXX_LIBS) -lrexx -lrexxapi -o orxexits.so orxclassicexits.o orxinstance.o + +# Build the shared library +orxinvocation.so: orxinvocation.o + xlC_r $(ORXLFLAGS) $(REXX_LIBS) -lrexx -lrexxapi -o orxinvocation.so orxinvocation.o + clean: rm -f *.so *.o $(OOTEST_BIN_DIR)/lib*.so Modified: test/trunk/external/API/Makefile.linux =================================================================== --- test/trunk/external/API/Makefile.linux 2008-11-15 15:53:42 UTC (rev 3695) +++ test/trunk/external/API/Makefile.linux 2008-11-16 15:08:50 UTC (rev 3696) @@ -60,7 +60,8 @@ # Build the libraries all: $(OOTEST_BIN_DIR)/liborxfunction.so $(OOTEST_BIN_DIR)/liborxmethod.so \ - $(OOTEST_BIN_DIR)/liborxclassic.so $(OOTEST_BIN_DIR)/liborxclassic1.so + $(OOTEST_BIN_DIR)/liborxclassic.so $(OOTEST_BIN_DIR)/liborxclassic1.so \ + $(OOTEST_BIN_DIR)/orxexits.so $(OOTEST_BIN_DIR)/orxinvocation.so $(OOTEST_BIN_DIR)/liborxfunction.so: liborxfunction.so cp liborxfunction.so $(OOTEST_BIN_DIR) @@ -74,7 +75,13 @@ $(OOTEST_BIN_DIR)/liborxclassic1.so: liborxclassic1.so cp liborxclassic1.so $(OOTEST_BIN_DIR) +$(OOTEST_BIN_DIR)/orxexits.so: orxexits.so + cp orxexits.so $(OOTEST_BIN_DIR) +$(OOTEST_BIN_DIR)/orxinvocation.so: orxinvocation.so + cp orxinvocation.so $(OOTEST_BIN_DIR) + + # Build the shared library liborxfunction.so: orxfunction.o gcc $(ORXLFLAGS) $(REXX_LIBS) -lrexx -lrexxapi -o liborxfunction.so orxfunction.o @@ -93,6 +100,18 @@ gcc -c $(ORXCFLAGS) $(REXX_INCLUDES) orxmethod.cpp +# Build the objects +orxclassicexits.o: orxclassicexits.cpp + gcc -c $(ORXCFLAGS) $(REXX_INCLUDES) orxclassicexits.cpp + +# Build the objects +orxinstance.o: orxinstance.cpp + gcc -c $(ORXCFLAGS) $(REXX_INCLUDES) orxinstance.cpp + +# Build the objects +orxinvocation.o: orxinvocation.cpp + gcc -c $(ORXCFLAGS) $(REXX_INCLUDES) orxinvocation.cpp + # Build the shared library liborxclassic.so: orxclassic.o gcc $(ORXLFLAGS) $(REXX_LIBS) -lrexx -lrexxapi -o liborxclassic.so orxclassic.o @@ -110,7 +129,15 @@ orxclassic1.o: orxclassic1.c $(FUNCTION_SRC_DEPS) gcc -c $(ORXCFLAGS) $(REXX_INCLUDES) orxclassic1.c +# Build the shared library +orxexits.so: orxclassicexits.o orxinstance.o + gcc $(ORXLFLAGS) $(REXX_LIBS) -lrexx -lrexxapi -o orxexits.so orxclassicexits.o orxinstance.o +# Build the shared library +orxinvocation.so: orxinvocation.o + gcc $(ORXLFLAGS) $(REXX_LIBS) -lrexx -lrexxapi -o orxinvocation.so orxinvocation.o + + clean: rm -f *.so *.o $(OOTEST_BIN_DIR)/lib*.so Modified: test/trunk/external/API/Makefile.windows =================================================================== --- test/trunk/external/API/Makefile.windows 2008-11-15 15:53:42 UTC (rev 3695) +++ test/trunk/external/API/Makefile.windows 2008-11-16 15:08:50 UTC (rev 3696) @@ -60,6 +60,7 @@ LIBS = $(REXX_LIBS) WARNINGFLAGS = /W3 /Wp64 /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE +ORXEXELFLAGS = /NOLOGO /DEBUG -debugtype:cv /SUBSYSTEM:Console $(LIBS) user32.lib comdlg32.lib gdi32.lib kernel32.lib ORXLFLAGS = /NOLOGO /DEBUG -debugtype:cv /SUBSYSTEM:Windows $(LIBS) /DLL ORXCFLAGS = /nologo /EHsc /Zi /Od /Gr /MTd /D_CRT_SECURE_NO_DEPRECATE $(WARNINGFLAG) $(REXX_INCLUDES) /c @@ -71,7 +72,8 @@ # Build the libraries all: $(OOTEST_BIN_DIR)\orxfunction.dll $(OOTEST_BIN_DIR)\orxmethod.dll \ $(OOTEST_BIN_DIR)\orxclassic.dll $(OOTEST_BIN_DIR)\orxclassic1.dll \ - $(OOTEST_BIN_DIR)\orxexits.dll $(OOTEST_BIN_DIR)\orxinvocation.dll + $(OOTEST_BIN_DIR)\orxexits.dll $(OOTEST_BIN_DIR)\orxinvocation.dll \ + $(OOTEST_BIN_DIR)\rexxinstance.exe $(OOTEST_BIN_DIR)\orxfunction.dll: orxfunction.dll copy orxfunction.dll $(OOTEST_BIN_DIR) @@ -91,7 +93,10 @@ $(OOTEST_BIN_DIR)\orxinvocation.dll: orxinvocation.dll copy orxinvocation.dll $(OOTEST_BIN_DIR) +$(OOTEST_BIN_DIR)\rexxinstance.exe: rexxinstance.exe + copy rexxinstance.exe $(OOTEST_BIN_DIR) + # Build the shared library orxfunction.dll: orxfunction.obj link $(ORXLFLAGS) /def:orxfunction.def orxfunction.obj @@ -110,15 +115,15 @@ cl $(ORXCFLAGS) orxmethod.cpp # Build the objects -orxclassicexits.obj: orxclassicexits.cpp +orxclassicexits.obj: orxclassicexits.cpp orxexits.hpp cl $(ORXCFLAGS) orxclassicexits.cpp # Build the objects -orxinstance.obj: orxinstance.cpp +orxinstance.obj: orxinstance.cpp orxexits.hpp cl $(ORXCFLAGS) orxinstance.cpp # Build the objects -orxinvocation.obj: orxinvocation.cpp +orxinvocation.obj: orxinvocation.cpp orxexits.hpp cl $(ORXCFLAGS) orxinvocation.cpp # Build the objects @@ -133,6 +138,10 @@ orxclassic.obj: orxclassic.cpp cl $(ORXCFLAGS) orxclassic.cpp +# Build the objects +rexxinstance.obj: rexxinstance.cpp orxexits.hpp + cl $(ORXCFLAGS) rexxinstance.cpp + # Build the shared library orxclassic1.dll: orxclassic1.obj link $(ORXLFLAGS) /def:orxclassic1.def orxclassic1.obj @@ -145,6 +154,11 @@ orxinvocation.dll: orxinvocation.obj link $(ORXLFLAGS) orxclassicexits.lib /def:orxinvocation.def orxinvocation.obj +# Build the .exe file +rexxinstance.exe: rexxinstance.obj + link $(ORXEXELFLAGS) orxclassicexits.lib rexxinstance.obj -out:$(@B).exe + + clean: del *.dll *.obj *.ilk *.pdb *.lib *.exp $(OOTEST_BIN_DIR)\*.dll 1>nul 2>&1 Modified: test/trunk/external/API/orxclassicexits.cpp =================================================================== --- test/trunk/external/API/orxclassicexits.cpp 2008-11-15 15:53:42 UTC (rev 3695) +++ test/trunk/external/API/orxclassicexits.cpp 2008-11-16 15:08:50 UTC (rev 3696) @@ -1,806 +1,807 @@ -/*----------------------------------------------------------------------------*/ -/* */ -/* Copyright (c) 2008 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: */ -/* http://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. */ -/* */ -/*----------------------------------------------------------------------------*/ - -#include "rexx.h" -#include "orxexits.hpp" - -InstanceInfo *getApplicationData() -{ - void *userData[2]; - unsigned short flag; - - RexxQueryExit("TestFunctionExit", NULL, &flag, (char *)userData); - return (InstanceInfo *)userData[1]; -} - - -void setContextVariable(const char *name, const char *value) -{ - SHVBLOCK shvb; - - memset(&shvb, 0, sizeof(shvb)); - shvb.shvnext = NULL; - shvb.shvname.strptr = name; - shvb.shvname.strlength = strlen(name); - shvb.shvvalue.strptr = const_cast<char *>(value); - shvb.shvvalue.strlength = strlen(value); - shvb.shvnamelen = shvb.shvname.strlength; - shvb.shvvaluelen = shvb.shvvalue.strlength; - shvb.shvcode = RXSHV_SET; - shvb.shvret = 0; - RexxVariablePool(&shvb); -} - - -void getContextVariable(const char *name, RXSTRING *value) -{ - SHVBLOCK shvb; - - memset(&shvb, 0, sizeof(shvb)); - shvb.shvnext = NULL; - shvb.shvname.strptr = name; - shvb.shvname.strlength = strlen(name); - shvb.shvvalue.strptr = value->strptr; - shvb.shvvalue.strlength = value->strlength; - shvb.shvnamelen = shvb.shvname.strlength; - shvb.shvvaluelen = shvb.shvvalue.strlength; - shvb.shvcode = RXSHV_FETCH; - shvb.shvret = 0; - RexxVariablePool(&shvb); -} - - -void dropContextVariable(const char *name) -{ - SHVBLOCK shvb; - - memset(&shvb, 0, sizeof(shvb)); - shvb.shvnext = NULL; - shvb.shvname.strptr = name; - shvb.shvname.strlength = strlen(name); - shvb.shvnamelen = shvb.shvname.strlength; - shvb.shvcode = RXSHV_DROPV; - shvb.shvret = 0; - RexxVariablePool(&shvb); -} - - -int RexxEntry TestFunctionExit(int code, int subcode, PEXIT exitInfo) -{ - InstanceInfo *instanceInfo = getApplicationData(); - - switch (instanceInfo->fnc.action) - { - case InstanceInfo::SKIP: - return RXEXIT_NOT_HANDLED; - case InstanceInfo::EXIT_ERROR: - return RXEXIT_RAISE_ERROR; - case InstanceInfo::RAISE: - return RXEXIT_RAISE_ERROR; - } - - RXFNCCAL_PARM *parms = (RXFNCCAL_PARM *)exitInfo; - const char *functionName = parms->rxfnc_name; - if (strcmp(functionName, "TESTSUBCALL") == 0) - { - // return the status of the flag - if (parms->rxfnc_flags.rxffsub) - { - strcpy(parms->rxfnc_retc.strptr, "SUBROUTINE"); - } - else - { - strcpy(parms->rxfnc_retc.strptr, "FUNCTION"); - } - parms->rxfnc_retc.strlength = strlen(parms->rxfnc_retc.strptr); - return RXEXIT_HANDLED; - } - else if (strcmp(functionName, "TESTERROR") == 0) - { - // this should raise an error - parms->rxfnc_flags.rxfferr = 1; - return RXEXIT_HANDLED; - } - else if (strcmp(functionName, "TESTNOTOUND") == 0) - { - // this should raise an error - parms->rxfnc_flags.rxffnfnd = 1; - return RXEXIT_HANDLED; - } - else if (strcmp(functionName, "TESTGETCONTEXTVARIABLE") == 0) - { - getContextVariable(parms->rxfnc_argv[0].strptr, &parms->rxfnc_retc); - return RXEXIT_HANDLED; - } - else if (strcmp(functionName, "TESTSETCONTEXTVARIABLE") == 0) - { - setContextVariable(parms->rxfnc_argv[0].strptr, parms->rxfnc_argv[1].strptr); - parms->rxfnc_retc.strlength = 0; - return RXEXIT_HANDLED; - } - else if (strcmp(functionName, "TESTDROPCONTEXTVARIABLE") == 0) - { - dropContextVariable(parms->rxfnc_argv[0].strptr); - return RXEXIT_HANDLED; - } - else - { - // pass on this - return RXEXIT_NOT_HANDLED; - } -} - -int RexxEntry TestCommandExit(int code, int subcode, PEXIT exitInfo) -{ - InstanceInfo *instanceInfo = getApplicationData(); - - switch (instanceInfo->cmd.action) - { - case InstanceInfo::SKIP: - return RXEXIT_NOT_HANDLED; - case InstanceInfo::EXIT_ERROR: - return RXEXIT_RAISE_ERROR; - case InstanceInfo::RAISE: - return RXEXIT_RAISE_ERROR; - } - - RXCMDHST_PARM *parms = (RXCMDHST_PARM *)exitInfo; - // handle commands here...we need to process both the address environment and the commands - if (strcmp(parms->rxcmd_address, "FOOBAR") == 0) - { - strcpy(parms->rxcmd_retc.strptr, "-1"); - parms->rxcmd_retc.strlength = 2; - return RXEXIT_HANDLED; - } - - // ok, a good address...now do the different commands - if (strcmp(parms->rxcmd_command.strptr, "GOOD") == 0) - { - strcpy(parms->rxcmd_retc.strptr, "0"); - parms->rxcmd_retc.strlength = 1; - return RXEXIT_HANDLED; - } - else if (strcmp(parms->rxcmd_command.strptr, "ERROR") == 0) - { - strcpy(parms->rxcmd_retc.strptr, "1"); - parms->rxcmd_retc.strlength = 1; - parms->rxcmd_flags.rxfcerr = 1; - return RXEXIT_HANDLED; - } - // ok, a good address...now do the different commands - else if (strcmp(parms->rxcmd_command.strptr, "TRACEON") == 0) - { - instanceInfo->trc = InstanceInfo::TRACEON; - strcpy(parms->rxcmd_retc.strptr, "0"); - parms->rxcmd_retc.strlength = 1; - return RXEXIT_HANDLED; - } - // ok, a good address...now do the different commands - else if (strcmp(parms->rxcmd_command.strptr, "TRACEOFF") == 0) - { - instanceInfo->trc = InstanceInfo::TRACEOFF; - strcpy(parms->rxcmd_retc.strptr, "0"); - parms->rxcmd_retc.strlength = 1; - return RXEXIT_HANDLED; - } - // ok, a good address...now do the different commands - else if (strcmp(parms->rxcmd_command.strptr, "HALT") == 0) - { - instanceInfo->hlt = InstanceInfo::HALT; - strcpy(parms->rxcmd_retc.strptr, "0"); - parms->rxcmd_retc.strlength = 1; - return RXEXIT_HANDLED; - } - else - { - // unknown command - strcpy(parms->rxcmd_retc.strptr, "-2"); - parms->rxcmd_retc.strlength = 2; - parms->rxcmd_flags.rxfcfail = 1; - return RXEXIT_HANDLED; - } -} - -int RexxEntry TestQueueExit(int code, int subcode, PEXIT exitInfo) -{ - InstanceInfo *instanceInfo = getApplicationData(); - - switch (instanceInfo->msq.action) - { - case InstanceInfo::SKIP: - return RXEXIT_NOT_HANDLED; - case InstanceInfo::EXIT_ERROR: - return RXEXIT_RAISE_ERROR; - case InstanceInfo::RAISE: - return RXEXIT_RAISE_ERROR; - } - - switch (subcode) - { - case RXMSQPLL: - { - RXMSQPLL_PARM *parms = (RXMSQPLL_PARM *)exitInfo; - strcpy(parms->rxmsq_retc.strptr, "Hello World"); - parms->rxmsq_retc.strlength = strlen("Hello World"); - return RXEXIT_HANDLED; - } - case RXMSQPSH: - { - RXMSQPSH_PARM *parms = (RXMSQPSH_PARM *)exitInfo; - if (parms->rxmsq_flags.rxfmlifo) - { - if (strcmp(parms->rxmsq_value.strptr, "LIFO") == 0) - { - return RXEXIT_HANDLED; - } - else - { - return RXEXIT_RAISE_ERROR; - } - } - else - { - if (strcmp(parms->rxmsq_value.strptr, "FIFO") == 0) - { - return RXEXIT_HANDLED; - } - else - { - return RXEXIT_RAISE_ERROR; - } - } - } - case RXMSQSIZ: - { - RXMSQSIZ_PARM *parms = (RXMSQSIZ_PARM *)exitInfo; - // this always returns a large, distinctive number - parms->rxmsq_size = 999999; - return RXEXIT_HANDLED; - } - case RXMSQNAM: - { - RXMSQPLL_PARM *parms = (RXMSQPLL_PARM *)exitInfo; - strcpy(parms->rxmsq_retc.strptr, "FOOBAR"); - parms->rxmsq_retc.strlength = strlen("FOOBAR"); - return RXEXIT_HANDLED; - } - } - return RXEXIT_RAISE_ERROR; -} - -int RexxEntry TestSessionIOExit(int code, int subcode, PEXIT exitInfo) -{ - InstanceInfo *instanceInfo = getApplicationData(); - - switch (instanceInfo->sio.action) - { - case InstanceInfo::SKIP: - return RXEXIT_NOT_HANDLED; - case InstanceInfo::EXIT_ERROR: - return RXEXIT_RAISE_ERROR; - case InstanceInfo::RAISE: - return RXEXIT_RAISE_ERROR; - } - switch (subcode) - { - case RXSIOTRD: - { - if (instanceInfo->sio == InstanceInfo::ALL || instanceInfo->sio == InstanceInfo::CONSOLE) - { - RXSIOTRD_PARM *parms = (RXSIOTRD_PARM *)exitInfo; - strcpy(parms->rxsiotrd_retc.strptr, "Hello World"); - parms->rxsiotrd_retc.strlength = strlen("Hello World"); - return RXEXIT_HANDLED; - } - return RXEXIT_NOT_HANDLED; - } - case RXSIODTR: - { - if (instanceInfo->sio == InstanceInfo::ALL || instanceInfo->sio == InstanceInfo::CONSOLE_DEBUG) - { - RXSIODTR_PARM *parms = (RXSIODTR_PARM *)exitInfo; - strcpy(parms->rxsiodtr_retc.strptr, "trace off"); - parms->rxsiodtr_retc.strlength = strlen("trace off"); - return RXEXIT_HANDLED; - } - return RXEXIT_NOT_HANDLED; - } - case RXSIOSAY: - { - if (instanceInfo->sio == InstanceInfo::ALL || instanceInfo->sio == InstanceInfo::CONSOLE) - { - RXSIOSAY_PARM *parms = (RXSIOSAY_PARM *)exitInfo; - if (strcmp(parms->rxsio_string.strptr, "HELLO") == 0) - { - return RXEXIT_HANDLED; - } - else - { - return RXEXIT_RAISE_ERROR; - } - } - return RXEXIT_NOT_HANDLED; - } - case RXSIOTRC: - { - if (instanceInfo->sio == InstanceInfo::ALL || instanceInfo->sio == InstanceInfo::CONSOLE_DEBUG) - { - RXMSQSIZ_PARM *parms = (RXMSQSIZ_PARM *)exitInfo; - // this one is really hard to test, so it's sufficient that we got here. - return RXEXIT_HANDLED; - } - return RXEXIT_NOT_HANDLED; - } - } - return RXEXIT_RAISE_ERROR; -} - -int RexxEntry TestHaltExit(int code, int subcode, PEXIT exitInfo) -{ - InstanceInfo *instanceInfo = getApplicationData(); - - switch (instanceInfo->hlt.action) - { - case InstanceInfo::SKIP: - return RXEXIT_NOT_HANDLED; - case InstanceInfo::EXIT_ERROR: - return RXEXIT_RAISE_ERROR; - case InstanceInfo::RAISE: - return RXEXIT_RAISE_ERROR; - case InstanceInfo::HALT: - { - RXHLTTST_PARM *parms = (RXHLTTST_PARM *)exitInfo; - parms->rxhlt_flags.rxfhhalt = 1; - // the next call is a no - instanceInfo->hlt = InstanceInfo::NOHALT; - return RXEXIT_HANDLED; - } - case InstanceInfo::NOHALT: - { - RXHLTTST_PARM *parms = (RXHLTTST_PARM *)exitInfo; - parms->rxhlt_flags.rxfhhalt = 0; - return RXEXIT_HANDLED; - } - } - return RXEXIT_NOT_HANDLED; -} - -int RexxEntry TestTraceExit(int code, int subcode, PEXIT exitInfo) -{ - InstanceInfo *instanceInfo = getApplicationData(); - - switch (instanceInfo->trc.action) - { - case InstanceInfo::SKIP: - return RXEXIT_NOT_HANDLED; - case InstanceInfo::EXIT_ERROR: - return RXEXIT_RAISE_ERROR; - case InstanceInfo::RAISE: - return RXEXIT_RAISE_ERROR; - case InstanceInfo::TRACEON: - { - RXTRCTST_PARM *parms = (RXTRCTST_PARM *)exitInfo; - parms->rxtrc_flags.rxftrace = 1; - // just one shot at this, otherwise the test rig goes into - // a loop in the io intercepter. - instanceInfo->trc = InstanceInfo::TRACEOFF; - return RXEXIT_HANDLED; - } - case InstanceInfo::TRACEOFF: - { - RXTRCTST_PARM *parms = (RXTRCTST_PARM *)exitInfo; - parms->rxtrc_flags.rxftrace = 0; - return RXEXIT_HANDLED; - } - } - return RXEXIT_NOT_HANDLED; -} - -int RexxEntry TestInitExit(int code, int subcode, PEXIT exitInfo) -{ - InstanceInfo *instanceInfo = getApplicationData(); - - switch (instanceInfo->ini.action) - { - case InstanceInfo::SKIP: - return RXEXIT_NOT_HANDLED; - case InstanceInfo::EXIT_ERROR: - return RXEXIT_RAISE_ERROR; - case InstanceInfo::RAISE: - return RXEXIT_RAISE_ERROR; - } - setContextVariable("TEST1", "Hello World"); - return RXEXIT_HANDLED; -} - -int RexxEntry TestTerminationExit(int code, int subcode, PEXIT exitInfo) -{ - InstanceInfo *instanceInfo = getApplicationData(); - - switch (instanceInfo->ter.action) - { - case InstanceInfo::SKIP: - return RXEXIT_NOT_HANDLED; - case InstanceInfo::EXIT_ERROR: - return RXEXIT_RAISE_ERROR; - case InstanceInfo::RAISE: - return RXEXIT_RAISE_ERROR; - } - - char buffer[256]; - RXSTRING value; - MAKERXSTRING(value, buffer, sizeof(buffer)); - - getContextVariable("TEST1", &value); - if (strcmp(value.strptr, "Hello World") != 0) - { - return RXEXIT_RAISE_ERROR; - } - return RXEXIT_NOT_HANDLED; -} - -int RexxEntry TestScriptFunctionExit(int code, int subcode, PEXIT exitInfo) -{ - InstanceInfo *instanceInfo = getApplicationData(); - - switch (instanceInfo->exf.action) - { - case InstanceInfo::SKIP: - return RXEXIT_NOT_HANDLED; - case InstanceInfo::EXIT_ERROR: - return RXEXIT_RAISE_ERROR; - case InstanceInfo::RAISE: - return RXEXIT_RAISE_ERROR; - } - // nothing else really testable in a classic fashion - return RXEXIT_NOT_HANDLED; -} - -int RexxEntry TestObjectFunctionExit(int code, int subcode, PEXIT exitInfo) -{ - InstanceInfo *instanceInfo = getApplicationData(); - - switch (instanceInfo->ofnc.action) - { - case InstanceInfo::SKIP: - return RXEXIT_NOT_HANDLED; - case InstanceInfo::EXIT_ERROR: - return RXEXIT_RAISE_ERROR; - case InstanceInfo::RAISE: - return RXEXIT_RAISE_ERROR; - } - // nothing else really testable in a classic fashion - return RXEXIT_NOT_HANDLED; -} - -int RexxEntry TestNovalueExit(int code, int subcode, PEXIT exitInfo) -{ - InstanceInfo *instanceInfo = getApplicationData(); - - switch (instanceInfo->var.action) - { - case InstanceInfo::SKIP: - return RXEXIT_NOT_HANDLED; - case InstanceInfo::EXIT_ERROR: - return RXEXIT_RAISE_ERROR; - case InstanceInfo::RAISE: - return RXEXIT_RAISE_ERROR; - } - - // nothing else really testable in a classic fashion - return RXEXIT_NOT_HANDLED; -} - -int RexxEntry TestValueExit(int code, int subcode, PEXIT exitInfo) -{ - InstanceInfo *instanceInfo = getApplicationData(); - - switch (instanceInfo->val.action) - { - case InstanceInfo::SKIP: - return RXEXIT_NOT_HANDLED; - case InstanceInfo::EXIT_ERROR: - return RXEXIT_RAISE_ERROR; - case InstanceInfo::RAISE: - return RXEXIT_RAISE_ERROR; - } - - // nothing else really testable in a classic fashion - return RXEXIT_NOT_HANDLED; -} - - -RexxReturnCode RexxEntry TestSubcomHandler(CONSTRXSTRING *cmd, unsigned short *flags, PRXSTRING retstr) -{ - *flags = RXSUBCOM_OK; - // ok, a good address...now do the different commands - if (strcmp(cmd->strptr, "GOOD") == 0) - { - strcpy(retstr->strptr, "0"); - retstr->strlength = 1; - return 0; - } - else if (strcmp(cmd->strptr, "ERROR") == 0) - { - strcpy(retstr->strptr, "1"); - retstr->strlength = 1; - *flags = RXSUBCOM_ERROR; - return 0; - } - else if (strcmp(cmd->strptr, "SETVAR") == 0) - { - setContextVariable("TEST1", "Hello World"); - strcpy(retstr->strptr, "0"); - retstr->strlength = 1; - return 0; - } - else if (strcmp(cmd->strptr, "GETVAR") == 0) - { - getContextVariable("TEST1", retstr); - return 0; - } - else - { - strcpy(retstr->strptr, "-1"); - retstr->strlength = 2; - *flags = RXSUBCOM_FAILURE; - return 0; - } -} - -void deregisterSubcomHandler() -{ - RexxDeregisterSubcom("TestSubcomHandler", NULL); -} - - -void REXXENTRY registerSubcomHandler(void *data) -{ - void *userData[2]; - userData[1] = data; - // make sure this is deregistered first - deregisterSubcomHandler(); - RexxRegisterSubcomExe("TestSubcomHandler", (REXXPFN)TestSubcomHandler, (char *)userData); -} - - -void REXXENTRY deregisterExits() -{ - RexxDeregisterExit("TestFunctionExit", NULL); - RexxDeregisterExit("TestObjectFunctionExit", NULL); - RexxDeregisterExit("TestScriptFunctionExit", NULL); - RexxDeregisterExit("TestCommandExit", NULL); - RexxDeregisterExit("TestQueueExit", NULL); - RexxDeregisterExit("TestSessionIOExit", NULL); - RexxDeregisterExit("TestHaltExit", NULL); - RexxDeregisterExit("TestInitExit", NULL); - RexxDeregisterExit("TestNovalueExit", NULL); - RexxDeregisterExit("TestTerminationExit", NULL); - RexxDeregisterExit("TestValueExit", NULL); - RexxDeregisterExit("TestTraceExit", NULL); -} - -void REXXENTRY registerExeExits(void *data) -{ - deregisterExits(); - - void *userData[2]; - userData[1] = data; - - RexxRegisterExitExe("TestFunctionExit", (REXXPFN)TestFunctionExit, (char *)userData); - RexxRegisterExitExe("TestObjectFunctionExit", (REXXPFN)TestObjectFunctionExit, (char *)userData); - RexxRegisterExitExe("TestScriptFunctionExit", (REXXPFN)TestScriptFunctionExit, (char *)userData); - RexxRegisterExitExe("TestCommandExit", (REXXPFN)TestCommandExit, (char *)userData); - RexxRegisterExitExe("TestQueueExit", (REXXPFN)TestQueueExit, (char *)userData); - RexxRegisterExitExe("TestSessionIOExit", (REXXPFN)TestSessionIOExit, (char *)userData); - RexxRegisterExitExe("TestHaltExit", (REXXPFN)TestHaltExit, (char *)userData); - RexxRegisterExitExe("TestInitExit", (REXXPFN)TestInitExit, (char *)userData); - RexxRegisterExitExe("TestNovalueExit", (REXXPFN)TestNovalueExit, (char *)userData); - RexxRegisterExitExe("TestTerminationExit", (REXXPFN)TestTerminationExit, (char *)userData); - RexxRegisterExitExe("TestValueExit", (REXXPFN)TestValueExit, (char *)userData); - RexxRegisterExitExe("TestTraceExit", (REXXPFN)TestTraceExit, (char *)userData); -} - -void REXXENTRY registerDllExits(void *data) -{ - deregisterExits(); - - void *userData[2]; - userData[1] = data; - - RexxRegisterExitDll("TestFunctionExit", "orxexits", "TestFunctionExit", (char *)userData, RXEXIT_DROPPABLE); - RexxRegisterExitDll("TestObjectFunctionExit", "orxexits", "TestObjectFunctionExit", (char *)userData, RXEXIT_DROPPABLE); - RexxRegisterExitDll("TestScriptFunctionExit", "orxexits", "TestScriptFunctionExit", (char *)userData, RXEXIT_DROPPABLE); - RexxRegisterExitDll("TestCommandExit", "orxexits", "TestCommandExit", (char *)userData, RXEXIT_DROPPABLE); - RexxRegisterExitDll("TestQueueExit", "orxexits", "TestQueueExit", (char *)userData, RXEXIT_DROPPABLE); - RexxRegisterExitDll("TestSessionIOExit", "orxexits", "TestSessionIOExit", (char *)userData, RXEXIT_DROPPABLE); - RexxRegisterExitDll("TestHaltExit", "orxexits", "TestHaltExit", (char *)userData, RXEXIT_DROPPABLE); - RexxRegisterExitDll("TestInitExit", "orxexits", "TestInitExit", (char *)userData, RXEXIT_DROPPABLE); - RexxRegisterExitDll("TestNovalueExit", "orxexits", "TestNovalueExit", (char *)userData, RXEXIT_DROPPABLE); - RexxRegisterExitDll("TestTerminationExit", "orxexits", "TestTerminationExit", (char *)userData, RXEXIT_DROPPABLE); - RexxRegisterExitDll("TestValueExit", "orxexits", "TestValueExit", (char *)userData, RXEXIT_DROPPABLE); - RexxRegisterExitDll("TestTraceExit", "orxexits", "TestTraceExit", (char *)userData, RXEXIT_DROPPABLE); -} - - -bool REXXENTRY buildRegisteredExitList(InstanceInfo *instanceInfo, RXSYSEXIT *exitList) -{ - int counter = 0; - if (instanceInfo->fnc.isEnabled()) - { - exitList->sysexit_name = "TestFunctionExit"; - exitList->sysexit_code = RXFNC; - exitList++; - counter++; - } - if (instanceInfo->cmd.isEnabled()) - { - exitList->sysexit_name = "TestCommandExit"; - exitList->sysexit_code = RXCMD; - exitList++; - counter++; - } - if (instanceInfo->msq.isEnabled()) - { - exitList->sysexit_name = "TestQueueExit"; - exitList->sysexit_code = RXMSQ; - exitList++; - counter++; - } - if (instanceInfo->sio.isEnabled()) - { - exitList->sysexit_name = "TestSessionIOExit"; - exitList->sysexit_code = RXSIO; - exitList++; - counter++; - } - if (instanceInfo->hlt.isEnabled()) - { - exitList->sysexit_name = "TestHaltExit"; - exitList->sysexit_code = RXHLT; - exitList++; - counter++; - } - if (instanceInfo->trc.isEnabled()) - { - exitList->sysexit_name = "TestTraceExit"; - exitList->sysexit_code = RXTRC; - exitList++; - counter++; - } - if (instanceInfo->ini.isEnabled()) - { - exitList->sysexit_name = "TestInitExit"; - exitList->sysexit_code = RXINI; - exitList++; - counter++; - } - if (instanceInfo->ter.isEnabled()) - { - exitList->sysexit_name = "TestTerminationExit"; - exitList->sysexit_code = RXTER; - exitList++; - counter++; - } - if (instanceInfo->exf.isEnabled()) - { - exitList->sysexit_name = "TestScriptFunctionExit"; - exitList->sysexit_code = RXEXF; - exitList++; - counter++; - } - if (instanceInfo->var.isEnabled()) - { - exitList->sysexit_name = "TestNovalueExit"; - exitList->sysexit_code = RXNOVAL; - exitList++; - counter++; - } - if (instanceInfo->val.isEnabled()) - { - exitList->sysexit_name = "TestValueExit"; - exitList->sysexit_code = RXVALUE; - exitList++; - counter++; - } - if (instanceInfo->ofnc.isEnabled()) - { - exitList->sysexit_name = "TestObjectFunctionExit"; - exitList->sysexit_code = RXOFNC; - exitList++; - counter++; - } - - if (counter > 0) - { - exitList->sysexit_name = NULL; - exitList->sysexit_code = 0; - return true; - } - return false; -} - - -void REXXENTRY invokeRexxStart(InstanceInfo *instanceInfo) -{ - CONSTRXSTRING args[10]; - RXSYSEXIT registeredExits[RXNOOFEXITS]; - short callRC = 0; - RXSTRING returnValue; - - instanceInfo->code = 0; - instanceInfo->rc = 0; - strcpy(instanceInfo->returnResult, ""); - - for (size_t i = 0; i < instanceInfo->argCount; i++) - { - if (instanceInfo->arguments[i] != NULL) - { - MAKERXSTRING(args[i], instanceInfo->arguments[i], strlen(instanceInfo->arguments[i])); - } - else - { - MAKERXSTRING(args[i], NULL, 0); - } - } - - RXSYSEXIT *exits = NULL; - - if (instanceInfo->exitStyle == InstanceInfo::REGISTERED_DLL) - { - registerDllExits((void *)instanceInfo); - buildRegisteredExitList(instanceInfo, registeredExits); - exits = registeredExits; - } - MAKERXSTRING(returnValue, NULL, 0); - - int rc = RexxStart(instanceInfo->argCount, args, instanceInfo->programName, NULL, instanceInfo->initialAddress, RXCOMMAND, exits, &callRC, &returnValue); - - if (rc < 0) - { - instanceInfo->rc = -rc; - } - else - { - if (returnValue.strptr != NULL) - { - strncpy(instanceInfo->returnResult, returnValue.strptr, sizeof(instanceInfo->returnResult)); - RexxFreeMemory(returnValue.strptr); - } - } - deregisterExits(); -} +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2008 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: */ +/* http://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. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#include "rexx.h" +#include "orxexits.hpp" +#include <string.h> + +InstanceInfo *getApplicationData() +{ + void *userData[2]; + unsigned short flag; + + RexxQueryExit("TestFunctionExit", NULL, &flag, (char *)userData); + return (InstanceInfo *)userData[1]; +} + + +void setContextVariable(const char *name, const char *value) +{ + SHVBLOCK shvb; + + memset(&shvb, 0, sizeof(shvb)); + shvb.shvnext = NULL; + shvb.shvname.strptr = name; + shvb.shvname.strlength = strlen(name); + shvb.shvvalue.strptr = const_cast<char *>(value); + shvb.shvvalue.strlength = strlen(value); + shvb.shvnamelen = shvb.shvname.strlength; + shvb.shvvaluelen = shvb.shvvalue.strlength; + shvb.shvcode = RXSHV_SET; + shvb.shvret = 0; + RexxVariablePool(&shvb); +} + + +void getContextVariable(const char *name, RXSTRING *value) +{ + SHVBLOCK shvb; + + memset(&shvb, 0, sizeof(shvb)); + shvb.shvnext = NULL; + shvb.shvname.strptr = name; + shvb.shvname.strlength = strlen(name); + shvb.shvvalue.strptr = value->strptr; + shvb.shvvalue.strlength = value->strlength; + shvb.shvnamelen = shvb.shvname.strlength; + shvb.shvvaluelen = shvb.shvvalue.strlength; + shvb.shvcode = RXSHV_FETCH; + shvb.shvret = 0; + RexxVariablePool(&shvb); +} + + +void dropContextVariable(const char *name) +{ + SHVBLOCK shvb; + + memset(&shvb, 0, sizeof(shvb)); + shvb.shvnext = NULL; + shvb.shvname.strptr = name; + shvb.shvname.strlength = strlen(name); + shvb.shvnamelen = shvb.shvname.strlength; + shvb.shvcode = RXSHV_DROPV; + shvb.shvret = 0; + RexxVariablePool(&shvb); +} + + +int RexxEntry TestFunctionExit(int code, int subcode, PEXIT exitInfo) +{ + InstanceInfo *instanceInfo = getApplicationData(); + + switch (instanceInfo->fnc.action) + { + case InstanceInfo::SKIP: + return RXEXIT_NOT_HANDLED; + case InstanceInfo::EXIT_ERROR: + return RXEXIT_RAISE_ERROR; + case InstanceInfo::RAISE: + return RXEXIT_RAISE_ERROR; + } + + RXFNCCAL_PARM *parms = (RXFNCCAL_PARM *)exitInfo; + const char *functionName = parms->rxfnc_name; + if (strcmp(functionName, "TESTSUBCALL") == 0) + { + // return the status of the flag + if (parms->rxfnc_flags.rxffsub) + { + strcpy(parms->rxfnc_retc.strptr, "SUBROUTINE"); + } + else + { + strcpy(parms->rxfnc_retc.strptr, "FUNCTION"); + } + parms->rxfnc_retc.strlength = strlen(parms->rxfnc_retc.strptr); + return RXEXIT_HANDLED; + } + else if (strcmp(functionName, "TESTERROR") == 0) + { + // this should raise an error + parms->rxfnc_flags.rxfferr = 1; + return RXEXIT_HANDLED; + } + else if (strcmp(functionName, "TESTNOTOUND") == 0) + { + // this should raise an error + parms->rxfnc_flags.rxffnfnd = 1; + return RXEXIT_HANDLED; + } + else if (strcmp(functionName, "TESTGETCONTEXTVARIABLE") == 0) + { + getContextVariable(parms->rxfnc_argv[0].strptr, &parms->rxfnc_retc); + return RXEXIT_HANDLED; + } + else if (strcmp(functionName, "TESTSETCONTEXTVARIABLE") == 0) + { + setContextVariable(parms->rxfnc_argv[0].strptr, parms->rxfnc_argv[1].strptr); + parms->rxfnc_retc.strlength = 0; + return RXEXIT_HANDLED; + } + else if (strcmp(functionName, "TESTDROPCONTEXTVARIABLE") == 0) + { + dropContextVariable(parms->rxfnc_argv[0].strptr); + return RXEXIT_HANDLED; + } + else + { + // pass on this + return RXEXIT_NOT_HANDLED; + } +} + +int RexxEntry TestCommandExit(int code, int subcode, PEXIT exitInfo) +{ + InstanceInfo *instanceInfo = getApplicationData(); + + switch (instanceInfo->cmd.action) + { + case InstanceInfo::SKIP: + return RXEXIT_NOT_HANDLED; + case InstanceInfo::EXIT_ERROR: + return RXEXIT_RAISE_ERROR; + case InstanceInfo::RAISE: + return RXEXIT_RAISE_ERROR; + } + + RXCMDHST_PARM *parms = (RXCMDHST_PARM *)exitInfo; + // handle commands here...we need to process both the address environment and the commands + if (strcmp(parms->rxcmd_address, "FOOBAR") == 0) + { + strcpy(parms->rxcmd_retc.strptr, "-1"); + parms->rxcmd_retc.strlength = 2; + return RXEXIT_HANDLED; + } + + // ok, a good address...now do the different commands + if (strcmp(parms->rxcmd_command.strptr, "GOOD") == 0) + { + strcpy(parms->rxcmd_retc.strptr, "0"); + parms->rxcmd_retc.strlength = 1; + return RXEXIT_HANDLED; + } + else if (strcmp(parms->rxcmd_command.strptr, "ERROR") == 0) + { + strcpy(parms->rxcmd_retc.strptr, "1"); + parms->rxcmd_retc.strlength = 1; + parms->rxcmd_flags.rxfcerr = 1; + return RXEXIT_HANDLED; + } + // ok, a good address...now do the different commands + else if (strcmp(parms->rxcmd_command.strptr, "TRACEON") == 0) + { + instanceInfo->trc = InstanceInfo::TRACEON; + strcpy(parms->rxcmd_retc.strptr, "0"); + parms->rxcmd_retc.strlength = 1; + return RXEXIT_HANDLED; + } + // ok, a good address...now do the different commands + else if (strcmp(parms->rxcmd_command.strptr, "TRACEOFF") == 0) + { + instanceInfo->trc = InstanceInfo::TRACEOFF; + strcpy(parms->rxcmd_retc.strptr, "0"); + parms->rxcmd_retc.strlength = 1; + return RXEXIT_HANDLED; + } + // ok, a good address...now do the different commands + else if (strcmp(parms->rxcmd_command.strptr, "HALT") == 0) + { + instanceInfo->hlt = InstanceInfo::HALT; + strcpy(parms->rxcmd_retc.strptr, "0"); + parms->rxcmd_retc.strlength = 1; + return RXEXIT_HANDLED; + } + else + { + // unknown command + strcpy(parms->rxcmd_retc.strptr, "-2"); + parms->rxcmd_retc.strlength = 2; + parms->rxcmd_flags.rxfcfail = 1; + return RXEXIT_HANDLED; + } +} + +int RexxEntry TestQueueExit(int code, int subcode, PEXIT exitInfo) +{ + InstanceInfo *instanceInfo = getApplicationData(); + + switch (instanceInfo->msq.action) + { + case InstanceInfo::SKIP: + return RXEXIT_NOT_HANDLED; + case InstanceInfo::EXIT_ERROR: + return RXEXIT_RAISE_ERROR; + case InstanceInfo::RAISE: + return RXEXIT_RAISE_ERROR; + } + + switch (subcode) + { + case RXMSQPLL: + { + RXMSQPLL_PARM *parms = (RXMSQPLL_PARM *)exitInfo; + strcpy(parms->rxmsq_retc.strptr, "Hello World"); + parms->rxmsq_retc.strlength = strlen("Hello World"); + return RXEXIT_HANDLED; + } + case RXMSQPSH: + { + RXMSQPSH_PARM *parms = (RXMSQPSH_PARM *)exitInfo; + if (parms->rxmsq_flags.rxfmlifo) + { + if (strcmp(parms->rxmsq_value.strptr, "LIFO") == 0) + { + return RXEXIT_HANDLED; + } + else + { + return RXEXIT_RAISE_ERROR; + } + } + else + { + if (strcmp(parms->rxmsq_value.strptr, "FIFO") == 0) + { + return RXEXIT_HANDLED; + } + else + { + return RXEXIT_RAISE_ERROR; + } + } + } + case RXMSQSIZ: + { + RXMSQSIZ_PARM *parms = (RXMSQSIZ_PARM *)exitInfo; + // this always returns a large, distinctive number + parms->rxmsq_size = 999999; + return RXEXIT_HANDLED; + } + case RXMSQNAM: + { + RXMSQPLL_PARM *parms = (RXMSQPLL_PARM *)exitInfo; + strcpy(parms->rxmsq_retc.strptr, "FOOBAR"); + parms->rxmsq_retc.strlength = strlen("FOOBAR"); + return RXEXIT_HANDLED; + } + } + return RXEXIT_RAISE_ERROR; +} + +int RexxEntry TestSessionIOExit(int code, int subcode, PEXIT exitInfo) +{ + InstanceInfo *instanceInfo = getApplicationData(); + + switch (instanceInfo->sio.action) + { + case InstanceInfo::SKIP: + return RXEXIT_NOT_HANDLED; + case InstanceInfo::EXIT_ERROR: + return RXEXIT_RAISE_ERROR; + case InstanceInfo::RAISE: + return RXEXIT_RAISE_ERROR; + } + switch (subcode) + { + case RXSIOTRD: + { + if (instanceInfo->sio == InstanceInfo::ALL || instanceInfo->sio == InstanceInfo::CONSOLE) + { + RXSIOTRD_PARM *parms = (RXSIOTRD_PARM *)exitInfo; + strcpy(parms->rxsiotrd_retc.strptr, "Hello World"); + parms->rxsiotrd_retc.strlength = strlen("Hello World"); + return RXEXIT_HANDLED; + } + return RXEXIT_NOT_HANDLED; + } + case RXSIODTR: + { + if (instanceInfo->sio == InstanceInfo::ALL || instanceInfo->sio == InstanceInfo::CONSOLE_DEBUG) + { + RXSIODTR_PARM *parms = (RXSIODTR_PARM *)exitInfo; + strcpy(parms->rxsiodtr_retc.strptr, "trace off"); + parms->rxsiodtr_retc.strlength = strlen("trace off"); + return RXEXIT_HANDLED; + } + return RXEXIT_NOT_HANDLED; + } + case RXSIOSAY: + { + if (instanceInfo->sio == InstanceInfo::ALL || instanceInfo->sio == InstanceInfo::CONSOLE) + { + RXSIOSAY_PARM *parms = (RXSIOSAY_PARM *)exitInfo; + if (strcmp(parms->rxsio_string.strptr, "HELLO") == 0) + { + return RXEXIT_HANDLED; + } + else + { + return RXEXIT_RAISE_ERROR; + } + } + return RXEXIT_NOT_HANDLED; + } + case RXSIOTRC: + { + if (instanceInfo->sio == InstanceInfo::ALL || instanceInfo->sio == InstanceInfo::CONSOLE_DEBUG) + { + RXMSQSIZ_PARM *parms = (RXMSQSIZ_PARM *)exitInfo; + // this one is really hard to test, so it's sufficient that we got here. + return RXEXIT_HANDLED; + } + return RXEXIT_NOT_HANDLED; + } + } + return RXEXIT_RAISE_ERROR; +} + +int RexxEntry TestHaltExit(int code, int subcode, PEXIT exitInfo) +{ + InstanceInfo *instanceInfo = getApplicationData(); + + switch (instanceInfo->hlt.action) + { + case InstanceInfo::SKIP: + return RXEXIT_NOT_HANDLED; + case InstanceInfo::EXIT_ERROR: + return RXEXIT_RAISE_ERROR; + case InstanceInfo::RAISE: + return RXEXIT_RAISE_ERROR; + case InstanceInfo::HALT: + { + RXHLTTST_PARM *parms = (RXHLTTST_PARM *)exitInfo; + parms->rxhlt_flags.rxfhhalt = 1; + // the next call is a no + instanceInfo->hlt = InstanceInfo::NOHALT; + return RXEXIT_HANDLED; + } + case InstanceInfo::NOHALT: + { + RXHLTTST_PARM *parms = (RXHLTTST_PARM *)exitInfo; + parms->rxhlt_flags.rxfhhalt = 0; + return RXEXIT_HANDLED; + } + } + return RXEXIT_NOT_HANDLED; +} + +int RexxEntry TestTraceExit(int code, int subcode, PEXIT exitInfo) +{ + InstanceInfo *instanceInfo = getApplicationData(); + + switch (instanceInfo->trc.action) + { + case InstanceInfo::SKIP: + return RXEXIT_NOT_HANDLED; + case InstanceInfo::EXIT_ERROR: + return RXEXIT_RAISE_ERROR; + case InstanceInfo::RAISE: + return RXEXIT_RAISE_ERROR; + case InstanceInfo::TRACEON: + { + RXTRCTST_PARM *parms = (RXTRCTST_PARM *)exitInfo; + parms->rxtrc_flags.rxftrace = 1; + // just one shot at this, otherwise the test rig goes into + // a loop in the io intercepter. + instanceInfo->trc = InstanceInfo::TRACEOFF; + return RXEXIT_HANDLED; + } + case InstanceInfo::TRACEOFF: + { + RXTRCTST_PARM *parms = (RXTRCTST_PARM *)exitInfo; + parms->rxtrc_flags.rxftrace = 0; + return RXEXIT_HANDLED; + } + } + return RXEXIT_NOT_HANDLED; +} + +int RexxEntry TestInitExit(int code, int subcode, PEXIT exitInfo) +{ + InstanceInfo *instanceInfo = getApplicationData(); + + switch (instanceInfo->ini.action) + { + case InstanceInfo::SKIP: + return RXEXIT_NOT_HANDLED; + case InstanceInfo::EXIT_ERROR: + return RXEXIT_RAISE_ERROR; + case InstanceInfo::RAISE: + return RXEXIT_RAISE_ERROR; + } + setContextVariable("TEST1", "Hello World"); + return RXEXIT_HANDLED; +} + +int RexxEntry TestTerminationExit(int code, int subcode, PEXIT exitInfo) +{ + InstanceInfo *instanceInfo = getApplicationData(); + + switch (instanceInfo->ter.action) + { + case InstanceInfo::SKIP: + return RXEXIT_NOT_HANDLED; + case InstanceInfo::EXIT_ERROR: + return RXEXIT_RAISE_ERROR; + case InstanceInfo::RAISE: + return RXEXIT_RAISE_ERROR; + } + + char buffer[256]; + RXSTRING value; + MAKERXSTRING(value, buffer, sizeof(buffer)); + + getContextVariable("TEST1", &value); + if (strcmp(value.strptr, "Hello World") != 0) + { + return RXEXIT_RAISE_ERROR; + } + return RXEXIT_NOT_HANDLED; +} + +int RexxEntry TestScriptFunctionExit(int code, int subcode, PEXIT exitInfo) +{ + InstanceInfo *instanceInfo = getApplicationData(); + + switch (instanceInfo->exf.action) + { + case InstanceInfo::SKIP: + return RXEXIT_NOT_HANDLED; + case InstanceInfo::EXIT_ERROR: + return RXEXIT_RAISE_ERROR; + case InstanceInfo::RAISE: + return RXEXIT_RAISE_ERROR; + } + // nothing else really testable in a classic fashion + return RXEXIT_NOT_HANDLED; +} + +int RexxEntry TestObjectFunctionExit(int code, int subcode, PEXIT exitInfo) +{ + InstanceInfo *instanceInfo = getApplicationData(); + + switch (instanceInfo->ofnc.action) + { + case InstanceInfo::SKIP: + return RXEXIT_NOT_HANDLED; + case InstanceInfo::EXIT_ERROR: + return RXEXIT_RAISE_ERROR; + case InstanceInfo::RAISE: + return RXEXIT_RAISE_ERROR; + } + // nothing else really testable in a classic fashion + return RXEXIT_NOT_HANDLED; +} + +int RexxEntry TestNovalueExit(int code, int subcode, PEXIT exitInfo) +{ + InstanceInfo *instanceInfo = getApplicationData(); + + switch (instanceInfo->var.action) + { + case InstanceInfo::SKIP: + return RXEXIT_NOT_HANDLED; + case InstanceInfo::EXIT_ERROR: + return RXEXIT_RAISE_ERROR; + case InstanceInfo::RAISE: + return RXEXIT_RAISE_ERROR; + } + + // nothing else really testable in a classic fashion + return RXEXIT_NOT_HANDLED; +} + +int RexxEntry TestValueExit(int code, int subcode, PEXIT exitInfo) +{ + InstanceInfo *instanceInfo = getApplicationData(); + + switch (instanceInfo->val.action) + { + case InstanceInfo::SKIP: + return RXEXIT_NOT_HANDLED; + case InstanceInfo::EXIT_ERROR: + return RXEXIT_RAISE_ERROR; + case InstanceInfo::RAISE: + return RXEXIT_RAISE_ERROR; + } + + // nothing else really testable in a classic fashion + return RXEXIT_NOT_HANDLED; +} + + +RexxReturnCode RexxEntry TestSubcomHandler(CONSTRXSTRING *cmd, unsigned short *flags, PRXSTRING retstr) +{ + *flags = RXSUBCOM_OK; + // ok, a good address...now do the different commands + if (strcmp(cmd->strptr, "GOOD") == 0) + { + strcpy(retstr->strptr, "0"); + retstr->strlength = 1; + return 0; + } + else if (strcmp(cmd->strptr, "ERROR") == 0) + { + strcpy(retstr->strptr, "1"); + retstr->strlength = 1; + *flags = RXSUBCOM_ERROR; + return 0; + } + else if (strcmp(cmd->strptr, "SETVAR") == 0) + { + setContextVariable("TEST1", "Hello World"); + strcpy(retstr->strptr, "0"); + retstr->strlength = 1; + return 0; + } + else if (strcmp(cmd->strptr, "GETVAR") == 0) + { + getContextVariable("TEST1", retstr); + return 0; + } + else + { + strcpy(retstr->strptr, "-1"); + retstr->strlength = 2; + *flags = RXSUBCOM_FAILURE; + return 0; + } +} + +void deregisterSubcomHandler() +{ + RexxDeregisterSubcom("TestSubcomHandler", NULL); +} + + +void REXXENTRY registerSubcomHandler(void *data) +{ + void *userData[2]; + userData[1] = data; + // make sure this is deregistered first + deregisterSubcomHandler(); + RexxRegisterSubcomExe("TestSubcomHandler", (REXXPFN)TestSubcomHandler, (char *)userData); +} + + +void REXXENTRY deregisterExits() +{ + RexxDeregisterExit("TestFunctionExit", NULL); + RexxDeregisterExit("TestObjectFunctionExit", NULL); + RexxDeregisterExit("TestScriptFunctionExit", NULL); + RexxDeregisterExit("TestCommandExit", NULL); + RexxDeregisterExit("TestQueueExit", NULL); + RexxDeregisterExit("TestSessionIOExit", NULL); + RexxDeregisterExit("TestHaltExit", NULL); + RexxDeregisterExit("TestInitExit", NULL); + RexxDeregisterExit("TestNovalueExit", NULL); + RexxDeregisterExit("TestTerminationExit", NULL); + RexxDeregisterExit("TestValueExit", NULL); + RexxDeregisterExit("TestTraceExit", NULL); +} + +void REXXENTRY registerExeExits(void *data) +{ + deregisterExits(); + + void *userData[2]; + userData[1] = data; + + RexxRegisterExitExe("TestFunctionExit", (REXXPFN)TestFunctionExit, (char *)userData); + RexxRegisterExitExe("TestObjectFunctionExit", (REXXPFN)TestObjectFunctionExit, (char *)userData); + RexxRegisterExitExe("TestScriptFunctionExit", (REXXPFN)TestScriptFunctionExit, (char *)userData); + RexxRegisterExitExe("TestCommandExit", (REXXPFN)TestCommandExit, (char *)userData); + RexxRegisterExitExe("TestQueueExit", (REXXPFN)TestQueueExit, (char *)userData); + RexxRegisterExitExe("TestSessionIOExit", (REXXPFN)TestSessionIOExit, (char *)userData); + RexxRegisterExitExe("TestHaltExit", (REXXPFN)TestHaltExit, (char *)userData); + RexxRegisterExitExe("TestInitExit", (REXXPFN)TestInitExit, (char *)userData); + RexxRegisterExitExe("TestNovalueExit", (REXXPFN)TestNovalueExit, (char *)userData); + RexxRegisterExitExe("TestTerminationExit", (REXXPFN)TestTerminationExit, (char *)userData); + RexxRegisterExitExe("TestValueExit", (REXXPFN)TestValueExit, (char *)userData); + RexxRegisterExitExe("TestTraceExit", (REXXPFN)TestTraceExit, (char *)userData); +} + +void REXXENTRY registerDllExits(void *data) +{ + deregisterExits(); + + void *userData[2]; + userData[1] = data; + + RexxRegisterExitDll("TestFunctionExit", "orxexits", "TestFunctionExit", (char *)userData, RXEXIT_DROPPABLE); + RexxRegisterExitDll("TestObjectFunctionExit", "orxexits", "TestObjectFunctionExit", (char *)userData, RXEXIT_DROPPABLE); + RexxRegisterExitDll("TestScriptFunctionExit", "orxexits", "TestScriptFunctionExit", (char *)userData, RXEXIT_DROPPABLE); + RexxRegisterExitDll("TestCommandExit", "orxexits", "TestCommandExit", (char *)userData, RXEXIT_DROPPABLE); + RexxRegisterExitDll("TestQueueExit", "orxexits", "TestQueueExit", (char *)userData, RXEXIT_DROPPABLE); + RexxRegisterExitDll("TestSessionIOExit", "orxexits", "TestSessionIOExit", (char *)userData, RXEXIT_DROPPABLE); + RexxRegisterExitDll("TestHaltExit", "orxexits", "TestHaltExit", (char *)userData, RXEXIT_DROPPABLE); + RexxRegisterExitDll("TestInitExit", "orxexits", "TestInitExit", (char *)userData, RXEXIT_DROPPABLE); + RexxRegisterExitDll("TestNovalueExit", "orxexits", "TestNovalueExit", (char *)userData, RXEXIT_DROPPABLE); + RexxRegisterExitDll("TestTerminationExit", "orxexits", "TestTerminationExit", (char *)userData, RXEXIT_DROPPABLE); + RexxRegisterExitDll("TestValueExit", "orxexits", "TestValueExit", (char *)userData, RXEXIT_DROPPABLE); + RexxRegisterExitDll("TestTraceExit", "orxexits", "TestTraceExit", (char *)userData, RXEXIT_DROPPABLE); +} + + +bool REXXENTRY buildRegisteredExitList(InstanceInfo *instanceInfo, RXSYSEXIT *exitList) +{ + int counter = 0; + if (instanceInfo->fnc.isEnabled()) + { + exitList->sysexit_name = "TestFunctionExit"; + exitList->sysexit_code = RXFNC; + exitList++; + counter++; + } + if (instanceInfo->cmd.isEnabled()) + { + exitList->sysexit_name = "TestCommandExit"; + exitList->sysexit_code = RXCMD; + exitList++; + counter++; + } + if (instanceInfo->msq.isEnabled()) + ... [truncated message content] |