#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 bool ensure_size(struct json *dest, size_t to_add) { struct json_children *chld = dest->children; while (chld->nitems + to_add >= chld->maxitems) { chld->maxitems *= 2; chld = realloc(chld, sizeof(*chld) + (sizeof(*chld->items) * chld->maxitems)); if (!chld) return false; dest->children = chld; } return true; } inline static void add_children(struct json *dest, struct json *src) { if (!ensure_size(dest, 1)) return; struct json_children *children = dest->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