00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
#ifndef __XB_EXP_H__
00047
#define __XB_EXP_H__
00048
00049
#ifdef __GNUG__
00050
#pragma interface
00051
#endif
00052
00053
#include <xbase/xbase.h>
00054
00055
#ifdef XB_EXPRESSIONS
00056
00057
#define XB_EXPRESSION xbExpNode
00058
00059
#include <xbase/xtypes.h>
00060
#include <xbase/xstack.h>
00061
00065
#undef ABS
00066
#undef MIN
00067
#undef MAX
00068
00069
class XBDLLEXPORT xbDbf;
00070
00072
00075
struct XBDLLEXPORT xbFuncDtl {
00076
const char * FuncName;
00077
xbShort ParmCnt;
00078
char ReturnType;
00079 void (*ExpFuncPtr)();
00080 };
00081
00083
00086
class XBDLLEXPORT xbExpNode {
00087
public:
00088
char * NodeText;
00089
char Type;
00090
xbShort Len;
00091
xbShort InTree;
00092 xbExpNode * Node;
00093 xbExpNode * Sibling1;
00094 xbExpNode * Sibling2;
00095 xbExpNode * Sibling3;
00096
00097
xbShort DataLen;
00098
xbShort ResultLen;
00099
00100
xbString StringResult;
00101
xbDouble DoubResult;
00102
xbShort IntResult;
00103
00104
xbDbf * dbf;
00105
xbShort FieldNo;
00106
char ExpressionType;
00107
00108
00109
public:
00110 xbExpNode();
00111
virtual ~xbExpNode();
00112 };
00113
00115
00118
00119
00120
class XBDLLEXPORT xbExpn :
public xbStack,
public xbDate {
00121
public:
00122
xbShort ProcessExpression( xbExpNode *, xbShort );
00123 xbExpNode * GetTree(
void ) {
return Tree; }
00124
void SetTreeToNull(
void ) { Tree = NULL; }
00125 xbExpNode * GetFirstTreeNode( xbExpNode * );
00126
00127 xbExpn(
void );
00128
virtual ~xbExpn();
00129
00130
xbShort GetNextToken(
const char *s, xbShort MaxLen);
00131
00132
00133
xbDouble ABS( xbDouble );
00134
xbLong ASC(
const char * );
00135
xbLong AT(
const char *,
const char * );
00136
char * CDOW(
const char * );
00137
char * CHR( xbLong );
00138
char * CMONTH(
const char * );
00139
char * DATE();
00140
xbLong DAY(
const char * );
00141
xbLong DESCEND(
const char * );
00142
xbLong DOW(
const char * );
00143
char * DTOC(
const char * );
00144
char * DTOS(
const char * );
00145
xbDouble EXP( xbDouble );
00146
xbLong INT( xbDouble );
00147
xbLong ISALPHA(
const char * );
00148
xbLong ISLOWER(
const char * );
00149
xbLong ISUPPER(
const char * );
00150
char * LEFT(
const char *, xbShort );
00151
xbLong LEN(
const char * );
00152
xbDouble LOG( xbDouble );
00153
char * LOWER(
const char * );
00154
char * LTRIM(
const char * );
00155
xbDouble MAX( xbDouble, xbDouble );
00156
xbLong MONTH(
const char * );
00157
xbDouble MIN( xbDouble, xbDouble );
00158
char * RECNO( xbULong );
00159
xbLong RECNO( xbDbf * );
00160
char * REPLICATE(
const char *, xbShort );
00161
char * RIGHT(
const char *, xbShort );
00162
char * RTRIM(
const char * );
00163
char * SPACE( xbShort );
00164
xbDouble SQRT( xbDouble );
00165
char * STR(
const char * );
00166
char * STR(
const char *, xbShort );
00167
char * STR(
const char *, xbShort, xbShort );
00168
char * STR( xbDouble );
00169
char * STR( xbDouble, xbShort );
00170
char * STR(xbDouble,
xbUShort length, xbShort numDecimals );
00171
char * STRZERO(
const char * );
00172
char * STRZERO(
const char *, xbShort );
00173
char * STRZERO(
const char *, xbShort, xbShort );
00174
char * STRZERO( xbDouble );
00175
char * STRZERO( xbDouble, xbShort );
00176
char * STRZERO( xbDouble, xbShort, xbShort );
00177
char * SUBSTR(
const char *, xbShort, xbShort );
00178
char * TRIM(
const char * );
00179
char * UPPER(
const char * );
00180
xbLong VAL(
const char * );
00181
xbLong YEAR(
const char * );
00183
00186
void SetDefaultDateFormat(
const xbString & f){ DefaultDateFormat = f; }
00187
00188
xbString GetDefaultDateFormat()
const {
return DefaultDateFormat; }
00189
xbShort ProcessExpression(
const char *exp, xbDbf * d );
00190
xbShort ParseExpression(
const char *exp, xbDbf * d );
00191 XB_EXPRESSION * GetExpressionHandle();
00192
char GetExpressionResultType(XB_EXPRESSION * );
00193
char * GetCharResult();
00194
xbString & GetStringResult();
00195
xbDouble GetDoubleResult();
00196
xbLong GetIntResult();
00197
xbShort ProcessExpression( xbExpNode * );
00198
xbShort BuildExpressionTree(
const char * Expression, xbShort MaxTokenLen,
00199 xbDbf *d );
00200
00201
#ifdef XBASE_DEBUG
00202
void DumpExpressionTree( xbExpNode * );
00203
void DumpExpNode( xbExpNode * );
00204
#endif
00205
00206
protected:
00207 xbFuncDtl *XbaseFuncList;
00208
00209 xbExpNode *Tree;
00210
xbShort LogicalType;
00211
00212
char TokenType;
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
char PreviousType;
00223
char * Op1;
00224
char * Op2;
00225
xbDouble Opd1;
00226
xbDouble Opd2;
00227
xbShort OpLen1;
00228
xbShort OpLen2;
00229
xbShort OpDataLen1;
00230
xbShort OpDataLen2;
00231
00232
char OpType1;
00233
char OpType2;
00234
xbShort TokenLen;
00235
00236
static xbString DefaultDateFormat;
00237
00238
enum { WorkBufMaxLen = 200 };
00239
char WorkBuf[WorkBufMaxLen+1];
00240
00241
xbShort IsWhiteSpace(
char );
00242
char IsSeparator(
char );
00243 xbExpNode * LoadExpNode(
const char * ENodeText,
const char EType,
00244
const xbShort ELen,
const xbShort BufLen );
00245
xbShort OperatorWeight(
const char *Oper, xbShort len );
00246
xbShort ReduceComplexExpression(
const char * NextToken, xbShort Len,
00247 xbExpNode * cn, xbDbf *d );
00248
xbShort GetFunctionTokenLen(
const char *s );
00249
xbShort ReduceFunction(
const char *NextToken, xbExpNode *cn, xbDbf *d );
00250 xbExpNode * GetNextTreeNode( xbExpNode * );
00251
xbShort ProcessOperator( xbShort );
00252
xbShort ProcessFunction(
char * );
00253
xbShort ValidOperation(
char *,
char,
char );
00254
char GetOperandType( xbExpNode * );
00255
xbShort AlphaOperation(
char * );
00256
xbShort NumericOperation(
char * );
00257 xbExpNode * GetExpNode( xbShort );
00258
xbShort GetFuncInfo(
const char *Function, xbShort Option );
00259
xbDouble GetDoub( xbExpNode * );
00260
xbLong GetInt( xbExpNode * );
00261 };
00262
#endif // XB_EXPRESSIONS
00263
#endif // __XB_EXP_H__