json-parser.h revision bb869cc24b24a8df84a43154c628785d6aee784c
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#ifndef JSON_PARSER_H
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#define JSON_PARSER_H
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
80c1d98d3638b71e57a39cafa88b9122bf8169c6Timo Sirainenenum json_type {
b780aa272b742a43579cdb523cc79cc8d4521306Timo Sirainen /* { key: */
de62ce819d59a529530da4b57be1b8d6dad13d6bTimo Sirainen JSON_TYPE_OBJECT_KEY,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* : { new object */
94a8cb0ee1d85569ad1a2acacd92d3ce22f8a1cbTimo Sirainen JSON_TYPE_OBJECT,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* } (not returned for the root object) */
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen JSON_TYPE_OBJECT_END,
795aeec896095aa8f08cc5d3282c88cc0921bff6Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen JSON_TYPE_ARRAY,
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen JSON_TYPE_ARRAY_END,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
e307c8202280c6db60a0615381f18cac33e46a53Timo Sirainen JSON_TYPE_STRING,
e307c8202280c6db60a0615381f18cac33e46a53Timo Sirainen JSON_TYPE_NUMBER,
e307c8202280c6db60a0615381f18cac33e46a53Timo Sirainen JSON_TYPE_TRUE,
e307c8202280c6db60a0615381f18cac33e46a53Timo Sirainen JSON_TYPE_FALSE,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen JSON_TYPE_NULL
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Parse JSON tokens from the input stream. */
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainenstruct json_parser *json_parser_init(struct istream *input);
8887bf3757d51d73887dd20b1db3334d867d3817Timo Sirainenint json_parser_deinit(struct json_parser **parser, const char **error_r);
8887bf3757d51d73887dd20b1db3334d867d3817Timo Sirainen
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen/* Parse the next token. Returns 1 if found, 0 if more input stream is
51b979b6414b940f04677a7e2d064be119345954Timo Sirainen non-blocking and needs more input, -1 if input stream is at EOF. */
c53e8ee216904ffe6de4f6518d9f9f5107b7610eTimo Sirainenint json_parse_next(struct json_parser *parser, enum json_type *type_r,
589a9c6e8ee22071c14171c04bfc6bfe17121871Timo Sirainen const char **value_r);
589a9c6e8ee22071c14171c04bfc6bfe17121871Timo Sirainen/* Skip the next object value. If it's an object, its members are also
ef5fb27361cc5e15766e85e28355750ff04b13c9Timo Sirainen skipped. */
ef5fb27361cc5e15766e85e28355750ff04b13c9Timo Sirainenvoid json_parse_skip_next(struct json_parser *parser);
ef5fb27361cc5e15766e85e28355750ff04b13c9Timo Sirainen/* Return the following string as input stream. Returns 1 if ok, 0 if
18d92dbbb752c79dc461514e52f7ef11847e636bTimo Sirainen input stream is non-blocking and needs more input, -1 if the next token
18d92dbbb752c79dc461514e52f7ef11847e636bTimo Sirainen isn't a string (call json_parse_next()). */
18d92dbbb752c79dc461514e52f7ef11847e636bTimo Sirainenint json_parse_next_stream(struct json_parser *parser,
f883b315ca72073b58020798e6d907340b327228Timo Sirainen struct istream **input_r);
f883b315ca72073b58020798e6d907340b327228Timo Sirainen
f883b315ca72073b58020798e6d907340b327228Timo Sirainen/* Append data to already opened JSON string. src should be valid UTF-8 data. */
945565e0c9cf979b5feeba6fbd4efce3bf4484adTimo Sirainenvoid json_append_escaped(string_t *dest, const char *src);
945565e0c9cf979b5feeba6fbd4efce3bf4484adTimo Sirainen/* Same as json_append_escaped(), but append non-\0 terminated input. */
945565e0c9cf979b5feeba6fbd4efce3bf4484adTimo Sirainenvoid json_append_escaped_data(string_t *dest, const unsigned char *src, size_t size);
a53cb86b4d733d9c48ee4d285bed477c80825804Timo Sirainen
a53cb86b4d733d9c48ee4d285bed477c80825804Timo Sirainen#endif
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen