00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef __WXEVAL_H__
00011 #define __WXEVAL_H__
00012
00013 #ifndef WX_PRECOMP
00014 #include "wx/wx.h"
00015 #endif
00016
00017 #if !wxUSE_EXCEPTIONS
00018 #include <setjmp.h>
00019 #endif
00020
00021 #ifdef A2DEDITORMAKINGDLL
00022 #define A2DEDITORDLLEXP WXEXPORT
00023 #define A2DEDITORDLLEXP_DATA(type) WXEXPORT type
00024 #define A2DEDITORDLLEXP_CTORFN
00025 #elif defined(WXART2D_USINGDLL)
00026 #define A2DEDITORDLLEXP WXIMPORT
00027 #define A2DEDITORDLLEXP_DATA(type) WXIMPORT type
00028 #define A2DEDITORDLLEXP_CTORFN
00029 #else // not making nor using DLL
00030 #define A2DEDITORDLLEXP
00031 #define A2DEDITORDLLEXP_DATA(type) type
00032 #define A2DEDITORDLLEXP_CTORFN
00033 #endif
00034
00035
00036 #define TYPENUMBER double
00037
00038 #define VARLEN 15
00039 #define TOKLEN 30
00040
00041 #define VAR 1
00042 #define DEL 2
00043 #define NUM 3
00044
00045
00046
00047
00048
00049 class A2DEDITORDLLEXP a2dEvalVar
00050 {
00051 public:
00052
00053 a2dEvalVar( const wxString& name, TYPENUMBER value )
00054 {
00055 m_name = name;
00056 m_value = value;
00057 }
00058
00059 ~a2dEvalVar() {}
00060
00061 wxString m_name;
00062 TYPENUMBER m_value;
00063 };
00064
00065
00066
00067
00068
00069
00070 class A2DEDITORDLLEXP a2dEvalFunction
00071 {
00072 typedef TYPENUMBER (*fArgX)(...);
00073
00074 public:
00075
00076
00077 typedef TYPENUMBER (*fArg1)(TYPENUMBER);
00078 typedef TYPENUMBER (*fArg2)(TYPENUMBER, TYPENUMBER);
00079
00080
00081 a2dEvalFunction( const wxString& name, fArg1 func)
00082 {
00083 m_name=name;
00084 m_args=1;
00085 m_func=(fArgX)func;
00086 }
00087
00088 a2dEvalFunction( const wxString& name, fArg2 func) {
00089 m_name=name;
00090 m_args=2;
00091 m_func=(fArgX)func;
00092 }
00093
00094 wxString m_name;
00095 int m_args;
00096 fArgX m_func;
00097 };
00098
00099 #include <wx/listimpl.cpp>
00100 WX_DECLARE_LIST_WITH_DECL( a2dEvalFunction, a2dFunctionList, class A2DEDITORDLLEXP );
00101 WX_DECLARE_LIST_WITH_DECL( a2dEvalVar, a2dVariableList, class A2DEDITORDLLEXP );
00102
00103
00104
00105 #define iswhite(c) (c == _T(' ') || c == _T('\t'))
00106 #define isnumer(c) ((c >= _T('0') && c <= _T('9')) || c == _T('.'))
00107 #define isalphaeval(c) ((c >= _T('a') && c <= _T('z')) || (c >= _T('0') && c <= _T('9')) \
00108 || c == _T('_'))
00109 #define isdelim(c) (c == _T('+') || c == _T('-') || c == _T('*') || c == _T('/') || c == _T('%') \
00110 || c == _T('^') || c == _T('(') || c == _T(')') || c == _T(',') || c == _T('='))
00111
00112
00113 #define E_OK 0
00114 #define E_SYNTAX 1
00115 #define E_UNBALAN 2
00116 #define E_DIVZERO 3
00117 #define E_UNKNOWN 4
00118 #define E_MAXVARS 5
00119 #define E_BADFUNC 6
00120 #define E_NUMARGS 7
00121 #define E_NOARG 8
00122 #define E_EMPTY 9
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142 class A2DEDITORDLLEXP a2dEval
00143 {
00144
00145 public:
00146
00147 a2dEval();
00148
00149 ~a2dEval();
00150
00151 void SetEvalString( const wxString& toEval ) { m_eval = toEval; }
00152
00153 bool GetSymbol( const wxString& envname, TYPENUMBER* envValue );
00154
00155 void ClearAllVars();
00156
00157 bool ClearVar( const wxString& name );
00158
00159 int Evaluate( TYPENUMBER* result, int* a );
00160
00161 void Parse();
00162
00163 bool GetValue( const wxString& name, TYPENUMBER* value );
00164
00165 bool SetValue( const wxString& name, TYPENUMBER value );
00166
00167 a2dFunctionList m_functions;
00168 a2dVariableList m_vars;
00169 a2dVariableList m_const;
00170
00171 protected:
00172
00173 int Level1( TYPENUMBER* r );
00174 void Level2( TYPENUMBER* r );
00175 void Level3( TYPENUMBER* r );
00176 void Level4( TYPENUMBER* r );
00177 void Level5( TYPENUMBER* r );
00178 void Level6( TYPENUMBER* r );
00179
00180 private:
00181
00182 wxString m_eval;
00183
00184
00185 wxChar* m_expression;
00186
00187 wxString m_tokenstr;
00188
00189
00190 wxChar* m_token;
00191
00192
00193 int m_type;
00194
00195 #if !wxUSE_EXCEPTIONS
00196
00197 jmp_buf m_jb;
00198 #endif
00199 };
00200
00201 #endif
00202