#ifndef _JSON_INTERNAL_H_ #define _JSON_INTERNAL_H_ #include #include 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; } 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