fis-gtm/sr_unix/fgncalsp.h

159 lines
4.7 KiB
C

/****************************************************************
* *
* Copyright 2001, 2012 Fidelity Information Services, Inc *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
#ifndef __FGNCALSP_H__
#define __FGNCALSP_H__
/* fgncalsp.h - UNIX foreign calls (d &package.label) */
#define MAX_NAME_LENGTH 255 /* Maximum length of file name */
#define PACKAGE_ENV_PREFIX "GTMXC" /* Prefix for environemnt variable containing
* external call table name */
#define CALLIN_ENV_NAME "GTMCI" /* Call-in table environment variable */
#define MAX_ERRSTR_LEN 1024 /* Maximum length of the error string returned
* by dlerror(). Couldn't find any system
* defined length, 1024 is just arbitrary */
#define MAX_TABLINE_LEN 1024 /* Maximum length of a line estimated to be sufficient
* to specify MAX_ACTUALS parameters in the
* callin/xcall table */
#define UNKNOWN_SYSERR "unknown system error"
#define COPY_DLLERR_MSG(err_ptr, err_buf) \
{ \
int len = 0; \
\
if ((err_ptr = dlerror()) != NULL) \
{ \
len = real_len(SIZEOF(err_buf) - 1, (uchar_ptr_t)err_ptr); \
strncpy(err_buf, err_ptr, len); \
err_buf[len] = '\0'; \
} else \
{ /* Ensure we will not overrun err_buf limits */ \
assert(ARRAYSIZE(UNKNOWN_SYSERR) < ARRAYSIZE(err_buf)); \
STRCPY(err_buf, UNKNOWN_SYSERR); \
} \
}
typedef int4 (*fgnfnc)();
typedef void (*clnupfptr)();
struct extcall_string
{
#ifdef __osf__
int len;
#else
long len;
#endif
char *addr;
};
/* A chain of packages, each package has a list of "entries", that is external routine entry points. */
struct extcall_package_list
{
struct extcall_package_list *next_package;
struct extcall_entry_list *first_entry;
void_ptr_t package_handle;
mstr package_name;
clnupfptr package_clnup_rtn;
};
enum xc_types
{
xc_notfound,
xc_void,
xc_status,
xc_int,
xc_uint,
xc_long,
xc_ulong,
xc_float,
xc_double,
xc_int_star,
xc_uint_star,
xc_long_star,
xc_ulong_star,
xc_string_star,
xc_float_star,
xc_char_star,
xc_char_starstar,
xc_double_star,
xc_pointertofunc,
xc_pointertofunc_star
};
enum callintogtm_fncs {
xc_hiber_start,
xc_hiber_start_any,
xc_start_timer,
xc_cancel_timer,
xc_gtm_malloc,
xc_gtm_free,
xc_unknown_function
};
/* There is one of these for each external routine. Each is owned by a package. */
struct extcall_entry_list
{
struct extcall_entry_list *next_entry;
enum xc_types return_type; /* function return value */
int ret_pre_alloc_val; /* amount of space to be pre-allocated for the return type */
uint4 input_mask; /* is it an input parameter lsb = 1st parm */
uint4 output_mask; /* is it an output parameter lsb = 1st parm */
int parmblk_size; /* size in bytes of parameter block to be allocated for call*/
int argcnt; /* number of arguments */
enum xc_types *parms; /* pointer to parameter array */
int *param_pre_alloc_size; /* amount of space to be pre-allocated for the parameters */
fgnfnc fcn; /* address of runtime routine */
mstr entry_name; /* name of M entryref */
mstr call_name; /* corresponding name of C function */
};
/* A list of entries in the call-in table each indicating the signature of
a call-in routine */
typedef struct callin_entry_list
{
mstr label_ref; /* labelref name of M routine */
mstr call_name; /* corresponding name of C function */
uint4 input_mask; /* input parameter? LSB = 1st parm */
uint4 output_mask; /* output parameter? LSB = 1st parm */
unsigned short argcnt; /* number of arguments */
enum xc_types return_type;
enum xc_types *parms; /* parameter types */
struct callin_entry_list *next_entry;
} callin_entry_list;
/* parameter block that ci_restart uses to pass arguments to M routine */
typedef struct parmblk_struct
{
void (*ci_rtn)(void);
int4 argcnt;
void *rtnaddr, *labaddr, *retaddr;
int4 mask;
lv_val *args[MAX_ACTUALS];
} parmblk_struct;
#include "rtnhdr.h"
/* function prototypes */
void_ptr_t fgn_getpak(char *pak_name, int msgtype);
fgnfnc fgn_getrtn(void_ptr_t pak_handle, mstr *sym_name, int msgtype);
void fgn_closepak(void_ptr_t pak_handle, int msgtype);
int fgncal_getint(mstr *inp);
int fgncal_read_args(mstr *inp);
void fgncal_getstr(mstr *inp, mstr *str);
void fgncal_lkbind(mstr *inp);
void fgn_glopref(mval *v);
struct extcall_package_list *exttab_parse (mval *package);
callin_entry_list *citab_parse (void);
#endif