| 86 CX_JSON_READER_LITERAL |
86 CX_JSON_READER_LITERAL |
| 87 }; |
87 }; |
| 88 |
88 |
| 89 typedef enum cx_json_token_type CxJsonTokenType; |
89 typedef enum cx_json_token_type CxJsonTokenType; |
| 90 typedef enum cx_json_value_type CxJsonValueType; |
90 typedef enum cx_json_value_type CxJsonValueType; |
| 91 typedef enum cx_json_literal_type CxJsonLiteralType; |
|
| 92 typedef enum cx_json_reader_type CxJsonReaderType; |
91 typedef enum cx_json_reader_type CxJsonReaderType; |
| 93 |
92 |
| 94 typedef struct cx_json_s CxJson; |
93 typedef struct cx_json_s CxJson; |
| 95 typedef struct cx_json_token_s CxJsonToken; |
94 typedef struct cx_json_token_s CxJsonToken; |
| 96 |
95 |
| 97 typedef struct cx_json_value_s CxJsonValue; |
96 typedef struct cx_json_value_s CxJsonValue; |
| 98 |
97 |
| 99 typedef struct cx_json_array_s CxJsonArray; |
98 typedef struct cx_json_array_s CxJsonArray; |
| 100 typedef struct cx_json_object_s CxJsonObject; |
99 typedef struct cx_json_object_s CxJsonObject; |
| 101 typedef struct cx_mutstr_s CxJsonString; |
100 typedef struct cx_mutstr_s CxJsonString; |
| 102 typedef struct cx_json_integer_s CxJsonInteger; |
101 typedef int64_t CxJsonInteger; |
| 103 typedef struct cx_json_number_s CxJsonNumber; |
102 typedef double CxJsonNumber; |
| 104 typedef struct cx_json_literal_s CxJsonLiteral; |
103 typedef enum cx_json_literal CxJsonLiteral; |
| 105 |
104 |
| 106 typedef struct cx_json_obj_value_s CxJsonObjValue; |
105 typedef struct cx_json_obj_value_s CxJsonObjValue; |
| 107 |
106 |
| 108 struct cx_json_token_s { |
107 struct cx_json_token_s { |
| 109 CxJsonTokenType tokentype; |
108 CxJsonTokenType tokentype; |
| 198 void cxJsonDestroy(CxJson *json); |
183 void cxJsonDestroy(CxJson *json); |
| 199 |
184 |
| 200 __attribute__((__nonnull__)) |
185 __attribute__((__nonnull__)) |
| 201 void cxJsonFill(CxJson *json, const char *buf, size_t len); |
186 void cxJsonFill(CxJson *json, const char *buf, size_t len); |
| 202 |
187 |
| 203 // TODO: discuss if it is intentional that cxJsonNext() will usually parse an entire file in one go |
|
| 204 __attribute__((__nonnull__)) |
188 __attribute__((__nonnull__)) |
| 205 int cxJsonNext(CxJson *json, CxJsonValue **value); |
189 int cxJsonNext(CxJson *json, CxJsonValue **value); |
| 206 |
190 |
| 207 void cxJsonValueFree(CxJsonValue *value); |
191 void cxJsonValueFree(CxJsonValue *value); |
| 208 |
192 |
| 237 return value->type == CX_JSON_LITERAL; |
221 return value->type == CX_JSON_LITERAL; |
| 238 } |
222 } |
| 239 |
223 |
| 240 __attribute__((__nonnull__)) |
224 __attribute__((__nonnull__)) |
| 241 static inline bool cxJsonIsBool(CxJsonValue *value) { |
225 static inline bool cxJsonIsBool(CxJsonValue *value) { |
| 242 return cxJsonIsLiteral(value) && value->value.literal.literal != CX_JSON_NULL; |
226 return cxJsonIsLiteral(value) && value->value.literal != CX_JSON_NULL; |
| 243 } |
227 } |
| 244 |
228 |
| 245 __attribute__((__nonnull__)) |
229 __attribute__((__nonnull__)) |
| 246 static inline bool cxJsonIsTrue(CxJsonValue *value) { |
230 static inline bool cxJsonIsTrue(CxJsonValue *value) { |
| 247 return cxJsonIsLiteral(value) && value->value.literal.literal == CX_JSON_TRUE; |
231 return cxJsonIsLiteral(value) && value->value.literal == CX_JSON_TRUE; |
| 248 } |
232 } |
| 249 |
233 |
| 250 __attribute__((__nonnull__)) |
234 __attribute__((__nonnull__)) |
| 251 static inline bool cxJsonIsFalse(CxJsonValue *value) { |
235 static inline bool cxJsonIsFalse(CxJsonValue *value) { |
| 252 return cxJsonIsLiteral(value) && value->value.literal.literal == CX_JSON_FALSE; |
236 return cxJsonIsLiteral(value) && value->value.literal == CX_JSON_FALSE; |
| 253 } |
237 } |
| 254 |
238 |
| 255 __attribute__((__nonnull__)) |
239 __attribute__((__nonnull__)) |
| 256 static inline bool cxJsonIsNull(CxJsonValue *value) { |
240 static inline bool cxJsonIsNull(CxJsonValue *value) { |
| 257 return cxJsonIsLiteral(value) && value->value.literal.literal == CX_JSON_NULL; |
241 return cxJsonIsLiteral(value) && value->value.literal == CX_JSON_NULL; |
| 258 } |
242 } |
| 259 |
243 |
| 260 __attribute__((__nonnull__)) |
244 __attribute__((__nonnull__)) |
| 261 static inline cxmutstr cxJsonAsString(CxJsonValue *value) { |
245 static inline cxmutstr cxJsonAsString(CxJsonValue *value) { |
| 262 // TODO: do we need a separate method to return this directly as cxstring? |
246 // TODO: do we need a separate method to return this directly as cxstring? |
| 263 return value->value.string; |
247 return value->value.string; |
| 264 } |
248 } |
| 265 |
249 |
| 266 __attribute__((__nonnull__)) |
250 __attribute__((__nonnull__)) |
| 267 static inline double cxJsonAsDouble(CxJsonValue *value) { |
251 static inline double cxJsonAsDouble(CxJsonValue *value) { |
| 268 return value->value.number.value; |
252 return value->value.number; |
| 269 } |
253 } |
| 270 |
254 |
| 271 __attribute__((__nonnull__)) |
255 __attribute__((__nonnull__)) |
| 272 static inline int64_t cxJsonAsInteger(CxJsonValue *value) { |
256 static inline int64_t cxJsonAsInteger(CxJsonValue *value) { |
| 273 return value->value.integer.value; |
257 return value->value.integer; |
| 274 } |
258 } |
| 275 |
259 |
| 276 __attribute__((__nonnull__)) |
260 __attribute__((__nonnull__)) |
| 277 static inline bool cxJsonAsBool(CxJsonValue *value) { |
261 static inline bool cxJsonAsBool(CxJsonValue *value) { |
| 278 return value->value.literal.literal == CX_JSON_TRUE; |
262 return value->value.literal == CX_JSON_TRUE; |
| 279 } |
263 } |
| 280 |
264 |
| 281 __attribute__((__nonnull__)) |
265 __attribute__((__nonnull__)) |
| 282 static inline size_t cxJsonArrSize(CxJsonValue *value) { |
266 static inline size_t cxJsonArrSize(CxJsonValue *value) { |
| 283 return value->value.array.size; |
267 return value->value.array.size; |