Initial commit
This commit is contained in:
113
Torque/SDK/lib/maxsdk40/expr.h
Normal file
113
Torque/SDK/lib/maxsdk40/expr.h
Normal file
@@ -0,0 +1,113 @@
|
||||
/**********************************************************************
|
||||
*<
|
||||
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_
|
||||
Reference in New Issue
Block a user