![]() Chapter Contents |
![]() Previous |
![]() Next |
| rxresult |
This
example shows a REXX function package containing
three trigonometric functions:
csqrt
,
csin
, and
ccos
. The routines in the package
can be called either as functions or as subroutines from REXX.
#include <cmsexec.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <options.h>
/* Because this program cannot be invoked directly from the */
/* command line, run-time options should be specified via the */
/* '_options' variable. For example, int _options = _DEBUG; */
static int csin(), ccos(), csqrt();
static double todouble();
static void result();
/* Define the values of 'fncv' and 'fncc'. */
REXX_FNC funlist[] = {csin,ccos,csqrt};
#define NFUNCS sizeof(funlist)/sizeof(REXX_FNC)
void main(int argc, char *argv[]);
{
int rc;
rc = cmsrxfn(argc,argv,NFUNCS,funlist);
/* A positive return code from cmsrxfn() indicates that either */
/* a NUCXDROP RXLOCFN was entered or an ABEND occurred under */
/* CMS. A negative return code indicates that initialization */
/* did not complete. */
if (rc < 0)
puts("RXLOCFN did not initialize.");
}
/* Compute trigonometric sine. Example: x = csin(y) */
static csin(struct REXX_PLIST args[]);
{
register double r;
/* Ensure that there is exactly one argument and that it is */
/* 15 or fewer characters long. (Other validation is probably */
/* useful, but it has been omitted here.) */
if (args->ad == REXX_LAST_AD || args->len > 15 ||
args[1].ad != REXX_LAST_AD)
return 1;
/* Perform other parameter validation as necessary. */
r = todouble(args->ad,args->len); /* Convert to double. */
r = sin(r); /* Get the sine. */
result(r); /* Set REXX 'result' variable. */
return 0; /* Tell REXX it worked. */
}
/* Compute trigonometric cosine. Example: x= ccos(y) */
static ccos(struct REXX_PLIST args[]);
{
register double r;
if (args->ad == REXX_LAST_AD || args->len > 15 ||
args[1].ad != REXX_LAST_AD)
return 1;
r = todouble(args->ad,args->len);
r = cos(r);
result(r);
return 0;
}
/* Compute square root. Example: x = csqrt(y) */
static csqrt(struct REXX_PLIST args[]);
{
register double r;
if (args->ad == REXX_LAST_AD || args->len > 15 ||
args[1].ad != REXX_LAST_AD)
return 1;
r = todouble(args->ad,args->len);
if (r < 0.0)
return 1;
r = sqrt(r);
result(r);
return 0;
}
/* Convert REXX parameter from Adlen to double. */
static double todouble(char *str, int len);
{
char buff[16]; /* Convert string to double. */
double d;
/* Copy to a temporary buffer and add a null terminator. */
memcpy(buff,str,len);
buff[len] = '\0';
d = strtod(buff,0);
return d; /* Return converted argument. */
}
/* Convert function result to char and set REXX result variable. */
static void result(double r);
{
/* Need enough room to handle leading 0, sign, decimal point, */
/* and exponent. */
char buff[15];
/* This is similar to REXX's NUMERIC DIGITS 9 format. */
sprintf(buff,"%.9G",r);
rxresult(buff);
}
![]() Chapter Contents |
![]() Previous |
![]() Next |
![]() Top of Page |
Copyright © 2001 by SAS Institute Inc., Cary, NC, USA. All rights reserved.