Chapter Contents

Previous

Next
cmsrxfn

cmsrxfn



Create a REXX Function Package

Portability: SAS/C extension


SYNOPSIS
DESCRIPTION
RETURN VALUE
CAUTIONS
IMPLEMENTATION
EXAMPLE


SYNOPSIS

#include <cmsexec.h>
int cmsrxfn(int argc, const char *argv[], int fncc,
            REXX_FNC fncv[]);


DESCRIPTION

cmsrxfn defines a set of C functions that can be called directly from the System Product Interpreter (REXX). fncc specifies the number of functions that can be called in this manner, and fncv is a pointer to an array of function pointers. Each function pointer in the array points to a function of type REXX_FNC that can be called by REXX. The argc and argv parameters are the command-line parameters passed to the main function in the C function package. These parameters should not be altered before passing them to cmsrxfn .


RETURN VALUE

The nature of cmsrxfn is such that it does not return under usual circumstances. Therefore, cmsrxfn does not return the normal successful return code of 0 . If cmsrxfn cannot allocate enough storage for control blocks or cannot install the module as a nucleus extension, it returns -1 . If the module is terminated by an ABEND under CMS, cmsrxfn returns 1 . If the module is terminated by a NUCXDROP command, cmsrxfn returns 2 .


CAUTIONS

REXX typically calls a function package with a parameter list of the following form:

RXLOCFN LOAD FUNC1

This parameter list is passed to the main function via argc and argv . These parameters should be passed directly to cmsrxfn without modification.

REXX calls a function in a function package with a parameter list in the form of an array of pairs of character pointers and integers, each pair describing a parameter. (Refer to The SAS/C Library Interface and the REXX Extended Plist). All parameters, including numbers, are in character format. The array is terminated with a char * , int pair where the value of the char * is REXX_LAST_AD (defined in <cmsexec.h> ), and the value of the int is REXX_LAST_LEN.

The result value, assigned to the REXX variable RESULT, also should be in character format.

If a C function called as a REXX function (identified as such in the array pointed to by fncv ) returns a nonzero value via the RETURN statement, REXX ignores any RESULT value returned by the function. To set the REXX variable RC, use cmsshv . To assign a value to the REXX variable RESULT or to return a value from a C function called as a REXX function, use rxresult or rxeval .


IMPLEMENTATION

cmsrxfn causes the program to be installed as a REXX function package.


EXAMPLE

#include <cmsexec.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

static int list();                  /* Declare REXX external function.*/
REXX_FNC rxfncs[] = {& list};

void main(int argc, char *argv[] )
{
   int rc;
      /* Call cmsrxfn, passing the argc, argv parameters, the number  */
      /* of functions to define (1), and an array of pointers to the  */
      /* function(s).                                                 */
   rc = cmsrxfn(argc, argv, 1, rxfncs);
   printf("cmsrxfn completed with return code %d\n",rc);
}

   /* This REXX function types a note indicating whether it was       */
   /* called as a function or as a subroutine (via a REXX call        */
   /* statement ). It then lists the arguments it was called with     */
   /* and sets the value of the REXX variable RESULT to the number    */
   /* of arguments.                                                   */
static list(args, subflag)
struct REXX_PLIST args[];
int subflag;
{
   int n;                           /* number of arguments passed     */
   char result_buffer[3];           /* buffer for REXX RESULT string  */

   if (subflag)      /* Were we called as a subroutine or a function? */
      puts("Called as a subroutine.");
   else
      puts("Called as a function.");
      /* Count arguments and print.  REXX will provide up to ten      */
      /* argument strings.                                            */
   for (n = 0; args[n].len != REXX_LAST_LEN; n++)
      if (args[n].ad != NULL)
         printf("Argument %d: "%.*s"\n",
                n, args[n].len, args[n].ad);
      else
         printf("Argument %d: (Omitted)\n", n);
   if (n == 0) puts("No arguments passed.");
      /* Convert 'n' to string and set REXX RESULT variable.     */
   sprintf(result_buffer, "%d", n);
   rxresult(result_buffer);
   return 0;
}


Chapter Contents

Previous

Next

Top of Page

Copyright © 2001 by SAS Institute Inc., Cary, NC, USA. All rights reserved.