| 1 | /*************** Xobject H Declares Source Code File (.H) **************/ |
| 2 | /* Name: XOBJECT.H Version 2.4 */ |
| 3 | /* */ |
| 4 | /* (C) Copyright to the author Olivier BERTRAND 1998-2014 */ |
| 5 | /* */ |
| 6 | /* This file contains the XOBJECT and derived classes declares. */ |
| 7 | /***********************************************************************/ |
| 8 | |
| 9 | #ifndef __XOBJECT__H |
| 10 | #define __XOBJECT__H |
| 11 | |
| 12 | /***********************************************************************/ |
| 13 | /* Include required application header files */ |
| 14 | /* block.h is header containing Block global declarations. */ |
| 15 | /***********************************************************************/ |
| 16 | #include "block.h" |
| 17 | #include "valblk.h" // includes value.h |
| 18 | |
| 19 | /***********************************************************************/ |
| 20 | /* Types used in some class definitions. */ |
| 21 | /***********************************************************************/ |
| 22 | typedef class STRING *PSTRG; |
| 23 | |
| 24 | /***********************************************************************/ |
| 25 | /* The pointer to the one and only needed void object. */ |
| 26 | /***********************************************************************/ |
| 27 | extern PXOB const pXVOID; |
| 28 | |
| 29 | /***********************************************************************/ |
| 30 | /* Class XOBJECT is the base class for all classes that can be used */ |
| 31 | /* in evaluation operations: FILTER, EXPRESSION, SCALF, FNC, COLBLK, */ |
| 32 | /* SELECT, FILTER as well as all the constant object types. */ |
| 33 | /***********************************************************************/ |
| 34 | class DllExport XOBJECT : public BLOCK { |
| 35 | public: |
| 36 | XOBJECT(void) {Value = NULL; Constant = false;} |
| 37 | |
| 38 | // Implementation |
| 39 | PVAL GetValue(void) {return Value;} |
| 40 | bool IsConstant(void) {return Constant;} |
| 41 | virtual int GetType(void) {return TYPE_XOBJECT;} |
| 42 | virtual int GetResultType(void) {return TYPE_VOID;} |
| 43 | virtual int GetKey(void) {return 0;} |
| 44 | #if defined(_DEBUG) |
| 45 | virtual void SetKey(int) {assert(false);} |
| 46 | #else // !_DEBUG |
| 47 | virtual void SetKey(int) {} // Only defined for COLBLK |
| 48 | #endif // !_DEBUG |
| 49 | virtual int GetLength(void) = 0; |
| 50 | virtual int GetLengthEx(void) = 0; |
| 51 | virtual PSZ GetCharValue(void); |
| 52 | virtual short GetShortValue(void); |
| 53 | virtual int GetIntValue(void); |
| 54 | virtual double GetFloatValue(void); |
| 55 | virtual int GetScale(void) = 0; |
| 56 | |
| 57 | // Methods |
| 58 | virtual void Reset(void) {} |
| 59 | virtual bool Compare(PXOB) = 0; |
| 60 | virtual bool Init(PGLOBAL) {return false;} |
| 61 | virtual bool Eval(PGLOBAL) {return false;} |
| 62 | virtual bool SetFormat(PGLOBAL, FORMAT&) = 0; |
| 63 | |
| 64 | protected: |
| 65 | PVAL Value; // The current value of the object. |
| 66 | bool Constant; // true for an object having a constant value. |
| 67 | }; // end of class XOBJECT |
| 68 | |
| 69 | /***********************************************************************/ |
| 70 | /* Class XVOID: represent a void (null) object. */ |
| 71 | /* Used to represent a void parameter for count(*) or for a filter. */ |
| 72 | /***********************************************************************/ |
| 73 | class DllExport XVOID : public XOBJECT { |
| 74 | public: |
| 75 | XVOID(void) {Constant = true;} |
| 76 | |
| 77 | // Implementation |
| 78 | virtual int GetType(void) {return TYPE_VOID;} |
| 79 | virtual int GetLength(void) {return 0;} |
| 80 | virtual int GetLengthEx(void) {return 0;} |
| 81 | virtual PSZ GetCharValue(void) {return NULL;} |
| 82 | virtual int GetIntValue(void) {return 0;} |
| 83 | virtual double GetFloatValue(void) {return 0.0;} |
| 84 | virtual int GetScale() {return 0;} |
| 85 | |
| 86 | // Methods |
| 87 | virtual bool Compare(PXOB xp) {return xp->GetType() == TYPE_VOID;} |
| 88 | virtual bool SetFormat(PGLOBAL, FORMAT&) {return true;} |
| 89 | }; // end of class XVOID |
| 90 | |
| 91 | |
| 92 | /***********************************************************************/ |
| 93 | /* Class CONSTANT: represents a constant XOBJECT of any value type. */ |
| 94 | /* Note that the CONSTANT class is a friend of the VALUE class; */ |
| 95 | /***********************************************************************/ |
| 96 | class DllExport CONSTANT : public XOBJECT { |
| 97 | public: |
| 98 | CONSTANT(PGLOBAL g, void *value, short type); |
| 99 | CONSTANT(PGLOBAL g, int n); |
| 100 | CONSTANT(PVAL valp) {Value = valp; Constant = true;} |
| 101 | |
| 102 | // Implementation |
| 103 | virtual int GetType(void) {return TYPE_CONST;} |
| 104 | virtual int GetResultType(void) {return Value->Type;} |
| 105 | virtual int GetLength(void) {return Value->GetValLen();} |
| 106 | virtual int GetScale() {return Value->GetValPrec();} |
| 107 | virtual int GetLengthEx(void); |
| 108 | |
| 109 | // Methods |
| 110 | virtual bool Compare(PXOB xp); |
| 111 | virtual bool SetFormat(PGLOBAL g, FORMAT& fmt) |
| 112 | {return Value->SetConstFormat(g, fmt);} |
| 113 | void Convert(PGLOBAL g, int newtype); |
| 114 | void SetValue(PVAL vp) {Value = vp;} |
| 115 | virtual void Printf(PGLOBAL g, FILE *, uint); |
| 116 | virtual void Prints(PGLOBAL g, char *, uint); |
| 117 | }; // end of class CONSTANT |
| 118 | |
| 119 | /***********************************************************************/ |
| 120 | /* Class STRING handles variable length char strings. */ |
| 121 | /* It is mainly used to avoid buffer overrun. */ |
| 122 | /***********************************************************************/ |
| 123 | class DllExport STRING : public BLOCK { |
| 124 | public: |
| 125 | // Constructor |
| 126 | STRING(PGLOBAL g, uint n, PCSZ str = NULL); |
| 127 | |
| 128 | // Implementation |
| 129 | inline int GetLength(void) {return (int)Length;} |
| 130 | inline void SetLength(uint n) {Length = n;} |
| 131 | inline PSZ GetStr(void) {return Strp;} |
| 132 | inline uint32 GetSize(void) {return Size;} |
| 133 | inline bool IsTruncated(void) {return Trc;} |
| 134 | |
| 135 | // Methods |
| 136 | inline void Reset(void) {*Strp = 0;} |
| 137 | bool Set(PCSZ s); |
| 138 | bool Set(char *s, uint n); |
| 139 | bool Append(const char *s, uint ln, bool nq = false); |
| 140 | bool Append(PCSZ s); |
| 141 | bool Append(STRING &str); |
| 142 | bool Append(char c); |
| 143 | bool Resize(uint n); |
| 144 | bool Append_quoted(PCSZ s); |
| 145 | inline void Trim(void) {(void)Resize(Length + 1);} |
| 146 | inline void Chop(void) {if (Length) Strp[--Length] = 0;} |
| 147 | inline void RepLast(char c) {if (Length) Strp[Length-1] = c;} |
| 148 | inline void Truncate(uint n) {if (n < Length) {Strp[n] = 0; Length = n;}} |
| 149 | |
| 150 | protected: |
| 151 | char *Realloc(uint len); |
| 152 | inline char *GetNext(void) |
| 153 | {return ((char*)G->Sarea)+((PPOOLHEADER)G->Sarea)->To_Free;} |
| 154 | |
| 155 | // Members |
| 156 | PGLOBAL G; // To avoid parameter |
| 157 | PSZ Strp; // The char string |
| 158 | uint Length; // String length |
| 159 | uint Size; // Allocated size |
| 160 | bool Trc; // When truncated |
| 161 | char *Next; // Next alloc position |
| 162 | }; // end of class STRING |
| 163 | |
| 164 | #endif |
| 165 | |