-
Notifications
You must be signed in to change notification settings - Fork 29
/
managesieve-parser.h
68 lines (54 loc) · 2.75 KB
/
managesieve-parser.h
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
68
/* Copyright (c) 2002-2018 Pigeonhole authors, see the included COPYING file
*/
#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