break;
case '(':
imap_parser_open_list(parser);
+ if ((parser->flags & IMAP_PARSE_FLAG_STOP_AT_LIST) != 0) {
+ i_stream_skip(parser->input, 1);
+ return FALSE;
+ }
break;
case ')':
if (!imap_parser_close_list(parser))
/* ARG_PARSE_NONE checks that last argument isn't only partially parsed. */
#define IS_UNFINISHED(parser) \
((parser)->cur_type != ARG_PARSE_NONE || \
- (parser)->cur_list != &parser->root_list)
+ ((parser)->cur_list != &parser->root_list && \
+ ((parser)->flags & IMAP_PARSE_FLAG_STOP_AT_LIST) == 0))
static int finish_line(struct imap_parser *parser, unsigned int count,
const struct imap_arg **args_r)
parser->cur_pos = 0;
parser->cur_resp_text = FALSE;
- if (parser->list_arg != NULL && !parser->literal_size_return) {
+ if (parser->list_arg != NULL && !parser->literal_size_return &&
+ (parser->flags & IMAP_PARSE_FLAG_STOP_AT_LIST) == 0) {
parser->error = "Missing ')'";
*args_r = NULL;
return -1;
/* We're parsing IMAP server replies. Parse the "text" after
OK/NO/BAD/BYE replies as a single atom. We assume that the initial
"*" or tag was already skipped over. */
- IMAP_PARSE_FLAG_SERVER_TEXT = 0x80
+ IMAP_PARSE_FLAG_SERVER_TEXT = 0x80,
+ /* Parse until '(' and return it as an empty list */
+ IMAP_PARSE_FLAG_STOP_AT_LIST = 0x100
};
struct imap_parser;