]> mj.ucw.cz Git - libucw.git/blobdiff - ucw-json/json.c
UCW::Configure::Perl: Split off configuration of Perl paths
[libucw.git] / ucw-json / json.c
index 3661a735c3d07809ed6686595af0701ad3fbdfd8..780478d661ed55cbcbede6e614036f187980bb1e 100644 (file)
 #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)
@@ -40,6 +45,18 @@ void json_reset(struct json_context *js)
   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)
 {
   struct json_node *n = mp_alloc_fast(js->pool, sizeof(*n));
@@ -47,6 +64,31 @@ struct json_node *json_new_node(struct json_context *js, enum json_node_type typ
   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);