summaryrefslogtreecommitdiff
path: root/src/internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/internal.h')
-rw-r--r--src/internal.h74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/internal.h b/src/internal.h
new file mode 100644
index 0000000..7ea8a5e
--- /dev/null
+++ b/src/internal.h
@@ -0,0 +1,74 @@
+#ifndef _JSON_INTERNAL_H_
+#define _JSON_INTERNAL_H_
+
+#include <stdlib.h>
+
+#include <json.h>
+
+struct raw_json {
+ const char *data;
+ size_t size;
+ size_t index;
+};
+
+inline static void skip_ws(struct raw_json *raw) {
+ // empty loop to move i along until we hit a non-whitespace
+ while (raw->index < raw->size &&
+ (raw->data[raw->index] == ' ' ||
+ raw->data[raw->index] == '\n' ||
+ raw->data[raw->index] == '\r' ||
+ raw->data[raw->index] == '\t'))
+ {
+ raw->index++;
+ }
+}
+
+inline static bool init_children(struct json *obj) {
+ const size_t starting_size = 4;
+ obj->children = calloc(sizeof(*obj->children) + (sizeof(*obj->children->items) * starting_size), 1);
+ if (!obj->children)
+ return false;
+ obj->children->maxitems = starting_size;
+ obj->children->nitems = 0;
+ return true;
+}
+
+
+inline static void add_children(struct json *dest, struct json *src) {
+ struct json_children *children = dest->children;
+ if (children->nitems + 1 >= children->maxitems) {
+ children->maxitems += 5;
+ children = realloc(children, sizeof(*children) + (sizeof(*children->items) * children->maxitems));
+ if (!children)
+ return;
+ dest->children = children;
+ }
+
+ src->parent = dest;
+ src->index = children->nitems;
+
+ if (children->nitems > 0) {
+ children->items[children->nitems - 1]->next = src;
+ src->prev = children->items[children->nitems - 1];
+ }
+
+ children->items[children->nitems++] = src;
+ src->parent = dest;
+}
+
+inline static void adjust_pointers(struct json* from, struct json* to) {
+ to->prev = from->prev;
+ to->next = from->next;
+ if (from->prev) from->prev->next = to;
+ if (from->next) from->next->prev = to;
+}
+
+
+enum json_parse_result parse_value(struct json **json_out, struct raw_json *raw, size_t depth);
+enum json_parse_result parse_object(struct json **json_out, struct raw_json *raw, size_t depth);
+enum json_parse_result parse_array(struct json **json_out, struct raw_json *raw, size_t depth);
+enum json_parse_result parse_raw_string(char **str_out, struct raw_json *raw);
+enum json_parse_result parse_string(struct json **json_out, struct raw_json *raw);
+enum json_parse_result parse_literal(struct json **json_out, struct raw_json *raw);
+
+#endif