static int json_get_value_size(struct json_parse_state_s* state) { if (json_skip_whitespace(state)) { // consumed the whole buffer when we expected a value! return 1; } state->dom_size += sizeof(struct json_value_s); switch (state->src[state->offset]) { case '"': return json_get_string_size(state); case '{': return json_get_object_size(state); case '[': return json_get_array_size(state); case '-': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return json_get_number_size(state); default: if ((state->offset + 4) < state->size && 't' == state->src[state->offset + 0] && 'r' == state->src[state->offset + 1] && 'u' == state->src[state->offset + 2] && 'e' == state->src[state->offset + 3]) { state->offset += 4; return 0; } else if ((state->offset + 5) < state->size && 'f' == state->src[state->offset + 0] && 'a' == state->src[state->offset + 1] && 'l' == state->src[state->offset + 2] && 's' == state->src[state->offset + 3] && 'e' == state->src[state->offset + 4]) { state->offset += 5; return 0; } else if ((state->offset + 4) < state->size && 'n' == state->src[state->offset + 0] && 'u' == state->src[state->offset + 1] && 'l' == state->src[state->offset + 2] && 'l' == state->src[state->offset + 3]) { state->offset += 4; return 0; } // invalid value! return 1; } }
static int json_get_value_size(struct json_parse_state_s *state, int is_global_object) { if (is_global_object) { state->dom_size += sizeof(struct json_value_s); return json_get_object_size(state, /* is_global_object = */ 1); } else { state->dom_size += sizeof(struct json_value_s); if (json_skip_all_skippables(state)) { state->error = json_parse_error_premature_end_of_buffer; return 1; } switch (state->src[state->offset]) { case '"': return json_get_string_size(state); case '{': return json_get_object_size(state, /* is_global_object = */ 0); case '[': return json_get_array_size(state); case '+': case '-': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.': return json_get_number_size(state); default: if ((state->offset + 4) <= state->size && 't' == state->src[state->offset + 0] && 'r' == state->src[state->offset + 1] && 'u' == state->src[state->offset + 2] && 'e' == state->src[state->offset + 3]) { state->offset += 4; return 0; } else if ((state->offset + 5) <= state->size && 'f' == state->src[state->offset + 0] && 'a' == state->src[state->offset + 1] && 'l' == state->src[state->offset + 2] && 's' == state->src[state->offset + 3] && 'e' == state->src[state->offset + 4]) { state->offset += 5; return 0; } else if ((state->offset + 4) <= state->size && 'n' == state->src[state->offset + 0] && 'u' == state->src[state->offset + 1] && 'l' == state->src[state->offset + 2] && 'l' == state->src[state->offset + 3]) { state->offset += 4; return 0; } // invalid value! state->error = json_parse_error_invalid_value; return 1; } } }