add 'score equal to' option
[claws.git] / src / matcher.h
1 #ifndef MATCHER_H
2
3 #define MATCHER_H
4
5 #include <sys/types.h>
6 #include <regex.h>
7 #include <glib.h>
8 #include "procmsg.h"
9
10 enum {
11         /* msginfo flags */
12         MATCHING_ALL,
13         MATCHING_UNREAD,
14         MATCHING_NOT_UNREAD,
15         MATCHING_NEW,
16         MATCHING_NOT_NEW,
17         MATCHING_MARKED,
18         MATCHING_NOT_MARKED,
19         MATCHING_DELETED,
20         MATCHING_NOT_DELETED,
21         MATCHING_REPLIED,
22         MATCHING_NOT_REPLIED,
23         MATCHING_FORWARDED,
24         MATCHING_NOT_FORWARDED,
25
26         /* msginfo headers */
27         MATCHING_SUBJECT,
28         MATCHING_NOT_SUBJECT,
29         MATCHING_FROM,
30         MATCHING_NOT_FROM,
31         MATCHING_TO,
32         MATCHING_NOT_TO,
33         MATCHING_CC,
34         MATCHING_NOT_CC,
35         MATCHING_TO_OR_CC,
36         MATCHING_NOT_TO_AND_NOT_CC,
37         MATCHING_AGE_GREATER,
38         MATCHING_AGE_LOWER,
39         MATCHING_NEWSGROUPS,
40         MATCHING_NOT_NEWSGROUPS,
41         MATCHING_INREPLYTO,
42         MATCHING_NOT_INREPLYTO,
43         MATCHING_REFERENCES,
44         MATCHING_NOT_REFERENCES,
45         MATCHING_SCORE_GREATER,
46         MATCHING_SCORE_LOWER,
47         MATCHING_SCORE_EQUAL,
48
49         /* file content */
50         MATCHING_HEADER,
51         MATCHING_NOT_HEADER,
52         MATCHING_MESSAGE,
53         MATCHING_NOT_MESSAGE,
54         MATCHING_HEADERS_PART,
55         MATCHING_NOT_HEADERS_PART,
56         MATCHING_BODY_PART,
57         MATCHING_NOT_BODY_PART,
58         MATCHING_EXECUTE,
59         MATCHING_NOT_EXECUTE,
60
61         /* scoring */
62         MATCHING_SCORE,
63
64         /* filtering */
65         MATCHING_ACTION_MOVE,
66         MATCHING_ACTION_COPY,
67         MATCHING_ACTION_DELETE,
68         MATCHING_ACTION_MARK,
69         MATCHING_ACTION_MARK_AS_READ,
70         MATCHING_ACTION_UNMARK,
71         MATCHING_ACTION_MARK_AS_UNREAD,
72         MATCHING_ACTION_FORWARD,
73         MATCHING_ACTION_FORWARD_AS_ATTACHMENT,
74         MATCHING_ACTION_COLOR,
75         /* MATCHING_ACTION_EXECUTE, */
76
77         MATCHING_MATCH,
78         MATCHING_REGEXP,
79         MATCHING_MATCHCASE,
80         MATCHING_REGEXPCASE
81 };
82
83 struct _MatcherProp {
84         int matchtype;
85         int criteria;
86         gchar * header;
87         gchar * expr;
88         int value;
89         regex_t * preg;
90         int error;
91         gboolean result;
92 };
93
94 typedef struct _MatcherProp MatcherProp;
95
96 struct _MatcherList {
97         GSList * matchers;
98         gboolean bool_and;
99 };
100
101 typedef struct _MatcherList MatcherList;
102
103 gchar * get_matchparser_tab_str(gint id);
104 MatcherProp * matcherprop_new(gint criteria, gchar * header,
105                               gint matchtype, gchar * expr,
106                               int age);
107 void matcherprop_free(MatcherProp * prop);
108 MatcherProp * matcherprop_parse(gchar ** str);
109
110 gboolean matcherprop_match(MatcherProp * prop, MsgInfo * info);
111
112 MatcherList * matcherlist_new(GSList * matchers, gboolean bool_and);
113 void matcherlist_free(MatcherList * cond);
114 MatcherList * matcherlist_parse(gchar ** str);
115
116 gboolean matcherlist_match(MatcherList * cond, MsgInfo * info);
117
118 gint matcher_parse_keyword(gchar ** str);
119 gint matcher_parse_number(gchar ** str);
120 gboolean matcher_parse_boolean_op(gchar ** str);
121 gchar * matcher_parse_regexp(gchar ** str);
122 gchar * matcher_parse_str(gchar ** str);
123 gchar * matcher_unescape_str(gchar *str);
124 gchar * matcherprop_to_string(MatcherProp * matcher);
125 gchar * matcherlist_to_string(MatcherList * matchers);
126 gchar * matching_build_command(gchar * cmd, MsgInfo * info);
127
128 #endif