|
|
/*****************************************************************************
emoci.h
Owner: DaleG Copyright (c) 1996-1997 Microsoft Corporation
Op-Code Interpreter header file
*****************************************************************************/
#ifndef EMOCI_H
#define EMOCI_H
#include "emocii.h"
MSOEXTERN_C_BEGIN // ***************** Begin extern "C" ********************
//############################################################################
//
// PUBLIC Interfaces
//
//############################################################################
// System Limits
#define msoilOciStackMax 2000
/* M S O O C I S */ /*----------------------------------------------------------------------------
%%Struct: MSOOCIS %%Contact: daleg
Op-Code Interpreter State structure ----------------------------------------------------------------------------*/
// The Interpreter op-code fns must always be compatible with MSOAPICALLTYPE
// so that MSO-exported and app-local functions have the same type
#define MSOOCVAPI MSOOCV MSOAPICALLTYPE
// Define normal function: all args are evaluated and received on the stack
typedef MSOOCV (MSOAPICALLTYPE *MSOPFNOCI)(MSOOCV *pocvSP);
// Define function to return address of variable data
typedef MSOOCV *(MSOAPICALLTYPE *MSOPFNPOCV)(MSOOCII);
typedef struct _MSOOCIS { MSOPFNOCI const *rgpfn; // Function ptr array
MSOOCAD const *rgocadArgDesc; // #Args/Offset arg len
MSOOCV *pocvSP; // Stack pointer
MSOOCV *pocvFP; // Frame pointer
MSOOCV rglStack[msoilOciStackMax]; // Call/Return stack
unsigned char const*rgcbImmedArg; // Immediate arg lens
void *rgocvVar; // Variable array
MSOPFNPOCV pfnPocvGetVar; // Get addr of var data
#ifdef DEBUG
unsigned char **rgszFnNames; // Function names
#endif /* DEBUG */
} MSOOCIS;
// Define non-evaluating function: it must interpret instructions itself
typedef MSOOCV (MSOAPICALLTYPE *MSOPFNOCI_NE) (MSOOCII **ppocii, MSOOCIS *pocis);
/*************************************************************************
Prototypes and macros *************************************************************************/
MSOAPI_(MSOOCIS *) MsoPocisInit( // Init Interp Fn tbl
MSOOCIS *pocis, MSOPFNOCI const *rgpfn, // Function table
MSOOCAD const *rgocadArgDesc, // Arg descript table
unsigned char const*rgcbImmedArg, // Immed arg desc tbl
int ipfnMax, // Num builtin fns
void *rgocvVar, // Variable array
MSOPFNPOCV pfnPocvGetVar // Get addr of var data
);
MSOAPI_(MSOOCV) MsoOcvEvalPocii( // Interpret 1 instr
MSOOCII **ppocii, MSOOCIS *pocis );
MSOAPI_(MSOOCV *) MsoPocvPushVarArgs( // Push var args on stk
int docvArgsFixed, MSOOCII **ppocii, MSOOCIS *pocis );
// NOTE:
// NOTE: The macros below require the parent routine to declare pocvSP!!
// NOTE:
// Return the value of the iocv-th argment on the stack
#define MsoOcvArg(iocv) \
(pocvSP[iocv])
// Return the value of the pointer in the iocv-th argment on the stack
#define MsoPvOcvArg(iocv) \
((void *) (pocvSP[iocv]))
// Convert the pointer value to a interpreter return type
#define MsoOcvFromPv(pv) \
((MSOOCV) (pv))
// Return the value of the char in the iocv-th argment on the stack
#define MsoChOcvArg(iocv) \
((char) (pocvSP[iocv]))
// Convert the char value to a interpreter return type
#define MsoOcvFromCh(ch) \
((MSOOCV) (ch))
// Return the value of the unsigned char in the iocv-th argment on the stack
#define MsoUchOcvArg(iocv) \
((unsigned char) (pocvSP[iocv]))
// Convert the unsigned char value to a interpreter return type
#define MsoOcvFromUch(uch) \
((MSOOCV) (uch))
// Return the value of the int in the iocv-th argment on the stack
#define MsoIntOcvArg(iocv) \
((int) (pocvSP[iocv]))
// Convert the integer value to a interpreter return type
#define MsoOcvFromInt(v) \
((MSOOCV) (v))
// Return the value of the unsigned int in the iocv-th argment on the stack
#define MsoUintOcvArg(iocv) \
((unsigned int) (pocvSP[iocv]))
// Convert the unsigned int value to a interpreter return type
#define MsoOcvFromUint(v) \
((MSOOCV) (v))
// Return the value of the short iocv-th argment on the stack
#define MsoWOcvArg(iocv) \
((short) (pocvSP[iocv]))
// Convert the short value to a interpreter return type
#define MsoOcvFromW(w) \
((MSOOCV) (w))
// Return the value of the unsigned short iocv-th argment on the stack
#define MsoUwOcvArg(iocv) \
((unsigned short) (pocvSP[iocv]))
// Convert the unsigned short value to a interpreter return type
#define MsoOcvFromWw(uw) \
((MSOOCV) (uw))
// Return the value of the long in the iocv-th argment on the stack
#define MsoLOcvArg(iocv) \
((long) (pocvSP[iocv]))
// Convert the long value to a interpreter return type
#define MsoOcvFromL(l) \
((MSOOCV) (l))
// Return the value of the unsigned long in the iocv-th argment on the stack
#define MsoUlOcvArg(iocv) \
((unsigned long) (pocvSP[iocv]))
// Convert the unsigned long value to a interpreter return type
#define MsoOcvFromUl(l) \
((MSOOCV) (l))
// Return the address of the event (var) of index iocv: Application callback
#define MsoOcvEventAddr(iocv, pocis) \
((*(pocis)->pfnPocvGetVar)(iocv))
// Return the address of the stack index
#define MsoOcvStackAddr(docv, pocis) \
(&(pocis)->pocvFP[docv])
// Return the address of a global variable or function
#define MsoOciiGlobalAddr(ipv, pocis) \
(&(pocis)->rgpfn[ipv])
// Return the value of iocv-th argment on the stack
#define MsoOcvStack(iocv) \
((long) (pocvSP[iocv]))
// Supply the rest of the calling arguments to a var-args function call
#define MsoOcv_varargs_0 \
MsoOcvStack(0), MsoOcvStack(1), MsoOcvStack(2), MsoOcvStack(3), \ MsoOcv_varargs_4
#define MsoOcv_varargs_1 \
MsoOcvStack(1), MsoOcvStack(2), MsoOcvStack(3), \ MsoOcv_varargs_4
#define MsoOcv_varargs_2 \
MsoOcvStack(2), MsoOcvStack(3), \ MsoOcv_varargs_4
#define MsoOcv_varargs_3 \
MsoOcvStack(3), \ MsoOcv_varargs_4
#define MsoOcv_varargs_4 \
MsoOcvStack(5), MsoOcvStack(5), MsoOcvStack(6), MsoOcvStack(7), \ MsoOcv_varargs_8
#define MsoOcv_varargs_5 \
MsoOcvStack(5), MsoOcvStack(6), MsoOcvStack(7), \ MsoOcv_varargs_8
#define MsoOcv_varargs_6 \
MsoOcvStack(6), MsoOcvStack(7), \ MsoOcv_varargs_8
#define MsoOcv_varargs_7 \
MsoOcvStack(7), \ MsoOcv_varargs_8
#define MsoOcv_varargs_8 \
MsoOcvStack(8), MsoOcvStack(9), MsoOcvStack(10), MsoOcvStack(11), \ MsoOcv_varargs_12
#define MsoOcv_varargs_9 \
MsoOcvStack(9), MsoOcvStack(10), MsoOcvStack(11), \ MsoOcv_varargs_12
#define MsoOcv_varargs_10 \
MsoOcvStack(10), MsoOcvStack(11), \ MsoOcv_varargs_12
#define MsoOcv_varargs_11 \
MsoOcvStack(11), \ MsoOcv_varargs_12
#define MsoOcv_varargs_12 \
MsoOcvStack(12), MsoOcvStack(13), MsoOcvStack(14), MsoOcvStack(15), \ MsoOcv_varargs_16
#define MsoOcv_varargs_13 \
MsoOcvStack(13), MsoOcvStack(14), MsoOcvStack(15), \ MsoOcv_varargs_16
#define MsoOcv_varargs_14 \
MsoOcvStack(14), MsoOcvStack(15), \ MsoOcv_varargs_16
#define MsoOcv_varargs_15 \
MsoOcvStack(15), \ MsoOcv_varargs_16
#define MsoOcv_varargs_16 \
MsoOcvStack(16), MsoOcvStack(17), MsoOcvStack(18), MsoOcvStack(19), \ MsoOcv_varargs_20
#define MsoOcv_varargs_17 \
MsoOcvStack(17), MsoOcvStack(18), MsoOcvStack(19), \ MsoOcv_varargs_20
#define MsoOcv_varargs_18 \
MsoOcvStack(18), MsoOcvStack(19), \ MsoOcv_varargs_20
#define MsoOcv_varargs_19 \
MsoOcvStack(19), \ MsoOcv_varargs_20
#define MsoOcv_varargs_20 \
MsoOcvStack(20), MsoOcvStack(21), MsoOcvStack(22), MsoOcvStack(23), \ MsoOcv_varargs_24
#define MsoOcv_varargs_21 \
MsoOcvStack(21), MsoOcvStack(22), MsoOcvStack(23), \ MsoOcv_varargs_24
#define MsoOcv_varargs_22 \
MsoOcvStack(22), MsoOcvStack(23), \ MsoOcv_varargs_24
#define MsoOcv_varargs_23 \
MsoOcvStack(23), \ MsoOcv_varargs_24
#define MsoOcv_varargs_24 \
MsoOcvStack(24), MsoOcvStack(25), MsoOcvStack(26), MsoOcvStack(27), \ MsoOcv_varargs_28
#define MsoOcv_varargs_25 \
MsoOcvStack(25), MsoOcvStack(26), MsoOcvStack(27), \ MsoOcv_varargs_28
#define MsoOcv_varargs_26 \
MsoOcvStack(26), MsoOcvStack(27), \ MsoOcv_varargs_28
#define MsoOcv_varargs_27 \
MsoOcvStack(27), \ MsoOcv_varargs_28
#define MsoOcv_varargs_28 \
MsoOcvStack(28), MsoOcvStack(29), MsoOcvStack(30), MsoOcvStack(31)
#define MsoOcv_varargs_29 \
MsoOcvStack(29), MsoOcvStack(30), MsoOcvStack(31)
#define MsoOcv_varargs_30 \
MsoOcvStack(30), MsoOcvStack(31)
#define MsoOcv_varargs_31 \
MsoOcvStack(31)
/*----------------------------------------------------------------------------
Interpreter function list. Should be list in same order as enum for clarity. ----------------------------------------------------------------------------*/
MSOAPI_(MSOOCV) MsoOcv_log_and( MSOOCII **ppocii, struct _MSOOCIS *pocis ); MSOAPI_(MSOOCV) MsoOcv_log_or( MSOOCII **ppocii, struct _MSOOCIS *pocis ); MSOAPI_(MSOOCV) MsoOcv_log_not(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_less_than(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_less_eql(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_eql(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_gtr_eql(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_gtr_than(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_not_eql(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_assign(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_plus(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_minus(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_mult(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_divide(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_mod(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_increment(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_decrement(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_unary_plus(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_unary_minus(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_bitwise_not(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_bitwise_and(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_bitwise_or(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_bitwise_xor(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_shift_l(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_shift_r(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_dereference(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_addr_of(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_cast_as(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_if( MSOOCII **ppocii, struct _MSOOCIS *pocis ); MSOAPI_(MSOOCV) MsoOcv_inline_if( MSOOCII **ppocii, struct _MSOOCIS *pocis ); MSOAPI_(MSOOCV) MsoOcv_let( MSOOCII **ppocii, struct _MSOOCIS *pocis ); MSOAPI_(MSOOCV) MsoOcv_compound_stmt( MSOOCII **ppocii, struct _MSOOCIS *pocis ); MSOAPI_(MSOOCV) MsoOcv_progn( MSOOCII **ppocii, struct _MSOOCIS *pocis ); MSOAPI_(MSOOCV) MsoOcv_get_char(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_get_uchar(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_get_short(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_get_ushort(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_get_int(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_get_uint(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_get_long(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_get_ulong(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_get_float(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_get_double(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_get_ldouble(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_set_char(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_set_uchar(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_set_short(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_set_ushort(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_set_int(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_set_uint(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_set_long(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_set_ulong(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_set_float(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_set_double(MSOOCV *pocvSP); MSOAPI_(MSOOCV) MsoOcv_set_ldouble(MSOOCV *pocvSP);
//############################################################################
//
// PRIVATE Interfaces
//
// To use, #define _OCI_PRIVATE
//
//############################################################################
#ifdef _OCI_PRIVATE
// Return the Argument descriptor associated with the function
#define OcadArgDecripOcii(ocii, pocis) \
((pocis)->rgocadArgDesc[ocii])
// Return the Argument descriptor list associated with the function
#define PcbArgFromOcad(ocad, pocis) \
(&(pocis)->rgcbImmedArg[ocad])
#endif /* _OCI_PRIVATE */
MSOEXTERN_C_END // ****************** End extern "C" *********************
#endif /* !EMOCI_H */
|