| 1 | /**************** json H Declares Source Code File (.H) ****************/ |
| 2 | /* Name: json.h Version 1.2 */ |
| 3 | /* */ |
| 4 | /* (C) Copyright to the author Olivier BERTRAND 2014 - 2017 */ |
| 5 | /* */ |
| 6 | /* This file contains the JSON classes declares. */ |
| 7 | /***********************************************************************/ |
| 8 | #include "value.h" |
| 9 | |
| 10 | #if defined(_DEBUG) |
| 11 | #define X assert(false); |
| 12 | #else |
| 13 | #define X |
| 14 | #endif |
| 15 | |
| 16 | enum JTYP {TYPE_NULL = TYPE_VOID, |
| 17 | TYPE_STRG = TYPE_STRING, |
| 18 | TYPE_DBL = TYPE_DOUBLE, |
| 19 | TYPE_BOOL = TYPE_TINY, |
| 20 | TYPE_BINT = TYPE_BIGINT, |
| 21 | TYPE_DTM = TYPE_DATE, |
| 22 | TYPE_INTG = TYPE_INT, |
| 23 | TYPE_VAL = 12, |
| 24 | TYPE_JSON, |
| 25 | TYPE_JAR, |
| 26 | TYPE_JOB, |
| 27 | TYPE_JVAL}; |
| 28 | |
| 29 | class JOUT; |
| 30 | class JSON; |
| 31 | class JMAP; |
| 32 | class JVALUE; |
| 33 | class JOBJECT; |
| 34 | class JARRAY; |
| 35 | |
| 36 | typedef class JPAIR *PJPR; |
| 37 | typedef class JSON *PJSON; |
| 38 | typedef class JVALUE *PJVAL; |
| 39 | typedef class JOBJECT *PJOB; |
| 40 | typedef class JARRAY *PJAR; |
| 41 | |
| 42 | typedef struct { |
| 43 | char *str; |
| 44 | int len; |
| 45 | } STRG, *PSG; |
| 46 | |
| 47 | char *NextChr(PSZ s, char sep); |
| 48 | char *GetJsonNull(void); |
| 49 | |
| 50 | PJSON ParseJson(PGLOBAL g, char *s, int n, int *prty = NULL, bool *b = NULL); |
| 51 | PJAR ParseArray(PGLOBAL g, int& i, STRG& src, bool *pty); |
| 52 | PJOB ParseObject(PGLOBAL g, int& i, STRG& src, bool *pty); |
| 53 | PJVAL ParseValue(PGLOBAL g, int& i, STRG& src, bool *pty); |
| 54 | char *ParseString(PGLOBAL g, int& i, STRG& src); |
| 55 | PVAL ParseNumeric(PGLOBAL g, int& i, STRG& src); |
| 56 | PSZ Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty); |
| 57 | bool SerializeArray(JOUT *js, PJAR jarp, bool b); |
| 58 | bool SerializeObject(JOUT *js, PJOB jobp); |
| 59 | bool SerializeValue(JOUT *js, PJVAL jvp); |
| 60 | char *NextChr(PSZ s, char sep); |
| 61 | DllExport bool IsNum(PSZ s); |
| 62 | |
| 63 | /***********************************************************************/ |
| 64 | /* Class JOUT. Used by Serialize. */ |
| 65 | /***********************************************************************/ |
| 66 | class JOUT : public BLOCK { |
| 67 | public: |
| 68 | JOUT(PGLOBAL gp) : BLOCK() {g = gp; Pretty = 3;} |
| 69 | |
| 70 | virtual bool WriteStr(const char *s) = 0; |
| 71 | virtual bool WriteChr(const char c) = 0; |
| 72 | virtual bool Escape(const char *s) = 0; |
| 73 | int Prty(void) {return Pretty;} |
| 74 | |
| 75 | // Member |
| 76 | PGLOBAL g; |
| 77 | int Pretty; |
| 78 | }; // end of class JOUT |
| 79 | |
| 80 | /***********************************************************************/ |
| 81 | /* Class JOUTSTR. Used to Serialize to a string. */ |
| 82 | /***********************************************************************/ |
| 83 | class JOUTSTR : public JOUT { |
| 84 | public: |
| 85 | JOUTSTR(PGLOBAL g); |
| 86 | |
| 87 | virtual bool WriteStr(const char *s); |
| 88 | virtual bool WriteChr(const char c); |
| 89 | virtual bool Escape(const char *s); |
| 90 | |
| 91 | // Member |
| 92 | char *Strp; // The serialized string |
| 93 | size_t N; // Position of next char |
| 94 | size_t Max; // String max size |
| 95 | }; // end of class JOUTSTR |
| 96 | |
| 97 | /***********************************************************************/ |
| 98 | /* Class JOUTFILE. Used to Serialize to a file. */ |
| 99 | /***********************************************************************/ |
| 100 | class JOUTFILE : public JOUT { |
| 101 | public: |
| 102 | JOUTFILE(PGLOBAL g, FILE *str, int pty) : JOUT(g) {Stream = str; Pretty = pty;} |
| 103 | |
| 104 | virtual bool WriteStr(const char *s); |
| 105 | virtual bool WriteChr(const char c); |
| 106 | virtual bool Escape(const char *s); |
| 107 | |
| 108 | // Member |
| 109 | FILE *Stream; |
| 110 | }; // end of class JOUTFILE |
| 111 | |
| 112 | /***********************************************************************/ |
| 113 | /* Class JOUTPRT. Used to Serialize to a pretty file. */ |
| 114 | /***********************************************************************/ |
| 115 | class JOUTPRT : public JOUTFILE { |
| 116 | public: |
| 117 | JOUTPRT(PGLOBAL g, FILE *str) : JOUTFILE(g, str, 2) {M = 0; B = false;} |
| 118 | |
| 119 | virtual bool WriteStr(const char *s); |
| 120 | virtual bool WriteChr(const char c); |
| 121 | |
| 122 | // Member |
| 123 | int M; |
| 124 | bool B; |
| 125 | }; // end of class JOUTPRT |
| 126 | |
| 127 | /***********************************************************************/ |
| 128 | /* Class PAIR. The pairs of a json Object. */ |
| 129 | /***********************************************************************/ |
| 130 | class JPAIR : public BLOCK { |
| 131 | friend class JOBJECT; |
| 132 | friend class JSNX; |
| 133 | friend PJOB ParseObject(PGLOBAL, int&, STRG&, bool*); |
| 134 | friend bool SerializeObject(JOUT *, PJOB); |
| 135 | public: |
| 136 | JPAIR(PCSZ key) : BLOCK() {Key = key; Val = NULL; Next = NULL;} |
| 137 | |
| 138 | inline PCSZ GetKey(void) {return Key;} |
| 139 | inline PJVAL GetVal(void) {return Val;} |
| 140 | inline PJPR GetNext(void) {return Next;} |
| 141 | |
| 142 | protected: |
| 143 | PCSZ Key; // This pair key name |
| 144 | PJVAL Val; // To the value of the pair |
| 145 | PJPR Next; // To the next pair |
| 146 | }; // end of class JPAIR |
| 147 | |
| 148 | /***********************************************************************/ |
| 149 | /* Class JSON. The base class for all other json classes. */ |
| 150 | /***********************************************************************/ |
| 151 | class JSON : public BLOCK { |
| 152 | public: |
| 153 | JSON(void) {Size = 0;} |
| 154 | |
| 155 | int size(void) {return Size;} |
| 156 | virtual int GetSize(bool b) {return Size;} |
| 157 | virtual void Clear(void) {Size = 0;} |
| 158 | virtual JTYP GetType(void) {return TYPE_JSON;} |
| 159 | virtual JTYP GetValType(void) {X return TYPE_JSON;} |
| 160 | virtual void InitArray(PGLOBAL g) {X} |
| 161 | //virtual PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL, int *x = NULL) {X return NULL;} |
| 162 | virtual PJPR AddPair(PGLOBAL g, PCSZ key) {X return NULL;} |
| 163 | virtual PJAR GetKeyList(PGLOBAL g) {X return NULL;} |
| 164 | virtual PJAR GetValList(PGLOBAL g) {X return NULL;} |
| 165 | virtual PJVAL GetValue(const char *key) {X return NULL;} |
| 166 | virtual PJOB GetObject(void) {return NULL;} |
| 167 | virtual PJAR GetArray(void) {return NULL;} |
| 168 | virtual PJVAL GetValue(int i) {X return NULL;} |
| 169 | virtual PVAL GetValue(void) {X return NULL;} |
| 170 | virtual PJSON GetJsp(void) { X return NULL; } |
| 171 | virtual PJSON GetJson(void) { X return NULL; } |
| 172 | virtual PJPR GetFirst(void) {X return NULL;} |
| 173 | virtual int GetInteger(void) {X return 0;} |
| 174 | virtual double GetFloat() {X return 0.0;} |
| 175 | virtual PSZ GetString(PGLOBAL g) {X return NULL;} |
| 176 | virtual PSZ GetText(PGLOBAL g, PSZ text) {X return NULL;} |
| 177 | virtual bool Merge(PGLOBAL g, PJSON jsp) { X return true; } |
| 178 | virtual bool SetValue(PGLOBAL g, PJVAL jvp, int i) { X return true; } |
| 179 | virtual void SetValue(PGLOBAL g, PJVAL jvp, PCSZ key) {X} |
| 180 | virtual void SetValue(PVAL valp) {X} |
| 181 | virtual void SetValue(PJSON jsp) {X} |
| 182 | virtual void SetString(PGLOBAL g, PSZ s, short c) {X} |
| 183 | virtual void SetInteger(PGLOBAL g, int n) {X} |
| 184 | virtual void SetFloat(PGLOBAL g, double f) {X} |
| 185 | virtual void DeleteKey(PCSZ k) {X} |
| 186 | virtual bool DeleteValue(int i) {X return true;} |
| 187 | virtual bool IsNull(void) {X return true;} |
| 188 | |
| 189 | protected: |
| 190 | int Size; |
| 191 | }; // end of class JSON |
| 192 | |
| 193 | /***********************************************************************/ |
| 194 | /* Class JOBJECT: contains a list of value pairs. */ |
| 195 | /***********************************************************************/ |
| 196 | class JOBJECT : public JSON { |
| 197 | friend PJOB ParseObject(PGLOBAL, int&, STRG&, bool*); |
| 198 | friend bool SerializeObject(JOUT *, PJOB); |
| 199 | friend class JSNX; |
| 200 | public: |
| 201 | JOBJECT(void) : JSON() {First = Last = NULL;} |
| 202 | |
| 203 | using JSON::GetValue; |
| 204 | using JSON::SetValue; |
| 205 | virtual void Clear(void) {First = Last = NULL; Size = 0;} |
| 206 | virtual JTYP GetType(void) {return TYPE_JOB;} |
| 207 | virtual PJPR GetFirst(void) {return First;} |
| 208 | virtual int GetSize(bool b); |
| 209 | virtual PJPR AddPair(PGLOBAL g, PCSZ key); |
| 210 | virtual PJOB GetObject(void) {return this;} |
| 211 | virtual PJVAL GetValue(const char* key); |
| 212 | virtual PJAR GetKeyList(PGLOBAL g); |
| 213 | virtual PJAR GetValList(PGLOBAL g); |
| 214 | virtual PSZ GetText(PGLOBAL g, PSZ text); |
| 215 | virtual bool Merge(PGLOBAL g, PJSON jsp); |
| 216 | virtual void SetValue(PGLOBAL g, PJVAL jvp, PCSZ key); |
| 217 | virtual void DeleteKey(PCSZ k); |
| 218 | virtual bool IsNull(void); |
| 219 | |
| 220 | protected: |
| 221 | PJPR First; |
| 222 | PJPR Last; |
| 223 | }; // end of class JOBJECT |
| 224 | |
| 225 | /***********************************************************************/ |
| 226 | /* Class JARRAY. */ |
| 227 | /***********************************************************************/ |
| 228 | class JARRAY : public JSON { |
| 229 | friend PJAR ParseArray(PGLOBAL, int&, STRG&, bool*); |
| 230 | public: |
| 231 | JARRAY(void) : JSON() {Alloc = 0; First = Last = NULL; Mvals = NULL;} |
| 232 | |
| 233 | using JSON::GetValue; |
| 234 | using JSON::SetValue; |
| 235 | virtual void Clear(void) {First = Last = NULL; Size = 0;} |
| 236 | virtual JTYP GetType(void) {return TYPE_JAR;} |
| 237 | virtual PJAR GetArray(void) {return this;} |
| 238 | virtual int GetSize(bool b); |
| 239 | PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL, int *x = NULL); |
| 240 | virtual void InitArray(PGLOBAL g); |
| 241 | virtual PJVAL GetValue(int i); |
| 242 | virtual PSZ GetText(PGLOBAL g, PSZ text); |
| 243 | virtual bool Merge(PGLOBAL g, PJSON jsp); |
| 244 | virtual bool SetValue(PGLOBAL g, PJVAL jvp, int i); |
| 245 | virtual bool DeleteValue(int n); |
| 246 | virtual bool IsNull(void); |
| 247 | |
| 248 | protected: |
| 249 | // Members |
| 250 | int Alloc; // The Mvals allocated size |
| 251 | PJVAL First; // Used when constructing |
| 252 | PJVAL Last; // Last constructed value |
| 253 | PJVAL *Mvals; // Allocated when finished |
| 254 | }; // end of class JARRAY |
| 255 | |
| 256 | /***********************************************************************/ |
| 257 | /* Class JVALUE. */ |
| 258 | /***********************************************************************/ |
| 259 | class JVALUE : public JSON { |
| 260 | friend class JARRAY; |
| 261 | friend class JSNX; |
| 262 | friend class JSONCOL; |
| 263 | friend PJVAL ParseValue(PGLOBAL, int&, STRG&, bool*); |
| 264 | friend bool SerializeValue(JOUT *, PJVAL); |
| 265 | public: |
| 266 | JVALUE(void) : JSON() {Clear();} |
| 267 | JVALUE(PJSON jsp); |
| 268 | JVALUE(PGLOBAL g, PVAL valp); |
| 269 | JVALUE(PGLOBAL g, PCSZ strp); |
| 270 | |
| 271 | using JSON::GetValue; |
| 272 | using JSON::SetValue; |
| 273 | virtual void Clear(void) |
| 274 | {Jsp = NULL; Value = NULL; Next = NULL; Del = false; Size = 1;} |
| 275 | virtual JTYP GetType(void) {return TYPE_JVAL;} |
| 276 | virtual JTYP GetValType(void); |
| 277 | virtual PJOB GetObject(void); |
| 278 | virtual PJAR GetArray(void); |
| 279 | virtual PVAL GetValue(void) {return Value;} |
| 280 | virtual PJSON GetJsp(void) {return Jsp;} |
| 281 | virtual PJSON GetJson(void) { return (Jsp ? Jsp : this); } |
| 282 | virtual int GetInteger(void); |
| 283 | virtual long long GetBigint(void); |
| 284 | virtual double GetFloat(void); |
| 285 | virtual PSZ GetString(PGLOBAL g); |
| 286 | virtual PSZ GetText(PGLOBAL g, PSZ text); |
| 287 | virtual void SetValue(PJSON jsp); |
| 288 | virtual void SetValue(PVAL valp) { Value = valp; Jsp = NULL; } |
| 289 | virtual void SetString(PGLOBAL g, PSZ s, short c = 0); |
| 290 | virtual void SetInteger(PGLOBAL g, int n); |
| 291 | virtual void SetBigint(PGLOBAL g, longlong ll); |
| 292 | virtual void SetFloat(PGLOBAL g, double f); |
| 293 | virtual void SetTiny(PGLOBAL g, char f); |
| 294 | virtual bool IsNull(void); |
| 295 | |
| 296 | protected: |
| 297 | PJSON Jsp; // To the json value |
| 298 | PVAL Value; // The numeric value |
| 299 | PJVAL Next; // Next value in array |
| 300 | bool Del; // True when deleted |
| 301 | }; // end of class JVALUE |
| 302 | |