| 768 | } |
| 769 | |
| 770 | void compile_grep_patterns(struct grep_opt *opt) |
| 771 | { |
| 772 | struct grep_pat *p; |
| 773 | struct grep_expr *header_expr = prep_header_patterns(opt); |
| 774 | int extended = 0; |
| 775 | |
| 776 | for (p = opt->pattern_list; p; p = p->next) { |
| 777 | switch (p->token) { |
| 778 | case GREP_PATTERN: /* atom */ |
| 779 | case GREP_PATTERN_HEAD: |
| 780 | case GREP_PATTERN_BODY: |
| 781 | compile_regexp(p, opt); |
| 782 | break; |
| 783 | default: |
| 784 | extended = 1; |
| 785 | break; |
| 786 | } |
| 787 | } |
| 788 | |
| 789 | if (opt->all_match || opt->no_body_match || header_expr) |
| 790 | extended = 1; |
| 791 | else if (!extended) |
| 792 | return; |
| 793 | |
| 794 | p = opt->pattern_list; |
| 795 | if (p) |
| 796 | opt->pattern_expression = compile_pattern_expr(&p); |
| 797 | if (p) |
| 798 | die("incomplete pattern expression group: %s", p->pattern); |
| 799 | |
| 800 | if (opt->no_body_match && opt->pattern_expression) |
| 801 | opt->pattern_expression = grep_not_expr(opt->pattern_expression); |
| 802 | |
| 803 | if (!header_expr) |
| 804 | return; |
| 805 | |
| 806 | if (!opt->pattern_expression) |
| 807 | opt->pattern_expression = header_expr; |
| 808 | else if (opt->all_match) |
| 809 | opt->pattern_expression = grep_splice_or(header_expr, |
| 810 | opt->pattern_expression); |
| 811 | else |
| 812 | opt->pattern_expression = grep_or_expr(opt->pattern_expression, |
| 813 | header_expr); |
| 814 | opt->all_match = 1; |
| 815 | } |
| 816 | |
| 817 | static void free_pattern_expr(struct grep_expr *x) |
| 818 | { |
no test coverage detected