json.h 9.82 KB
Newer Older
1
/**************** json H Declares Source Code File (.H) ****************/
2
/*  Name: json.h   Version 1.2                                         */
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*                                                                     */
/*  (C) Copyright to the author Olivier BERTRAND          2014 - 2015  */
/*                                                                     */
/*  This file contains the JSON classes declares.                      */
/***********************************************************************/
#include "value.h"

#if defined(_DEBUG)
#define X  assert(false);
#else
#define X
#endif

enum JTYP {TYPE_STRG = 1, 
           TYPE_DBL = 2,
           TYPE_BOOL = 4,
19 20 21
           TYPE_BINT = 5, 
					 TYPE_INTG = 7,
					 TYPE_JSON = 12,
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
           TYPE_JAR, 
           TYPE_JOB, 
           TYPE_JVAL};

class JOUT;
class JSON;
class JMAP;
class JVALUE;
class JOBJECT;
class JARRAY;

typedef class JPAIR   *PJPR;
typedef class JSON    *PJSON;
typedef class JVALUE  *PJVAL;
typedef class JOBJECT *PJOB;
typedef class JARRAY  *PJAR;

typedef struct {
  char *str;
  int   len;
  } STRG, *PSG;

44
PJSON ParseJson(PGLOBAL g, char *s, int n, int prty = 2, bool *b = NULL);
45 46 47 48 49
PJAR  ParseArray(PGLOBAL g, int& i, STRG& src);
PJOB  ParseObject(PGLOBAL g, int& i, STRG& src);
PJVAL ParseValue(PGLOBAL g, int& i, STRG& src);
char *ParseString(PGLOBAL g, int& i, STRG& src);
PVAL  ParseNumeric(PGLOBAL g, int& i, STRG& src);
50
PSZ   Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty);
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
bool  SerializeArray(JOUT *js, PJAR jarp, bool b);
bool  SerializeObject(JOUT *js, PJOB jobp);
bool  SerializeValue(JOUT *js, PJVAL jvp);

/***********************************************************************/
/* Class JOUT. Used by Serialize.                                      */
/***********************************************************************/
class JOUT : public BLOCK {
 public:
  JOUT(PGLOBAL gp) : BLOCK() {g = gp;}

  virtual bool WriteStr(const char *s) = 0;
  virtual bool WriteChr(const char c) = 0;
  virtual bool Escape(const char *s) = 0;

  // Member
  PGLOBAL g;
}; // end of class JOUT

/***********************************************************************/
/* Class JOUTSTR. Used to Serialize to a string.                       */
/***********************************************************************/
class JOUTSTR : public JOUT {
 public:
  JOUTSTR(PGLOBAL g);

  virtual bool WriteStr(const char *s);
  virtual bool WriteChr(const char c);
  virtual bool Escape(const char *s);

  // Member
  char  *Strp;                         // The serialized string
  size_t N;                            // Position of next char
  size_t Max;                          // String max size
}; // end of class JOUTSTR

/***********************************************************************/
/* Class JOUTFILE. Used to Serialize to a file.                        */
/***********************************************************************/
class JOUTFILE : public JOUT {
 public:
  JOUTFILE(PGLOBAL g, FILE *str) : JOUT(g) {Stream = str;}

  virtual bool WriteStr(const char *s);
  virtual bool WriteChr(const char c);
  virtual bool Escape(const char *s);

  // Member
  FILE *Stream;
}; // end of class JOUTFILE

/***********************************************************************/
/* Class JOUTPRT. Used to Serialize to a pretty file.                  */
/***********************************************************************/
class JOUTPRT : public JOUTFILE {
 public:
  JOUTPRT(PGLOBAL g, FILE *str) : JOUTFILE(g, str) {M = 0; B = false;}

  virtual bool WriteStr(const char *s);
  virtual bool WriteChr(const char c);

  // Member
  int  M;
  bool B;
}; // end of class JOUTPRT

/***********************************************************************/
/* Class PAIR. The pairs of a json Object.                             */
/***********************************************************************/
class JPAIR : public BLOCK {
  friend class JOBJECT;
122 123
	friend class JSNX;
	friend PJOB ParseObject(PGLOBAL, int&, STRG&);
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
  friend bool SerializeObject(JOUT *, PJOB);
 public:
  JPAIR(PSZ key) : BLOCK() {Key = key; Val = NULL; Next = NULL;}

  inline PSZ   GetKey(void) {return Key;}
  inline PJVAL GetVal(void) {return Val;}
  inline PJPR  GetNext(void) {return Next;}

 protected:
  PSZ   Key;      // This pair key name
  PJVAL Val;      // To the value of the pair
  PJPR  Next;     // To the next pair
}; // end of class JPAIR

/***********************************************************************/
/* Class JSON. The base class for all other json classes.              */
/***********************************************************************/
class JSON : public BLOCK {
 public:
  JSON(void) {Size = 0;}

          int    size(void) {return Size;}
  virtual void   Clear(void) {Size = 0;}
  virtual JTYP   GetType(void) {return TYPE_JSON;}
  virtual JTYP   GetValType(void) {X return TYPE_JSON;}
  virtual void   InitArray(PGLOBAL g) {X}
150
  virtual PJVAL  AddValue(PGLOBAL g, PJVAL jvp = NULL, int *x = NULL) {X return NULL;}
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
  virtual PJPR   AddPair(PGLOBAL g, PSZ key) {X return NULL;}
  virtual PJVAL  GetValue(const char *key) {X return NULL;}
  virtual PJOB   GetObject(void) {return NULL;}
  virtual PJAR   GetArray(void) {return NULL;}
  virtual PJVAL  GetValue(int i) {X return NULL;}
  virtual PVAL   GetValue(void) {X return NULL;}
  virtual PJSON  GetJson(void) {X return NULL;}
  virtual PJPR   GetFirst(void) {X return NULL;}
  virtual int    GetInteger(void) {X return 0;}
  virtual double GetFloat() {X return 0.0;}
  virtual PSZ    GetString() {X return NULL;}
  virtual PSZ    GetText(PGLOBAL g, PSZ text) {X return NULL;}
  virtual bool   SetValue(PGLOBAL g, PJVAL jvp, int i) {X return true;}
  virtual void   SetValue(PGLOBAL g, PJVAL jvp, PSZ key) {X}
  virtual void   SetValue(PVAL valp) {X}
  virtual void   SetValue(PJSON jsp) {X}
  virtual void   SetString(PGLOBAL g, PSZ s) {X}
  virtual void   SetInteger(PGLOBAL g, int n) {X}
  virtual void   SetFloat(PGLOBAL g, double f) {X}
170 171 172
	virtual void   DeleteKey(char *k) {X}
	virtual bool   DeleteValue(int i) {X return true;}
	virtual bool   IsNull(void) {X return true;}
173 174 175 176 177 178 179 180 181 182 183

 protected:
  int Size;
}; // end of class JSON

/***********************************************************************/
/* Class JOBJECT: contains a list of value pairs.                      */
/***********************************************************************/
class JOBJECT : public JSON {
  friend PJOB ParseObject(PGLOBAL, int&, STRG&);
  friend bool SerializeObject(JOUT *, PJOB);
184
	friend class JSNX;
185 186 187 188 189 190 191 192 193 194 195 196 197
 public:
  JOBJECT(void) : JSON() {First = Last = NULL;}

  using JSON::GetValue;
  using JSON::SetValue;
  virtual void  Clear(void) {First = Last = NULL; Size = 0;}
  virtual JTYP  GetType(void) {return TYPE_JOB;}
  virtual PJPR  GetFirst(void) {return First;}
  virtual PJPR  AddPair(PGLOBAL g, PSZ key);
  virtual PJOB  GetObject(void) {return this;}
  virtual PJVAL GetValue(const char* key);
  virtual PSZ   GetText(PGLOBAL g, PSZ text);
  virtual void  SetValue(PGLOBAL g, PJVAL jvp, PSZ key);
198 199
	virtual void  DeleteKey(char *k);
	virtual bool  IsNull(void);
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218

 protected:
  PJPR First;
  PJPR Last;
}; // end of class JOBJECT

/***********************************************************************/
/* Class JARRAY.                                                       */
/***********************************************************************/
class JARRAY : public JSON {
  friend PJAR ParseArray(PGLOBAL, int&, STRG&);
 public:
  JARRAY(void) : JSON() {Alloc = 0; First = Last = NULL; Mvals = NULL;}

  using JSON::GetValue;
  using JSON::SetValue;
  virtual void  Clear(void) {First = Last = NULL; Size = 0;}
  virtual JTYP  GetType(void) {return TYPE_JAR;}
  virtual PJAR  GetArray(void) {return this;}
219
  virtual PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL, int *x = NULL);
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238
  virtual void  InitArray(PGLOBAL g);
  virtual PJVAL GetValue(int i);
  virtual bool  SetValue(PGLOBAL g, PJVAL jvp, int i);
  virtual bool  DeleteValue(int n);
  virtual bool  IsNull(void);

 protected:
  // Members
  int    Alloc;    // The Mvals allocated size
  PJVAL  First;    // Used when constructing
  PJVAL  Last;     // Last constructed value
  PJVAL *Mvals;    // Allocated when finished
}; // end of class JARRAY

/***********************************************************************/
/* Class JVALUE.                                                       */
/***********************************************************************/
class JVALUE : public JSON {
  friend class JARRAY;
239 240
	friend class JSNX;
	friend PJVAL ParseValue(PGLOBAL, int&, STRG&);
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
  friend bool  SerializeValue(JOUT *, PJVAL);
 public:
  JVALUE(void) : JSON() 
                {Jsp = NULL; Value = NULL; Next = NULL; Del = false;}
  JVALUE(PJSON jsp) : JSON()
                {Jsp = jsp; Value = NULL; Next = NULL; Del = false;}
  JVALUE(PGLOBAL g, PVAL valp);

  using JSON::GetValue;
  using JSON::SetValue;
  virtual void   Clear(void)
          {Jsp = NULL; Value = NULL; Next = NULL; Del = false; Size = 0;}
  virtual JTYP   GetType(void) {return TYPE_JVAL;}
  virtual JTYP   GetValType(void);
  virtual PJOB   GetObject(void);
  virtual PJAR   GetArray(void);
  virtual PVAL   GetValue(void) {return Value;}
  virtual PJSON  GetJson(void) {return (Jsp ? Jsp : this);}
  virtual int    GetInteger(void);
260 261
	virtual long long GetBigint(void);
	virtual double GetFloat(void);
262 263 264 265 266 267
  virtual PSZ    GetString(void);
  virtual PSZ    GetText(PGLOBAL g, PSZ text);
  virtual void   SetValue(PVAL valp) {Value = valp;}
  virtual void   SetValue(PJSON jsp) {Jsp = jsp;}
  virtual void   SetString(PGLOBAL g, PSZ s);
  virtual void   SetInteger(PGLOBAL g, int n);
268 269
	virtual void   SetBigint(PGLOBAL g, longlong ll);
	virtual void   SetFloat(PGLOBAL g, double f);
270 271 272 273 274 275 276 277 278
  virtual bool   IsNull(void);

 protected:
  PJSON Jsp;      // To the json value
  PVAL  Value;    // The numeric value
  PJVAL Next;     // Next value in array
  bool  Del;      // True when deleted
}; // end of class JVALUE