5 #include "matcher_parser.h"
6 #include "matcher_parser_lex.h"
10 static gint error = 0;
11 static gint bool_op = 0;
12 static gint match_type = 0;
13 static gchar * header = NULL;
15 static MatcherProp * prop;
17 static GSList * matchers_list = NULL;
19 static MatcherList * cond;
20 static gint score = 0;
21 static FilteringAction * action = NULL;
23 static FilteringProp * filtering;
24 static ScoringProp * scoring = NULL;
26 static GSList ** prefs_scoring = NULL;
27 static GSList ** prefs_filtering = NULL;
29 static int matcher_parser_dialog = 0;
31 FilteringProp * matcher_parser_get_filtering(gchar * str)
35 matcher_parserlineno = 1;
36 matcher_parser_dialog = 1;
37 bufstate = matcher_parser_scan_string(str);
38 matcher_parserparse();
39 matcher_parser_dialog = 0;
40 matcher_parser_delete_buffer(bufstate);
44 ScoringProp * matcher_parser_get_scoring(gchar * str)
48 matcher_parserlineno = 1;
49 matcher_parser_dialog = 1;
50 bufstate = matcher_parser_scan_string(str);
51 matcher_parserparse();
52 matcher_parser_dialog = 0;
53 matcher_parser_delete_buffer(bufstate);
57 MatcherList * matcher_parser_get_cond(gchar * str)
61 matcher_parserlineno = 1;
62 matcher_parser_dialog = 1;
63 bufstate = matcher_parser_scan_string(str);
64 matcher_parserparse();
65 matcher_parser_dialog = 0;
66 matcher_parser_delete_buffer(bufstate);
70 MatcherProp * matcher_parser_get_prop(gchar * str)
75 matcher_parserlineno = 1;
76 list = matcher_parser_get_cond(str);
80 if (list->matchers == NULL)
83 if (list->matchers->next != NULL)
86 prop = list->matchers->data;
88 g_slist_free(list->matchers);
92 void matcher_parsererror(char * str)
97 for(l = matchers_list ; l != NULL ;
99 matcherprop_free((MatcherProp *)
101 g_slist_free(matchers_list);
102 matchers_list = NULL;
105 g_warning(_("scoring / filtering parsing: %i: %s\n"),
106 matcher_parserlineno, str);
110 int matcher_parserwrap(void)
121 %token MATCHER_ALL MATCHER_UNREAD MATCHER_NOT_UNREAD
122 %token MATCHER_NEW MATCHER_NOT_NEW MATCHER_MARKED
123 %token MATCHER_NOT_MARKED MATCHER_DELETED MATCHER_NOT_DELETED
124 %token MATCHER_REPLIED MATCHER_NOT_REPLIED MATCHER_FORWARDED
125 %token MATCHER_NOT_FORWARDED MATCHER_SUBJECT MATCHER_NOT_SUBJECT
126 %token MATCHER_FROM MATCHER_NOT_FROM MATCHER_TO MATCHER_NOT_TO
127 %token MATCHER_CC MATCHER_NOT_CC MATCHER_TO_OR_CC MATCHER_NOT_TO_AND_NOT_CC
128 %token MATCHER_AGE_GREATER MATCHER_AGE_LOWER MATCHER_NEWSGROUPS
129 %token MATCHER_NOT_NEWSGROUPS MATCHER_INREPLYTO MATCHER_NOT_INREPLYTO
130 %token MATCHER_REFERENCES MATCHER_NOT_REFERENCES MATCHER_SCORE_GREATER
131 %token MATCHER_SCORE_LOWER MATCHER_HEADER MATCHER_NOT_HEADER
132 %token MATCHER_HEADERS_PART MATCHER_NOT_HEADERS_PART MATCHER_MESSAGE
133 %token MATCHER_NOT_MESSAGE MATCHER_BODY_PART MATCHER_NOT_BODY_PART
134 %token MATCHER_EXECUTE MATCHER_NOT_EXECUTE MATCHER_MATCHCASE MATCHER_MATCH
135 %token MATCHER_REGEXPCASE MATCHER_REGEXP MATCHER_SCORE MATCHER_MOVE
136 %token MATCHER_COPY MATCHER_DELETE MATCHER_MARK MATCHER_UNMARK
137 %token MATCHER_MARK_AS_READ MATCHER_MARK_AS_UNREAD MATCHER_FORWARD
138 %token MATCHER_FORWARD_AS_ATTACHMENT MATCHER_EOL MATCHER_STRING
139 %token MATCHER_OR MATCHER_AND
143 %token <str> MATCHER_STRING
144 %token <str> MATCHER_SECTION
145 %token <value> MATCHER_INTEGER
151 if (!matcher_parser_dialog) {
152 prefs_scoring = &global_scoring;
153 prefs_filtering = &global_filtering;
169 section_notification:
170 MATCHER_SECTION MATCHER_EOL
173 FolderItem * item = NULL;
175 if (!matcher_parser_dialog) {
176 item = folder_find_item_from_identifier(folder);
178 prefs_scoring = &global_scoring;
179 prefs_filtering = &global_scoring;
182 prefs_scoring = &item->prefs->scoring;
183 prefs_filtering = &item->prefs->processing;
190 condition end_instr_opt
195 filtering_or_scoring MATCHER_EOL
198 if (!matcher_parser_dialog) {
199 yyerror("parse error");
205 filtering_or_scoring:
208 filtering = filteringprop_new(cond, action);
211 if (!matcher_parser_dialog) {
212 * prefs_filtering = g_slist_append(* prefs_filtering,
219 scoring = scoringprop_new(cond, score);
222 if (!matcher_parser_dialog) {
223 * prefs_scoring = g_slist_append(* prefs_scoring, scoring);
232 match_type = MATCHTYPE_MATCHCASE;
236 match_type = MATCHTYPE_MATCH;
240 match_type = MATCHTYPE_REGEXPCASE;
244 match_type = MATCHTYPE_REGEXP;
251 cond = matcherlist_new(matchers_list, (bool_op == MATCHERBOOL_AND));
252 matchers_list = NULL;
257 condition_list bool_op one_condition
259 matchers_list = g_slist_append(matchers_list, prop);
263 matchers_list = NULL;
264 matchers_list = g_slist_append(matchers_list, prop);
271 bool_op = MATCHERBOOL_AND;
275 bool_op = MATCHERBOOL_OR;
284 criteria = MATCHCRITERIA_ALL;
285 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
291 criteria = MATCHCRITERIA_UNREAD;
292 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
298 criteria = MATCHCRITERIA_NOT_UNREAD;
299 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
305 criteria = MATCHCRITERIA_NEW;
306 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
312 criteria = MATCHCRITERIA_NOT_NEW;
313 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
319 criteria = MATCHCRITERIA_MARKED;
320 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
326 criteria = MATCHCRITERIA_NOT_MARKED;
327 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
333 criteria = MATCHCRITERIA_DELETED;
334 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
336 | MATCHER_NOT_DELETED
340 criteria = MATCHCRITERIA_NOT_DELETED;
341 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
347 criteria = MATCHCRITERIA_REPLIED;
348 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
350 | MATCHER_NOT_REPLIED
354 criteria = MATCHCRITERIA_NOT_REPLIED;
355 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
361 criteria = MATCHCRITERIA_FORWARDED;
362 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
364 | MATCHER_NOT_FORWARDED
368 criteria = MATCHCRITERIA_NOT_FORWARDED;
369 prop = matcherprop_new(criteria, NULL, 0, NULL, 0);
371 | MATCHER_SUBJECT match_type MATCHER_STRING
376 criteria = MATCHCRITERIA_SUBJECT;
378 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
380 | MATCHER_NOT_SUBJECT match_type MATCHER_STRING
385 criteria = MATCHCRITERIA_NOT_SUBJECT;
387 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
389 | MATCHER_FROM match_type MATCHER_STRING
394 criteria = MATCHCRITERIA_FROM;
396 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
398 | MATCHER_NOT_FROM match_type MATCHER_STRING
403 criteria = MATCHCRITERIA_NOT_FROM;
405 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
407 | MATCHER_TO match_type MATCHER_STRING
412 criteria = MATCHCRITERIA_TO;
414 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
416 | MATCHER_NOT_TO match_type MATCHER_STRING
421 criteria = MATCHCRITERIA_NOT_TO;
423 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
425 | MATCHER_CC match_type MATCHER_STRING
430 criteria = MATCHCRITERIA_CC;
432 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
434 | MATCHER_NOT_CC match_type MATCHER_STRING
439 criteria = MATCHCRITERIA_NOT_CC;
441 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
443 | MATCHER_TO_OR_CC match_type MATCHER_STRING
448 criteria = MATCHCRITERIA_TO_OR_CC;
450 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
452 | MATCHER_NOT_TO_AND_NOT_CC match_type MATCHER_STRING
457 criteria = MATCHCRITERIA_NOT_TO_AND_NOT_CC;
459 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
461 | MATCHER_AGE_GREATER MATCHER_INTEGER
466 criteria = MATCHCRITERIA_AGE_GREATER;
468 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
470 | MATCHER_AGE_LOWER MATCHER_INTEGER
475 criteria = MATCHCRITERIA_AGE_LOWER;
477 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
479 | MATCHER_NEWSGROUPS match_type MATCHER_STRING
484 criteria = MATCHCRITERIA_NEWSGROUPS;
486 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
488 | MATCHER_NOT_NEWSGROUPS match_type MATCHER_STRING
493 criteria = MATCHCRITERIA_NOT_NEWSGROUPS;
495 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
497 | MATCHER_INREPLYTO match_type MATCHER_STRING
502 criteria = MATCHCRITERIA_INREPLYTO;
504 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
506 | MATCHER_NOT_INREPLYTO match_type MATCHER_STRING
511 criteria = MATCHCRITERIA_NOT_INREPLYTO;
513 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
515 | MATCHER_REFERENCES match_type MATCHER_STRING
520 criteria = MATCHCRITERIA_REFERENCES;
522 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
524 | MATCHER_NOT_REFERENCES match_type MATCHER_STRING
529 criteria = MATCHCRITERIA_NOT_REFERENCES;
531 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
533 | MATCHER_SCORE_GREATER MATCHER_INTEGER
538 criteria = MATCHCRITERIA_SCORE_GREATER;
540 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
542 | MATCHER_SCORE_LOWER MATCHER_INTEGER
547 criteria = MATCHCRITERIA_SCORE_LOWER;
549 prop = matcherprop_new(criteria, NULL, 0, NULL, value);
551 | MATCHER_HEADER MATCHER_STRING
553 header = g_strdup($2);
554 } match_type MATCHER_STRING
559 criteria = MATCHCRITERIA_HEADER;
561 prop = matcherprop_new(criteria, header, match_type, expr, 0);
564 | MATCHER_NOT_HEADER MATCHER_STRING
566 header = g_strdup($2);
567 } match_type MATCHER_STRING
572 criteria = MATCHCRITERIA_NOT_HEADER;
574 prop = matcherprop_new(criteria, header, match_type, expr, 0);
577 | MATCHER_HEADERS_PART match_type MATCHER_STRING
582 criteria = MATCHCRITERIA_HEADERS_PART;
584 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
586 | MATCHER_NOT_HEADERS_PART match_type MATCHER_STRING
591 criteria = MATCHCRITERIA_NOT_HEADERS_PART;
593 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
595 | MATCHER_MESSAGE match_type MATCHER_STRING
600 criteria = MATCHCRITERIA_MESSAGE;
602 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
604 | MATCHER_NOT_MESSAGE match_type MATCHER_STRING
609 criteria = MATCHCRITERIA_NOT_MESSAGE;
611 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
613 | MATCHER_BODY_PART match_type MATCHER_STRING
618 criteria = MATCHCRITERIA_BODY_PART;
620 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
622 | MATCHER_NOT_BODY_PART match_type MATCHER_STRING
627 criteria = MATCHCRITERIA_NOT_BODY_PART;
629 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
631 | MATCHER_NOT_MESSAGE match_type MATCHER_STRING
636 criteria = MATCHCRITERIA_NOT_MESSAGE;
638 prop = matcherprop_new(criteria, NULL, match_type, expr, 0);
640 | MATCHER_EXECUTE MATCHER_STRING
645 criteria = MATCHCRITERIA_EXECUTE;
647 prop = matcherprop_new(criteria, NULL, 0, expr, 0);
649 | MATCHER_NOT_EXECUTE MATCHER_STRING
654 criteria = MATCHCRITERIA_NOT_EXECUTE;
656 prop = matcherprop_new(criteria, NULL, 0, expr, 0);
661 MATCHER_EXECUTE MATCHER_STRING
664 gint action_type = 0;
666 action_type = MATCHACTION_EXECUTE;
668 action = filteringaction_new(action_type, 0, cmd);
670 | MATCHER_MOVE MATCHER_STRING
672 gchar * destination = NULL;
673 gint action_type = 0;
675 action_type = MATCHACTION_MOVE;
677 action = filteringaction_new(action_type, 0, destination);
679 | MATCHER_COPY MATCHER_STRING
681 gchar * destination = NULL;
682 gint action_type = 0;
684 action_type = MATCHACTION_COPY;
686 action = filteringaction_new(action_type, 0, destination);
690 gint action_type = 0;
692 action_type = MATCHACTION_DELETE;
693 action = filteringaction_new(action_type, 0, NULL);
697 gint action_type = 0;
699 action_type = MATCHACTION_MARK;
700 action = filteringaction_new(action_type, 0, NULL);
704 gint action_type = 0;
706 action_type = MATCHACTION_UNMARK;
707 action = filteringaction_new(action_type, 0, NULL);
709 | MATCHER_MARK_AS_READ
711 gint action_type = 0;
713 action_type = MATCHACTION_MARK_AS_READ;
714 action = filteringaction_new(action_type, 0, NULL);
716 | MATCHER_MARK_AS_UNREAD
718 gint action_type = 0;
720 action_type = MATCHACTION_MARK_AS_UNREAD;
721 action = filteringaction_new(action_type, 0, NULL);
723 | MATCHER_FORWARD MATCHER_INTEGER MATCHER_STRING
725 gchar * destination = NULL;
726 gint action_type = 0;
729 action_type = MATCHACTION_FORWARD;
732 action = filteringaction_new(action_type, account_id, destination);
734 | MATCHER_FORWARD_AS_ATTACHMENT MATCHER_INTEGER MATCHER_STRING
736 gchar * destination = NULL;
737 gint action_type = 0;
740 action_type = MATCHACTION_FORWARD_AS_ATTACHMENT;
743 action = filteringaction_new(action_type, account_id, destination);
748 MATCHER_SCORE MATCHER_INTEGER