Lines Matching refs:str

71 static const char* parse_value(const char *str, const char *end, pa_json_object **obj, unsigned int depth);
103 static const char* consume_string(const char *str, const char *expect) {
105 if (*str != *expect)
108 str++;
112 return str;
115 static const char* parse_null(const char *str, pa_json_object *obj) {
116 str = consume_string(str, "null");
118 if (str)
121 return str;
124 static const char* parse_boolean(const char *str, pa_json_object *obj) {
127 tmp = consume_string(str, "true");
133 tmp = consume_string(str, "false");
135 if (str) {
144 static const char* parse_string(const char *str, pa_json_object *obj) {
147 str++; /* Consume leading '"' */
149 while (*str && *str != '"') {
150 if (*str != '\\') {
152 if (*str < 0x20 || *str > 0x7E) {
153 pa_log("Invalid non-ASCII character: 0x%x", (unsigned int) *str);
158 pa_strbuf_putc(buf, *str);
161 str++;
163 switch (*str) {
167 pa_strbuf_putc(buf, *str);
195 pa_log("Unexpected escape value: %c", *str);
200 str++;
203 if (*str != '"') {
204 pa_log("Failed to parse remainder of string: %s", str);
208 str++;
213 return str;
220 static const char* parse_number(const char *str, pa_json_object *obj) {
223 const char *s = str;
284 candidate = pa_xstrndup(str, s - str);
288 pa_log("Cannot convert string '%s' to double value", str);
294 pa_log("Cannot convert string '%s' to int64_t value", str);
309 static const char *parse_object(const char *str, pa_json_object *obj, unsigned int depth) {
315 while (*str != '}') {
316 str++; /* Consume leading '{' or ',' */
318 str = parse_value(str, ":", &name, depth + 1);
319 if (!str || pa_json_object_get_type(name) != PA_JSON_TYPE_STRING) {
325 str++;
327 str = parse_value(str, ",}", &value, depth + 1);
328 if (!str) {
341 str++;
346 return str;
360 static const char *parse_array(const char *str, pa_json_object *obj, unsigned int depth) {
365 while (*str != ']') {
366 str++; /* Consume leading '[' or ',' */
370 while (is_whitespace(*str))
371 str++;
373 if (*str == ']')
376 str = parse_value(str, ",]", &value, depth + 1);
377 if (!str) {
386 str++;
391 return str;
404 static const char* parse_value(const char *str, const char *end, pa_json_object **obj, unsigned int depth) {
408 pa_assert(str != NULL);
417 while (!is_end(*str, end)) {
420 if (is_whitespace(*str)) {
421 str++;
422 } else if (*str == 'n') {
423 str = parse_null(str, o);
425 } else if (*str == 't' || *str == 'f') {
426 str = parse_boolean(str, o);
428 } else if (*str == '"') {
429 str = parse_string(str, o);
431 } else if (is_digit(*str) || *str == '-') {
432 str = parse_number(str, o);
434 } else if (*str == '{') {
435 str = parse_object(str, o, depth);
437 } else if (*str == '[') {
438 str = parse_array(str, o, depth);
441 pa_log("Invalid JSON string: %s", str);
445 if (!str)
452 if (is_whitespace(*str)) {
453 str++;
462 pa_log("No data while parsing json string: '%s' till '%s'", str, pa_strnull(end));
468 return str;
476 pa_json_object* pa_json_parse(const char *str) {
479 str = parse_value(str, NULL, &obj, 0);
481 if (!str) {
486 if (*str != '\0') {
487 pa_log("Unable to parse complete JSON string, remainder is: %s", str);