1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
#ifndef MANAGESIEVE_PARSER_H
#define MANAGESIEVE_PARSER_H
#include "managesieve-arg.h"
enum managesieve_parser_flags {
/* Set this flag if you want to read a string argument as as stream.
Useful when you need to deal with large strings. The string must be
the last read argument. */
MANAGESIEVE_PARSE_FLAG_STRING_STREAM = 0x01,
/* Don't remove '\' chars from string arguments */
MANAGESIEVE_PARSE_FLAG_NO_UNESCAPE = 0x02,
/* Return literals as MANAGESIEVE_ARG_LITERAL instead of
MANAGESIEVE_ARG_STRING */
MANAGESIEVE_PARSE_FLAG_LITERAL_TYPE = 0x04
};
struct managesieve_parser;
/* Create new MANAGESIEVE argument parser.
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 managesieve_parser *
managesieve_parser_create(struct istream *input, size_t max_line_size);
void managesieve_parser_destroy(struct managesieve_parser **parser);
/* Reset the parser to initial state. */
void managesieve_parser_reset(struct managesieve_parser *parser);
/* 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. */
const char *
managesieve_parser_get_error(struct managesieve_parser *parser, bool *fatal);
/* 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 MANAGESIEVE_ARG_EOL. */
int managesieve_parser_read_args(struct managesieve_parser *parser,
unsigned int count,
enum managesieve_parser_flags flags,
const struct managesieve_arg **args_r);
/* Just like managesieve_parser_read_args(), but assume \n at end of data in
input stream. */
int managesieve_parser_finish_line(struct managesieve_parser *parser,
unsigned int count,
enum managesieve_parser_flags flags,
const struct managesieve_arg **args_r);
/* Read one word - used for reading command name. Returns NULL if more data is
needed. */
const char *managesieve_parser_read_word(struct managesieve_parser *parser);
#endif
|