3
3
#include "userdiff.h"
4
4
#include "xdiff-interface.h"
5
5
6
+ static int grep_source_load (struct grep_source * gs );
7
+ static int grep_source_is_binary (struct grep_source * gs );
8
+
9
+
6
10
static struct grep_pat * create_grep_pat (const char * pat , size_t patlen ,
7
11
const char * origin , int no ,
8
12
enum grep_pat_token t ,
@@ -332,6 +336,87 @@ static struct grep_expr *compile_pattern_expr(struct grep_pat **list)
332
336
return compile_pattern_or (list );
333
337
}
334
338
339
+ static void indent (int in )
340
+ {
341
+ while (in -- > 0 )
342
+ fputc (' ' , stderr );
343
+ }
344
+
345
+ static void dump_grep_pat (struct grep_pat * p )
346
+ {
347
+ switch (p -> token ) {
348
+ case GREP_AND : fprintf (stderr , "*and*" ); break ;
349
+ case GREP_OPEN_PAREN : fprintf (stderr , "*(*" ); break ;
350
+ case GREP_CLOSE_PAREN : fprintf (stderr , "*)*" ); break ;
351
+ case GREP_NOT : fprintf (stderr , "*not*" ); break ;
352
+ case GREP_OR : fprintf (stderr , "*or*" ); break ;
353
+
354
+ case GREP_PATTERN : fprintf (stderr , "pattern" ); break ;
355
+ case GREP_PATTERN_HEAD : fprintf (stderr , "pattern_head" ); break ;
356
+ case GREP_PATTERN_BODY : fprintf (stderr , "pattern_body" ); break ;
357
+ }
358
+
359
+ switch (p -> token ) {
360
+ default : break ;
361
+ case GREP_PATTERN_HEAD :
362
+ fprintf (stderr , "<head %d>" , p -> field ); break ;
363
+ case GREP_PATTERN_BODY :
364
+ fprintf (stderr , "<body>" ); break ;
365
+ }
366
+ switch (p -> token ) {
367
+ default : break ;
368
+ case GREP_PATTERN_HEAD :
369
+ case GREP_PATTERN_BODY :
370
+ case GREP_PATTERN :
371
+ fprintf (stderr , "%.*s" , (int )p -> patternlen , p -> pattern );
372
+ break ;
373
+ }
374
+ fputc ('\n' , stderr );
375
+ }
376
+
377
+ static void dump_grep_expression_1 (struct grep_expr * x , int in )
378
+ {
379
+ indent (in );
380
+ switch (x -> node ) {
381
+ case GREP_NODE_TRUE :
382
+ fprintf (stderr , "true\n" );
383
+ break ;
384
+ case GREP_NODE_ATOM :
385
+ dump_grep_pat (x -> u .atom );
386
+ break ;
387
+ case GREP_NODE_NOT :
388
+ fprintf (stderr , "(not\n" );
389
+ dump_grep_expression_1 (x -> u .unary , in + 1 );
390
+ indent (in );
391
+ fprintf (stderr , ")\n" );
392
+ break ;
393
+ case GREP_NODE_AND :
394
+ fprintf (stderr , "(and\n" );
395
+ dump_grep_expression_1 (x -> u .binary .left , in + 1 );
396
+ dump_grep_expression_1 (x -> u .binary .right , in + 1 );
397
+ indent (in );
398
+ fprintf (stderr , ")\n" );
399
+ break ;
400
+ case GREP_NODE_OR :
401
+ fprintf (stderr , "(or\n" );
402
+ dump_grep_expression_1 (x -> u .binary .left , in + 1 );
403
+ dump_grep_expression_1 (x -> u .binary .right , in + 1 );
404
+ indent (in );
405
+ fprintf (stderr , ")\n" );
406
+ break ;
407
+ }
408
+ }
409
+
410
+ static void dump_grep_expression (struct grep_opt * opt )
411
+ {
412
+ struct grep_expr * x = opt -> pattern_expression ;
413
+
414
+ if (opt -> all_match )
415
+ fprintf (stderr , "[all-match]\n" );
416
+ dump_grep_expression_1 (x , 0 );
417
+ fflush (NULL );
418
+ }
419
+
335
420
static struct grep_expr * grep_true_expr (void )
336
421
{
337
422
struct grep_expr * z = xcalloc (1 , sizeof (* z ));
@@ -395,7 +480,23 @@ static struct grep_expr *prep_header_patterns(struct grep_opt *opt)
395
480
return header_expr ;
396
481
}
397
482
398
- void compile_grep_patterns (struct grep_opt * opt )
483
+ static struct grep_expr * grep_splice_or (struct grep_expr * x , struct grep_expr * y )
484
+ {
485
+ struct grep_expr * z = x ;
486
+
487
+ while (x ) {
488
+ assert (x -> node == GREP_NODE_OR );
489
+ if (x -> u .binary .right &&
490
+ x -> u .binary .right -> node == GREP_NODE_TRUE ) {
491
+ x -> u .binary .right = y ;
492
+ break ;
493
+ }
494
+ x = x -> u .binary .right ;
495
+ }
496
+ return z ;
497
+ }
498
+
499
+ static void compile_grep_patterns_real (struct grep_opt * opt )
399
500
{
400
501
struct grep_pat * p ;
401
502
struct grep_expr * header_expr = prep_header_patterns (opt );
@@ -415,7 +516,7 @@ void compile_grep_patterns(struct grep_opt *opt)
415
516
416
517
if (opt -> all_match || header_expr )
417
518
opt -> extended = 1 ;
418
- else if (!opt -> extended )
519
+ else if (!opt -> extended && ! opt -> debug )
419
520
return ;
420
521
421
522
p = opt -> pattern_list ;
@@ -429,12 +530,22 @@ void compile_grep_patterns(struct grep_opt *opt)
429
530
430
531
if (!opt -> pattern_expression )
431
532
opt -> pattern_expression = header_expr ;
533
+ else if (opt -> all_match )
534
+ opt -> pattern_expression = grep_splice_or (header_expr ,
535
+ opt -> pattern_expression );
432
536
else
433
537
opt -> pattern_expression = grep_or_expr (opt -> pattern_expression ,
434
538
header_expr );
435
539
opt -> all_match = 1 ;
436
540
}
437
541
542
+ void compile_grep_patterns (struct grep_opt * opt )
543
+ {
544
+ compile_grep_patterns_real (opt );
545
+ if (opt -> debug )
546
+ dump_grep_expression (opt );
547
+ }
548
+
438
549
static void free_pattern_expr (struct grep_expr * x )
439
550
{
440
551
switch (x -> node ) {
@@ -1358,7 +1469,7 @@ static int grep_source_load_file(struct grep_source *gs)
1358
1469
return 0 ;
1359
1470
}
1360
1471
1361
- int grep_source_load (struct grep_source * gs )
1472
+ static int grep_source_load (struct grep_source * gs )
1362
1473
{
1363
1474
if (gs -> buf )
1364
1475
return 0 ;
@@ -1386,7 +1497,7 @@ void grep_source_load_driver(struct grep_source *gs)
1386
1497
grep_attr_unlock ();
1387
1498
}
1388
1499
1389
- int grep_source_is_binary (struct grep_source * gs )
1500
+ static int grep_source_is_binary (struct grep_source * gs )
1390
1501
{
1391
1502
grep_source_load_driver (gs );
1392
1503
if (gs -> driver -> binary != -1 )
0 commit comments