tge/lib/maxsdk31/expr.h
2025-02-17 23:17:30 -06:00

114 lines
3.6 KiB
C++
Executable File

/**********************************************************************
*<
FILE: expr.h
DESCRIPTION: expression object include file.
CREATED BY: Don Brittain
HISTORY:
*> Copyright (c) 1994, All Rights Reserved.
**********************************************************************/
#ifndef _EXPR_H_
#define _EXPR_H_
#include "export.h"
#define SCALAR_EXPR 1
#define VECTOR_EXPR 3
#define SCALAR_VAR SCALAR_EXPR
#define VECTOR_VAR VECTOR_EXPR
class Expr;
typedef int (*ExprFunc)(Expr *e, float f);
class DllExport Inst {
public:
ExprFunc func;
float sVal;
};
class ExprVar {
public:
TSTR name;
int type;
int regNum;
};
MakeTab(float);
MakeTab(Point3);
MakeTab(Inst);
MakeTab(ExprVar);
class Expr {
public:
Expr() { sValStk = vValStk = instStk = nextScalar = nextVector = 0; }
~Expr() { deleteAllVars(); }
DllExport int load(char *s);
DllExport int eval(float *ans, int sRegCt, float *sRegs, int vRegCt=0, Point3 *vRegs=NULL);
int getExprType(void) { return exprType; }
TCHAR * getExprStr(void) { return origStr; }
TCHAR * getProgressStr(void){ return progressStr; }
DllExport int defVar(int type, TCHAR *name);
DllExport int getVarCount(int type);
DllExport TCHAR * getVarName(int type, int i);
DllExport int getVarRegNum(int type, int i);
DllExport BOOL deleteAllVars();
DllExport BOOL deleteVar(TCHAR *name);
// pseudo-private: (only to be used by the "instruction" functions
void setExprType(int type) { exprType = type; }
void pushInst(ExprFunc fn, float f)
{ if(instStk >= inst.Count()) inst.SetCount(instStk+30);
inst[instStk].func = fn; inst[instStk++].sVal = f; }
void pushSVal(float f) { if(sValStk>=sVal.Count())sVal.SetCount(sValStk+10);sVal[sValStk++]=f; }
float popSVal() { return sVal[--sValStk]; }
void pushVVal(Point3 &v) { if(vValStk>=vVal.Count())vVal.SetCount(vValStk+10);vVal[vValStk++]=v; }
Point3 & popVVal() { return vVal[--vValStk]; }
int getSRegCt(void) { return sRegCt; }
float getSReg(int index) { return sRegPtr[index]; }
int getVRegCt(void) { return vRegCt; }
Point3 & getVReg(int index) { return vRegPtr[index]; }
ExprVarTab vars; // named variables
private:
TCHAR * exprPtr; // pointer to current str pos during parsing
TCHAR * exprStr; // ptr to original expression string to parse
TSTR origStr; // original expression string that was loaded
TSTR progressStr; // string to hold part of expr successfully parsed
int sRegCt; // actual number of scalar registers passed to "eval"
float *sRegPtr; // pointer to the scalar register array
int vRegCt; // actual number of vector registers passed to "eval"
Point3 *vRegPtr; // pointer to the vector register array
int exprType; // expression type: SCALAR_EXPR or VECTOR_EXPR (set by load)
int sValStk; // scalar value stack
floatTab sVal;
int vValStk; // vector value stack
Point3Tab vVal;
int instStk; // instruction stack
InstTab inst;
int nextScalar; // next scalar slot
int nextVector; // next vector slot
friend yylex();
friend yyerror(char *);
};
#define EXPR_NORMAL 0
#define EXPR_INST_OVERFLOW -1 // instruction stack overflow during parsing
#define EXPR_UNKNOWN_TOKEN -2 // unknown function, const, or reg during parsing
#define EXPR_TOO_MANY_VARS -3 // value stack overflow
#define EXPR_TOO_MANY_REGS -4 // register array overflow, or reg number too big
#define EXPR_CANT_EVAL -5 // function can't be evaluated with given arg
#define EXPR_CANT_PARSE -6 // expression can't be parsed (syntactically)
#endif // _EXPR_H_