home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
testrf.zip
/
testrfnc.c
next >
Wrap
Text File
|
1993-12-30
|
4KB
|
163 lines
// Include files
// Rexx External Function testing program.
// This program allows you to debug your Rexx external functions (written in
// 'C') under IPMD in a relatively straight forward manner.
// It is being released into the public domain by the author:
// Dave Boll
// Compuserve : 74170,2016
// IBMLink : USFMCFKF
#define INCL_DOS
#define INCL_ERRORS
#include <os2.h>
#define INCL_REXXSAA
#include <rexxsaa.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define VALID_ROUTINE 0
#define INVALID_ROUTINE 40
RexxFunctionHandler RxJoeFunc;
typedef RexxFunctionHandler * PRexxFunctionHandler;
ULONG loadApi(PSZ dllname, PSZ procname, ULONG ordinal, PFN* pprocaddr);
// Global variables
PRexxFunctionHandler prxfunc=(PRexxFunctionHandler)NULL;
int main(int argc, char *argv[])
{
RXSTRING rexxretval; // return value from Rexx
APIRET rc; // return code from Rexx
SHORT rexxrc = 0; // return code from function
RXSTRING execargs[20];
ULONG ulCtr;
HMODULE hmod;
UCHAR modname[300];
if (argc < 4)
{
printf("Must supply name of Rexx program to run, external function entry point name, DLL name\n");
return;
}
// Fold function/procedure name to upper case
strupr(argv[2]);
if (!loadApi(argv[3],argv[2],0,(PFN *)&prxfunc))
{
printf("Could not find entry point '%s' of DLL '%s'\n",argv[2],argv[3]);
return;
}
DosQueryModuleHandle(argv[3],&hmod);
memset(modname,0x00,sizeof(modname));
DosQueryModuleName(hmod,sizeof(modname)-1,modname);
printf("Executing Rexx Program '%s'\n",argv[1]);
printf("to test external function '%s' in DLL '%s'\n",argv[2],modname);
RexxRegisterFunctionExe(argv[2],(PFN)RxJoeFunc);
for (ulCtr=4;ulCtr < argc;ulCtr++)
{
execargs[ulCtr-4].strptr = argv[ulCtr];
execargs[ulCtr-4].strlength = strlen(argv[ulCtr]);
}
MAKERXSTRING(rexxretval, NULL, 0); // null out RXSTRING
rc=RexxStart((LONG) argc-4, // number of arguments
(PRXSTRING) &execargs[0], // arguments
(PSZ) argv[1], // name of REXX file
(PRXSTRING) 0, // No INSTORE used
(PSZ) NULL, // Command env. name
(LONG) RXCOMMAND, // Code for how invoked
(PRXSYSEXIT) 0, // No EXITs on this call
(PSHORT) &rexxrc, // Rexx program output
(PRXSTRING) &rexxretval ); // Rexx program output
DosFreeMem(rexxretval.strptr);
return 0;
}
// Function which calls real Rexx function
ULONG RxJoeFunc(PSZ name, ULONG numargs, RXSTRING args[],
PSZ queuename, PRXSTRING retstr)
{
ULONG funcrc;
funcrc = (*prxfunc)((PSZ)name,(ULONG)numargs,(PRXSTRING)&args[0],
(PSZ)queuename,(PRXSTRING)retstr);
return funcrc;
}
// Load a function API
ULONG loadApi(PSZ dllname, PSZ procname, ULONG ulOrdinal, PFN * pprocaddr)
{
APIRET rc;
HMODULE hmod;
ULONG ulProcType = 0;
PFN pfnProcAddr;
rc = DosQueryModuleHandle(dllname, &hmod);
switch (rc)
{
case 0: // Ok
break;
case ERROR_MOD_NOT_FOUND: // Module Not Found (126)
rc = DosLoadModule((PSZ)NULL, (ULONG)0, dllname, &hmod);
if (rc)
return 0;
break;
default:
return 0;
break;
}
rc = DosQueryProcAddr(hmod, ulOrdinal, procname,
&pfnProcAddr);
switch (rc)
{
case 0:
break;
case ERROR_INVALID_HANDLE:
rc = DosLoadModule((PSZ)NULL, (ULONG)0, dllname, &hmod);
if (rc)
return 0;
rc = DosQueryProcAddr(hmod, ulOrdinal, procname,
&pfnProcAddr);
if (rc)
return 0;
break;
default:
return 0;
break;
}
*pprocaddr = (PFN) pfnProcAddr;
rc = DosQueryProcType(hmod, ulOrdinal, procname,
&ulProcType);
switch (ulProcType)
{
case PT_16BIT:
return 16;
break;
case PT_32BIT:
return 32;
break;
default:
return 0;
break;
}
return 0;
}