jv_parse: refactor jv_parse_sized

Signed-off-by: David Korczynski <david@adalogics.com>
This commit is contained in:
David Korczynski authored and Emanuele Torre committed 2023-11-28 20:36:59 +01:00
1 parent eb3b5654bb
commit 4570c23720
1 file changed
+8 -43
+8 -43
View File
@@ -859,49 +859,6 @@ jv jv_parser_next(struct jv_parser* p) {
} }
} }
jv jv_parse_sized(const char* string, int length) {
struct jv_parser parser;
parser_init(&parser, 0);
jv_parser_set_buf(&parser, string, length, 0);
jv value = jv_parser_next(&parser);
if (jv_is_valid(value)) {
jv next = jv_parser_next(&parser);
if (jv_is_valid(next)) {
// multiple JSON values, we only wanted one
jv_free(value);
jv_free(next);
value = jv_invalid_with_msg(jv_string("Unexpected extra JSON values"));
} else if (jv_invalid_has_msg(jv_copy(next))) {
// parser error after the first JSON value
jv_free(value);
value = next;
} else {
// a single valid JSON value
jv_free(next);
}
} else if (jv_invalid_has_msg(jv_copy(value))) {
// parse error, we'll return it
} else {
// no value at all
jv_free(value);
value = jv_invalid_with_msg(jv_string("Expected JSON value"));
}
parser_free(&parser);
if (!jv_is_valid(value) && jv_invalid_has_msg(jv_copy(value))) {
jv msg = jv_invalid_get_msg(value);
value = jv_invalid_with_msg(jv_string_fmt("%s (while parsing '%s')",
jv_string_value(msg),
string));
jv_free(msg);
}
return value;
}
jv jv_parse(const char* string) {
return jv_parse_sized(string, strlen(string));
}
jv jv_parse_sized_custom_flags(const char* string, int length, int flags) { jv jv_parse_sized_custom_flags(const char* string, int length, int flags) {
struct jv_parser parser; struct jv_parser parser;
parser_init(&parser, flags); parser_init(&parser, flags);
@@ -941,6 +898,14 @@ jv jv_parse_sized_custom_flags(const char* string, int length, int flags) {
return value; return value;
} }
jv jv_parse_sized(const char* string, int length) {
return jv_parse_sized_custom_flags(string, length, 0);
}
jv jv_parse(const char* string) {
return jv_parse_sized(string, strlen(string));
}
jv jv_parse_custom_flags(const char* string, int flags) { jv jv_parse_custom_flags(const char* string, int flags) {
return jv_parse_sized_custom_flags(string, strlen(string), flags); return jv_parse_sized_custom_flags(string, strlen(string), flags);
} }