332
return compile_pattern_or(list);
333
}
334
335
+static void indent(int in)
336
+{
337
+ while (in-- > 0)
338
+ fputc(' ', stderr);
339
+}
340
+
341
+static void dump_grep_pat(struct grep_pat *p)
342
+{
343
+ switch (p->token) {
344
+ case GREP_AND: fprintf(stderr, "*and*"); break;
345
+ case GREP_OPEN_PAREN: fprintf(stderr, "*(*"); break;
346
+ case GREP_CLOSE_PAREN: fprintf(stderr, "*)*"); break;
347
+ case GREP_NOT: fprintf(stderr, "*not*"); break;
348
+ case GREP_OR: fprintf(stderr, "*or*"); break;
349
+
350
+ case GREP_PATTERN: fprintf(stderr, "pattern"); break;
351
+ case GREP_PATTERN_HEAD: fprintf(stderr, "pattern_head"); break;
352
+ case GREP_PATTERN_BODY: fprintf(stderr, "pattern_body"); break;
353
+ }
354
+
355
+ switch (p->token) {
356
+ default: break;
357
+ case GREP_PATTERN_HEAD:
358
+ fprintf(stderr, "<head %d>", p->field); break;
359
+ case GREP_PATTERN_BODY:
360
+ fprintf(stderr, "<body>"); break;
361
+ }
362
+ switch (p->token) {
363
+ default: break;
364
+ case GREP_PATTERN_HEAD:
365
+ case GREP_PATTERN_BODY:
366
+ case GREP_PATTERN:
367
+ fprintf(stderr, "%.*s", (int)p->patternlen, p->pattern);
368
+ break;
369
+ }
370
+ fputc('\n', stderr);
371
+}
372
+
373
+static void dump_grep_expression_1(struct grep_expr *x, int in)
374
+{
375
+ indent(in);
376
+ switch (x->node) {
377
+ case GREP_NODE_TRUE:
378
+ fprintf(stderr, "true\n");
379
+ break;
380
+ case GREP_NODE_ATOM:
381
+ dump_grep_pat(x->u.atom);
382
+ break;
383
+ case GREP_NODE_NOT:
384
+ fprintf(stderr, "(not\n");
385
+ dump_grep_expression_1(x->u.unary, in+1);
386
+ indent(in);
387
+ fprintf(stderr, ")\n");
388
+ break;
389
+ case GREP_NODE_AND:
390
+ fprintf(stderr, "(and\n");
391
+ dump_grep_expression_1(x->u.binary.left, in+1);
392
+ dump_grep_expression_1(x->u.binary.right, in+1);
393
+ indent(in);
394
+ fprintf(stderr, ")\n");
395
+ break;
396
+ case GREP_NODE_OR:
397
+ fprintf(stderr, "(or\n");
398
+ dump_grep_expression_1(x->u.binary.left, in+1);
399
+ dump_grep_expression_1(x->u.binary.right, in+1);
400
+ indent(in);
401
+ fprintf(stderr, ")\n");
402
+ break;
403
+ }
404
+}
405
+
406
+void dump_grep_expression(struct grep_opt *opt)
407
+{
408
+ struct grep_expr *x = opt->pattern_expression;
409
+
410
+ if (opt->all_match)
411
+ fprintf(stderr, "[all-match]\n");
412
+ dump_grep_expression_1(x, 0);
413
+ fflush(NULL);
414
+}
415
+
416
static struct grep_expr *grep_true_expr(void)
417
{
418
struct grep_expr *z = xcalloc(1, sizeof(*z));
476
return header_expr;
477
}
478
398
-void compile_grep_patterns(struct grep_opt *opt)
479
+static void compile_grep_patterns_real(struct grep_opt *opt)
480
{
481
struct grep_pat *p;
482
struct grep_expr *header_expr = prep_header_patterns(opt);
496
497
if (opt->all_match || header_expr)
498
opt->extended = 1;
418
- else if (!opt->extended)
499
+ else if (!opt->extended && !opt->debug)
500
return;
501
502
p = opt->pattern_list;
516
opt->all_match = 1;
517
}
518
519
+void compile_grep_patterns(struct grep_opt *opt)
520
+{
521
+ compile_grep_patterns_real(opt);
522
+ if (opt->debug)
523
+ dump_grep_expression(opt);
524
+}
525
+
526
static void free_pattern_expr(struct grep_expr *x)
527
{
528
switch (x->node) {