33#include "userdiff.h"
44#include "xdiff-interface.h"
55
6- void append_header_grep_pattern (struct grep_opt * opt , enum grep_header_field field , const char * pat )
6+ static struct grep_pat * create_grep_pat (const char * pat , size_t patlen ,
7+ const char * origin , int no ,
8+ enum grep_pat_token t ,
9+ enum grep_header_field field )
710{
811 struct grep_pat * p = xcalloc (1 , sizeof (* p ));
9- p -> pattern = pat ;
10- p -> patternlen = strlen ( pat ) ;
11- p -> origin = "header" ;
12- p -> no = 0 ;
13- p -> token = GREP_PATTERN_HEAD ;
12+ p -> pattern = xmemdupz ( pat , patlen ) ;
13+ p -> patternlen = patlen ;
14+ p -> origin = origin ;
15+ p -> no = no ;
16+ p -> token = t ;
1417 p -> field = field ;
15- * opt -> header_tail = p ;
16- opt -> header_tail = & p -> next ;
18+ return p ;
19+ }
20+
21+ static void do_append_grep_pat (struct grep_pat * * * tail , struct grep_pat * p )
22+ {
23+ * * tail = p ;
24+ * tail = & p -> next ;
1725 p -> next = NULL ;
26+
27+ switch (p -> token ) {
28+ case GREP_PATTERN : /* atom */
29+ case GREP_PATTERN_HEAD :
30+ case GREP_PATTERN_BODY :
31+ for (;;) {
32+ struct grep_pat * new_pat ;
33+ size_t len = 0 ;
34+ char * cp = p -> pattern + p -> patternlen , * nl = NULL ;
35+ while (++ len <= p -> patternlen ) {
36+ if (* (-- cp ) == '\n' ) {
37+ nl = cp ;
38+ break ;
39+ }
40+ }
41+ if (!nl )
42+ break ;
43+ new_pat = create_grep_pat (nl + 1 , len - 1 , p -> origin ,
44+ p -> no , p -> token , p -> field );
45+ new_pat -> next = p -> next ;
46+ if (!p -> next )
47+ * tail = & new_pat -> next ;
48+ p -> next = new_pat ;
49+ * nl = '\0' ;
50+ p -> patternlen -= len ;
51+ }
52+ break ;
53+ default :
54+ break ;
55+ }
56+ }
57+
58+ void append_header_grep_pattern (struct grep_opt * opt ,
59+ enum grep_header_field field , const char * pat )
60+ {
61+ struct grep_pat * p = create_grep_pat (pat , strlen (pat ), "header" , 0 ,
62+ GREP_PATTERN_HEAD , field );
63+ do_append_grep_pat (& opt -> header_tail , p );
1864}
1965
2066void append_grep_pattern (struct grep_opt * opt , const char * pat ,
@@ -26,15 +72,8 @@ void append_grep_pattern(struct grep_opt *opt, const char *pat,
2672void append_grep_pat (struct grep_opt * opt , const char * pat , size_t patlen ,
2773 const char * origin , int no , enum grep_pat_token t )
2874{
29- struct grep_pat * p = xcalloc (1 , sizeof (* p ));
30- p -> pattern = pat ;
31- p -> patternlen = patlen ;
32- p -> origin = origin ;
33- p -> no = no ;
34- p -> token = t ;
35- * opt -> pattern_tail = p ;
36- opt -> pattern_tail = & p -> next ;
37- p -> next = NULL ;
75+ struct grep_pat * p = create_grep_pat (pat , patlen , origin , no , t , 0 );
76+ do_append_grep_pat (& opt -> pattern_tail , p );
3877}
3978
4079struct grep_opt * grep_opt_dup (const struct grep_opt * opt )
@@ -430,6 +469,7 @@ void free_grep_patterns(struct grep_opt *opt)
430469 free_pcre_regexp (p );
431470 else
432471 regfree (& p -> regexp );
472+ free (p -> pattern );
433473 break ;
434474 default :
435475 break ;
0 commit comments