189
return compile_pattern_or(list);
190
}
191
192
+static struct grep_expr *grep_true_expr(void)
193
+{
194
+ struct grep_expr *z = xcalloc(1, sizeof(*z));
195
+ z->node = GREP_NODE_TRUE;
196
+ return z;
197
+}
198
+
199
+static struct grep_expr *grep_or_expr(struct grep_expr *left, struct grep_expr *right)
200
+{
201
+ struct grep_expr *z = xcalloc(1, sizeof(*z));
202
+ z->node = GREP_NODE_OR;
203
+ z->u.binary.left = left;
204
+ z->u.binary.right = right;
205
+ return z;
206
+}
207
+
208
static struct grep_expr *prep_header_patterns(struct grep_opt *opt)
209
{
210
struct grep_pat *p;
211
struct grep_expr *header_expr;
212
+ struct grep_expr *(header_group[GREP_HEADER_FIELD_MAX]);
213
+ enum grep_header_field fld;
214
215
if (!opt->header_list)
216
return NULL;
217
p = opt->header_list;
200
- header_expr = compile_pattern_expr(&p);
201
- if (p)
202
- die("incomplete pattern expression: %s", p->pattern);
218
for (p = opt->header_list; p; p = p->next) {
219
if (p->token != GREP_PATTERN_HEAD)
220
die("bug: a non-header pattern in grep header list.");
222
die("bug: unknown header field %d", p->field);
223
compile_regexp(p, opt);
224
}
225
+
226
+ for (fld = 0; fld < GREP_HEADER_FIELD_MAX; fld++)
227
+ header_group[fld] = NULL;
228
+
229
+ for (p = opt->header_list; p; p = p->next) {
230
+ struct grep_expr *h;
231
+ struct grep_pat *pp = p;
232
+
233
+ h = compile_pattern_atom(&pp);
234
+ if (!h || pp != p->next)
235
+ die("bug: malformed header expr");
236
+ if (!header_group[p->field]) {
237
+ header_group[p->field] = h;
238
+ continue;
239
+ }
240
+ header_group[p->field] = grep_or_expr(h, header_group[p->field]);
241
+ }
242
+
243
+ header_expr = NULL;
244
+
245
+ for (fld = 0; fld < GREP_HEADER_FIELD_MAX; fld++) {
246
+ if (!header_group[fld])
247
+ continue;
248
+ if (!header_expr)
249
+ header_expr = grep_true_expr();
250
+ header_expr = grep_or_expr(header_group[fld], header_expr);
251
+ }
252
return header_expr;
253
}
254
284
if (!header_expr)
285
return;
286
245
- if (opt->pattern_expression) {
246
- struct grep_expr *z;
247
- z = xcalloc(1, sizeof(*z));
248
- z->node = GREP_NODE_OR;
249
- z->u.binary.left = opt->pattern_expression;
250
- z->u.binary.right = header_expr;
251
- opt->pattern_expression = z;
252
- } else {
287
+ if (!opt->pattern_expression)
288
opt->pattern_expression = header_expr;
254
- }
289
+ else
290
+ opt->pattern_expression = grep_or_expr(opt->pattern_expression,
291
+ header_expr);
292
opt->all_match = 1;
293
}
294
295
static void free_pattern_expr(struct grep_expr *x)
296
{
297
switch (x->node) {
298
+ case GREP_NODE_TRUE:
299
case GREP_NODE_ATOM:
300
break;
301
case GREP_NODE_NOT:
524
if (!x)
525
die("Not a valid grep expression");
526
switch (x->node) {
527
+ case GREP_NODE_TRUE:
528
+ h = 1;
529
+ break;
530
case GREP_NODE_ATOM:
531
h = match_one_pattern(x->u.atom, bol, eol, ctx, &match, 0);
532
break;