diff --git a/cig.h b/cig.h index 2a2d352..9af9678 100644 --- a/cig.h +++ b/cig.h @@ -381,7 +381,7 @@ bool json_as_number(json_value_t *value, double *out_double); bool json_as_object(json_value_t *value, json_object_t *out_object); bool json_as_string(json_value_t *value, json_string_t *out_string); bool json_obj_get(json_object_t *obj, json_string_t key, json_value_t *out_value); -json_value_t *json_parse(const char *content, allocator_t allocator); +json_value_t json_parse(scanner_t *scanner, allocator_t allocator); // string builder ////////////////////////////////////////////////////////////// typedef struct string_builder_node { @@ -444,6 +444,7 @@ void allocator_reset(allocator_t this) { #include "dyn_array.c" #include "cli.c" #include "scanner.c" +#include "json.c" #include "string_builder.c" #include "file_io.c" diff --git a/json.c b/json.c new file mode 100644 index 0000000..5835a44 --- /dev/null +++ b/json.c @@ -0,0 +1,66 @@ +#include "cig.h" +#include + +bool json_as_array(json_value_t *value, json_array_t *array) { +} + +bool json_as_boolean(json_value_t *value, bool *out_bool) { +} + +bool json_as_null(json_value_t *value) { +} + +bool json_as_number(json_value_t *value, double *out_double) { +} + +bool json_as_object(json_value_t *value, json_object_t *out_object) { +} + +bool json_as_string(json_value_t *value, json_string_t *out_string) { +} + +bool json_obj_get(json_object_t *obj, json_string_t key, json_value_t *out_value) { +} + +json_value_t json_parse(scanner_t *scanner, allocator_t allocator) { + scan_whitespace(scanner); + if (scan_string_literal(scanner)) { + const char *buffer = scanner->value.string_literal; + size_t length = strlen(buffer); + char *buff_copy = allocator_alloc(allocator, length+1); + strncpy(buff_copy, buffer, length+1); + buff_copy[length] = '\0'; + return (json_value_t) { + .type=json_type_string, + .string=(json_string_t) { .length=length, .buffer=buff_copy } + }; + } else if (scan_f64(scanner)) { + return (json_value_t) { + .type=json_type_number, + .number=scanner->value.f64 + }; + } else if (scan_i64(scanner)) { + // TODO: is this needed? + return (json_value_t) { + .type=json_type_number, + .number=(double)scanner->value.i64 + }; + } else if (scan_literal(scanner, "true")) { + return (json_value_t) { + .type=json_type_boolean, + .boolean=true + }; + } else if (scan_literal(scanner, "false")) { + return (json_value_t) { + .type=json_type_boolean, + .boolean=false + }; + } else if (scan_literal(scanner, "null")) { + return (json_value_t) { + .type=json_type_null + }; + } else if (scan_literal(scanner, "[")) { + json_parse(scanner, allocator); + // TODO + } +}