// string = '"' { quoted_printable_chars } '"' static int parse_string(struct frozen *f) { int n, ch = 0, len = 0; TRY(test_and_skip(f, '"')); TRY(capture_ptr(f, f->cur, JSON_TYPE_STRING)); for (; f->cur < f->end; f->cur += len) { ch = * (unsigned char *) f->cur; len = get_utf8_char_len((unsigned char) ch); //printf("[%c] [%d]\n", ch, len); EXPECT(ch >= 32 && len > 0, JSON_STRING_INVALID); // No control chars EXPECT(len < left(f), JSON_STRING_INCOMPLETE); if (ch == '\\') { EXPECT((n = get_escape_len(f->cur + 1, left(f))) > 0, n); len += n; } else if (ch == '"') { capture_len(f, f->num_tokens - 1, f->cur); f->cur++; break; }; } return ch == '"' ? 0 : JSON_STRING_INCOMPLETE; }
/* string = '"' { quoted_printable_chars } '"' */ static int parse_string(struct frozen *f) { int n, ch = 0, len = 0; TRY(test_and_skip(f, '"')); { SET_STATE(f, f->cur, JSON_TYPE_STRING, "", 0); for (; f->cur < f->end; f->cur += len) { ch = *(unsigned char *) f->cur; len = get_utf8_char_len((unsigned char) ch); EXPECT(ch >= 32 && len > 0, JSON_STRING_INVALID); /* No control chars */ EXPECT(len < left(f), JSON_STRING_INCOMPLETE); if (ch == '\\') { EXPECT((n = get_escape_len(f->cur + 1, left(f))) > 0, n); len += n; } else if (ch == '"') { CALL_BACK(f); f->cur++; break; }; } } return ch == '"' ? 0 : JSON_STRING_INCOMPLETE; }