11 #include "matcher_parser.h"
12 #include "matcher_parser_lex.h"
14 static gint error = 0;
15 static gint bool_op = 0;
16 static gint match_type = 0;
17 static gchar * header = NULL;
19 static MatcherProp * prop;
21 static GSList * matchers_list = NULL;
23 static MatcherList * cond;
24 static gint score = 0;
25 static FilteringAction * action = NULL;
27 static FilteringProp * filtering;
28 static ScoringProp * scoring = NULL;
30 static GSList ** prefs_scoring = NULL;
31 static GSList ** prefs_filtering = NULL;
33 static int matcher_parser_dialog = 0;
36 /* ******************************************************************** */
40 void matcher_parser_start_parsing(FILE * f)
42 matcher_parserrestart(f);
43 matcher_parserparse();
46 FilteringProp * matcher_parser_get_filtering(gchar * str)
50 /* bad coding to enable the sub-grammar matching
52 matcher_parserlineno = 1;
53 matcher_parser_dialog = 1;
54 matcher_parserrestart(NULL);
55 matcher_parser_init();
56 bufstate = matcher_parser_scan_string(str);
57 matcher_parser_switch_to_buffer(bufstate);
58 if (matcher_parserparse() != 0)
60 matcher_parser_dialog = 0;
61 matcher_parser_delete_buffer(bufstate);
65 ScoringProp * matcher_parser_get_scoring(gchar * str)
69 /* bad coding to enable the sub-grammar matching
71 matcher_parserlineno = 1;
72 matcher_parser_dialog = 1;
73 matcher_parserrestart(NULL);
74 matcher_parser_init();
75 bufstate = matcher_parser_scan_string(str);
76 matcher_parser_switch_to_buffer(bufstate);
77 if (matcher_parserparse() != 0)
79 matcher_parser_dialog = 0;
80 matcher_parser_delete_buffer(bufstate);
84 MatcherList * matcher_parser_get_cond(gchar * str)
88 /* bad coding to enable the sub-grammar matching
90 matcher_parserlineno = 1;
91 matcher_parser_dialog = 1;
92 matcher_parserrestart(NULL);
93 matcher_parser_init();
94 bufstate = matcher_parser_scan_string(str);
95 matcher_parserparse();
96 matcher_parser_dialog = 0;
97 matcher_parser_delete_buffer(bufstate);
101 MatcherProp * matcher_parser_get_prop(gchar * str)
106 matcher_parserlineno = 1;
107 list = matcher_parser_get_cond(str);
111 if (list->matchers == NULL)
114 if (list->matchers->next != NULL)
117 prop = list->matchers->data;
119 g_slist_free(list->matchers);
125 void matcher_parsererror(char * str)
130 for(l = matchers_list ; l != NULL ;
131 l = g_slist_next(l)) {
132 matcherprop_free((MatcherProp *)
136 g_slist_free(matchers_list);
137 matchers_list = NULL;
140 g_warning(_("scoring / filtering parsing: %i: %s\n"),
141 matcher_parserlineno, str);
145 int matcher_parserwrap(void)
156 %token MATCHER_ALL MATCHER_UNREAD MATCHER_NOT_UNREAD
157 %token MATCHER_NEW MATCHER_NOT_NEW MATCHER_MARKED
158 %token MATCHER_NOT_MARKED MATCHER_DELETED MATCHER_NOT_DELETED
159 %token MATCHER_REPLIED MATCHER_NOT_REPLIED MATCHER_FORWARDED
160 %token MATCHER_NOT_FORWARDED MATCHER_SUBJECT MATCHER_NOT_SUBJECT
161 %token MATCHER_FROM MATCHER_NOT_FROM MATCHER_TO MATCHER_NOT_TO
162 %token MATCHER_CC MATCHER_NOT_CC MATCHER_TO_OR_CC MATCHER_NOT_TO_AND_NOT_CC
163 %token MATCHER_AGE_GREATER MATCHER_AGE_LOWER MATCHER_NEWSGROUPS
164 %token MATCHER_NOT_NEWSGROUPS MATCHER_INREPLYTO MATCHER_NOT_INREPLYTO
165 %token MATCHER_REFERENCES MATCHER_NOT_REFERENCES MATCHER_SCORE_GREATER
166 %token MATCHER_SCORE_LOWER MATCHER_HEADER MATCHER_NOT_HEADER
167 %token MATCHER_HEADERS_PART MATCHER_NOT_HEADERS_PART MATCHER_MESSAGE
168 %token MATCHER_NOT_MESSAGE MATCHER_BODY_PART MATCHER_NOT_BODY_PART
169 %token MATCHER_EXECUTE MATCHER_NOT_EXECUTE MATCHER_MATCHCASE MATCHER_MATCH
170 %token MATCHER_REGEXPCASE MATCHER_REGEXP MATCHER_SCORE MATCHER_MOVE
171 %token MATCHER_COPY MATCHER_DELETE MATCHER_MARK MATCHER_UNMARK
172 %token MATCHER_MARK_AS_READ MATCHER_MARK_AS_UNREAD MATCHER_FORWARD
173 %token MATCHER_FORWARD_AS_ATTACHMENT MATCHER_EOL MATCHER_STRING
174 %token MATCHER_OR MATCHER_AND
175 %token MATCHER_COLOR MATCHER_SCORE_EQUAL MATCHER_REDIRECT MATCHER_DELETE_ON_SERVER
176 %token MATCHER_SIZE_GREATER MATCHER_SIZE_SMALLER MATCHER_SIZE_EQUAL
180 %token <str> MATCHER_STRING
181 %token <str> MATCHER_SECTION
182 %token <str> MATCHER_INTEGER
188 if (!matcher_parser_dialog) {
189 prefs_scoring = &global_scoring;
190 prefs_filtering = &global_processing;
209 section_notification:
210 MATCHER_SECTION MATCHER_EOL
213 FolderItem * item = NULL;
215 if (!matcher_parser_dialog) {
216 item = folder_find_item_from_identifier(folder);
218 prefs_scoring = &global_scoring;
219 prefs_filtering = &global_processing;
222 prefs_scoring = &item->prefs->scoring;
223 prefs_filtering = &item->prefs->processing;
230 condition end_instr_opt
235 filtering_or_scoring end_action
238 if (matcher_parser_dialog)
241 matcher_parsererror("parse error");
251 if (matcher_parser_dialog)
254 matcher_parsererror("parse error");
260 filtering_or_scoring:
263 filtering = filteringprop_new(cond, action);
266 if (!matcher_parser_dialog) {
267 * prefs_filtering = g_slist_append(* prefs_filtering,
274 scoring = scoringprop_new(cond, score);
277 if (!matcher_parser_dialog) {
278 * prefs_scoring = g_slist_append(* prefs_scoring, scoring);
287 match_type = MATCHTYPE_MATCHCASE;
291 match_type = MATCHTYPE_MATCH;
295 match_type = MATCHTYPE_REGEXPCASE;
299 match_type = MATCHTYPE_REGEXP;
306 cond = matcherlist_new(matchers_list, (bool_op == MATCHERBOOL_AND));
307 matchers_list = NULL;
312 condition_list bool_op one_condition
314 matchers_list = g_slist_append(matchers_list, prop);
318 matchers_list = NULL;
319 matchers_list = g_slist_append(matchers_list, prop);
326 bool_op = MATCHERBOOL_AND;
330 bool_op = MATCHERBOOL_OR;
339 criteria = MATCHCRITERIA_ALL;
340 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
346 criteria = MATCHCRITERIA_UNREAD;
347 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
353 criteria = MATCHCRITERIA_NOT_UNREAD;
354 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
360 criteria = MATCHCRITERIA_NEW;
361 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
367 criteria = MATCHCRITERIA_NOT_NEW;
368 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
374 criteria = MATCHCRITERIA_MARKED;
375 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
381 criteria = MATCHCRITERIA_NOT_MARKED;
382 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
388 criteria = MATCHCRITERIA_DELETED;
389 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
391 | MATCHER_NOT_DELETED
395 criteria = MATCHCRITERIA_NOT_DELETED;
396 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
402 criteria = MATCHCRITERIA_REPLIED;
403 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
405 | MATCHER_NOT_REPLIED
409 criteria = MATCHCRITERIA_NOT_REPLIED;
410 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
416 criteria = MATCHCRITERIA_FORWARDED;
417 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
419 | MATCHER_NOT_FORWARDED
423 criteria = MATCHCRITERIA_NOT_FORWARDED;
424 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
426 | MATCHER_SUBJECT match_type MATCHER_STRING
431 criteria = MATCHCRITERIA_SUBJECT;
433 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
435 | MATCHER_NOT_SUBJECT match_type MATCHER_STRING
440 criteria = MATCHCRITERIA_NOT_SUBJECT;
442 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
444 | MATCHER_FROM match_type MATCHER_STRING
449 criteria = MATCHCRITERIA_FROM;
451 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
453 | MATCHER_NOT_FROM match_type MATCHER_STRING
458 criteria = MATCHCRITERIA_NOT_FROM;
460 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
462 | MATCHER_TO match_type MATCHER_STRING
467 criteria = MATCHCRITERIA_TO;
469 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
471 | MATCHER_NOT_TO match_type MATCHER_STRING
476 criteria = MATCHCRITERIA_NOT_TO;
478 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
480 | MATCHER_CC match_type MATCHER_STRING
485 criteria = MATCHCRITERIA_CC;
487 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
489 | MATCHER_NOT_CC match_type MATCHER_STRING
494 criteria = MATCHCRITERIA_NOT_CC;
496 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
498 | MATCHER_TO_OR_CC match_type MATCHER_STRING
503 criteria = MATCHCRITERIA_TO_OR_CC;
505 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
507 | MATCHER_NOT_TO_AND_NOT_CC match_type MATCHER_STRING
512 criteria = MATCHCRITERIA_NOT_TO_AND_NOT_CC;
514 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
516 | MATCHER_AGE_GREATER MATCHER_INTEGER
521 criteria = MATCHCRITERIA_AGE_GREATER;
523 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
525 | MATCHER_AGE_LOWER MATCHER_INTEGER
530 criteria = MATCHCRITERIA_AGE_LOWER;
532 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
534 | MATCHER_NEWSGROUPS match_type MATCHER_STRING
539 criteria = MATCHCRITERIA_NEWSGROUPS;
541 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
543 | MATCHER_NOT_NEWSGROUPS match_type MATCHER_STRING
548 criteria = MATCHCRITERIA_NOT_NEWSGROUPS;
550 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
552 | MATCHER_INREPLYTO match_type MATCHER_STRING
557 criteria = MATCHCRITERIA_INREPLYTO;
559 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
561 | MATCHER_NOT_INREPLYTO match_type MATCHER_STRING
566 criteria = MATCHCRITERIA_NOT_INREPLYTO;
568 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
570 | MATCHER_REFERENCES match_type MATCHER_STRING
575 criteria = MATCHCRITERIA_REFERENCES;
577 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
579 | MATCHER_NOT_REFERENCES match_type MATCHER_STRING
584 criteria = MATCHCRITERIA_NOT_REFERENCES;
586 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
588 | MATCHER_SCORE_GREATER MATCHER_INTEGER
593 criteria = MATCHCRITERIA_SCORE_GREATER;
595 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
597 | MATCHER_SCORE_LOWER MATCHER_INTEGER
602 criteria = MATCHCRITERIA_SCORE_LOWER;
604 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
606 | MATCHER_SCORE_EQUAL MATCHER_INTEGER
611 criteria = MATCHCRITERIA_SCORE_EQUAL;
613 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
615 | MATCHER_SIZE_GREATER MATCHER_INTEGER
619 criteria = MATCHCRITERIA_SIZE_GREATER;
621 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
623 | MATCHER_SIZE_SMALLER MATCHER_INTEGER
627 criteria = MATCHCRITERIA_SIZE_SMALLER;
629 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
631 | MATCHER_SIZE_EQUAL MATCHER_INTEGER
635 criteria = MATCHCRITERIA_SIZE_EQUAL;
637 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
639 | MATCHER_HEADER MATCHER_STRING
641 header = g_strdup($2);
642 } match_type MATCHER_STRING
647 criteria = MATCHCRITERIA_HEADER;
649 prop = matcherprop_unquote_new(criteria, header, match_type, expr, 0);
652 | MATCHER_NOT_HEADER MATCHER_STRING
654 header = g_strdup($2);
655 } match_type MATCHER_STRING
660 criteria = MATCHCRITERIA_NOT_HEADER;
662 prop = matcherprop_unquote_new(criteria, header, match_type, expr, 0);
665 | MATCHER_HEADERS_PART match_type MATCHER_STRING
670 criteria = MATCHCRITERIA_HEADERS_PART;
672 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
674 | MATCHER_NOT_HEADERS_PART match_type MATCHER_STRING
679 criteria = MATCHCRITERIA_NOT_HEADERS_PART;
681 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
683 | MATCHER_MESSAGE match_type MATCHER_STRING
688 criteria = MATCHCRITERIA_MESSAGE;
690 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
692 | MATCHER_NOT_MESSAGE match_type MATCHER_STRING
697 criteria = MATCHCRITERIA_NOT_MESSAGE;
699 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
701 | MATCHER_BODY_PART match_type MATCHER_STRING
706 criteria = MATCHCRITERIA_BODY_PART;
708 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
710 | MATCHER_NOT_BODY_PART match_type MATCHER_STRING
715 criteria = MATCHCRITERIA_NOT_BODY_PART;
717 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
719 | MATCHER_EXECUTE MATCHER_STRING
724 criteria = MATCHCRITERIA_EXECUTE;
726 prop = matcherprop_unquote_new(criteria, NULL, 0, expr, 0);
728 | MATCHER_NOT_EXECUTE MATCHER_STRING
733 criteria = MATCHCRITERIA_NOT_EXECUTE;
735 prop = matcherprop_unquote_new(criteria, NULL, 0, expr, 0);
740 MATCHER_EXECUTE MATCHER_STRING
743 gint action_type = 0;
745 action_type = MATCHACTION_EXECUTE;
747 action = filteringaction_new(action_type, 0, cmd, 0);
749 | MATCHER_MOVE MATCHER_STRING
751 gchar * destination = NULL;
752 gint action_type = 0;
754 action_type = MATCHACTION_MOVE;
756 action = filteringaction_new(action_type, 0, destination, 0);
758 | MATCHER_COPY MATCHER_STRING
760 gchar * destination = NULL;
761 gint action_type = 0;
763 action_type = MATCHACTION_COPY;
765 action = filteringaction_new(action_type, 0, destination, 0);
769 gint action_type = 0;
771 action_type = MATCHACTION_DELETE;
772 action = filteringaction_new(action_type, 0, NULL, 0);
776 gint action_type = 0;
778 action_type = MATCHACTION_MARK;
779 action = filteringaction_new(action_type, 0, NULL, 0);
783 gint action_type = 0;
785 action_type = MATCHACTION_UNMARK;
786 action = filteringaction_new(action_type, 0, NULL, 0);
788 | MATCHER_MARK_AS_READ
790 gint action_type = 0;
792 action_type = MATCHACTION_MARK_AS_READ;
793 action = filteringaction_new(action_type, 0, NULL, 0);
795 | MATCHER_MARK_AS_UNREAD
797 gint action_type = 0;
799 action_type = MATCHACTION_MARK_AS_UNREAD;
800 action = filteringaction_new(action_type, 0, NULL, 0);
802 | MATCHER_FORWARD MATCHER_INTEGER MATCHER_STRING
804 gchar * destination = NULL;
805 gint action_type = 0;
808 action_type = MATCHACTION_FORWARD;
809 account_id = atoi($2);
811 action = filteringaction_new(action_type, account_id, destination, 0);
813 | MATCHER_FORWARD_AS_ATTACHMENT MATCHER_INTEGER MATCHER_STRING
815 gchar * destination = NULL;
816 gint action_type = 0;
819 action_type = MATCHACTION_FORWARD_AS_ATTACHMENT;
820 account_id = atoi($2);
822 action = filteringaction_new(action_type, account_id, destination, 0);
824 | MATCHER_REDIRECT MATCHER_INTEGER MATCHER_STRING
826 gchar * destination = NULL;
827 gint action_type = 0;
830 action_type = MATCHACTION_REDIRECT;
831 account_id = atoi($2);
833 action = filteringaction_new(action_type, account_id, destination, 0);
835 | MATCHER_COLOR MATCHER_INTEGER
837 gint action_type = 0;
840 action_type = MATCHACTION_COLOR;
842 action = filteringaction_new(action_type, 0, NULL, color);
844 | MATCHER_DELETE_ON_SERVER
846 gint action_type = 0;
847 action_type = MATCHACTION_DELETE_ON_SERVER;
848 action = filteringaction_new(action_type, 0, NULL, 0);
853 MATCHER_SCORE MATCHER_INTEGER