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__