(struct json_string_istream *)stream;
struct json_parser *parser = jstream->parser;
bool stop_loop;
- size_t old_pos;
+ size_t old_pos, read_size, read_total;
int ret;
if (jstream->ended) {
i_assert(stream->pos == str_len(parser->buffer));
i_assert(stream->skip <= stream->pos);
+ read_total = 0;
do {
if (jstream->buffer_overflowed) {
- stream->pos = str_len(parser->buffer);
- if (stream->skip == stream->pos)
+ if (stream->skip == str_len(parser->buffer))
str_truncate(parser->buffer, 0);
else if (stream->skip > 0)
str_delete(parser->buffer, 0, stream->skip);
else
return -2;
+ stream->pos = str_len(parser->buffer);
stream->skip = 0;
jstream->buffer_overflowed = FALSE;
}
old_pos = str_len(parser->buffer);
ret = json_parser_continue(parser);
i_assert(str_len(parser->buffer) >= old_pos);
- stop_loop = (str_len(parser->buffer) > old_pos);
+ read_size = str_len(parser->buffer) - old_pos;
+ stop_loop = (read_size > 0);
+ read_total += read_size;
switch (ret) {
case JSON_PARSE_INTERRUPTED:
i_assert(stream->skip == 0 ||
stop_loop = TRUE;
break;
case JSON_PARSE_NO_DATA:
- stream->buffer = str_data(parser->buffer);
- stream->pos = str_len(parser->buffer);
- return 0;
+ stop_loop = TRUE;
+ break;
case JSON_PARSE_ERROR:
io_stream_set_error(&stream->iostream,
"%s", parser->error);
stream->pos = str_len(parser->buffer);
stream->buffer = str_data(parser->buffer);
- return (ssize_t)(stream->pos - old_pos);
+ return (ssize_t)read_total;
}
static void