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 #ifndef _QCSCHEMA_JSON_H
00032 #define _QCSCHEMA_JSON_H
00033
00034 #ifndef json_char
00035 #define json_char char
00036 #endif
00037
00038 #ifndef json_int_t
00039 #ifndef _MSC_VER
00040 #include <inttypes.h>
00041 #define json_int_t int64_t
00042 #else
00043 #define json_int_t __int64
00044 #endif
00045 #endif
00046
00047 #include <stdlib.h>
00048
00049 #ifdef __cplusplus
00050
00051 #include <string.h>
00052
00053 extern "C"
00054 {
00055
00056 #endif
00057
00058 typedef struct
00059 {
00060 unsigned long max_memory;
00061 int settings;
00062
00063
00064
00065
00066 void * (* mem_alloc) (size_t, int zero, void * user_data);
00067 void (* mem_free) (void *, void * user_data);
00068
00069 void * user_data;
00070
00071 size_t value_extra;
00072
00073 } json_settings;
00074
00075 #define json_enable_comments 0x01
00076
00077 typedef enum
00078 {
00079 json_none,
00080 json_object,
00081 json_array,
00082 json_integer,
00083 json_double,
00084 json_string,
00085 json_boolean,
00086 json_null
00087
00088 } json_type;
00089
00090 extern const struct _json_value json_value_none;
00091
00092 typedef struct _json_object_entry
00093 {
00094 json_char * name;
00095 unsigned int name_length;
00096
00097 struct _json_value * value;
00098
00099 } json_object_entry;
00100
00101 typedef struct _json_value
00102 {
00103 struct _json_value * parent;
00104
00105 json_type type;
00106
00107 union
00108 {
00109 int boolean;
00110 json_int_t integer;
00111 double dbl;
00112
00113 struct
00114 {
00115 unsigned int length;
00116 json_char * ptr;
00117
00118 } string;
00119
00120 struct
00121 {
00122 unsigned int length;
00123
00124 json_object_entry * values;
00125
00126 #if defined(__cplusplus) && __cplusplus >= 201103L
00127 decltype(values) begin () const
00128 { return values;
00129 }
00130 decltype(values) end () const
00131 { return values + length;
00132 }
00133 #endif
00134
00135 } object;
00136
00137 struct
00138 {
00139 unsigned int length;
00140 struct _json_value ** values;
00141
00142 #if defined(__cplusplus) && __cplusplus >= 201103L
00143 decltype(values) begin () const
00144 { return values;
00145 }
00146 decltype(values) end () const
00147 { return values + length;
00148 }
00149 #endif
00150
00151 } array;
00152
00153 } u;
00154
00155 union
00156 {
00157 struct _json_value * next_alloc;
00158 void * object_mem;
00159
00160 } _reserved;
00161
00162 #ifdef JSON_TRACK_SOURCE
00163
00164
00165
00166 unsigned int line, col;
00167
00168 #endif
00169
00170
00171
00172
00173 #ifdef __cplusplus
00174
00175 public:
00176
00177 inline _json_value ()
00178 { memset (this, 0, sizeof (_json_value));
00179 }
00180
00181 inline const struct _json_value &operator [] (int index) const
00182 {
00183 if (type != json_array || index < 0
00184 || ((unsigned int) index) >= u.array.length)
00185 {
00186 return json_value_none;
00187 }
00188
00189 return *u.array.values [index];
00190 }
00191
00192 inline const struct _json_value &operator [] (const char * index) const
00193 {
00194 if (type != json_object)
00195 return json_value_none;
00196
00197 for (unsigned int i = 0; i < u.object.length; ++ i)
00198 if (!strcmp (u.object.values [i].name, index))
00199 return *u.object.values [i].value;
00200
00201 return json_value_none;
00202 }
00203
00204 inline operator const char * () const
00205 {
00206 switch (type)
00207 {
00208 case json_string:
00209 return u.string.ptr;
00210
00211 default:
00212 return "";
00213 };
00214 }
00215
00216 inline operator json_int_t () const
00217 {
00218 switch (type)
00219 {
00220 case json_integer:
00221 return u.integer;
00222
00223 case json_double:
00224 return (json_int_t) u.dbl;
00225
00226 default:
00227 return 0;
00228 };
00229 }
00230
00231 inline operator bool () const
00232 {
00233 if (type != json_boolean)
00234 return false;
00235
00236 return u.boolean != 0;
00237 }
00238
00239 inline operator double () const
00240 {
00241 switch (type)
00242 {
00243 case json_integer:
00244 return (double) u.integer;
00245
00246 case json_double:
00247 return u.dbl;
00248
00249 default:
00250 return 0;
00251 };
00252 }
00253
00254 #endif
00255
00256 } json_value;
00257
00258 json_value * json_parse (const json_char * json,
00259 size_t length);
00260
00261 #define json_error_max 128
00262 json_value * json_parse_ex (json_settings * settings,
00263 const json_char * json,
00264 size_t length,
00265 char * error);
00266
00267 void json_value_free (json_value *);
00268
00269
00270
00271
00272
00273 void json_value_free_ex (json_settings * settings,
00274 json_value *);
00275
00276
00277 #ifdef __cplusplus
00278 }
00279 #endif
00280
00281 #endif
00282
00283