| 703 | } |
| 704 | |
| 705 | static struct grep_expr *prep_header_patterns(struct grep_opt *opt) |
| 706 | { |
| 707 | struct grep_pat *p; |
| 708 | struct grep_expr *header_expr; |
| 709 | struct grep_expr *(header_group[GREP_HEADER_FIELD_MAX]); |
| 710 | enum grep_header_field fld; |
| 711 | |
| 712 | if (!opt->header_list) |
| 713 | return NULL; |
| 714 | |
| 715 | for (p = opt->header_list; p; p = p->next) { |
| 716 | if (p->token != GREP_PATTERN_HEAD) |
| 717 | BUG("a non-header pattern in grep header list."); |
| 718 | if (p->field < GREP_HEADER_FIELD_MIN || |
| 719 | GREP_HEADER_FIELD_MAX <= p->field) |
| 720 | BUG("unknown header field %d", p->field); |
| 721 | compile_regexp(p, opt); |
| 722 | } |
| 723 | |
| 724 | for (fld = 0; fld < GREP_HEADER_FIELD_MAX; fld++) |
| 725 | header_group[fld] = NULL; |
| 726 | |
| 727 | for (p = opt->header_list; p; p = p->next) { |
| 728 | struct grep_expr *h; |
| 729 | struct grep_pat *pp = p; |
| 730 | |
| 731 | h = compile_pattern_atom(&pp); |
| 732 | if (!h || pp != p->next) |
| 733 | BUG("malformed header expr"); |
| 734 | if (!header_group[p->field]) { |
| 735 | header_group[p->field] = h; |
| 736 | continue; |
| 737 | } |
| 738 | header_group[p->field] = grep_or_expr(h, header_group[p->field]); |
| 739 | } |
| 740 | |
| 741 | header_expr = NULL; |
| 742 | |
| 743 | for (fld = 0; fld < GREP_HEADER_FIELD_MAX; fld++) { |
| 744 | if (!header_group[fld]) |
| 745 | continue; |
| 746 | if (!header_expr) |
| 747 | header_expr = grep_true_expr(); |
| 748 | header_expr = grep_or_expr(header_group[fld], header_expr); |
| 749 | } |
| 750 | return header_expr; |
| 751 | } |
| 752 | |
| 753 | static struct grep_expr *grep_splice_or(struct grep_expr *x, struct grep_expr *y) |
| 754 | { |
no test coverage detected