#include <ucw/mempool.h>
#include <ucw-json/json.h>
+#include <limits.h>
+#include <math.h>
+#include <stdint.h>
+
+static void json_init(struct json_context *js)
+{
+ mp_save(js->pool, &js->init_state);
+ js->trivial_token = json_new_node(js, JSON_INVALID);
+}
+
struct json_context *json_new(void)
{
struct mempool *mp = mp_new(4096);
struct json_context *js = mp_alloc_zero(mp, sizeof(*js));
js->pool = mp;
- mp_save(mp, &js->init_state);
+ json_init(js);
return js;
}
void json_reset(struct json_context *js)
{
- mp_restore(js->pool, &js->init_state);
+ struct mempool *mp = js->pool;
+ mp_restore(mp, &js->init_state);
+ bzero(js, sizeof(*js));
+ js->pool = mp;
+ json_init(js);
+}
+
+void json_push(struct json_context *js)
+{
+ ASSERT(!js->next_token);
+ mp_push(js->pool);
}
+void json_pop(struct json_context *js)
+{
+ ASSERT(!js->next_token);
+ mp_pop(js->pool);
+}
struct json_node *json_new_node(struct json_context *js, enum json_node_type type)
{
return n;
}
+struct json_node *json_new_number(struct json_context *js, double value)
+{
+ ASSERT(isfinite(value));
+ struct json_node *n = json_new_node(js, JSON_NUMBER);
+ n->number = value;
+ return n;
+}
+
+#define JSON_NUM_TO(_type, _min, _max) \
+ bool json_number_to_##_type(struct json_node *num, _type *dest) \
+ { \
+ if (num->type == JSON_NUMBER && \
+ num->number >= _min && num->number <= _max) \
+ { \
+ *dest = num->number; \
+ return 1; \
+ } \
+ return 0; \
+ }
+
+JSON_NUM_TO(int, INT_MIN, INT_MAX)
+JSON_NUM_TO(uint, 0, UINT_MAX)
+JSON_NUM_TO(s64, INT64_MIN, INT64_MAX)
+JSON_NUM_TO(u64, 0, UINT64_MAX)
+
struct json_node *json_new_array(struct json_context *js)
{
struct json_node *n = json_new_node(js, JSON_ARRAY);