5 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
6 * Copyright (c) 2001-2002 by Hiroyuki Yamamoto & The Sylpheed Claws Team.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26 #include <glib/gi18n.h>
29 #include "filtering.h"
31 #include "matcher_parser.h"
32 #include "matcher_parser_lex.h"
35 #define MAX_COLORLABELS (MSG_CLABEL_7 - MSG_CLABEL_NONE)
37 static gint error = 0;
38 static gint bool_op = 0;
39 static gint match_type = 0;
40 static gchar *header = NULL;
42 static MatcherProp *prop;
44 static GSList *matchers_list = NULL;
46 static gchar *name = NULL;
47 static MatcherList *cond;
48 static GSList *action_list = NULL;
49 static FilteringAction *action = NULL;
51 static FilteringProp *filtering;
53 static GSList **prefs_filtering = NULL;
54 static int enable_compatibility = 0;
60 MATCHER_PARSE_CONDITION,
61 MATCHER_PARSE_FILTERING_ACTION,
64 static int matcher_parse_op = MATCHER_PARSE_FILE;
67 /* ******************************************************************** */
68 /* redeclarations to avoid warnings */
69 void matcher_parserrestart(FILE *input_file);
70 void matcher_parser_init(void);
71 void matcher_parser_switch_to_buffer(void * new_buffer);
72 void matcher_parser_delete_buffer(void * b);
73 int matcher_parserlex(void);
75 void matcher_parser_start_parsing(FILE *f)
77 matcher_parserrestart(f);
78 matcher_parserparse();
82 void * matcher_parser_scan_string(const char * str);
84 FilteringProp *matcher_parser_get_filtering(gchar *str)
89 /* little hack to allow passing rules with no names */
90 if (!strncmp(str, "rulename ", 9))
91 tmp_str = g_strdup(str);
93 tmp_str = g_strconcat("rulename \"\" ", str, NULL);
95 /* bad coding to enable the sub-grammar matching
97 matcher_parserlineno = 1;
98 matcher_parse_op = MATCHER_PARSE_NO_EOL;
99 matcher_parserrestart(NULL);
100 matcher_parser_init();
101 bufstate = matcher_parser_scan_string((const char *) tmp_str);
102 matcher_parser_switch_to_buffer(bufstate);
103 if (matcher_parserparse() != 0)
105 matcher_parse_op = MATCHER_PARSE_FILE;
106 matcher_parser_delete_buffer(bufstate);
111 static gboolean check_quote_symetry(gchar *str)
117 return TRUE; /* heh, that's symetric */
120 for (walk = str; *walk; walk++) {
122 if (walk == str /* first char */
123 || *(walk - 1) != '\\') /* not escaped */
130 MatcherList *matcher_parser_get_name(gchar *str)
134 if (!check_quote_symetry(str)) {
139 /* bad coding to enable the sub-grammar matching
141 matcher_parserlineno = 1;
142 matcher_parse_op = MATCHER_PARSE_NAME;
143 matcher_parserrestart(NULL);
144 matcher_parser_init();
145 bufstate = matcher_parser_scan_string(str);
146 matcher_parserparse();
147 matcher_parse_op = MATCHER_PARSE_FILE;
148 matcher_parser_delete_buffer(bufstate);
152 MatcherList *matcher_parser_get_cond(gchar *str)
156 if (!check_quote_symetry(str)) {
161 /* bad coding to enable the sub-grammar matching
163 matcher_parserlineno = 1;
164 matcher_parse_op = MATCHER_PARSE_CONDITION;
165 matcher_parserrestart(NULL);
166 matcher_parser_init();
167 bufstate = matcher_parser_scan_string(str);
168 matcher_parserparse();
169 matcher_parse_op = MATCHER_PARSE_FILE;
170 matcher_parser_delete_buffer(bufstate);
174 GSList *matcher_parser_get_action_list(gchar *str)
178 if (!check_quote_symetry(str)) {
183 /* bad coding to enable the sub-grammar matching
185 matcher_parserlineno = 1;
186 matcher_parse_op = MATCHER_PARSE_FILTERING_ACTION;
187 matcher_parserrestart(NULL);
188 matcher_parser_init();
189 bufstate = matcher_parser_scan_string(str);
190 matcher_parserparse();
191 matcher_parse_op = MATCHER_PARSE_FILE;
192 matcher_parser_delete_buffer(bufstate);
196 MatcherProp *matcher_parser_get_prop(gchar *str)
201 matcher_parserlineno = 1;
202 list = matcher_parser_get_cond(str);
206 if (list->matchers == NULL)
209 if (list->matchers->next != NULL)
212 prop = list->matchers->data;
214 g_slist_free(list->matchers);
220 void matcher_parsererror(char *str)
225 for (l = matchers_list; l != NULL; l = g_slist_next(l)) {
226 matcherprop_free((MatcherProp *)
230 g_slist_free(matchers_list);
231 matchers_list = NULL;
234 g_warning("filtering parsing: %i: %s\n",
235 matcher_parserlineno, str);
239 int matcher_parserwrap(void)
249 %token MATCHER_ALL MATCHER_UNREAD MATCHER_NOT_UNREAD
250 %token MATCHER_NEW MATCHER_NOT_NEW MATCHER_MARKED
251 %token MATCHER_NOT_MARKED MATCHER_DELETED MATCHER_NOT_DELETED
252 %token MATCHER_REPLIED MATCHER_NOT_REPLIED MATCHER_FORWARDED
253 %token MATCHER_NOT_FORWARDED MATCHER_SUBJECT MATCHER_NOT_SUBJECT
254 %token MATCHER_FROM MATCHER_NOT_FROM MATCHER_TO MATCHER_NOT_TO
255 %token MATCHER_CC MATCHER_NOT_CC MATCHER_TO_OR_CC MATCHER_NOT_TO_AND_NOT_CC
256 %token MATCHER_AGE_GREATER MATCHER_AGE_LOWER MATCHER_NEWSGROUPS
257 %token MATCHER_NOT_NEWSGROUPS MATCHER_INREPLYTO MATCHER_NOT_INREPLYTO
258 %token MATCHER_REFERENCES MATCHER_NOT_REFERENCES MATCHER_SCORE_GREATER
259 %token MATCHER_SCORE_LOWER MATCHER_HEADER MATCHER_NOT_HEADER
260 %token MATCHER_HEADERS_PART MATCHER_NOT_HEADERS_PART MATCHER_MESSAGE
261 %token MATCHER_NOT_MESSAGE MATCHER_BODY_PART MATCHER_NOT_BODY_PART
262 %token MATCHER_TEST MATCHER_NOT_TEST MATCHER_MATCHCASE MATCHER_MATCH
263 %token MATCHER_REGEXPCASE MATCHER_REGEXP MATCHER_SCORE MATCHER_MOVE
264 %token MATCHER_ANY_IN_ADDRESSBOOK MATCHER_ALL_IN_ADDRESSBOOK
265 %token MATCHER_COPY MATCHER_DELETE MATCHER_MARK MATCHER_UNMARK
266 %token MATCHER_LOCK MATCHER_UNLOCK
267 %token MATCHER_EXECUTE
268 %token MATCHER_MARK_AS_READ MATCHER_MARK_AS_UNREAD MATCHER_FORWARD
269 %token MATCHER_FORWARD_AS_ATTACHMENT MATCHER_EOL MATCHER_STRING
270 %token MATCHER_OR MATCHER_AND
271 %token MATCHER_COLOR MATCHER_SCORE_EQUAL MATCHER_REDIRECT
272 %token MATCHER_SIZE_GREATER MATCHER_SIZE_SMALLER MATCHER_SIZE_EQUAL
273 %token MATCHER_LOCKED MATCHER_NOT_LOCKED
274 %token MATCHER_PARTIAL MATCHER_NOT_PARTIAL
275 %token MATCHER_COLORLABEL MATCHER_NOT_COLORLABEL
276 %token MATCHER_IGNORE_THREAD MATCHER_NOT_IGNORE_THREAD
277 %token MATCHER_CHANGE_SCORE MATCHER_SET_SCORE
278 %token MATCHER_STOP MATCHER_HIDE MATCHER_IGNORE
282 %token MATCHER_RULENAME
283 %token <str> MATCHER_STRING
284 %token <str> MATCHER_SECTION
285 %token <str> MATCHER_INTEGER
291 if (matcher_parse_op == MATCHER_PARSE_FILE) {
292 prefs_filtering = &pre_global_processing;
306 { action_list = NULL; }
313 section_notification:
314 MATCHER_SECTION MATCHER_EOL
317 FolderItem *item = NULL;
319 if (matcher_parse_op == MATCHER_PARSE_FILE) {
320 enable_compatibility = 0;
321 if (!strcmp(folder, "global")) {
322 /* backward compatibility */
323 enable_compatibility = 1;
325 else if (!strcmp(folder, "preglobal")) {
326 prefs_filtering = &pre_global_processing;
328 else if (!strcmp(folder, "postglobal")) {
329 prefs_filtering = &post_global_processing;
331 else if (!strcmp(folder, "filtering")) {
332 prefs_filtering = &filtering_rules;
335 item = folder_find_item_from_identifier(folder);
337 prefs_filtering = &item->prefs->processing;
339 prefs_filtering = NULL;
347 name condition filtering MATCHER_EOL
348 | name condition filtering
350 if (matcher_parse_op == MATCHER_PARSE_NO_EOL)
353 matcher_parsererror("parse error a");
359 if (matcher_parse_op == MATCHER_PARSE_NAME)
362 matcher_parsererror("parse error b");
368 if (matcher_parse_op == MATCHER_PARSE_CONDITION)
371 matcher_parsererror("parse error c");
375 | filtering_action_list
377 if (matcher_parse_op == MATCHER_PARSE_FILTERING_ACTION)
380 matcher_parsererror("parse error d");
388 MATCHER_RULENAME MATCHER_STRING
395 filtering_action_list
397 filtering = filteringprop_new(name, cond, action_list);
400 if (enable_compatibility) {
401 prefs_filtering = &filtering_rules;
402 if (action_list != NULL) {
403 FilteringAction * first_action;
405 first_action = action_list->data;
407 if (first_action->type == MATCHACTION_CHANGE_SCORE)
408 prefs_filtering = &pre_global_processing;
415 if ((matcher_parse_op == MATCHER_PARSE_FILE) &&
416 (prefs_filtering != NULL)) {
417 *prefs_filtering = g_slist_append(*prefs_filtering,
424 filtering_action_list:
425 filtering_action_b filtering_action_list
432 action_list = g_slist_append(action_list, action);
440 match_type = MATCHTYPE_MATCHCASE;
444 match_type = MATCHTYPE_MATCH;
448 match_type = MATCHTYPE_REGEXPCASE;
452 match_type = MATCHTYPE_REGEXP;
454 | MATCHER_ANY_IN_ADDRESSBOOK
456 match_type = MATCHTYPE_ANY_IN_ADDRESSBOOK;
458 | MATCHER_ALL_IN_ADDRESSBOOK
460 match_type = MATCHTYPE_ALL_IN_ADDRESSBOOK;
467 cond = matcherlist_new(matchers_list, (bool_op == MATCHERBOOL_AND));
468 matchers_list = NULL;
473 condition_list bool_op one_condition
475 matchers_list = g_slist_append(matchers_list, prop);
479 matchers_list = NULL;
480 matchers_list = g_slist_append(matchers_list, prop);
487 bool_op = MATCHERBOOL_AND;
491 bool_op = MATCHERBOOL_OR;
500 criteria = MATCHCRITERIA_ALL;
501 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
507 criteria = MATCHCRITERIA_UNREAD;
508 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
514 criteria = MATCHCRITERIA_NOT_UNREAD;
515 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
521 criteria = MATCHCRITERIA_NEW;
522 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
528 criteria = MATCHCRITERIA_NOT_NEW;
529 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
535 criteria = MATCHCRITERIA_MARKED;
536 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
542 criteria = MATCHCRITERIA_NOT_MARKED;
543 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
549 criteria = MATCHCRITERIA_DELETED;
550 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
552 | MATCHER_NOT_DELETED
556 criteria = MATCHCRITERIA_NOT_DELETED;
557 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
563 criteria = MATCHCRITERIA_REPLIED;
564 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
566 | MATCHER_NOT_REPLIED
570 criteria = MATCHCRITERIA_NOT_REPLIED;
571 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
577 criteria = MATCHCRITERIA_FORWARDED;
578 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
580 | MATCHER_NOT_FORWARDED
584 criteria = MATCHCRITERIA_NOT_FORWARDED;
585 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
591 criteria = MATCHCRITERIA_LOCKED;
592 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
598 criteria = MATCHCRITERIA_NOT_LOCKED;
599 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
605 criteria = MATCHCRITERIA_PARTIAL;
606 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
608 | MATCHER_NOT_PARTIAL
612 criteria = MATCHCRITERIA_NOT_PARTIAL;
613 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
615 | MATCHER_COLORLABEL MATCHER_INTEGER
620 criteria = MATCHCRITERIA_COLORLABEL;
621 value = strtol($2, NULL, 10);
622 if (value < 0) value = 0;
623 else if (value > MAX_COLORLABELS) value = MAX_COLORLABELS;
624 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
626 | MATCHER_NOT_COLORLABEL MATCHER_INTEGER
631 criteria = MATCHCRITERIA_NOT_COLORLABEL;
632 value = strtol($2, NULL, 0);
633 if (value < 0) value = 0;
634 else if (value > MAX_COLORLABELS) value = MAX_COLORLABELS;
635 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
637 | MATCHER_IGNORE_THREAD
641 criteria = MATCHCRITERIA_IGNORE_THREAD;
642 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
644 | MATCHER_NOT_IGNORE_THREAD
648 criteria = MATCHCRITERIA_NOT_IGNORE_THREAD;
649 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
651 | MATCHER_SUBJECT match_type MATCHER_STRING
656 criteria = MATCHCRITERIA_SUBJECT;
658 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
660 | MATCHER_NOT_SUBJECT match_type MATCHER_STRING
665 criteria = MATCHCRITERIA_NOT_SUBJECT;
667 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
669 | MATCHER_FROM match_type MATCHER_STRING
674 criteria = MATCHCRITERIA_FROM;
676 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
678 | MATCHER_NOT_FROM match_type MATCHER_STRING
683 criteria = MATCHCRITERIA_NOT_FROM;
685 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
687 | MATCHER_TO match_type MATCHER_STRING
692 criteria = MATCHCRITERIA_TO;
694 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
696 | MATCHER_NOT_TO match_type MATCHER_STRING
701 criteria = MATCHCRITERIA_NOT_TO;
703 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
705 | MATCHER_CC match_type MATCHER_STRING
710 criteria = MATCHCRITERIA_CC;
712 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
714 | MATCHER_NOT_CC match_type MATCHER_STRING
719 criteria = MATCHCRITERIA_NOT_CC;
721 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
723 | MATCHER_TO_OR_CC match_type MATCHER_STRING
728 criteria = MATCHCRITERIA_TO_OR_CC;
730 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
732 | MATCHER_NOT_TO_AND_NOT_CC match_type MATCHER_STRING
737 criteria = MATCHCRITERIA_NOT_TO_AND_NOT_CC;
739 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
741 | MATCHER_AGE_GREATER MATCHER_INTEGER
746 criteria = MATCHCRITERIA_AGE_GREATER;
747 value = strtol($2, NULL, 0);
748 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
750 | MATCHER_AGE_LOWER MATCHER_INTEGER
755 criteria = MATCHCRITERIA_AGE_LOWER;
756 value = strtol($2, NULL, 0);
757 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
759 | MATCHER_NEWSGROUPS match_type MATCHER_STRING
764 criteria = MATCHCRITERIA_NEWSGROUPS;
766 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
768 | MATCHER_NOT_NEWSGROUPS match_type MATCHER_STRING
773 criteria = MATCHCRITERIA_NOT_NEWSGROUPS;
775 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
777 | MATCHER_INREPLYTO match_type MATCHER_STRING
782 criteria = MATCHCRITERIA_INREPLYTO;
784 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
786 | MATCHER_NOT_INREPLYTO match_type MATCHER_STRING
791 criteria = MATCHCRITERIA_NOT_INREPLYTO;
793 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
795 | MATCHER_REFERENCES match_type MATCHER_STRING
800 criteria = MATCHCRITERIA_REFERENCES;
802 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
804 | MATCHER_NOT_REFERENCES match_type MATCHER_STRING
809 criteria = MATCHCRITERIA_NOT_REFERENCES;
811 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
813 | MATCHER_SCORE_GREATER MATCHER_INTEGER
818 criteria = MATCHCRITERIA_SCORE_GREATER;
819 value = strtol($2, NULL, 0);
820 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
822 | MATCHER_SCORE_LOWER MATCHER_INTEGER
827 criteria = MATCHCRITERIA_SCORE_LOWER;
828 value = strtol($2, NULL, 0);
829 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
831 | MATCHER_SCORE_EQUAL MATCHER_INTEGER
836 criteria = MATCHCRITERIA_SCORE_EQUAL;
837 value = strtol($2, NULL, 0);
838 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
840 | MATCHER_SIZE_GREATER MATCHER_INTEGER
844 criteria = MATCHCRITERIA_SIZE_GREATER;
845 value = strtol($2, NULL, 0);
846 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
848 | MATCHER_SIZE_SMALLER MATCHER_INTEGER
852 criteria = MATCHCRITERIA_SIZE_SMALLER;
853 value = strtol($2, NULL, 0);
854 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
856 | MATCHER_SIZE_EQUAL MATCHER_INTEGER
860 criteria = MATCHCRITERIA_SIZE_EQUAL;
861 value = strtol($2, NULL, 0);
862 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
864 | MATCHER_HEADER MATCHER_STRING
866 header = g_strdup($2);
867 } match_type MATCHER_STRING
872 criteria = MATCHCRITERIA_HEADER;
874 prop = matcherprop_new(criteria, header, match_type, expr, 0);
877 | MATCHER_NOT_HEADER MATCHER_STRING
879 header = g_strdup($2);
880 } match_type MATCHER_STRING
885 criteria = MATCHCRITERIA_NOT_HEADER;
887 prop = matcherprop_new(criteria, header, match_type, expr, 0);
890 | MATCHER_HEADERS_PART match_type MATCHER_STRING
895 criteria = MATCHCRITERIA_HEADERS_PART;
897 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
899 | MATCHER_NOT_HEADERS_PART match_type MATCHER_STRING
904 criteria = MATCHCRITERIA_NOT_HEADERS_PART;
906 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
908 | MATCHER_MESSAGE match_type MATCHER_STRING
913 criteria = MATCHCRITERIA_MESSAGE;
915 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
917 | MATCHER_NOT_MESSAGE match_type MATCHER_STRING
922 criteria = MATCHCRITERIA_NOT_MESSAGE;
924 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
926 | MATCHER_BODY_PART match_type MATCHER_STRING
931 criteria = MATCHCRITERIA_BODY_PART;
933 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
935 | MATCHER_NOT_BODY_PART match_type MATCHER_STRING
940 criteria = MATCHCRITERIA_NOT_BODY_PART;
942 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
944 | MATCHER_TEST MATCHER_STRING
949 criteria = MATCHCRITERIA_TEST;
951 prop = matcherprop_new(criteria, NULL, 0, expr, 0);
953 | MATCHER_NOT_TEST MATCHER_STRING
958 criteria = MATCHCRITERIA_NOT_TEST;
960 prop = matcherprop_new(criteria, NULL, 0, expr, 0);
965 MATCHER_EXECUTE MATCHER_STRING
968 gint action_type = 0;
970 action_type = MATCHACTION_EXECUTE;
972 action = filteringaction_new(action_type, 0, cmd, 0, 0);
974 | MATCHER_MOVE MATCHER_STRING
976 gchar *destination = NULL;
977 gint action_type = 0;
979 action_type = MATCHACTION_MOVE;
981 action = filteringaction_new(action_type, 0, destination, 0, 0);
983 | MATCHER_COPY MATCHER_STRING
985 gchar *destination = NULL;
986 gint action_type = 0;
988 action_type = MATCHACTION_COPY;
990 action = filteringaction_new(action_type, 0, destination, 0, 0);
994 gint action_type = 0;
996 action_type = MATCHACTION_DELETE;
997 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1001 gint action_type = 0;
1003 action_type = MATCHACTION_MARK;
1004 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1008 gint action_type = 0;
1010 action_type = MATCHACTION_UNMARK;
1011 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1015 gint action_type = 0;
1017 action_type = MATCHACTION_LOCK;
1018 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1022 gint action_type = 0;
1024 action_type = MATCHACTION_UNLOCK;
1025 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1027 | MATCHER_MARK_AS_READ
1029 gint action_type = 0;
1031 action_type = MATCHACTION_MARK_AS_READ;
1032 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1034 | MATCHER_MARK_AS_UNREAD
1036 gint action_type = 0;
1038 action_type = MATCHACTION_MARK_AS_UNREAD;
1039 action = filteringaction_new(action_type, 0, NULL, 0, 0);
1041 | MATCHER_FORWARD MATCHER_INTEGER MATCHER_STRING
1043 gchar *destination = NULL;
1044 gint action_type = 0;
1045 gint account_id = 0;
1047 action_type = MATCHACTION_FORWARD;
1048 account_id = strtol($2, NULL, 10);
1050 action = filteringaction_new(action_type,
1051 account_id, destination, 0, 0);
1053 | MATCHER_FORWARD_AS_ATTACHMENT MATCHER_INTEGER MATCHER_STRING
1055 gchar *destination = NULL;
1056 gint action_type = 0;
1057 gint account_id = 0;
1059 action_type = MATCHACTION_FORWARD_AS_ATTACHMENT;
1060 account_id = strtol($2, NULL, 10);
1062 action = filteringaction_new(action_type,
1063 account_id, destination, 0, 0);
1065 | MATCHER_REDIRECT MATCHER_INTEGER MATCHER_STRING
1067 gchar *destination = NULL;
1068 gint action_type = 0;
1069 gint account_id = 0;
1071 action_type = MATCHACTION_REDIRECT;
1072 account_id = strtol($2, NULL, 10);
1074 action = filteringaction_new(action_type,
1075 account_id, destination, 0, 0);
1077 | MATCHER_COLOR MATCHER_INTEGER
1079 gint action_type = 0;
1082 action_type = MATCHACTION_COLOR;
1083 color = strtol($2, NULL, 10);
1084 action = filteringaction_new(action_type, 0, NULL, color, 0);
1086 | MATCHER_CHANGE_SCORE MATCHER_INTEGER
1090 score = strtol($2, NULL, 10);
1091 action = filteringaction_new(MATCHACTION_CHANGE_SCORE, 0,
1094 /* backward compatibility */
1095 | MATCHER_SCORE MATCHER_INTEGER
1099 score = strtol($2, NULL, 10);
1100 action = filteringaction_new(MATCHACTION_CHANGE_SCORE, 0,
1103 | MATCHER_SET_SCORE MATCHER_INTEGER
1107 score = strtol($2, NULL, 10);
1108 action = filteringaction_new(MATCHACTION_SET_SCORE, 0,
1113 action = filteringaction_new(MATCHACTION_HIDE, 0, NULL, 0, 0);
1117 action = filteringaction_new(MATCHACTION_IGNORE, 0, NULL, 0, 0);
1121 action = filteringaction_new(MATCHACTION_STOP, 0, NULL, 0, 0);