-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexpr.h
More file actions
146 lines (121 loc) · 3.36 KB
/
Copy pathexpr.h
File metadata and controls
146 lines (121 loc) · 3.36 KB
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
struct arena_scope;
struct match;
/* Return values for expr_eval(). */
#define EXPR_MATCH (0)
#define EXPR_NOMATCH (1)
#define EXPR_ERROR (-1)
/* expr_set_pattern() flags */
#define EXPR_PATTERN_ICASE 0x00000001U
#define EXPR_PATTERN_LCASE 0x00000002U
#define EXPR_PATTERN_UCASE 0x00000004U
enum expr_type {
/* blocks */
EXPR_TYPE_BLOCK,
/* logical operators */
EXPR_TYPE_AND,
EXPR_TYPE_OR,
EXPR_TYPE_NEG,
EXPR_TYPE_MATCH, /* alias for and */
/* matchers */
EXPR_TYPE_ALL,
EXPR_TYPE_ATTACHMENT,
EXPR_TYPE_BODY,
EXPR_TYPE_DATE,
EXPR_TYPE_HEADER,
EXPR_TYPE_NEW,
EXPR_TYPE_OLD,
EXPR_TYPE_STAT,
EXPR_TYPE_COMMAND,
/* actions */
EXPR_TYPE_MOVE,
EXPR_TYPE_FLAG,
EXPR_TYPE_FLAGS,
EXPR_TYPE_DISCARD,
EXPR_TYPE_BREAK,
EXPR_TYPE_LABEL,
EXPR_TYPE_PASS,
EXPR_TYPE_REJECT,
EXPR_TYPE_EXEC,
EXPR_TYPE_ATTACHMENT_BLOCK,
EXPR_TYPE_ADD_HEADER,
};
enum expr_date_cmp {
EXPR_DATE_CMP_LT,
EXPR_DATE_CMP_GT,
};
enum expr_date_field {
EXPR_DATE_FIELD_HEADER,
EXPR_DATE_FIELD_ACCESS,
EXPR_DATE_FIELD_MODIFIED,
EXPR_DATE_FIELD_CREATED,
};
enum expr_stat {
EXPR_STAT_DIR,
};
struct expr_eval_arg {
struct match_list *ea_ml;
struct message *ea_msg;
const struct environment *ea_env;
struct {
struct arena_scope *eternal_scope;
struct arena *scratch;
} ea_arena;
};
struct expr {
enum expr_type ex_type;
unsigned int ex_lno;
unsigned int ex_flags;
/* Denotes an action. */
#define EXPR_FLAG_ACTION 0x00000001U
/* Associated with a match that must be displayed during dry run. */
#define EXPR_FLAG_INSPECT 0x00000002U
/* Associated with a match that can be used during interpolation. */
#define EXPR_FLAG_INTERPOLATE 0x00000004U
/* Associated with a match that requires a maildir destination path. */
#define EXPR_FLAG_PATH 0x00000008U
int (*ex_eval)(struct expr *,
struct expr_eval_arg *);
const char *(*ex_inspect)(const struct expr *,
const struct match *, const struct message *, struct arena_scope *);
struct string_list *ex_strings;
struct expr_regex *ex_re;
union {
struct {
enum expr_date_cmp cmp;
enum expr_date_field field;
long long int age;
} ex_date;
struct {
unsigned int flags;
#define EXPR_EXEC_STDIN 0x00000001U
#define EXPR_EXEC_BODY 0x00000002U
} ex_exec;
struct {
enum expr_stat stat;
} ex_stat;
struct {
const char *key;
const char *val;
} ex_add_header;
};
struct expr *ex_lhs;
struct expr *ex_rhs;
};
struct expr *expr_alloc(enum expr_type, unsigned int, struct expr *,
struct expr *, struct arena_scope *);
void expr_set_add_header(struct expr *, const char *, const char *);
void expr_set_date(struct expr *, enum expr_date_field, enum expr_date_cmp,
long long int, struct arena_scope *);
int expr_set_exec(struct expr *, struct string_list *, unsigned int);
void expr_set_stat(struct expr *, const char *, enum expr_stat,
struct arena_scope *);
void expr_set_strings(struct expr *, struct string_list *);
int expr_set_pattern(struct expr *, const char *, unsigned int,
const char **, struct arena_scope *);
int expr_count(const struct expr *, enum expr_type);
int expr_count_actions(const struct expr *);
int expr_eval(struct expr *, struct expr_eval_arg *);
const char *expr_inspect(const struct expr *, const struct match *,
const struct message *, struct arena_scope *);
void expr_inspect_matches(const struct expr *, const struct match *,
const struct environment *);