managesieve-parser.h [plain text]
#ifndef __MANAGESIEVE_PARSER_H
#define __MANAGESIEVE_PARSER_H
#define IS_QUOTED_SPECIAL(c) \
((c) == '"' || (c) == '\\')
#define IS_ATOM_SPECIAL(c) \
((c) == '(' || (c) == ')' || (c) == '{' || \
(c) <= 32 || (c) == 0x7f || \
IS_QUOTED_SPECIAL(c))
#define IS_CHAR(c) \
(((c) & 0x80) == 0)
#define IS_TEXT_CHAR(c) \
(IS_CHAR(c) && (c) != '\r' && (c) != '\n')
#define IS_SAFE_CHAR(c) \
(IS_TEXT_CHAR(c) && !IS_QUOTED_SPECIAL(c))
enum managesieve_parser_flags {
MANAGESIEVE_PARSE_FLAG_LITERAL_SIZE = 0x01,
MANAGESIEVE_PARSE_FLAG_NO_UNESCAPE = 0x02,
MANAGESIEVE_PARSE_FLAG_LITERAL_TYPE = 0x04
};
enum managesieve_arg_type {
MANAGESIEVE_ARG_ATOM = 0,
MANAGESIEVE_ARG_STRING,
MANAGESIEVE_ARG_LITERAL,
MANAGESIEVE_ARG_LITERAL_SIZE,
MANAGESIEVE_ARG_EOL
};
struct managesieve_parser;
struct managesieve_arg {
enum managesieve_arg_type type;
union {
char *str;
uoff_t literal_size;
} _data;
};
#define MANAGESIEVE_ARG_STR(arg) \
((arg)->type == MANAGESIEVE_ARG_STRING || \
(arg)->type == MANAGESIEVE_ARG_ATOM || \
(arg)->type == MANAGESIEVE_ARG_LITERAL ? \
(arg)->_data.str : _managesieve_arg_str_error(arg))
#define MANAGESIEVE_ARG_LITERAL_SIZE(arg) \
(((arg)->type == MANAGESIEVE_ARG_LITERAL_SIZE) ? \
(arg)->_data.literal_size : _managesieve_arg_literal_size_error(arg))
struct managesieve_arg_list {
size_t size, alloc;
struct managesieve_arg args[1];
};
struct managesieve_parser *
managesieve_parser_create(struct istream *input, struct ostream *output,
size_t max_line_size);
void managesieve_parser_destroy(struct managesieve_parser **parser);
void managesieve_parser_reset(struct managesieve_parser *parser);
const char *managesieve_parser_get_error(struct managesieve_parser *parser, bool *fatal);
int managesieve_parser_read_args(struct managesieve_parser *parser, unsigned int count,
enum managesieve_parser_flags flags, struct managesieve_arg **args);
int managesieve_parser_finish_line(struct managesieve_parser *parser, unsigned int count,
enum managesieve_parser_flags flags,
struct managesieve_arg **args);
const char *managesieve_parser_read_word(struct managesieve_parser *parser);
const char *managesieve_arg_string(struct managesieve_arg *arg);
int managesieve_arg_number
(struct managesieve_arg *arg, uoff_t *number);
char *_managesieve_arg_str_error(const struct managesieve_arg *arg);
uoff_t _managesieve_arg_literal_size_error(const struct managesieve_arg *arg);
struct managesieve_arg_list *_managesieve_arg_list_error(const struct managesieve_arg *arg);
#endif