home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / testrf.zip / testrfnc.c next >
Text File  |  1993-12-30  |  4KB  |  163 lines

  1. // Include files
  2.  
  3. // Rexx External Function testing program.
  4.  
  5. // This program allows you to debug your Rexx external functions (written in
  6. // 'C') under IPMD in a relatively straight forward manner.
  7.  
  8. // It is being released into the public domain by the author:
  9. //   Dave Boll
  10. //   Compuserve : 74170,2016
  11. //   IBMLink    : USFMCFKF
  12.  
  13. #define INCL_DOS
  14. #define INCL_ERRORS
  15. #include <os2.h>
  16. #define INCL_REXXSAA
  17. #include <rexxsaa.h>
  18. #include <stdio.h>
  19. #include <string.h>
  20. #include <stdlib.h>
  21. #define  VALID_ROUTINE   0
  22. #define  INVALID_ROUTINE 40
  23.  
  24. RexxFunctionHandler  RxJoeFunc;
  25. typedef RexxFunctionHandler * PRexxFunctionHandler;
  26. ULONG   loadApi(PSZ dllname, PSZ procname, ULONG ordinal, PFN* pprocaddr);
  27.  
  28. // Global variables
  29. PRexxFunctionHandler prxfunc=(PRexxFunctionHandler)NULL;
  30.  
  31. int main(int argc, char *argv[])
  32.  
  33. {
  34.  
  35.   RXSTRING rexxretval;                // return value from Rexx
  36.   APIRET   rc;                        // return code from Rexx
  37.   SHORT    rexxrc = 0;                // return code from function
  38.   RXSTRING execargs[20];
  39.   ULONG    ulCtr;
  40.   HMODULE  hmod;
  41.   UCHAR    modname[300];
  42.  
  43.   if (argc < 4)
  44.     {
  45.     printf("Must supply name of Rexx program to run, external function entry point name, DLL name\n");
  46.     return;
  47.     }
  48.  
  49.   // Fold function/procedure name to upper case
  50.   strupr(argv[2]);
  51.   if (!loadApi(argv[3],argv[2],0,(PFN *)&prxfunc))
  52.     {
  53.     printf("Could not find entry point '%s' of DLL '%s'\n",argv[2],argv[3]);
  54.     return;
  55.     }
  56.   DosQueryModuleHandle(argv[3],&hmod);
  57.   memset(modname,0x00,sizeof(modname));
  58.   DosQueryModuleName(hmod,sizeof(modname)-1,modname);
  59.  
  60.   printf("Executing Rexx Program '%s'\n",argv[1]);
  61.   printf("to test external function '%s' in DLL '%s'\n",argv[2],modname);
  62.  
  63.   RexxRegisterFunctionExe(argv[2],(PFN)RxJoeFunc);
  64.  
  65.   for (ulCtr=4;ulCtr < argc;ulCtr++)
  66.     {
  67.     execargs[ulCtr-4].strptr = argv[ulCtr];
  68.     execargs[ulCtr-4].strlength = strlen(argv[ulCtr]);
  69.     }
  70.  
  71.   MAKERXSTRING(rexxretval, NULL, 0);      // null out RXSTRING
  72.   rc=RexxStart((LONG)      argc-4,        // number of arguments
  73.               (PRXSTRING)  &execargs[0],  // arguments
  74.               (PSZ)        argv[1],       // name of REXX file
  75.               (PRXSTRING)  0,             // No INSTORE used
  76.               (PSZ)        NULL,          // Command env. name
  77.               (LONG)       RXCOMMAND,     // Code for how invoked
  78.               (PRXSYSEXIT) 0,             // No EXITs on this call
  79.               (PSHORT)     &rexxrc,       // Rexx program output
  80.               (PRXSTRING)  &rexxretval ); // Rexx program output
  81.  
  82.   DosFreeMem(rexxretval.strptr);
  83.  
  84.   return 0;
  85.  
  86. }
  87.  
  88. // Function which calls real Rexx function
  89. ULONG  RxJoeFunc(PSZ name, ULONG numargs, RXSTRING args[],
  90.                  PSZ queuename, PRXSTRING retstr)
  91.  
  92. {
  93.   ULONG funcrc;
  94.   funcrc = (*prxfunc)((PSZ)name,(ULONG)numargs,(PRXSTRING)&args[0],
  95.                       (PSZ)queuename,(PRXSTRING)retstr);
  96.   return funcrc;
  97. }
  98.  
  99. // Load a function API
  100. ULONG loadApi(PSZ dllname, PSZ procname, ULONG ulOrdinal, PFN * pprocaddr)
  101.  
  102. {
  103.  
  104.   APIRET    rc;
  105.   HMODULE   hmod;
  106.   ULONG     ulProcType = 0;
  107.   PFN       pfnProcAddr;
  108.  
  109.   rc = DosQueryModuleHandle(dllname, &hmod);
  110.   switch (rc)
  111.     {
  112.     case 0:    // Ok
  113.       break;
  114.     case ERROR_MOD_NOT_FOUND:  // Module Not Found (126)
  115.       rc = DosLoadModule((PSZ)NULL, (ULONG)0, dllname, &hmod);
  116.       if (rc)
  117.         return 0;
  118.       break;
  119.     default:
  120.       return 0;
  121.       break;
  122.     }
  123.  
  124.   rc = DosQueryProcAddr(hmod, ulOrdinal, procname,
  125.                         &pfnProcAddr);
  126.   switch (rc)
  127.     {
  128.     case 0:
  129.       break;
  130.     case ERROR_INVALID_HANDLE:
  131.       rc = DosLoadModule((PSZ)NULL, (ULONG)0, dllname, &hmod);
  132.       if (rc)
  133.         return 0;
  134.       rc = DosQueryProcAddr(hmod, ulOrdinal, procname,
  135.                             &pfnProcAddr);
  136.       if (rc)
  137.         return 0;
  138.       break;
  139.     default:
  140.       return 0;
  141.       break;
  142.     }
  143.  
  144.   *pprocaddr = (PFN) pfnProcAddr;
  145.  
  146.   rc = DosQueryProcType(hmod, ulOrdinal, procname,
  147.                         &ulProcType);
  148.   switch (ulProcType)
  149.     {
  150.     case PT_16BIT:
  151.       return 16;
  152.       break;
  153.     case PT_32BIT:
  154.       return 32;
  155.       break;
  156.     default:
  157.       return 0;
  158.       break;
  159.     }
  160.  
  161.   return 0;
  162. }
  163.