33#include "userdiff.h"
44#include "xdiff-interface.h"
55
6+ static int grep_source_load (struct grep_source * gs );
7+ static int grep_source_is_binary (struct grep_source * gs );
8+
9+
610static struct grep_pat * create_grep_pat (const char * pat , size_t patlen ,
711 const char * origin , int no ,
812 enum grep_pat_token t ,
@@ -332,6 +336,87 @@ static struct grep_expr *compile_pattern_expr(struct grep_pat **list)
332336 return compile_pattern_or (list );
333337}
334338
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+
335420static struct grep_expr * grep_true_expr (void )
336421{
337422 struct grep_expr * z = xcalloc (1 , sizeof (* z ));
@@ -395,7 +480,23 @@ static struct grep_expr *prep_header_patterns(struct grep_opt *opt)
395480 return header_expr ;
396481}
397482
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 )
399500{
400501 struct grep_pat * p ;
401502 struct grep_expr * header_expr = prep_header_patterns (opt );
@@ -415,7 +516,7 @@ void compile_grep_patterns(struct grep_opt *opt)
415516
416517 if (opt -> all_match || header_expr )
417518 opt -> extended = 1 ;
418- else if (!opt -> extended )
519+ else if (!opt -> extended && ! opt -> debug )
419520 return ;
420521
421522 p = opt -> pattern_list ;
@@ -429,12 +530,22 @@ void compile_grep_patterns(struct grep_opt *opt)
429530
430531 if (!opt -> pattern_expression )
431532 opt -> pattern_expression = header_expr ;
533+ else if (opt -> all_match )
534+ opt -> pattern_expression = grep_splice_or (header_expr ,
535+ opt -> pattern_expression );
432536 else
433537 opt -> pattern_expression = grep_or_expr (opt -> pattern_expression ,
434538 header_expr );
435539 opt -> all_match = 1 ;
436540}
437541
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+
438549static void free_pattern_expr (struct grep_expr * x )
439550{
440551 switch (x -> node ) {
@@ -1358,7 +1469,7 @@ static int grep_source_load_file(struct grep_source *gs)
13581469 return 0 ;
13591470}
13601471
1361- int grep_source_load (struct grep_source * gs )
1472+ static int grep_source_load (struct grep_source * gs )
13621473{
13631474 if (gs -> buf )
13641475 return 0 ;
@@ -1386,7 +1497,7 @@ void grep_source_load_driver(struct grep_source *gs)
13861497 grep_attr_unlock ();
13871498}
13881499
1389- int grep_source_is_binary (struct grep_source * gs )
1500+ static int grep_source_is_binary (struct grep_source * gs )
13901501{
13911502 grep_source_load_driver (gs );
13921503 if (gs -> driver -> binary != -1 )
0 commit comments