While it is possible to compile the wpipe1 example on Unix, there is one 
irregularity: when
displaying the variable "result", upon return of registering the external 
functions it will show
garbage instead of "0" (return code of the loader function).

Here the code snippet from "rexxasp1.c":

    /*********************************************************************/
    /* Numeric Return calls                                              */
    /*********************************************************************/

    #define  INVALID_ROUTINE 10            /* Raise Rexx error           */
    #define  VALID_ROUTINE    0            /* Successful completion      */

    #ifdef __cplusplus
    extern "C" {
    #endif

    /*********************************************************************/
    /* AspiFncTable                                                      */
    /*   Array of names of the REXXASP1 functions.                       */
    /*   This list is used for registration and deregistration.          */
    /*********************************************************************/
    static const char *AspiFncTable[] =
       {
          "Aspi_Output_From_C",
          "Aspi_Output_From_REXX",
          "Aspi_Exchange_Data",
          "AspiDeregFunc"
       };


    /*************************************************************************
    * Function:  AspiLoadFuncs                                               *
    *                                                                        *
    * Syntax:    call AspiLoadFuncs                                          *
    *                                                                        *
    * Params:    none                                                        *
    *                                                                        *
    * Return:    null string                                                 *
    *************************************************************************/

    RexxReturnCode REXXENTRY AspiLoadFuncs(
        const char *name,                    /* Function name              */
        size_t numargs,                      /* Number of arguments        */
        CONSTRXSTRING args[],                /* Argument array             */
        const char * queuename,              /* Current queue              */
        PRXSTRING retstr )                   /* Return RXSTRING            */
    {
      int    entries;                      /* Num of entries             */
      int    j;                            /* Counter                    */


      entries = sizeof(AspiFncTable)/sizeof(const char *);

      for (j = 0; j < entries; j++)
      {
        fprintf(stderr,"AspiLoadFuncs: registering # %d: 
[%s]\n",j,AspiFncTable[j]);

        RexxRegisterFunctionDll(AspiFncTable[j], "rexxasp1", AspiFncTable[j]);
      }

      fprintf(stderr,"AspiLoadFuncs: VALID_ROUTINE=%d\n",VALID_ROUTINE);

      return VALID_ROUTINE;
    }

Here the Linux Makefile:

    DLL_LFLAGS = -shared
    OOREXX_CFLAGS =  -fPIC

    all: librexxasp1.so

    rexxasp1.o: rexxasp1.c
        gcc -c rexxasp1.c $(OOREXX_CFLAGS) -o rexxasp1.o 

    librexxasp1.so: rexxasp1.o
        gcc rexxasp1.o ${DLL_LFLAGS} -o librexxasp1.so 

    clean:
        rm -f *.so *.o libwpipe1.so  librexxasp1.so

Here the Rexx script using the library (note on Linux one needs to prefix the 
command with
LD_LIBRARY_PATH pointing to the directory where the library resides):

    all RxFuncAdd "AspiLoadFuncs", "rexxasp1", "AspiLoadFuncs"
    -- Call RxFuncAdd "AspiLoadFuncs", "wpipe1", "AspiLoadFuncs"
    say "1) rc:" rc "result="result
    Call AspiLoadFuncs
    say "2) rc:" rc "result="result

    call Aspi_Output_From_C

    call Aspi_Output_From_REXX
    say RESULT

    a = 'This is a String'

    Say Aspi_Exchange_Data(23456,888, a)

    call AspiDeregFunc

Here the output on Linux (the same problem exists on Mac, just different 
garbage gets displayed):

    

It looks as if a stray pointer gets returned for "result" instead of "0".

After a while it occurred to me that this is the 32-bit SAA version of the Rexx 
API which supposedly
has problems with 64-bit with ooRexx. Could this be the reason/cause?

---rony


_______________________________________________
Oorexx-devel mailing list
Oorexx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/oorexx-devel

Reply via email to