/* * Decode JSON string in place. * * \param str_start Pointer to the beginning of the string (the opening " character). * * \return Number of bytes in decoded string (beginning from start). */ static int json_decode_string(uint8_t *str_start, uint8_t *buf_end, uint8_t **str_end, uint32_t flags) { uint8_t *str = str_start; uint8_t *out = str_start + 1; /* Decode string in place (skip the initial quote) */ int rc; if (buf_end - str_start < 2) { /* * Shortest valid string (the empty string) is two bytes (""), * so this can't possibly be valid */ return SPDK_JSON_PARSE_INCOMPLETE; } if (*str++ != '"') { return SPDK_JSON_PARSE_INVALID; } while (str < buf_end) { if (str[0] == '"') { /* * End of string. * Update str_end to point at next input byte and return output length. */ *str_end = str + 1; return out - str_start - 1; } else if (str[0] == '\\') { rc = json_decode_string_escape(&str, buf_end, flags & SPDK_JSON_PARSE_FLAG_DECODE_IN_PLACE ? out : NULL); assert(rc != 0); if (rc < 0) { return rc; } out += rc; } else if (str[0] <= 0x1f) { /* control characters must be escaped */ return SPDK_JSON_PARSE_INVALID; } else { rc = utf8_valid(str, buf_end); if (rc == 0) { return SPDK_JSON_PARSE_INCOMPLETE; } else if (rc < 0) { return SPDK_JSON_PARSE_INVALID; } if (out && out != str && (flags & SPDK_JSON_PARSE_FLAG_DECODE_IN_PLACE)) { memmove(out, str, rc); } out += rc; str += rc; } } /* If execution gets here, we ran out of buffer. */ return SPDK_JSON_PARSE_INCOMPLETE; }
bool CPPCMS_API valid_utf8(char const *begin,char const *end,size_t &count) { return utf8_valid(begin,end,count); }