imap-parser.h revision f1e9611e93dcb3b745c1904029084fa81644e1b3
#ifndef __IMAP_PARSER_H
#define __IMAP_PARSER_H
/* FIXME: we don't have ']' here due to FETCH BODY[] handling failing
with it.. also '%' and '*' are banned due to LIST, and '\' due to it being
in flags. oh well.. */
#define IS_ATOM_SPECIAL(c) \
((c) == '(' || (c) == ')' || (c) == '{' || \
(c) == '"' || (c) <= 32 || (c) == 0x7f)
enum imap_parser_flags {
/* Set this flag if you wish to read only size of literal argument
and not convert literal into string. Useful when you need to deal
with large literal sizes. The literal must be the last read
parameter. */
IMAP_PARSE_FLAG_LITERAL_SIZE = 0x01,
/* Don't remove '\' chars from string arguments */
IMAP_PARSE_FLAG_NO_UNESCAPE = 0x02,
/* Return literals as IMAP_ARG_LITERAL instead of IMAP_ARG_STRING */
IMAP_PARSE_FLAG_LITERAL_TYPE = 0x04
};
enum imap_arg_type {
IMAP_ARG_NIL = 0,
/* literals are returned as IMAP_ARG_STRING by default */
IMAP_ARG_EOL /* end of argument list */
};
struct imap_parser;
struct imap_arg {
enum imap_arg_type type;
union {
const char *str;
struct imap_arg_list *list;
} _data;
};
#define IMAP_ARG_STR(arg) \
#define IMAP_ARG_STR_NONULL(arg) \
#define IMAP_ARG_LITERAL_SIZE(arg) \
#define IMAP_ARG_LIST(arg) \
struct imap_arg_list {
};
/* Create new IMAP argument parser. output is used for sending command
continuation requests for literals.
max_line_size can be used to approximately limit the maximum amount of
memory that gets allocated when parsing a line. Input buffer size limits
the maximum size of each parsed token.
Usually the largest lines are large only because they have a one huge
message set token, so you'll probably want to keep input buffer size the
same as max_line_size. That means the maximum memory usage is around
2 * max_line_size. */
struct imap_parser *
/* Reset the parser to initial state. */
/* Return the last error in parser. fatal is set to TRUE if there's no way to
continue parsing, currently only if too large non-sync literal size was
given. */
/* Read a number of arguments. This function doesn't call i_stream_read(), you
need to do that. Returns number of arguments read (may be less than count
in case of EOL), -2 if more data is needed or -1 if error occurred.
count-sized array of arguments are stored into args when return value is
0 or larger. If all arguments weren't read, they're set to NIL. count
can be set to 0 to read all arguments in the line. Last element in
args is always of type IMAP_ARG_EOL. */
enum imap_parser_flags flags,
/* just like imap_parser_read_args(), but assume \n at end of data in
input stream. */
enum imap_parser_flags flags,
/* Read one word - used for reading tag and command name.
Returns NULL if more data is needed. */
/* Returns the imap argument as string. NIL returns "" and list returns NULL. */
/* Error functions */
#endif