33#ifndef SHEREDOM_JSON_H_INCLUDED
34#define SHEREDOM_JSON_H_INCLUDED
40#pragma warning(disable : 4255)
43#pragma warning(disable : 4668)
46#pragma warning(disable : 4820)
52#if defined(_MSC_VER) || defined(__MINGW32__)
53#define json_weak __inline
54#elif defined(__clang__) || defined(__GNUC__)
55#define json_weak __attribute__((weak))
57#error Non clang, non gcc, non MSVC compiler found!
67enum json_parse_flags_e {
68 json_parse_flags_default = 0,
72 json_parse_flags_allow_trailing_comma = 0x1,
76 json_parse_flags_allow_unquoted_keys = 0x2,
80 json_parse_flags_allow_global_object = 0x4,
84 json_parse_flags_allow_equals_in_object = 0x8,
88 json_parse_flags_allow_no_commas = 0x10,
92 json_parse_flags_allow_c_style_comments = 0x20,
95 json_parse_flags_deprecated = 0x40,
98 json_parse_flags_allow_location_information = 0x80,
101 json_parse_flags_allow_single_quoted_strings = 0x100,
104 json_parse_flags_allow_hexadecimal_numbers = 0x200,
107 json_parse_flags_allow_leading_plus_sign = 0x400,
110 json_parse_flags_allow_leading_or_trailing_decimal_point = 0x800,
113 json_parse_flags_allow_inf_and_nan = 0x1000,
116 json_parse_flags_allow_multi_line_strings = 0x2000,
120 json_parse_flags_allow_simplified_json =
121 (json_parse_flags_allow_trailing_comma |
122 json_parse_flags_allow_unquoted_keys |
123 json_parse_flags_allow_global_object |
124 json_parse_flags_allow_equals_in_object |
125 json_parse_flags_allow_no_commas),
129 json_parse_flags_allow_json5 =
130 (json_parse_flags_allow_trailing_comma |
131 json_parse_flags_allow_unquoted_keys |
132 json_parse_flags_allow_c_style_comments |
133 json_parse_flags_allow_single_quoted_strings |
134 json_parse_flags_allow_hexadecimal_numbers |
135 json_parse_flags_allow_leading_plus_sign |
136 json_parse_flags_allow_leading_or_trailing_decimal_point |
137 json_parse_flags_allow_inf_and_nan |
138 json_parse_flags_allow_multi_line_strings)
144json_weak
struct json_value_s *json_parse(
const void *src,
size_t src_size);
153json_parse_ex(
const void *src,
size_t src_size,
size_t flags_bitset,
154 void *(*alloc_func_ptr)(
void *,
size_t),
void *user_data,
168 void *(*alloc_func_ptr)(
void *,
size_t),
void *user_data);
175json_weak
void *json_write_minified(
const struct json_value_s *value,
187json_weak
void *json_write_pretty(
const struct json_value_s *value,
188 const char *indent,
const char *newline,
212json_weak
int json_value_is_true(
const struct json_value_s *
const value);
215json_weak
int json_value_is_false(
const struct json_value_s *
const value);
218json_weak
int json_value_is_null(
const struct json_value_s *
const value);
325enum json_parse_error_e {
327 json_parse_error_none = 0,
331 json_parse_error_expected_comma_or_closing_bracket,
334 json_parse_error_expected_colon,
337 json_parse_error_expected_opening_quote,
340 json_parse_error_invalid_string_escape_sequence,
343 json_parse_error_invalid_number_format,
346 json_parse_error_invalid_value,
349 json_parse_error_premature_end_of_buffer,
352 json_parse_error_invalid_string,
355 json_parse_error_allocator_failed,
360 json_parse_error_unexpected_trailing_characters,
363 json_parse_error_unknown
375 size_t error_line_no;
391#if defined(_MSC_VER) && (_MSC_VER < 1920)
392#define json_uintmax_t unsigned __int64
395#define json_uintmax_t uintmax_t
399#define json_strtoumax _strtoui64
401#define json_strtoumax strtoumax
404#if defined(__cplusplus) && (__cplusplus >= 201103L)
405#define json_null nullptr
410#if defined(__clang__)
411#pragma clang diagnostic push
416#pragma clang diagnostic ignored "-Wcast-align"
419#pragma clang diagnostic ignored "-Wold-style-cast"
422#pragma clang diagnostic ignored "-Wc++11-long-long"
425#pragma clang diagnostic ignored "-Wc++98-compat"
426#pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
427#elif defined(_MSC_VER)
431#pragma warning(disable : 4711)
434#pragma warning(disable : 4619)
437#pragma warning(disable : 4616)
442#pragma warning(disable : 5045)
460json_weak
int json_hexadecimal_digit(
const char c);
461int json_hexadecimal_digit(
const char c) {
462 if (
'0' <= c && c <=
'9') {
465 if (
'a' <= c && c <=
'f') {
468 if (
'A' <= c && c <=
'F') {
474json_weak
int json_hexadecimal_value(
const char *c,
const unsigned long size,
475 unsigned long *result);
476int json_hexadecimal_value(
const char *c,
const unsigned long size,
477 unsigned long *result) {
481 if (size >
sizeof(
unsigned long) * 2) {
486 for (p = c; (
unsigned long)(p - c) <
size; ++p) {
488 digit = json_hexadecimal_digit(*p);
489 if (digit < 0 || digit > 15) {
492 *result |= (
unsigned char)digit;
499 size_t offset = state->offset;
500 const size_t size = state->size;
501 const char *
const src = state->src;
505 switch (src[offset]) {
516 switch (src[offset]) {
519 state->offset = offset;
527 state->line_offset = offset;
532 }
while (offset < size);
535 state->offset = offset;
542 if (
'/' == state->src[state->offset]) {
546 if (
'/' == state->src[state->offset]) {
552 while (state->offset < state->size) {
553 switch (state->src[state->offset]) {
564 state->line_offset = state->offset;
571 }
else if (
'*' == state->src[state->offset]) {
577 while (state->offset + 1 < state->size) {
578 if ((
'*' == state->src[state->offset]) &&
579 (
'/' == state->src[state->offset + 1])) {
583 }
else if (
'\n' == state->src[state->offset]) {
586 state->line_offset = state->offset;
610 const size_t size = state->size;
612 if (json_parse_flags_allow_c_style_comments & state->flags_bitset) {
614 if (state->offset == size) {
615 state->error = json_parse_error_premature_end_of_buffer;
619 did_consume = json_skip_whitespace(state);
623 if (state->offset == size) {
624 state->error = json_parse_error_premature_end_of_buffer;
628 did_consume |= json_skip_c_style_comments(state);
629 }
while (0 != did_consume);
632 if (state->offset == size) {
633 state->error = json_parse_error_premature_end_of_buffer;
637 did_consume = json_skip_whitespace(state);
638 }
while (0 != did_consume);
641 if (state->offset == size) {
642 state->error = json_parse_error_premature_end_of_buffer;
650 int is_global_object);
655 size_t offset = state->offset;
656 const size_t size = state->size;
657 size_t data_size = 0;
658 const char *
const src = state->src;
659 const int is_single_quote =
'\'' == src[offset];
660 const char quote_to_use = is_single_quote ?
'\'' :
'"';
661 const size_t flags_bitset = state->flags_bitset;
662 unsigned long codepoint;
663 unsigned long high_surrogate = 0;
665 if ((json_parse_flags_allow_location_information & flags_bitset) != 0 &&
672 if (
'"' != src[offset]) {
674 if (!((json_parse_flags_allow_single_quoted_strings & flags_bitset) &&
676 state->error = json_parse_error_expected_opening_quote;
677 state->offset = offset;
685 while ((offset < size) && (quote_to_use != src[offset])) {
689 switch (src[offset]) {
694 state->error = json_parse_error_invalid_string;
695 state->offset = offset;
699 if (
'\\' == src[offset]) {
703 if (offset == size) {
704 state->error = json_parse_error_premature_end_of_buffer;
705 state->offset = offset;
709 switch (src[offset]) {
711 state->error = json_parse_error_invalid_string_escape_sequence;
712 state->offset = offset;
726 if (!(offset + 5 < size)) {
728 state->error = json_parse_error_invalid_string_escape_sequence;
729 state->offset = offset;
734 if (!json_hexadecimal_value(&src[offset + 1], 4, &codepoint)) {
736 state->error = json_parse_error_invalid_string_escape_sequence;
737 state->offset = offset;
755 if (high_surrogate != 0) {
758 if (codepoint >= 0xdc00 &&
759 codepoint <= 0xdfff) {
763 state->error = json_parse_error_invalid_string_escape_sequence;
764 state->offset = offset;
767 }
else if (codepoint <= 0x7f) {
769 }
else if (codepoint <= 0x7ff) {
771 }
else if (codepoint >= 0xd800 &&
772 codepoint <= 0xdbff) {
775 if (offset + 11 > size ||
'\\' != src[offset + 5] ||
776 'u' != src[offset + 6]) {
777 state->error = json_parse_error_invalid_string_escape_sequence;
778 state->offset = offset;
781 high_surrogate = codepoint;
782 }
else if (codepoint >= 0xd800 &&
783 codepoint <= 0xdfff) {
785 state->error = json_parse_error_invalid_string_escape_sequence;
786 state->offset = offset;
797 }
else if ((
'\r' == src[offset]) || (
'\n' == src[offset])) {
798 if (!(json_parse_flags_allow_multi_line_strings & flags_bitset)) {
800 state->error = json_parse_error_invalid_string_escape_sequence;
801 state->offset = offset;
813 if (offset == size) {
814 state->error = json_parse_error_premature_end_of_buffer;
815 state->offset = offset - 1;
823 state->data_size += data_size;
829 state->offset = offset;
834json_weak
int is_valid_unquoted_key_char(
const char c);
835int is_valid_unquoted_key_char(
const char c) {
836 return ((
'0' <= c && c <=
'9') || (
'a' <= c && c <=
'z') ||
837 (
'A' <= c && c <=
'Z') || (
'_' == c));
842 const size_t flags_bitset = state->flags_bitset;
844 if (json_parse_flags_allow_unquoted_keys & flags_bitset) {
845 size_t offset = state->offset;
846 const size_t size = state->size;
847 const char *
const src = state->src;
848 size_t data_size = state->data_size;
851 if (
'"' == src[offset]) {
853 return json_get_string_size(state, 1);
854 }
else if ((json_parse_flags_allow_single_quoted_strings & flags_bitset) &&
855 (
'\'' == src[offset])) {
857 return json_get_string_size(state, 1);
859 while ((offset < size) && is_valid_unquoted_key_char(src[offset])) {
867 if (json_parse_flags_allow_location_information & flags_bitset) {
874 state->offset = offset;
877 state->data_size = data_size;
883 return json_get_string_size(state, 1);
888 int is_global_object);
890 int is_global_object) {
891 const size_t flags_bitset = state->flags_bitset;
892 const char *
const src = state->src;
893 const size_t size = state->size;
896 int found_closing_brace = 0;
898 if (is_global_object) {
901 if (!json_skip_all_skippables(state) &&
'{' == state->src[state->offset]) {
903 is_global_object = 0;
907 if (!is_global_object) {
908 if (
'{' != src[state->offset]) {
909 state->error = json_parse_error_unknown;
919 if ((state->offset == size) && !is_global_object) {
920 state->error = json_parse_error_premature_end_of_buffer;
925 if (!is_global_object) {
926 if (json_skip_all_skippables(state)) {
927 state->error = json_parse_error_premature_end_of_buffer;
931 if (
'}' == src[state->offset]) {
935 found_closing_brace = 1;
943 if (json_skip_all_skippables(state)) {
950 if (
',' == src[state->offset]) {
954 }
else if (json_parse_flags_allow_no_commas & flags_bitset) {
959 state->error = json_parse_error_expected_comma_or_closing_bracket;
963 if (json_parse_flags_allow_trailing_comma & flags_bitset) {
966 if (json_skip_all_skippables(state)) {
967 state->error = json_parse_error_premature_end_of_buffer;
973 if (json_get_key_size(state)) {
975 state->error = json_parse_error_invalid_string;
979 if (json_skip_all_skippables(state)) {
980 state->error = json_parse_error_premature_end_of_buffer;
984 if (json_parse_flags_allow_equals_in_object & flags_bitset) {
985 const char current = src[state->offset];
986 if ((
':' != current) && (
'=' != current)) {
987 state->error = json_parse_error_expected_colon;
991 if (
':' != src[state->offset]) {
992 state->error = json_parse_error_expected_colon;
1000 if (json_skip_all_skippables(state)) {
1001 state->error = json_parse_error_premature_end_of_buffer;
1005 if (json_get_value_size(state, 0)) {
1013 }
while (state->offset < size);
1015 if ((state->offset == size) && !is_global_object && !found_closing_brace) {
1016 state->error = json_parse_error_premature_end_of_buffer;
1027 const size_t flags_bitset = state->flags_bitset;
1028 size_t elements = 0;
1029 int allow_comma = 0;
1030 const char *
const src = state->src;
1031 const size_t size = state->size;
1033 if (
'[' != src[state->offset]) {
1035 state->error = json_parse_error_unknown;
1044 while (state->offset < size) {
1045 if (json_skip_all_skippables(state)) {
1046 state->error = json_parse_error_premature_end_of_buffer;
1050 if (
']' == src[state->offset]) {
1062 if (
',' == src[state->offset]) {
1066 }
else if (!(json_parse_flags_allow_no_commas & flags_bitset)) {
1067 state->error = json_parse_error_expected_comma_or_closing_bracket;
1071 if (json_parse_flags_allow_trailing_comma & flags_bitset) {
1075 if (json_skip_all_skippables(state)) {
1076 state->error = json_parse_error_premature_end_of_buffer;
1082 if (json_get_value_size(state, 0)) {
1094 state->error = json_parse_error_premature_end_of_buffer;
1100 const size_t flags_bitset = state->flags_bitset;
1101 size_t offset = state->offset;
1102 const size_t size = state->size;
1103 int had_leading_digits = 0;
1104 const char *
const src = state->src;
1108 if ((json_parse_flags_allow_hexadecimal_numbers & flags_bitset) &&
1109 (offset + 1 < size) && (
'0' == src[offset]) &&
1110 ((
'x' == src[offset + 1]) || (
'X' == src[offset + 1]))) {
1115 while ((offset < size) && ((
'0' <= src[offset] && src[offset] <=
'9') ||
1116 (
'a' <= src[offset] && src[offset] <=
'f') ||
1117 (
'A' <= src[offset] && src[offset] <=
'F'))) {
1124 if ((offset < size) &&
1125 ((
'-' == src[offset]) ||
1126 ((json_parse_flags_allow_leading_plus_sign & flags_bitset) &&
1127 (
'+' == src[offset])))) {
1134 if (json_parse_flags_allow_inf_and_nan & flags_bitset) {
1135 const char inf[9] =
"Infinity";
1136 const size_t inf_strlen =
sizeof(inf) - 1;
1137 const char nan[4] =
"NaN";
1138 const size_t nan_strlen =
sizeof(
nan) - 1;
1140 if (offset + inf_strlen < size) {
1143 for (i = 0; i < inf_strlen; i++) {
1144 if (inf[i] != src[offset + i]) {
1152 offset += inf_strlen;
1158 if (offset + nan_strlen < size) {
1161 for (i = 0; i < nan_strlen; i++) {
1162 if (nan[i] != src[offset + i]) {
1170 offset += nan_strlen;
1177 if (found_sign && !inf_or_nan && (offset < size) &&
1178 !(
'0' <= src[offset] && src[offset] <=
'9')) {
1180 if (!(json_parse_flags_allow_leading_or_trailing_decimal_point &
1182 (
'.' != src[offset])) {
1184 state->error = json_parse_error_invalid_number_format;
1185 state->offset = offset;
1190 if ((offset < size) && (
'0' == src[offset])) {
1196 had_leading_digits = 1;
1198 if ((offset < size) && (
'0' <= src[offset] && src[offset] <=
'9')) {
1200 state->error = json_parse_error_invalid_number_format;
1201 state->offset = offset;
1207 while ((offset < size) && (
'0' <= src[offset] && src[offset] <=
'9')) {
1212 had_leading_digits = 1;
1215 if ((offset < size) && (
'.' == src[offset])) {
1218 if (!(
'0' <= src[offset] && src[offset] <=
'9')) {
1219 if (!(json_parse_flags_allow_leading_or_trailing_decimal_point &
1221 !had_leading_digits) {
1223 state->error = json_parse_error_invalid_number_format;
1224 state->offset = offset;
1230 while ((offset < size) && (
'0' <= src[offset] && src[offset] <=
'9')) {
1235 if ((offset < size) && (
'e' == src[offset] ||
'E' == src[offset])) {
1239 if ((offset < size) && (
'-' == src[offset] ||
'+' == src[offset])) {
1244 if ((offset < size) && !(
'0' <= src[offset] && src[offset] <=
'9')) {
1246 state->error = json_parse_error_invalid_number_format;
1247 state->offset = offset;
1254 }
while ((offset < size) && (
'0' <= src[offset] && src[offset] <=
'9'));
1258 if (offset < size) {
1259 switch (src[offset]) {
1270 if (json_parse_flags_allow_equals_in_object & flags_bitset) {
1274 state->error = json_parse_error_invalid_number_format;
1275 state->offset = offset;
1278 state->error = json_parse_error_invalid_number_format;
1279 state->offset = offset;
1284 state->data_size += offset - state->offset;
1290 state->offset = offset;
1296 int is_global_object);
1298 int is_global_object) {
1299 const size_t flags_bitset = state->flags_bitset;
1300 const char *
const src = state->src;
1302 const size_t size = state->size;
1304 if (json_parse_flags_allow_location_information & flags_bitset) {
1310 if (is_global_object) {
1311 return json_get_object_size(state, 1);
1313 if (json_skip_all_skippables(state)) {
1314 state->error = json_parse_error_premature_end_of_buffer;
1319 offset = state->offset;
1321 switch (src[offset]) {
1323 return json_get_string_size(state, 0);
1325 if (json_parse_flags_allow_single_quoted_strings & flags_bitset) {
1326 return json_get_string_size(state, 0);
1329 state->error = json_parse_error_invalid_value;
1333 return json_get_object_size(state, 0);
1335 return json_get_array_size(state);
1347 return json_get_number_size(state);
1349 if (json_parse_flags_allow_leading_plus_sign & flags_bitset) {
1350 return json_get_number_size(state);
1353 state->error = json_parse_error_invalid_number_format;
1357 if (json_parse_flags_allow_leading_or_trailing_decimal_point &
1359 return json_get_number_size(state);
1362 state->error = json_parse_error_invalid_number_format;
1366 if ((offset + 4) <= size &&
't' == src[offset + 0] &&
1367 'r' == src[offset + 1] &&
'u' == src[offset + 2] &&
1368 'e' == src[offset + 3]) {
1371 }
else if ((offset + 5) <= size &&
'f' == src[offset + 0] &&
1372 'a' == src[offset + 1] &&
'l' == src[offset + 2] &&
1373 's' == src[offset + 3] &&
'e' == src[offset + 4]) {
1376 }
else if ((offset + 4) <= size &&
'n' == state->src[offset + 0] &&
1377 'u' == state->src[offset + 1] &&
1378 'l' == state->src[offset + 2] &&
1379 'l' == state->src[offset + 3]) {
1382 }
else if ((json_parse_flags_allow_inf_and_nan & flags_bitset) &&
1383 (offset + 3) <= size &&
'N' == src[offset + 0] &&
1384 'a' == src[offset + 1] &&
'N' == src[offset + 2]) {
1385 return json_get_number_size(state);
1386 }
else if ((json_parse_flags_allow_inf_and_nan & flags_bitset) &&
1387 (offset + 8) <= size &&
'I' == src[offset + 0] &&
1388 'n' == src[offset + 1] &&
'f' == src[offset + 2] &&
1389 'i' == src[offset + 3] &&
'n' == src[offset + 4] &&
1390 'i' == src[offset + 5] &&
't' == src[offset + 6] &&
1391 'y' == src[offset + 7]) {
1392 return json_get_number_size(state);
1396 state->error = json_parse_error_invalid_value;
1403 int is_global_object,
1410 size_t offset = state->offset;
1411 size_t bytes_written = 0;
1412 const char *
const src = state->src;
1413 const char quote_to_use =
'\'' == src[offset] ?
'\'' :
'"';
1414 char *
data = state->data;
1415 unsigned long high_surrogate = 0;
1416 unsigned long codepoint;
1418 string->string =
data;
1423 while (quote_to_use != src[offset]) {
1424 if (
'\\' == src[offset]) {
1428 switch (src[offset++]) {
1433 if (!json_hexadecimal_value(&src[offset], 4, &codepoint)) {
1440 if (codepoint <= 0x7fu) {
1441 data[bytes_written++] = (
char)codepoint;
1442 }
else if (codepoint <= 0x7ffu) {
1443 data[bytes_written++] =
1444 (
char)(0xc0u | (codepoint >> 6));
1445 data[bytes_written++] =
1446 (
char)(0x80u | (codepoint & 0x3fu));
1447 }
else if (codepoint >= 0xd800 &&
1448 codepoint <= 0xdbff) {
1449 high_surrogate = codepoint;
1451 }
else if (codepoint >= 0xdc00 &&
1452 codepoint <= 0xdfff) {
1455 const unsigned long surrogate_offset =
1456 0x10000u - (0xD800u << 10) - 0xDC00u;
1457 codepoint = (high_surrogate << 10) + codepoint + surrogate_offset;
1459 data[bytes_written++] =
1460 (
char)(0xF0u | (codepoint >> 18));
1461 data[bytes_written++] =
1462 (
char)(0x80u | ((codepoint >> 12) & 0x3fu));
1463 data[bytes_written++] =
1464 (
char)(0x80u | ((codepoint >> 6) & 0x3fu));
1465 data[bytes_written++] =
1466 (
char)(0x80u | (codepoint & 0x3fu));
1470 data[bytes_written++] =
1471 (
char)(0xe0u | (codepoint >> 12));
1472 data[bytes_written++] =
1473 (
char)(0x80u | ((codepoint >> 6) & 0x3fu));
1474 data[bytes_written++] =
1475 (
char)(0x80u | (codepoint & 0x3fu));
1479 data[bytes_written++] =
'"';
1482 data[bytes_written++] =
'\\';
1485 data[bytes_written++] =
'/';
1488 data[bytes_written++] =
'\b';
1491 data[bytes_written++] =
'\f';
1494 data[bytes_written++] =
'\n';
1497 data[bytes_written++] =
'\r';
1500 data[bytes_written++] =
'\t';
1503 data[bytes_written++] =
'\r';
1506 if (
'\n' == src[offset]) {
1507 data[bytes_written++] =
'\n';
1513 data[bytes_written++] =
'\n';
1518 data[bytes_written++] = src[offset++];
1526 string->string_size = bytes_written;
1529 data[bytes_written++] =
'\0';
1532 state->data += bytes_written;
1535 state->offset = offset;
1542 if (json_parse_flags_allow_unquoted_keys & state->flags_bitset) {
1543 const char *
const src = state->src;
1544 char *
const data = state->data;
1545 size_t offset = state->offset;
1548 if ((
'"' == src[offset]) || (
'\'' == src[offset])) {
1550 json_parse_string(state,
string);
1554 string->string = state->data;
1556 while (is_valid_unquoted_key_char(src[offset])) {
1564 string->string_size =
size++;
1567 state->data +=
size;
1570 state->offset = offset;
1574 json_parse_string(state,
string);
1579 int is_global_object,
1583 const size_t flags_bitset = state->flags_bitset;
1584 const size_t size = state->size;
1585 const char *
const src = state->src;
1586 size_t elements = 0;
1587 int allow_comma = 0;
1590 if (is_global_object) {
1594 if (
'{' == src[state->offset]) {
1596 is_global_object = 0;
1600 if (!is_global_object) {
1605 (void)json_skip_all_skippables(state);
1610 while (state->offset < size) {
1615 if (!is_global_object) {
1616 (void)json_skip_all_skippables(state);
1618 if (
'}' == src[state->offset]) {
1626 if (json_skip_all_skippables(state)) {
1634 if (
',' == src[state->offset]) {
1646 if (json_null == previous) {
1648 object->start = element;
1650 previous->next = element;
1655 if (json_parse_flags_allow_location_information & flags_bitset) {
1660 string_ex->offset = state->offset;
1661 string_ex->line_no = state->line_no;
1662 string_ex->row_no = state->offset - state->line_offset;
1664 string = &(string_ex->string);
1670 element->name = string;
1672 (void)json_parse_key(state,
string);
1674 (void)json_skip_all_skippables(state);
1679 (void)json_skip_all_skippables(state);
1681 if (json_parse_flags_allow_location_information & flags_bitset) {
1685 value_ex->offset = state->offset;
1686 value_ex->line_no = state->line_no;
1687 value_ex->row_no = state->offset - state->line_offset;
1689 value = &(value_ex->value);
1695 element->value = value;
1697 json_parse_value(state, 0, value);
1706 previous->next = json_null;
1709 if (0 == elements) {
1710 object->start = json_null;
1713 object->length = elements;
1720 const char *
const src = state->src;
1721 const size_t size = state->size;
1722 size_t elements = 0;
1723 int allow_comma = 0;
1729 (void)json_skip_all_skippables(state);
1738 (void)json_skip_all_skippables(state);
1740 if (
']' == src[state->offset]) {
1750 if (
',' == src[state->offset]) {
1762 if (json_null == previous) {
1764 array->start = element;
1766 previous->next = element;
1771 if (json_parse_flags_allow_location_information & state->flags_bitset) {
1775 value_ex->offset = state->offset;
1776 value_ex->line_no = state->line_no;
1777 value_ex->row_no = state->offset - state->line_offset;
1779 value = &(value_ex->value);
1785 element->value = value;
1787 json_parse_value(state, 0, value);
1792 }
while (state->offset < size);
1796 previous->next = json_null;
1799 if (0 == elements) {
1800 array->start = json_null;
1803 array->length = elements;
1810 const size_t flags_bitset = state->flags_bitset;
1811 size_t offset = state->offset;
1812 const size_t size = state->size;
1813 size_t bytes_written = 0;
1814 const char *
const src = state->src;
1815 char *
data = state->data;
1817 number->number =
data;
1819 if (json_parse_flags_allow_hexadecimal_numbers & flags_bitset) {
1820 if ((
'0' == src[offset]) &&
1821 ((
'x' == src[offset + 1]) || (
'X' == src[offset + 1]))) {
1823 while ((offset < size) &&
1824 ((
'0' <= src[offset] && src[offset] <=
'9') ||
1825 (
'a' <= src[offset] && src[offset] <=
'f') ||
1826 (
'A' <= src[offset] && src[offset] <=
'F') ||
1827 (
'x' == src[offset]) || (
'X' == src[offset]))) {
1828 data[bytes_written++] = src[offset++];
1833 while (offset < size) {
1836 switch (src[offset]) {
1852 data[bytes_written++] = src[offset++];
1864 if (json_parse_flags_allow_inf_and_nan & flags_bitset) {
1865 const size_t inf_strlen = 8;
1866 const size_t nan_strlen = 3;
1868 if (offset + inf_strlen < size) {
1869 if (
'I' == src[offset]) {
1872 for (i = 0; i < inf_strlen; i++) {
1873 data[bytes_written++] = src[offset++];
1878 if (offset + nan_strlen < size) {
1879 if (
'N' == src[offset]) {
1882 for (i = 0; i < nan_strlen; i++) {
1883 data[bytes_written++] = src[offset++];
1890 number->number_size = bytes_written;
1892 data[bytes_written++] =
'\0';
1894 state->data += bytes_written;
1896 state->offset = offset;
1900 int is_global_object,
1904 const size_t flags_bitset = state->flags_bitset;
1905 const char *
const src = state->src;
1906 const size_t size = state->size;
1909 (void)json_skip_all_skippables(state);
1912 offset = state->offset;
1914 if (is_global_object) {
1915 value->type = json_type_object;
1916 value->payload = state->dom;
1918 json_parse_object(state, 1,
1921 switch (src[offset]) {
1924 value->type = json_type_string;
1925 value->payload = state->dom;
1927 json_parse_string(state, (
struct json_string_s *)value->payload);
1930 value->type = json_type_object;
1931 value->payload = state->dom;
1933 json_parse_object(state, 0,
1937 value->type = json_type_array;
1938 value->payload = state->dom;
1940 json_parse_array(state, (
struct json_array_s *)value->payload);
1955 value->type = json_type_number;
1956 value->payload = state->dom;
1958 json_parse_number(state, (
struct json_number_s *)value->payload);
1961 if ((offset + 4) <= size &&
't' == src[offset + 0] &&
1962 'r' == src[offset + 1] &&
'u' == src[offset + 2] &&
1963 'e' == src[offset + 3]) {
1964 value->type = json_type_true;
1965 value->payload = json_null;
1967 }
else if ((offset + 5) <= size &&
'f' == src[offset + 0] &&
1968 'a' == src[offset + 1] &&
'l' == src[offset + 2] &&
1969 's' == src[offset + 3] &&
'e' == src[offset + 4]) {
1970 value->type = json_type_false;
1971 value->payload = json_null;
1973 }
else if ((offset + 4) <= size &&
'n' == src[offset + 0] &&
1974 'u' == src[offset + 1] &&
'l' == src[offset + 2] &&
1975 'l' == src[offset + 3]) {
1976 value->type = json_type_null;
1977 value->payload = json_null;
1979 }
else if ((json_parse_flags_allow_inf_and_nan & flags_bitset) &&
1980 (offset + 3) <= size &&
'N' == src[offset + 0] &&
1981 'a' == src[offset + 1] &&
'N' == src[offset + 2]) {
1982 value->type = json_type_number;
1983 value->payload = state->dom;
1985 json_parse_number(state, (
struct json_number_s *)value->payload);
1986 }
else if ((json_parse_flags_allow_inf_and_nan & flags_bitset) &&
1987 (offset + 8) <= size &&
'I' == src[offset + 0] &&
1988 'n' == src[offset + 1] &&
'f' == src[offset + 2] &&
1989 'i' == src[offset + 3] &&
'n' == src[offset + 4] &&
1990 'i' == src[offset + 5] &&
't' == src[offset + 6] &&
1991 'y' == src[offset + 7]) {
1992 value->type = json_type_number;
1993 value->payload = state->dom;
1995 json_parse_number(state, (
struct json_number_s *)value->payload);
2003json_parse_ex(
const void *src,
size_t src_size,
size_t flags_bitset,
2004 void *(*alloc_func_ptr)(
void *user_data,
size_t size),
2013 result->error = json_parse_error_none;
2014 result->error_offset = 0;
2015 result->error_line_no = 0;
2016 result->error_row_no = 0;
2019 if (json_null == src) {
2024 state.src = (
const char *)src;
2025 state.size = src_size;
2028 state.line_offset = 0;
2029 state.error = json_parse_error_none;
2031 state.data_size = 0;
2032 state.flags_bitset = flags_bitset;
2034 input_error = json_get_value_size(
2035 &state, (
int)(json_parse_flags_allow_global_object & state.flags_bitset));
2037 if (0 == input_error) {
2038 json_skip_all_skippables(&state);
2040 if (state.offset != state.size) {
2044 state.error = json_parse_error_unexpected_trailing_characters;
2052 result->error = state.error;
2053 result->error_offset = state.offset;
2054 result->error_line_no = state.line_no;
2055 result->error_row_no = state.offset - state.line_offset;
2063 total_size = state.dom_size + state.data_size;
2065 if (json_null == alloc_func_ptr) {
2066 allocation =
malloc(total_size);
2068 allocation = alloc_func_ptr(user_data, total_size);
2071 if (json_null == allocation) {
2074 result->error = json_parse_error_allocator_failed;
2075 result->error_offset = 0;
2076 result->error_line_no = 0;
2077 result->error_row_no = 0;
2088 state.line_offset = 0;
2090 state.dom = (
char *)allocation;
2091 state.data = state.dom + state.dom_size;
2093 if (json_parse_flags_allow_location_information & state.flags_bitset) {
2097 value_ex->offset = state.offset;
2098 value_ex->line_no = state.line_no;
2099 value_ex->row_no = state.offset - state.line_offset;
2101 value = &(value_ex->value);
2108 &state, (
int)(json_parse_flags_allow_global_object & state.flags_bitset),
2114struct json_value_s *json_parse(
const void *src,
size_t src_size) {
2115 return json_parse_ex(src, src_size, json_parse_flags_default, json_null,
2116 json_null, json_null);
2125 return json_extract_value_ex(value, json_null, json_null);
2129json_extract_get_number_size(const struct
json_number_s *
const number);
2131json_extract_get_string_size(const struct
json_string_s *
const string);
2133json_extract_get_object_size(const struct
json_object_s *
const object);
2135json_extract_get_array_size(const struct
json_array_s *
const array);
2137json_extract_get_value_size(const struct
json_value_s *
const value);
2140json_extract_get_number_size(const struct
json_number_s *
const number) {
2143 result.data_size = number->number_size;
2148json_extract_get_string_size(const struct
json_string_s *
const string) {
2151 result.data_size =
string->string_size + 1;
2156json_extract_get_object_size(const struct
json_object_s *
const object) {
2163 result.data_size = 0;
2165 for (i = 0; i <
object->length; i++) {
2167 json_extract_get_string_size(element->name);
2169 json_extract_get_value_size(element->value);
2171 result.dom_size += string_result.dom_size;
2172 result.data_size += string_result.data_size;
2174 result.dom_size += value_result.dom_size;
2175 result.data_size += value_result.data_size;
2177 element = element->next;
2184json_extract_get_array_size(const struct
json_array_s *
const array) {
2191 result.data_size = 0;
2193 for (i = 0; i < array->length; i++) {
2195 json_extract_get_value_size(element->value);
2197 result.dom_size += value_result.dom_size;
2198 result.data_size += value_result.data_size;
2200 element = element->next;
2207json_extract_get_value_size(const struct
json_value_s *
const value) {
2210 switch (value->type) {
2213 case json_type_object:
2214 result = json_extract_get_object_size(
2217 case json_type_array:
2218 result = json_extract_get_array_size(
2221 case json_type_number:
2222 result = json_extract_get_number_size(
2225 case json_type_string:
2226 result = json_extract_get_string_size(
2254 new_value->payload = state->dom;
2256 if (json_type_string == value->type) {
2261 memcpy(state->data, string->string, string->string_size + 1);
2262 string->string = state->data;
2263 state->data +=
string->string_size + 1;
2264 }
else if (json_type_number == value->type) {
2269 memcpy(state->data, number->number, number->number_size);
2270 number->number = state->data;
2271 state->data += number->number_size;
2272 }
else if (json_type_object == value->type) {
2280 element =
object->start;
2283 for (i = 0; i <
object->length; i++) {
2291 string = element->name;
2295 element->name = string;
2297 memcpy(state->data, string->string, string->string_size + 1);
2298 string->string = state->data;
2299 state->data +=
string->string_size + 1;
2301 previous_value = element->value;
2303 json_extract_copy_value(state, previous_value);
2305 previous_element = element;
2306 element = element->next;
2312 }
else if (json_type_array == value->type) {
2320 element = array->start;
2323 for (i = 0; i < array->length; i++) {
2331 previous_value = element->value;
2333 json_extract_copy_value(state, previous_value);
2335 previous_element = element;
2336 element = element->next;
2346 void *(*alloc_func_ptr)(
void *,
2354 if (json_null == value) {
2359 result = json_extract_get_value_size(value);
2360 total_size = result.dom_size + result.data_size;
2362 if (json_null == alloc_func_ptr) {
2363 allocation =
malloc(total_size);
2365 allocation = alloc_func_ptr(user_data, total_size);
2368 state.dom = (
char *)allocation;
2369 state.data = state.dom + result.dom_size;
2371 json_extract_copy_value(&state, value);
2377 if (value->type != json_type_string) {
2385 if (value->type != json_type_number) {
2393 if (value->type != json_type_object) {
2401 if (value->type != json_type_array) {
2408int json_value_is_true(
const struct json_value_s *
const value) {
2409 return value->type == json_type_true;
2412int json_value_is_false(
const struct json_value_s *
const value) {
2413 return value->type == json_type_false;
2416int json_value_is_null(
const struct json_value_s *
const value) {
2417 return value->type == json_type_null;
2421json_write_minified_get_value_size(
const struct json_value_s *value,
2424json_weak
int json_write_get_number_size(
const struct json_number_s *number,
2426int json_write_get_number_size(
const struct json_number_s *number,
2428 json_uintmax_t parsed_number;
2431 if (number->number_size >= 2) {
2432 switch (number->number[1]) {
2440 parsed_number = json_strtoumax(number->number, json_null, 0);
2444 while (0 != parsed_number) {
2445 parsed_number /= 10;
2458 if ((i < number->number_size) &&
2459 ((
'+' == number->number[i]) || (
'-' == number->number[i]))) {
2464 if ((i < number->number_size) && (
'I' == number->number[i])) {
2465 const char *inf =
"Infinity";
2468 for (k = i; k < number->number_size; k++) {
2469 const char c = *inf++;
2474 }
else if (c != number->number[k]) {
2484 if (
'-' == number->number[0]) {
2493 if ((i < number->number_size) && (
'N' == number->number[i])) {
2494 const char *
nan =
"NaN";
2497 for (k = i; k < number->number_size; k++) {
2498 const char c = *
nan++;
2503 }
else if (c != number->number[k]) {
2517 if ((i < number->number_size) && (
'.' == number->number[i])) {
2523 for (; i < number->number_size; i++) {
2524 const char c = number->number[i];
2525 if (!(
'0' <= c && c <=
'9')) {
2531 if ((i + 1 == number->number_size) && (
'.' == number->number[i])) {
2538 *
size += number->number_size;
2541 if (
'+' == number->number[0]) {
2548json_weak
int json_write_get_string_size(
const struct json_string_s *
string,
2550int json_write_get_string_size(
const struct json_string_s *
string,
2553 for (i = 0; i <
string->string_size; i++) {
2554 switch (string->string[i]) {
2576json_write_minified_get_array_size(
const struct json_array_s *array,
2578int json_write_minified_get_array_size(
const struct json_array_s *array,
2584 if (1 < array->length) {
2585 *
size += array->length - 1;
2588 for (element = array->start; json_null != element; element = element->next) {
2589 if (json_write_minified_get_value_size(element->value, size)) {
2599json_write_minified_get_object_size(
const struct json_object_s *
object,
2601int json_write_minified_get_object_size(
const struct json_object_s *
object,
2607 *
size +=
object->length;
2609 if (1 < object->length) {
2610 *
size +=
object->length - 1;
2613 for (element = object->start; json_null != element; element = element->next) {
2614 if (json_write_get_string_size(element->name, size)) {
2619 if (json_write_minified_get_value_size(element->value, size)) {
2629json_write_minified_get_value_size(
const struct json_value_s *value,
2631int json_write_minified_get_value_size(
const struct json_value_s *value,
2633 switch (value->type) {
2637 case json_type_number:
2638 return json_write_get_number_size((
struct json_number_s *)value->payload,
2640 case json_type_string:
2641 return json_write_get_string_size((
struct json_string_s *)value->payload,
2643 case json_type_array:
2644 return json_write_minified_get_array_size(
2646 case json_type_object:
2647 return json_write_minified_get_object_size(
2649 case json_type_true:
2652 case json_type_false:
2655 case json_type_null:
2661json_weak
char *json_write_minified_value(
const struct json_value_s *value,
2664json_weak
char *json_write_number(
const struct json_number_s *number,
2666char *json_write_number(
const struct json_number_s *number,
char *data) {
2667 json_uintmax_t parsed_number, backup;
2670 if (number->number_size >= 2) {
2671 switch (number->number[1]) {
2679 parsed_number = json_strtoumax(number->number, json_null, 0);
2682 backup = parsed_number;
2686 while (0 != parsed_number) {
2687 parsed_number /= 10;
2692 parsed_number = backup;
2698 *(
data + i - 1) =
'0' + (
char)(parsed_number % 10);
2699 parsed_number /= 10;
2701 }
while (0 != parsed_number);
2713 if ((i < number->number_size) &&
2714 ((
'+' == number->number[i]) || (
'-' == number->number[i]))) {
2719 if ((i < number->number_size) && (
'I' == number->number[i])) {
2720 const char *inf =
"Infinity";
2723 for (k = i; k < number->number_size; k++) {
2724 const char c = *inf++;
2729 }
else if (c != number->number[k]) {
2734 if (
'\0' == *inf++) {
2735 const char *dbl_max;
2738 if (
'-' == number->number[0]) {
2743 for (dbl_max =
"1.7976931348623158e308";
'\0' != *dbl_max; dbl_max++) {
2752 if ((i < number->number_size) && (
'N' == number->number[i])) {
2753 const char *
nan =
"NaN";
2756 for (k = i; k < number->number_size; k++) {
2757 const char c = *
nan++;
2762 }
else if (c != number->number[k]) {
2767 if (
'\0' == *nan++) {
2775 if ((i < number->number_size) && (
'.' == number->number[i])) {
2779 if (
'+' == number->number[i]) {
2784 if (
'-' == number->number[i]) {
2793 for (; i < number->number_size; i++) {
2794 *
data++ = number->number[i];
2800 for (; i < number->number_size; i++) {
2801 const char c = number->number[i];
2802 if (!(
'0' <= c && c <=
'9')) {
2808 if ((i + 1 == number->number_size) && (
'.' == number->number[i])) {
2812 if (
'+' == number->number[i]) {
2817 if (
'-' == number->number[i]) {
2823 for (; i < number->number_size; i++) {
2824 *
data++ = number->number[i];
2836 if (
'+' == number->number[i]) {
2840 for (; i < number->number_size; i++) {
2841 *
data++ = number->number[i];
2847json_weak
char *json_write_string(
const struct json_string_s *
string,
2849char *json_write_string(
const struct json_string_s *
string,
char *data) {
2854 for (i = 0; i <
string->string_size; i++) {
2855 switch (string->string[i]) {
2885 *
data++ =
string->string[i];
2895json_weak
char *json_write_minified_array(
const struct json_array_s *array,
2897char *json_write_minified_array(
const struct json_array_s *array,
char *data) {
2902 for (element = array->start; json_null != element; element = element->next) {
2903 if (element != array->start) {
2907 data = json_write_minified_value(element->value, data);
2909 if (json_null == data) {
2920json_weak
char *json_write_minified_object(
const struct json_object_s *
object,
2922char *json_write_minified_object(
const struct json_object_s *
object,
2928 for (element = object->start; json_null != element; element = element->next) {
2929 if (element != object->start) {
2933 data = json_write_string(element->name, data);
2935 if (json_null == data) {
2942 data = json_write_minified_value(element->value, data);
2944 if (json_null == data) {
2955json_weak
char *json_write_minified_value(
const struct json_value_s *value,
2957char *json_write_minified_value(
const struct json_value_s *value,
char *data) {
2958 switch (value->type) {
2962 case json_type_number:
2963 return json_write_number((
struct json_number_s *)value->payload, data);
2964 case json_type_string:
2965 return json_write_string((
struct json_string_s *)value->payload, data);
2966 case json_type_array:
2967 return json_write_minified_array((
struct json_array_s *)value->payload,
2969 case json_type_object:
2970 return json_write_minified_object((
struct json_object_s *)value->payload,
2972 case json_type_true:
2978 case json_type_false:
2985 case json_type_null:
2994void *json_write_minified(
const struct json_value_s *value,
size_t *out_size) {
2996 char *
data = json_null;
2997 char *data_end = json_null;
2999 if (json_null == value) {
3003 if (json_write_minified_get_value_size(value, &size)) {
3012 if (json_null == data) {
3017 data_end = json_write_minified_value(value, data);
3019 if (json_null == data_end) {
3028 if (json_null != out_size) {
3035json_weak
int json_write_pretty_get_value_size(
const struct json_value_s *value,
3036 size_t depth,
size_t indent_size,
3037 size_t newline_size,
3040json_weak
int json_write_pretty_get_array_size(
const struct json_array_s *array,
3041 size_t depth,
size_t indent_size,
3042 size_t newline_size,
3044int json_write_pretty_get_array_size(
const struct json_array_s *array,
3045 size_t depth,
size_t indent_size,
3046 size_t newline_size,
size_t *size) {
3051 if (0 < array->length) {
3053 *
size += newline_size;
3055 *
size += array->length - 1;
3057 for (element = array->start; json_null != element;
3058 element = element->next) {
3060 *
size += (depth + 1) * indent_size;
3062 if (json_write_pretty_get_value_size(element->value, depth + 1,
3063 indent_size, newline_size, size)) {
3069 *
size += newline_size;
3075 *
size += depth * indent_size;
3084json_write_pretty_get_object_size(
const struct json_object_s *
object,
3085 size_t depth,
size_t indent_size,
3086 size_t newline_size,
size_t *size);
3087int json_write_pretty_get_object_size(
const struct json_object_s *
object,
3088 size_t depth,
size_t indent_size,
3089 size_t newline_size,
size_t *size) {
3094 if (0 < object->length) {
3095 *
size += newline_size;
3097 *
size +=
object->length - 1;
3099 for (element = object->start; json_null != element;
3100 element = element->next) {
3102 *
size += (depth + 1) * indent_size;
3103 *
size += newline_size;
3105 if (json_write_get_string_size(element->name, size)) {
3112 if (json_write_pretty_get_value_size(element->value, depth + 1,
3113 indent_size, newline_size, size)) {
3119 *
size += depth * indent_size;
3127json_weak
int json_write_pretty_get_value_size(
const struct json_value_s *value,
3128 size_t depth,
size_t indent_size,
3129 size_t newline_size,
3131int json_write_pretty_get_value_size(
const struct json_value_s *value,
3132 size_t depth,
size_t indent_size,
3133 size_t newline_size,
size_t *size) {
3134 switch (value->type) {
3138 case json_type_number:
3139 return json_write_get_number_size((
struct json_number_s *)value->payload,
3141 case json_type_string:
3142 return json_write_get_string_size((
struct json_string_s *)value->payload,
3144 case json_type_array:
3145 return json_write_pretty_get_array_size(
3146 (
struct json_array_s *)value->payload, depth, indent_size, newline_size,
3148 case json_type_object:
3149 return json_write_pretty_get_object_size(
3151 newline_size, size);
3152 case json_type_true:
3155 case json_type_false:
3158 case json_type_null:
3164json_weak
char *json_write_pretty_value(
const struct json_value_s *value,
3165 size_t depth,
const char *indent,
3166 const char *newline,
char *data);
3168json_weak
char *json_write_pretty_array(
const struct json_array_s *array,
3169 size_t depth,
const char *indent,
3170 const char *newline,
char *data);
3171char *json_write_pretty_array(
const struct json_array_s *array,
size_t depth,
3172 const char *indent,
const char *newline,
3179 if (0 < array->length) {
3180 for (k = 0;
'\0' != newline[k]; k++) {
3181 *
data++ = newline[k];
3184 for (element = array->start; json_null != element;
3185 element = element->next) {
3186 if (element != array->start) {
3189 for (k = 0;
'\0' != newline[k]; k++) {
3190 *
data++ = newline[k];
3194 for (k = 0; k < depth + 1; k++) {
3195 for (m = 0;
'\0' != indent[m]; m++) {
3196 *
data++ = indent[m];
3200 data = json_write_pretty_value(element->value, depth + 1, indent, newline,
3203 if (json_null == data) {
3209 for (k = 0;
'\0' != newline[k]; k++) {
3210 *
data++ = newline[k];
3213 for (k = 0; k < depth; k++) {
3214 for (m = 0;
'\0' != indent[m]; m++) {
3215 *
data++ = indent[m];
3225json_weak
char *json_write_pretty_object(
const struct json_object_s *
object,
3226 size_t depth,
const char *indent,
3227 const char *newline,
char *data);
3228char *json_write_pretty_object(
const struct json_object_s *
object,
size_t depth,
3229 const char *indent,
const char *newline,
3236 if (0 < object->length) {
3237 for (k = 0;
'\0' != newline[k]; k++) {
3238 *
data++ = newline[k];
3241 for (element = object->start; json_null != element;
3242 element = element->next) {
3243 if (element != object->start) {
3246 for (k = 0;
'\0' != newline[k]; k++) {
3247 *
data++ = newline[k];
3251 for (k = 0; k < depth + 1; k++) {
3252 for (m = 0;
'\0' != indent[m]; m++) {
3253 *
data++ = indent[m];
3257 data = json_write_string(element->name, data);
3259 if (json_null == data) {
3269 data = json_write_pretty_value(element->value, depth + 1, indent, newline,
3272 if (json_null == data) {
3278 for (k = 0;
'\0' != newline[k]; k++) {
3279 *
data++ = newline[k];
3282 for (k = 0; k < depth; k++) {
3283 for (m = 0;
'\0' != indent[m]; m++) {
3284 *
data++ = indent[m];
3294json_weak
char *json_write_pretty_value(
const struct json_value_s *value,
3295 size_t depth,
const char *indent,
3296 const char *newline,
char *data);
3297char *json_write_pretty_value(
const struct json_value_s *value,
size_t depth,
3298 const char *indent,
const char *newline,
3300 switch (value->type) {
3304 case json_type_number:
3305 return json_write_number((
struct json_number_s *)value->payload, data);
3306 case json_type_string:
3307 return json_write_string((
struct json_string_s *)value->payload, data);
3308 case json_type_array:
3309 return json_write_pretty_array((
struct json_array_s *)value->payload, depth,
3310 indent, newline, data);
3311 case json_type_object:
3312 return json_write_pretty_object((
struct json_object_s *)value->payload,
3313 depth, indent, newline, data);
3314 case json_type_true:
3320 case json_type_false:
3327 case json_type_null:
3336void *json_write_pretty(
const struct json_value_s *value,
const char *indent,
3337 const char *newline,
size_t *out_size) {
3339 size_t indent_size = 0;
3340 size_t newline_size = 0;
3341 char *
data = json_null;
3342 char *data_end = json_null;
3344 if (json_null == value) {
3348 if (json_null == indent) {
3352 if (json_null == newline) {
3356 while (
'\0' != indent[indent_size]) {
3360 while (
'\0' != newline[newline_size]) {
3364 if (json_write_pretty_get_value_size(value, 0, indent_size, newline_size,
3374 if (json_null == data) {
3379 data_end = json_write_pretty_value(value, 0, indent, newline, data);
3381 if (json_null == data_end) {
3390 if (json_null != out_size) {
3397#if defined(__clang__)
3398#pragma clang diagnostic pop
3399#elif defined(_MSC_VER)