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 static gboolean check_quote_symetry (gchar *str)
90 return TRUE; /* heh, that's symetric */
93 for (walk = str; *walk; walk++) {
95 if (walk == str /* first char */
96 || *(walk - 1) != '\\') /* not escaped */
103 MatcherList * matcher_parser_get_cond(gchar * str)
107 if (!check_quote_symetry(str)) {
112 /* bad coding to enable the sub-grammar matching
114 matcher_parserlineno = 1;
115 matcher_parser_dialog = 1;
116 matcher_parserrestart(NULL);
117 matcher_parser_init();
118 bufstate = matcher_parser_scan_string(str);
119 matcher_parserparse();
120 matcher_parser_dialog = 0;
121 matcher_parser_delete_buffer(bufstate);
125 MatcherProp * matcher_parser_get_prop(gchar * str)
130 matcher_parserlineno = 1;
131 list = matcher_parser_get_cond(str);
135 if (list->matchers == NULL)
138 if (list->matchers->next != NULL)
141 prop = list->matchers->data;
143 g_slist_free(list->matchers);
149 void matcher_parsererror(char * str)
154 for(l = matchers_list ; l != NULL ;
155 l = g_slist_next(l)) {
156 matcherprop_free((MatcherProp *)
160 g_slist_free(matchers_list);
161 matchers_list = NULL;
164 g_warning("scoring / filtering parsing: %i: %s\n",
165 matcher_parserlineno, str);
169 int matcher_parserwrap(void)
180 %token MATCHER_ALL MATCHER_UNREAD MATCHER_NOT_UNREAD
181 %token MATCHER_NEW MATCHER_NOT_NEW MATCHER_MARKED
182 %token MATCHER_NOT_MARKED MATCHER_DELETED MATCHER_NOT_DELETED
183 %token MATCHER_REPLIED MATCHER_NOT_REPLIED MATCHER_FORWARDED
184 %token MATCHER_NOT_FORWARDED MATCHER_SUBJECT MATCHER_NOT_SUBJECT
185 %token MATCHER_FROM MATCHER_NOT_FROM MATCHER_TO MATCHER_NOT_TO
186 %token MATCHER_CC MATCHER_NOT_CC MATCHER_TO_OR_CC MATCHER_NOT_TO_AND_NOT_CC
187 %token MATCHER_AGE_GREATER MATCHER_AGE_LOWER MATCHER_NEWSGROUPS
188 %token MATCHER_NOT_NEWSGROUPS MATCHER_INREPLYTO MATCHER_NOT_INREPLYTO
189 %token MATCHER_REFERENCES MATCHER_NOT_REFERENCES MATCHER_SCORE_GREATER
190 %token MATCHER_SCORE_LOWER MATCHER_HEADER MATCHER_NOT_HEADER
191 %token MATCHER_HEADERS_PART MATCHER_NOT_HEADERS_PART MATCHER_MESSAGE
192 %token MATCHER_NOT_MESSAGE MATCHER_BODY_PART MATCHER_NOT_BODY_PART
193 %token MATCHER_EXECUTE MATCHER_NOT_EXECUTE MATCHER_MATCHCASE MATCHER_MATCH
194 %token MATCHER_REGEXPCASE MATCHER_REGEXP MATCHER_SCORE MATCHER_MOVE
195 %token MATCHER_COPY MATCHER_DELETE MATCHER_MARK MATCHER_UNMARK
196 %token MATCHER_MARK_AS_READ MATCHER_MARK_AS_UNREAD MATCHER_FORWARD
197 %token MATCHER_FORWARD_AS_ATTACHMENT MATCHER_EOL MATCHER_STRING
198 %token MATCHER_OR MATCHER_AND
199 %token MATCHER_COLOR MATCHER_SCORE_EQUAL MATCHER_REDIRECT MATCHER_DELETE_ON_SERVER
200 %token MATCHER_SIZE_GREATER MATCHER_SIZE_SMALLER MATCHER_SIZE_EQUAL
201 %token MATCHER_LOCKED MATCHER_NOT_LOCKED
205 %token <str> MATCHER_STRING
206 %token <str> MATCHER_SECTION
207 %token <str> MATCHER_INTEGER
213 if (!matcher_parser_dialog) {
214 prefs_scoring = &global_scoring;
215 prefs_filtering = &global_processing;
234 section_notification:
235 MATCHER_SECTION MATCHER_EOL
238 FolderItem * item = NULL;
240 if (!matcher_parser_dialog) {
241 item = folder_find_item_from_identifier(folder);
243 prefs_scoring = &global_scoring;
244 prefs_filtering = &global_processing;
247 prefs_scoring = &item->prefs->scoring;
248 prefs_filtering = &item->prefs->processing;
255 condition end_instr_opt
260 filtering_or_scoring end_action
263 if (matcher_parser_dialog)
266 matcher_parsererror("parse error");
276 if (matcher_parser_dialog)
279 matcher_parsererror("parse error");
285 filtering_or_scoring:
288 filtering = filteringprop_new(cond, action);
291 if (!matcher_parser_dialog) {
292 * prefs_filtering = g_slist_append(* prefs_filtering,
299 scoring = scoringprop_new(cond, score);
302 if (!matcher_parser_dialog) {
303 * prefs_scoring = g_slist_append(* prefs_scoring, scoring);
312 match_type = MATCHTYPE_MATCHCASE;
316 match_type = MATCHTYPE_MATCH;
320 match_type = MATCHTYPE_REGEXPCASE;
324 match_type = MATCHTYPE_REGEXP;
331 cond = matcherlist_new(matchers_list, (bool_op == MATCHERBOOL_AND));
332 matchers_list = NULL;
337 condition_list bool_op one_condition
339 matchers_list = g_slist_append(matchers_list, prop);
343 matchers_list = NULL;
344 matchers_list = g_slist_append(matchers_list, prop);
351 bool_op = MATCHERBOOL_AND;
355 bool_op = MATCHERBOOL_OR;
364 criteria = MATCHCRITERIA_ALL;
365 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
371 criteria = MATCHCRITERIA_UNREAD;
372 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
378 criteria = MATCHCRITERIA_NOT_UNREAD;
379 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
385 criteria = MATCHCRITERIA_NEW;
386 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
392 criteria = MATCHCRITERIA_NOT_NEW;
393 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
399 criteria = MATCHCRITERIA_MARKED;
400 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
406 criteria = MATCHCRITERIA_NOT_MARKED;
407 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
413 criteria = MATCHCRITERIA_DELETED;
414 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
416 | MATCHER_NOT_DELETED
420 criteria = MATCHCRITERIA_NOT_DELETED;
421 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
427 criteria = MATCHCRITERIA_REPLIED;
428 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
430 | MATCHER_NOT_REPLIED
434 criteria = MATCHCRITERIA_NOT_REPLIED;
435 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
441 criteria = MATCHCRITERIA_FORWARDED;
442 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
444 | MATCHER_NOT_FORWARDED
448 criteria = MATCHCRITERIA_NOT_FORWARDED;
449 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
455 criteria = MATCHCRITERIA_LOCKED;
456 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
462 criteria = MATCHCRITERIA_NOT_LOCKED;
463 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, 0);
465 | MATCHER_SUBJECT match_type MATCHER_STRING
470 criteria = MATCHCRITERIA_SUBJECT;
472 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
474 | MATCHER_NOT_SUBJECT match_type MATCHER_STRING
479 criteria = MATCHCRITERIA_NOT_SUBJECT;
481 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
483 | MATCHER_FROM match_type MATCHER_STRING
488 criteria = MATCHCRITERIA_FROM;
490 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
492 | MATCHER_NOT_FROM match_type MATCHER_STRING
497 criteria = MATCHCRITERIA_NOT_FROM;
499 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
501 | MATCHER_TO match_type MATCHER_STRING
506 criteria = MATCHCRITERIA_TO;
508 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
510 | MATCHER_NOT_TO match_type MATCHER_STRING
515 criteria = MATCHCRITERIA_NOT_TO;
517 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
519 | MATCHER_CC match_type MATCHER_STRING
524 criteria = MATCHCRITERIA_CC;
526 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
528 | MATCHER_NOT_CC match_type MATCHER_STRING
533 criteria = MATCHCRITERIA_NOT_CC;
535 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
537 | MATCHER_TO_OR_CC match_type MATCHER_STRING
542 criteria = MATCHCRITERIA_TO_OR_CC;
544 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
546 | MATCHER_NOT_TO_AND_NOT_CC match_type MATCHER_STRING
551 criteria = MATCHCRITERIA_NOT_TO_AND_NOT_CC;
553 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
555 | MATCHER_AGE_GREATER MATCHER_INTEGER
560 criteria = MATCHCRITERIA_AGE_GREATER;
562 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
564 | MATCHER_AGE_LOWER MATCHER_INTEGER
569 criteria = MATCHCRITERIA_AGE_LOWER;
571 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
573 | MATCHER_NEWSGROUPS match_type MATCHER_STRING
578 criteria = MATCHCRITERIA_NEWSGROUPS;
580 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
582 | MATCHER_NOT_NEWSGROUPS match_type MATCHER_STRING
587 criteria = MATCHCRITERIA_NOT_NEWSGROUPS;
589 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
591 | MATCHER_INREPLYTO match_type MATCHER_STRING
596 criteria = MATCHCRITERIA_INREPLYTO;
598 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
600 | MATCHER_NOT_INREPLYTO match_type MATCHER_STRING
605 criteria = MATCHCRITERIA_NOT_INREPLYTO;
607 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
609 | MATCHER_REFERENCES match_type MATCHER_STRING
614 criteria = MATCHCRITERIA_REFERENCES;
616 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
618 | MATCHER_NOT_REFERENCES match_type MATCHER_STRING
623 criteria = MATCHCRITERIA_NOT_REFERENCES;
625 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
627 | MATCHER_SCORE_GREATER MATCHER_INTEGER
632 criteria = MATCHCRITERIA_SCORE_GREATER;
634 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
636 | MATCHER_SCORE_LOWER MATCHER_INTEGER
641 criteria = MATCHCRITERIA_SCORE_LOWER;
643 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
645 | MATCHER_SCORE_EQUAL MATCHER_INTEGER
650 criteria = MATCHCRITERIA_SCORE_EQUAL;
652 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
654 | MATCHER_SIZE_GREATER MATCHER_INTEGER
658 criteria = MATCHCRITERIA_SIZE_GREATER;
660 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
662 | MATCHER_SIZE_SMALLER MATCHER_INTEGER
666 criteria = MATCHCRITERIA_SIZE_SMALLER;
668 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
670 | MATCHER_SIZE_EQUAL MATCHER_INTEGER
674 criteria = MATCHCRITERIA_SIZE_EQUAL;
676 prop = matcherprop_unquote_new(criteria, NULL, 0, NULL, value);
678 | MATCHER_HEADER MATCHER_STRING
680 header = g_strdup($2);
681 } match_type MATCHER_STRING
686 criteria = MATCHCRITERIA_HEADER;
688 prop = matcherprop_unquote_new(criteria, header, match_type, expr, 0);
691 | MATCHER_NOT_HEADER MATCHER_STRING
693 header = g_strdup($2);
694 } match_type MATCHER_STRING
699 criteria = MATCHCRITERIA_NOT_HEADER;
701 prop = matcherprop_unquote_new(criteria, header, match_type, expr, 0);
704 | MATCHER_HEADERS_PART match_type MATCHER_STRING
709 criteria = MATCHCRITERIA_HEADERS_PART;
711 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
713 | MATCHER_NOT_HEADERS_PART match_type MATCHER_STRING
718 criteria = MATCHCRITERIA_NOT_HEADERS_PART;
720 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
722 | MATCHER_MESSAGE match_type MATCHER_STRING
727 criteria = MATCHCRITERIA_MESSAGE;
729 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
731 | MATCHER_NOT_MESSAGE match_type MATCHER_STRING
736 criteria = MATCHCRITERIA_NOT_MESSAGE;
738 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
740 | MATCHER_BODY_PART match_type MATCHER_STRING
745 criteria = MATCHCRITERIA_BODY_PART;
747 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
749 | MATCHER_NOT_BODY_PART match_type MATCHER_STRING
754 criteria = MATCHCRITERIA_NOT_BODY_PART;
756 prop = matcherprop_unquote_new(criteria, NULL, match_type, expr, 0);
758 | MATCHER_EXECUTE MATCHER_STRING
763 criteria = MATCHCRITERIA_EXECUTE;
765 prop = matcherprop_unquote_new(criteria, NULL, 0, expr, 0);
767 | MATCHER_NOT_EXECUTE MATCHER_STRING
772 criteria = MATCHCRITERIA_NOT_EXECUTE;
774 prop = matcherprop_unquote_new(criteria, NULL, 0, expr, 0);
779 MATCHER_EXECUTE MATCHER_STRING
782 gint action_type = 0;
784 action_type = MATCHACTION_EXECUTE;
786 action = filteringaction_new(action_type, 0, cmd, 0);
788 | MATCHER_MOVE MATCHER_STRING
790 gchar * destination = NULL;
791 gint action_type = 0;
793 action_type = MATCHACTION_MOVE;
795 action = filteringaction_new(action_type, 0, destination, 0);
797 | MATCHER_COPY MATCHER_STRING
799 gchar * destination = NULL;
800 gint action_type = 0;
802 action_type = MATCHACTION_COPY;
804 action = filteringaction_new(action_type, 0, destination, 0);
808 gint action_type = 0;
810 action_type = MATCHACTION_DELETE;
811 action = filteringaction_new(action_type, 0, NULL, 0);
815 gint action_type = 0;
817 action_type = MATCHACTION_MARK;
818 action = filteringaction_new(action_type, 0, NULL, 0);
822 gint action_type = 0;
824 action_type = MATCHACTION_UNMARK;
825 action = filteringaction_new(action_type, 0, NULL, 0);
827 | MATCHER_MARK_AS_READ
829 gint action_type = 0;
831 action_type = MATCHACTION_MARK_AS_READ;
832 action = filteringaction_new(action_type, 0, NULL, 0);
834 | MATCHER_MARK_AS_UNREAD
836 gint action_type = 0;
838 action_type = MATCHACTION_MARK_AS_UNREAD;
839 action = filteringaction_new(action_type, 0, NULL, 0);
841 | MATCHER_FORWARD MATCHER_INTEGER MATCHER_STRING
843 gchar * destination = NULL;
844 gint action_type = 0;
847 action_type = MATCHACTION_FORWARD;
848 account_id = atoi($2);
850 action = filteringaction_new(action_type, account_id, destination, 0);
852 | MATCHER_FORWARD_AS_ATTACHMENT MATCHER_INTEGER MATCHER_STRING
854 gchar * destination = NULL;
855 gint action_type = 0;
858 action_type = MATCHACTION_FORWARD_AS_ATTACHMENT;
859 account_id = atoi($2);
861 action = filteringaction_new(action_type, account_id, destination, 0);
863 | MATCHER_REDIRECT MATCHER_INTEGER MATCHER_STRING
865 gchar * destination = NULL;
866 gint action_type = 0;
869 action_type = MATCHACTION_REDIRECT;
870 account_id = atoi($2);
872 action = filteringaction_new(action_type, account_id, destination, 0);
874 | MATCHER_COLOR MATCHER_INTEGER
876 gint action_type = 0;
879 action_type = MATCHACTION_COLOR;
881 action = filteringaction_new(action_type, 0, NULL, color);
883 | MATCHER_DELETE_ON_SERVER
885 gint action_type = 0;
886 action_type = MATCHACTION_DELETE_ON_SERVER;
887 action = filteringaction_new(action_type, 0, NULL, 0);
892 MATCHER_SCORE MATCHER_INTEGER