diff options
Diffstat (limited to 'lib/json.h')
-rw-r--r-- | lib/json.h | 313 |
1 files changed, 152 insertions, 161 deletions
@@ -50,220 +50,211 @@ #include <string.h> - extern "C" - { +extern "C" +{ #endif -typedef struct -{ - unsigned long max_memory; - int settings; +typedef struct { + unsigned long max_memory; + int settings; - /* Custom allocator support (leave null to use malloc/free) - */ + /* Custom allocator support (leave null to use malloc/free) + */ - void * (* mem_alloc) (size_t, int zero, void * user_data); - void (* mem_free) (void *, void * user_data); + void * (*mem_alloc)(size_t, int zero, void * user_data); + void (* mem_free)(void *, void * user_data); - void * user_data; /* will be passed to mem_alloc and mem_free */ + void * user_data; /* will be passed to mem_alloc and mem_free */ } json_settings; #define json_enable_comments 0x01 -typedef enum -{ - json_none, - json_object, - json_array, - json_integer, - json_double, - json_string, - json_boolean, - json_null +typedef enum { + json_none, + json_object, + json_array, + json_integer, + json_double, + json_string, + json_boolean, + json_null } json_type; extern const struct _json_value json_value_none; -typedef struct _json_value -{ - struct _json_value * parent; +typedef struct _json_value { + struct _json_value * parent; - json_type type; + json_type type; - union - { - int boolean; - json_int_t integer; - double dbl; + union { + int boolean; + json_int_t integer; + double dbl; - struct - { - unsigned int length; - json_char * ptr; /* null terminated */ + struct { + unsigned int length; + json_char * ptr; /* null terminated */ - } string; + } string; - struct - { - unsigned int length; + struct { + unsigned int length; - struct - { - json_char * name; - unsigned int name_length; + struct { + json_char * name; + unsigned int name_length; - struct _json_value * value; + struct _json_value * value; - } * values; + } * values; - #if defined(__cplusplus) && __cplusplus >= 201103L - decltype(values) begin () const - { return values; - } - decltype(values) end () const - { return values + length; - } - #endif + #if defined(__cplusplus) && __cplusplus >= 201103L + decltype(values) begin() const + { return values; } + decltype(values) end() const + { return values + length; } + #endif - } object; + } object; - struct - { - unsigned int length; - struct _json_value ** values; + struct { + unsigned int length; + struct _json_value ** values; - #if defined(__cplusplus) && __cplusplus >= 201103L - decltype(values) begin () const - { return values; - } - decltype(values) end () const - { return values + length; - } - #endif + #if defined(__cplusplus) && __cplusplus >= 201103L + decltype(values) begin() const + { return values; } + decltype(values) end() const + { return values + length; } + #endif - } array; + } array; - } u; + } u; - union - { - struct _json_value * next_alloc; - void * object_mem; + union { + struct _json_value * next_alloc; + void * object_mem; - } _reserved; + } _reserved; - /* Some C++ operator sugar */ + /* Some C++ operator sugar */ #ifdef __cplusplus - public: - - inline _json_value () - { memset (this, 0, sizeof (_json_value)); - } - - inline const struct _json_value &operator [] (int index) const - { - if (type != json_array || index < 0 - || ((unsigned int) index) >= u.array.length) - { - return json_value_none; - } - - return *u.array.values [index]; - } - - inline const struct _json_value &operator [] (const char * index) const - { - if (type != json_object) - return json_value_none; - - for (unsigned int i = 0; i < u.object.length; ++ i) - if (!strcmp (u.object.values [i].name, index)) - return *u.object.values [i].value; - - return json_value_none; - } - - inline operator const char * () const - { - switch (type) - { - case json_string: - return u.string.ptr; - - default: - return ""; - }; - } - - inline operator json_int_t () const - { - switch (type) - { - case json_integer: - return u.integer; - - case json_double: - return (json_int_t) u.dbl; - - default: - return 0; - }; - } - - inline operator bool () const - { - if (type != json_boolean) - return false; - - return u.boolean != 0; - } - - inline operator double () const - { - switch (type) - { - case json_integer: - return (double) u.integer; - - case json_double: - return u.dbl; - - default: - return 0; - }; - } +public: + + inline _json_value () + { + memset(this, 0, sizeof(_json_value)); + } + + inline const struct _json_value &operator [](int index) const + { + if (type != json_array || index < 0 + || ((unsigned int)index) >= u.array.length) { + return json_value_none; + } + + return *u.array.values [index]; + } + + inline const struct _json_value &operator [](const char * index) const + { + if (type != json_object) { + return json_value_none; + } + + for (unsigned int i = 0; i < u.object.length; ++i) { + if (!strcmp(u.object.values [i].name, index)) { + return *u.object.values [i].value; + } + } + + return json_value_none; + } + + inline operator const char *() const + { + switch (type) { + case json_string: + return u.string.ptr; + + default: + return ""; + } + ; + } + + inline operator json_int_t() const + { + switch (type) { + case json_integer: + return u.integer; + + case json_double: + return (json_int_t)u.dbl; + + default: + return 0; + } + ; + } + + inline operator bool() const + { + if (type != json_boolean) { + return false; + } + + return u.boolean != 0; + } + + inline operator double() const + { + switch (type) { + case json_integer: + return (double)u.integer; + + case json_double: + return u.dbl; + + default: + return 0; + } + ; + } #endif } json_value; -json_value * json_parse (const json_char * json, - size_t length); +json_value * json_parse(const json_char * json, + size_t length); #define json_error_max 128 -json_value * json_parse_ex (json_settings * settings, - const json_char * json, - size_t length, - char * error); +json_value * json_parse_ex(json_settings * settings, + const json_char * json, + size_t length, + char * error); -void json_value_free (json_value *); +void json_value_free(json_value *); /* Not usually necessary, unless you used a custom mem_alloc and now want to * use a custom mem_free. */ -void json_value_free_ex (json_settings * settings, - json_value *); +void json_value_free_ex(json_settings * settings, + json_value *); #ifdef __cplusplus - } /* extern "C" */ +} /* extern "C" */ #endif #endif |