| 136 | } |
| 137 | |
| 138 | static void do_append_grep_pat(struct grep_pat ***tail, struct grep_pat *p) |
| 139 | { |
| 140 | **tail = p; |
| 141 | *tail = &p->next; |
| 142 | p->next = NULL; |
| 143 | |
| 144 | switch (p->token) { |
| 145 | case GREP_PATTERN: /* atom */ |
| 146 | case GREP_PATTERN_HEAD: |
| 147 | case GREP_PATTERN_BODY: |
| 148 | for (;;) { |
| 149 | struct grep_pat *new_pat; |
| 150 | size_t len = 0; |
| 151 | char *cp = p->pattern + p->patternlen, *nl = NULL; |
| 152 | while (++len <= p->patternlen) { |
| 153 | if (*(--cp) == '\n') { |
| 154 | nl = cp; |
| 155 | break; |
| 156 | } |
| 157 | } |
| 158 | if (!nl) |
| 159 | break; |
| 160 | new_pat = create_grep_pat(nl + 1, len - 1, p->origin, |
| 161 | p->no, p->token, p->field); |
| 162 | new_pat->next = p->next; |
| 163 | if (!p->next) |
| 164 | *tail = &new_pat->next; |
| 165 | p->next = new_pat; |
| 166 | *nl = '\0'; |
| 167 | p->patternlen -= len; |
| 168 | } |
| 169 | break; |
| 170 | default: |
| 171 | break; |
| 172 | } |
| 173 | } |
| 174 | |
| 175 | void append_header_grep_pattern(struct grep_opt *opt, |
| 176 | enum grep_header_field field, const char *pat) |
no test coverage detected