grep/pcre2: better support invalid UTF-8 haystacks
[git] / grep.c
1 #include "cache.h"
2 #include "config.h"
3 #include "grep.h"
4 #include "object-store.h"
5 #include "userdiff.h"
6 #include "xdiff-interface.h"
7 #include "diff.h"
8 #include "diffcore.h"
9 #include "commit.h"
10 #include "quote.h"
11 #include "help.h"
12
13 static int grep_source_load(struct grep_source *gs);
14 static int grep_source_is_binary(struct grep_source *gs,
15                                  struct index_state *istate);
16
17 static void std_output(struct grep_opt *opt, const void *buf, size_t size)
18 {
19         fwrite(buf, size, 1, stdout);
20 }
21
22 static struct grep_opt grep_defaults = {
23         .relative = 1,
24         .pathname = 1,
25         .max_depth = -1,
26         .pattern_type_option = GREP_PATTERN_TYPE_UNSPECIFIED,
27         .colors = {
28                 [GREP_COLOR_CONTEXT] = "",
29                 [GREP_COLOR_FILENAME] = "",
30                 [GREP_COLOR_FUNCTION] = "",
31                 [GREP_COLOR_LINENO] = "",
32                 [GREP_COLOR_COLUMNNO] = "",
33                 [GREP_COLOR_MATCH_CONTEXT] = GIT_COLOR_BOLD_RED,
34                 [GREP_COLOR_MATCH_SELECTED] = GIT_COLOR_BOLD_RED,
35                 [GREP_COLOR_SELECTED] = "",
36                 [GREP_COLOR_SEP] = GIT_COLOR_CYAN,
37         },
38         .only_matching = 0,
39         .color = -1,
40         .output = std_output,
41 };
42
43 #ifdef USE_LIBPCRE2
44 static pcre2_general_context *pcre2_global_context;
45
46 static void *pcre2_malloc(PCRE2_SIZE size, MAYBE_UNUSED void *memory_data)
47 {
48         return malloc(size);
49 }
50
51 static void pcre2_free(void *pointer, MAYBE_UNUSED void *memory_data)
52 {
53         free(pointer);
54 }
55 #endif
56
57 static const char *color_grep_slots[] = {
58         [GREP_COLOR_CONTEXT]        = "context",
59         [GREP_COLOR_FILENAME]       = "filename",
60         [GREP_COLOR_FUNCTION]       = "function",
61         [GREP_COLOR_LINENO]         = "lineNumber",
62         [GREP_COLOR_COLUMNNO]       = "column",
63         [GREP_COLOR_MATCH_CONTEXT]  = "matchContext",
64         [GREP_COLOR_MATCH_SELECTED] = "matchSelected",
65         [GREP_COLOR_SELECTED]       = "selected",
66         [GREP_COLOR_SEP]            = "separator",
67 };
68
69 static int parse_pattern_type_arg(const char *opt, const char *arg)
70 {
71         if (!strcmp(arg, "default"))
72                 return GREP_PATTERN_TYPE_UNSPECIFIED;
73         else if (!strcmp(arg, "basic"))
74                 return GREP_PATTERN_TYPE_BRE;
75         else if (!strcmp(arg, "extended"))
76                 return GREP_PATTERN_TYPE_ERE;
77         else if (!strcmp(arg, "fixed"))
78                 return GREP_PATTERN_TYPE_FIXED;
79         else if (!strcmp(arg, "perl"))
80                 return GREP_PATTERN_TYPE_PCRE;
81         die("bad %s argument: %s", opt, arg);
82 }
83
84 define_list_config_array_extra(color_grep_slots, {"match"});
85
86 /*
87  * Read the configuration file once and store it in
88  * the grep_defaults template.
89  */
90 int grep_config(const char *var, const char *value, void *cb)
91 {
92         struct grep_opt *opt = &grep_defaults;
93         const char *slot;
94
95         if (userdiff_config(var, value) < 0)
96                 return -1;
97
98         /*
99          * The instance of grep_opt that we set up here is copied by
100          * grep_init() to be used by each individual invocation.
101          * When populating a new field of this structure here, be
102          * sure to think about ownership -- e.g., you might need to
103          * override the shallow copy in grep_init() with a deep copy.
104          */
105
106         if (!strcmp(var, "grep.extendedregexp")) {
107                 opt->extended_regexp_option = git_config_bool(var, value);
108                 return 0;
109         }
110
111         if (!strcmp(var, "grep.patterntype")) {
112                 opt->pattern_type_option = parse_pattern_type_arg(var, value);
113                 return 0;
114         }
115
116         if (!strcmp(var, "grep.linenumber")) {
117                 opt->linenum = git_config_bool(var, value);
118                 return 0;
119         }
120         if (!strcmp(var, "grep.column")) {
121                 opt->columnnum = git_config_bool(var, value);
122                 return 0;
123         }
124
125         if (!strcmp(var, "grep.fullname")) {
126                 opt->relative = !git_config_bool(var, value);
127                 return 0;
128         }
129
130         if (!strcmp(var, "color.grep"))
131                 opt->color = git_config_colorbool(var, value);
132         if (!strcmp(var, "color.grep.match")) {
133                 if (grep_config("color.grep.matchcontext", value, cb) < 0)
134                         return -1;
135                 if (grep_config("color.grep.matchselected", value, cb) < 0)
136                         return -1;
137         } else if (skip_prefix(var, "color.grep.", &slot)) {
138                 int i = LOOKUP_CONFIG(color_grep_slots, slot);
139                 char *color;
140
141                 if (i < 0)
142                         return -1;
143                 color = opt->colors[i];
144                 if (!value)
145                         return config_error_nonbool(var);
146                 return color_parse(value, color);
147         }
148         return 0;
149 }
150
151 /*
152  * Initialize one instance of grep_opt and copy the
153  * default values from the template we read the configuration
154  * information in an earlier call to git_config(grep_config).
155  *
156  * If using PCRE, make sure that the library is configured
157  * to use the same allocator as Git (e.g. nedmalloc on Windows).
158  *
159  * Any allocated memory needs to be released in grep_destroy().
160  */
161 void grep_init(struct grep_opt *opt, struct repository *repo, const char *prefix)
162 {
163 #if defined(USE_LIBPCRE2)
164         if (!pcre2_global_context)
165                 pcre2_global_context = pcre2_general_context_create(
166                                         pcre2_malloc, pcre2_free, NULL);
167 #endif
168
169 #ifdef USE_LIBPCRE1
170         pcre_malloc = malloc;
171         pcre_free = free;
172 #endif
173
174         *opt = grep_defaults;
175
176         opt->repo = repo;
177         opt->prefix = prefix;
178         opt->prefix_length = (prefix && *prefix) ? strlen(prefix) : 0;
179         opt->pattern_tail = &opt->pattern_list;
180         opt->header_tail = &opt->header_list;
181 }
182
183 void grep_destroy(void)
184 {
185 #ifdef USE_LIBPCRE2
186         pcre2_general_context_free(pcre2_global_context);
187 #endif
188 }
189
190 static void grep_set_pattern_type_option(enum grep_pattern_type pattern_type, struct grep_opt *opt)
191 {
192         /*
193          * When committing to the pattern type by setting the relevant
194          * fields in grep_opt it's generally not necessary to zero out
195          * the fields we're not choosing, since they won't have been
196          * set by anything. The extended_regexp_option field is the
197          * only exception to this.
198          *
199          * This is because in the process of parsing grep.patternType
200          * & grep.extendedRegexp we set opt->pattern_type_option and
201          * opt->extended_regexp_option, respectively. We then
202          * internally use opt->extended_regexp_option to see if we're
203          * compiling an ERE. It must be unset if that's not actually
204          * the case.
205          */
206         if (pattern_type != GREP_PATTERN_TYPE_ERE &&
207             opt->extended_regexp_option)
208                 opt->extended_regexp_option = 0;
209
210         switch (pattern_type) {
211         case GREP_PATTERN_TYPE_UNSPECIFIED:
212                 /* fall through */
213
214         case GREP_PATTERN_TYPE_BRE:
215                 break;
216
217         case GREP_PATTERN_TYPE_ERE:
218                 opt->extended_regexp_option = 1;
219                 break;
220
221         case GREP_PATTERN_TYPE_FIXED:
222                 opt->fixed = 1;
223                 break;
224
225         case GREP_PATTERN_TYPE_PCRE:
226 #ifdef USE_LIBPCRE2
227                 opt->pcre2 = 1;
228 #else
229                 /*
230                  * It's important that pcre1 always be assigned to
231                  * even when there's no USE_LIBPCRE* defined. We still
232                  * call the PCRE stub function, it just dies with
233                  * "cannot use Perl-compatible regexes[...]".
234                  */
235                 opt->pcre1 = 1;
236 #endif
237                 break;
238         }
239 }
240
241 void grep_commit_pattern_type(enum grep_pattern_type pattern_type, struct grep_opt *opt)
242 {
243         if (pattern_type != GREP_PATTERN_TYPE_UNSPECIFIED)
244                 grep_set_pattern_type_option(pattern_type, opt);
245         else if (opt->pattern_type_option != GREP_PATTERN_TYPE_UNSPECIFIED)
246                 grep_set_pattern_type_option(opt->pattern_type_option, opt);
247         else if (opt->extended_regexp_option)
248                 /*
249                  * This branch *must* happen after setting from the
250                  * opt->pattern_type_option above, we don't want
251                  * grep.extendedRegexp to override grep.patternType!
252                  */
253                 grep_set_pattern_type_option(GREP_PATTERN_TYPE_ERE, opt);
254 }
255
256 static struct grep_pat *create_grep_pat(const char *pat, size_t patlen,
257                                         const char *origin, int no,
258                                         enum grep_pat_token t,
259                                         enum grep_header_field field)
260 {
261         struct grep_pat *p = xcalloc(1, sizeof(*p));
262         p->pattern = xmemdupz(pat, patlen);
263         p->patternlen = patlen;
264         p->origin = origin;
265         p->no = no;
266         p->token = t;
267         p->field = field;
268         return p;
269 }
270
271 static void do_append_grep_pat(struct grep_pat ***tail, struct grep_pat *p)
272 {
273         **tail = p;
274         *tail = &p->next;
275         p->next = NULL;
276
277         switch (p->token) {
278         case GREP_PATTERN: /* atom */
279         case GREP_PATTERN_HEAD:
280         case GREP_PATTERN_BODY:
281                 for (;;) {
282                         struct grep_pat *new_pat;
283                         size_t len = 0;
284                         char *cp = p->pattern + p->patternlen, *nl = NULL;
285                         while (++len <= p->patternlen) {
286                                 if (*(--cp) == '\n') {
287                                         nl = cp;
288                                         break;
289                                 }
290                         }
291                         if (!nl)
292                                 break;
293                         new_pat = create_grep_pat(nl + 1, len - 1, p->origin,
294                                                   p->no, p->token, p->field);
295                         new_pat->next = p->next;
296                         if (!p->next)
297                                 *tail = &new_pat->next;
298                         p->next = new_pat;
299                         *nl = '\0';
300                         p->patternlen -= len;
301                 }
302                 break;
303         default:
304                 break;
305         }
306 }
307
308 void append_header_grep_pattern(struct grep_opt *opt,
309                                 enum grep_header_field field, const char *pat)
310 {
311         struct grep_pat *p = create_grep_pat(pat, strlen(pat), "header", 0,
312                                              GREP_PATTERN_HEAD, field);
313         if (field == GREP_HEADER_REFLOG)
314                 opt->use_reflog_filter = 1;
315         do_append_grep_pat(&opt->header_tail, p);
316 }
317
318 void append_grep_pattern(struct grep_opt *opt, const char *pat,
319                          const char *origin, int no, enum grep_pat_token t)
320 {
321         append_grep_pat(opt, pat, strlen(pat), origin, no, t);
322 }
323
324 void append_grep_pat(struct grep_opt *opt, const char *pat, size_t patlen,
325                      const char *origin, int no, enum grep_pat_token t)
326 {
327         struct grep_pat *p = create_grep_pat(pat, patlen, origin, no, t, 0);
328         do_append_grep_pat(&opt->pattern_tail, p);
329 }
330
331 struct grep_opt *grep_opt_dup(const struct grep_opt *opt)
332 {
333         struct grep_pat *pat;
334         struct grep_opt *ret = xmalloc(sizeof(struct grep_opt));
335         *ret = *opt;
336
337         ret->pattern_list = NULL;
338         ret->pattern_tail = &ret->pattern_list;
339
340         for(pat = opt->pattern_list; pat != NULL; pat = pat->next)
341         {
342                 if(pat->token == GREP_PATTERN_HEAD)
343                         append_header_grep_pattern(ret, pat->field,
344                                                    pat->pattern);
345                 else
346                         append_grep_pat(ret, pat->pattern, pat->patternlen,
347                                         pat->origin, pat->no, pat->token);
348         }
349
350         return ret;
351 }
352
353 static NORETURN void compile_regexp_failed(const struct grep_pat *p,
354                 const char *error)
355 {
356         char where[1024];
357
358         if (p->no)
359                 xsnprintf(where, sizeof(where), "In '%s' at %d, ", p->origin, p->no);
360         else if (p->origin)
361                 xsnprintf(where, sizeof(where), "%s, ", p->origin);
362         else
363                 where[0] = 0;
364
365         die("%s'%s': %s", where, p->pattern, error);
366 }
367
368 static int is_fixed(const char *s, size_t len)
369 {
370         size_t i;
371
372         for (i = 0; i < len; i++) {
373                 if (is_regex_special(s[i]))
374                         return 0;
375         }
376
377         return 1;
378 }
379
380 #ifdef USE_LIBPCRE1
381 static void compile_pcre1_regexp(struct grep_pat *p, const struct grep_opt *opt)
382 {
383         const char *error;
384         int erroffset;
385         int options = PCRE_MULTILINE;
386         int study_options = 0;
387
388         if (opt->ignore_case) {
389                 if (!opt->ignore_locale && has_non_ascii(p->pattern))
390                         p->pcre1_tables = pcre_maketables();
391                 options |= PCRE_CASELESS;
392         }
393         if (!opt->ignore_locale && is_utf8_locale() && has_non_ascii(p->pattern))
394                 options |= PCRE_UTF8;
395
396         p->pcre1_regexp = pcre_compile(p->pattern, options, &error, &erroffset,
397                                       p->pcre1_tables);
398         if (!p->pcre1_regexp)
399                 compile_regexp_failed(p, error);
400
401 #if defined(PCRE_CONFIG_JIT) && !defined(NO_LIBPCRE1_JIT)
402         pcre_config(PCRE_CONFIG_JIT, &p->pcre1_jit_on);
403         if (opt->debug)
404                 fprintf(stderr, "pcre1_jit_on=%d\n", p->pcre1_jit_on);
405
406         if (p->pcre1_jit_on)
407                 study_options = PCRE_STUDY_JIT_COMPILE;
408 #endif
409
410         p->pcre1_extra_info = pcre_study(p->pcre1_regexp, study_options, &error);
411         if (!p->pcre1_extra_info && error)
412                 die("%s", error);
413 }
414
415 static int pcre1match(struct grep_pat *p, const char *line, const char *eol,
416                 regmatch_t *match, int eflags)
417 {
418         int ovector[30], ret, flags = PCRE_NO_UTF8_CHECK;
419
420         if (eflags & REG_NOTBOL)
421                 flags |= PCRE_NOTBOL;
422
423         ret = pcre_exec(p->pcre1_regexp, p->pcre1_extra_info, line,
424                         eol - line, 0, flags, ovector,
425                         ARRAY_SIZE(ovector));
426
427         if (ret < 0 && ret != PCRE_ERROR_NOMATCH)
428                 die("pcre_exec failed with error code %d", ret);
429         if (ret > 0) {
430                 ret = 0;
431                 match->rm_so = ovector[0];
432                 match->rm_eo = ovector[1];
433         }
434
435         return ret;
436 }
437
438 static void free_pcre1_regexp(struct grep_pat *p)
439 {
440         pcre_free(p->pcre1_regexp);
441 #ifdef PCRE_CONFIG_JIT
442         if (p->pcre1_jit_on)
443                 pcre_free_study(p->pcre1_extra_info);
444         else
445 #endif
446                 pcre_free(p->pcre1_extra_info);
447         pcre_free((void *)p->pcre1_tables);
448 }
449 #else /* !USE_LIBPCRE1 */
450 static void compile_pcre1_regexp(struct grep_pat *p, const struct grep_opt *opt)
451 {
452         die("cannot use Perl-compatible regexes when not compiled with USE_LIBPCRE");
453 }
454
455 static int pcre1match(struct grep_pat *p, const char *line, const char *eol,
456                 regmatch_t *match, int eflags)
457 {
458         return 1;
459 }
460
461 static void free_pcre1_regexp(struct grep_pat *p)
462 {
463 }
464 #endif /* !USE_LIBPCRE1 */
465
466 #ifdef USE_LIBPCRE2
467 static void compile_pcre2_pattern(struct grep_pat *p, const struct grep_opt *opt)
468 {
469         int error;
470         PCRE2_UCHAR errbuf[256];
471         PCRE2_SIZE erroffset;
472         int options = PCRE2_MULTILINE;
473         int jitret;
474         int patinforet;
475         size_t jitsizearg;
476
477         assert(opt->pcre2);
478
479         p->pcre2_compile_context = NULL;
480
481         /* pcre2_global_context is initialized in append_grep_pattern */
482         if (opt->ignore_case) {
483                 if (!opt->ignore_locale && has_non_ascii(p->pattern)) {
484                         if (!pcre2_global_context)
485                                 BUG("pcre2_global_context uninitialized");
486                         p->pcre2_tables = pcre2_maketables(pcre2_global_context);
487                         p->pcre2_compile_context = pcre2_compile_context_create(NULL);
488                         pcre2_set_character_tables(p->pcre2_compile_context,
489                                                         p->pcre2_tables);
490                 }
491                 options |= PCRE2_CASELESS;
492         }
493         if (!opt->ignore_locale && is_utf8_locale() && has_non_ascii(p->pattern) &&
494             !(!opt->ignore_case && (p->fixed || p->is_fixed)))
495                 options |= (PCRE2_UTF | PCRE2_MATCH_INVALID_UTF);
496
497         /* Work around https://bugs.exim.org/show_bug.cgi?id=2642 fixed in 10.36 */
498         if (PCRE2_MATCH_INVALID_UTF && options & (PCRE2_UTF | PCRE2_CASELESS)) {
499                 struct strbuf buf;
500                 int len;
501                 int err;
502
503                 if ((len = pcre2_config(PCRE2_CONFIG_VERSION, NULL)) < 0)
504                         BUG("pcre2_config(..., NULL) failed: %d", len);
505                 strbuf_init(&buf, len + 1);
506                 if ((err = pcre2_config(PCRE2_CONFIG_VERSION, buf.buf)) < 0)
507                         BUG("pcre2_config(..., buf.buf) failed: %d", err);
508                 if (versioncmp(buf.buf, "10.36") < 0)
509                         options |= PCRE2_NO_START_OPTIMIZE;
510                 strbuf_release(&buf);
511         }
512
513         p->pcre2_pattern = pcre2_compile((PCRE2_SPTR)p->pattern,
514                                          p->patternlen, options, &error, &erroffset,
515                                          p->pcre2_compile_context);
516
517         if (p->pcre2_pattern) {
518                 p->pcre2_match_data = pcre2_match_data_create_from_pattern(p->pcre2_pattern, NULL);
519                 if (!p->pcre2_match_data)
520                         die("Couldn't allocate PCRE2 match data");
521         } else {
522                 pcre2_get_error_message(error, errbuf, sizeof(errbuf));
523                 compile_regexp_failed(p, (const char *)&errbuf);
524         }
525
526         pcre2_config(PCRE2_CONFIG_JIT, &p->pcre2_jit_on);
527         if (opt->debug)
528                 fprintf(stderr, "pcre2_jit_on=%d\n", p->pcre2_jit_on);
529         if (p->pcre2_jit_on) {
530                 jitret = pcre2_jit_compile(p->pcre2_pattern, PCRE2_JIT_COMPLETE);
531                 if (jitret)
532                         die("Couldn't JIT the PCRE2 pattern '%s', got '%d'\n", p->pattern, jitret);
533
534                 /*
535                  * The pcre2_config(PCRE2_CONFIG_JIT, ...) call just
536                  * tells us whether the library itself supports JIT,
537                  * but to see whether we're going to be actually using
538                  * JIT we need to extract PCRE2_INFO_JITSIZE from the
539                  * pattern *after* we do pcre2_jit_compile() above.
540                  *
541                  * This is because if the pattern contains the
542                  * (*NO_JIT) verb (see pcre2syntax(3))
543                  * pcre2_jit_compile() will exit early with 0. If we
544                  * then proceed to call pcre2_jit_match() further down
545                  * the line instead of pcre2_match() we'll either
546                  * segfault (pre PCRE 10.31) or run into a fatal error
547                  * (post PCRE2 10.31)
548                  */
549                 patinforet = pcre2_pattern_info(p->pcre2_pattern, PCRE2_INFO_JITSIZE, &jitsizearg);
550                 if (patinforet)
551                         BUG("pcre2_pattern_info() failed: %d", patinforet);
552                 if (jitsizearg == 0) {
553                         p->pcre2_jit_on = 0;
554                         if (opt->debug)
555                                 fprintf(stderr, "pcre2_jit_on=%d: (*NO_JIT) in regex\n",
556                                         p->pcre2_jit_on);
557                         return;
558                 }
559         }
560 }
561
562 static int pcre2match(struct grep_pat *p, const char *line, const char *eol,
563                 regmatch_t *match, int eflags)
564 {
565         int ret, flags = 0;
566         PCRE2_SIZE *ovector;
567         PCRE2_UCHAR errbuf[256];
568
569         if (eflags & REG_NOTBOL)
570                 flags |= PCRE2_NOTBOL;
571
572         if (p->pcre2_jit_on)
573                 ret = pcre2_jit_match(p->pcre2_pattern, (unsigned char *)line,
574                                       eol - line, 0, flags, p->pcre2_match_data,
575                                       NULL);
576         else
577                 ret = pcre2_match(p->pcre2_pattern, (unsigned char *)line,
578                                   eol - line, 0, flags, p->pcre2_match_data,
579                                   NULL);
580
581         if (ret < 0 && ret != PCRE2_ERROR_NOMATCH) {
582                 pcre2_get_error_message(ret, errbuf, sizeof(errbuf));
583                 die("%s failed with error code %d: %s",
584                     (p->pcre2_jit_on ? "pcre2_jit_match" : "pcre2_match"), ret,
585                     errbuf);
586         }
587         if (ret > 0) {
588                 ovector = pcre2_get_ovector_pointer(p->pcre2_match_data);
589                 ret = 0;
590                 match->rm_so = (int)ovector[0];
591                 match->rm_eo = (int)ovector[1];
592         }
593
594         return ret;
595 }
596
597 static void free_pcre2_pattern(struct grep_pat *p)
598 {
599         pcre2_compile_context_free(p->pcre2_compile_context);
600         pcre2_code_free(p->pcre2_pattern);
601         pcre2_match_data_free(p->pcre2_match_data);
602         free((void *)p->pcre2_tables);
603 }
604 #else /* !USE_LIBPCRE2 */
605 static void compile_pcre2_pattern(struct grep_pat *p, const struct grep_opt *opt)
606 {
607         /*
608          * Unreachable until USE_LIBPCRE2 becomes synonymous with
609          * USE_LIBPCRE. See the sibling comment in
610          * grep_set_pattern_type_option().
611          */
612         die("cannot use Perl-compatible regexes when not compiled with USE_LIBPCRE");
613 }
614
615 static int pcre2match(struct grep_pat *p, const char *line, const char *eol,
616                 regmatch_t *match, int eflags)
617 {
618         return 1;
619 }
620
621 static void free_pcre2_pattern(struct grep_pat *p)
622 {
623 }
624
625 static void compile_fixed_regexp(struct grep_pat *p, struct grep_opt *opt)
626 {
627         struct strbuf sb = STRBUF_INIT;
628         int err;
629         int regflags = 0;
630
631         basic_regex_quote_buf(&sb, p->pattern);
632         if (opt->ignore_case)
633                 regflags |= REG_ICASE;
634         err = regcomp(&p->regexp, sb.buf, regflags);
635         if (opt->debug)
636                 fprintf(stderr, "fixed %s\n", sb.buf);
637         strbuf_release(&sb);
638         if (err) {
639                 char errbuf[1024];
640                 regerror(err, &p->regexp, errbuf, sizeof(errbuf));
641                 compile_regexp_failed(p, errbuf);
642         }
643 }
644 #endif /* !USE_LIBPCRE2 */
645
646 static void compile_regexp(struct grep_pat *p, struct grep_opt *opt)
647 {
648         int err;
649         int regflags = REG_NEWLINE;
650
651         p->word_regexp = opt->word_regexp;
652         p->ignore_case = opt->ignore_case;
653         p->fixed = opt->fixed;
654
655         if (memchr(p->pattern, 0, p->patternlen) && !opt->pcre2)
656                 die(_("given pattern contains NULL byte (via -f <file>). This is only supported with -P under PCRE v2"));
657
658         p->is_fixed = is_fixed(p->pattern, p->patternlen);
659 #ifdef USE_LIBPCRE2
660        if (!p->fixed && !p->is_fixed) {
661                const char *no_jit = "(*NO_JIT)";
662                const int no_jit_len = strlen(no_jit);
663                if (starts_with(p->pattern, no_jit) &&
664                    is_fixed(p->pattern + no_jit_len,
665                             p->patternlen - no_jit_len))
666                        p->is_fixed = 1;
667        }
668 #endif
669         if (p->fixed || p->is_fixed) {
670 #ifdef USE_LIBPCRE2
671                 opt->pcre2 = 1;
672                 if (p->is_fixed) {
673                         compile_pcre2_pattern(p, opt);
674                 } else {
675                         /*
676                          * E.g. t7811-grep-open.sh relies on the
677                          * pattern being restored.
678                          */
679                         char *old_pattern = p->pattern;
680                         size_t old_patternlen = p->patternlen;
681                         struct strbuf sb = STRBUF_INIT;
682
683                         /*
684                          * There is the PCRE2_LITERAL flag, but it's
685                          * only in PCRE v2 10.30 and later. Needing to
686                          * ifdef our way around that and dealing with
687                          * it + PCRE2_MULTILINE being an error is more
688                          * complex than just quoting this ourselves.
689                         */
690                         strbuf_add(&sb, "\\Q", 2);
691                         strbuf_add(&sb, p->pattern, p->patternlen);
692                         strbuf_add(&sb, "\\E", 2);
693
694                         p->pattern = sb.buf;
695                         p->patternlen = sb.len;
696                         compile_pcre2_pattern(p, opt);
697                         p->pattern = old_pattern;
698                         p->patternlen = old_patternlen;
699                         strbuf_release(&sb);
700                 }
701 #else /* !USE_LIBPCRE2 */
702                 compile_fixed_regexp(p, opt);
703 #endif /* !USE_LIBPCRE2 */
704                 return;
705         }
706
707         if (opt->pcre2) {
708                 compile_pcre2_pattern(p, opt);
709                 return;
710         }
711
712         if (opt->pcre1) {
713                 compile_pcre1_regexp(p, opt);
714                 return;
715         }
716
717         if (p->ignore_case)
718                 regflags |= REG_ICASE;
719         if (opt->extended_regexp_option)
720                 regflags |= REG_EXTENDED;
721         err = regcomp(&p->regexp, p->pattern, regflags);
722         if (err) {
723                 char errbuf[1024];
724                 regerror(err, &p->regexp, errbuf, 1024);
725                 compile_regexp_failed(p, errbuf);
726         }
727 }
728
729 static struct grep_expr *compile_pattern_or(struct grep_pat **);
730 static struct grep_expr *compile_pattern_atom(struct grep_pat **list)
731 {
732         struct grep_pat *p;
733         struct grep_expr *x;
734
735         p = *list;
736         if (!p)
737                 return NULL;
738         switch (p->token) {
739         case GREP_PATTERN: /* atom */
740         case GREP_PATTERN_HEAD:
741         case GREP_PATTERN_BODY:
742                 x = xcalloc(1, sizeof (struct grep_expr));
743                 x->node = GREP_NODE_ATOM;
744                 x->u.atom = p;
745                 *list = p->next;
746                 return x;
747         case GREP_OPEN_PAREN:
748                 *list = p->next;
749                 x = compile_pattern_or(list);
750                 if (!*list || (*list)->token != GREP_CLOSE_PAREN)
751                         die("unmatched parenthesis");
752                 *list = (*list)->next;
753                 return x;
754         default:
755                 return NULL;
756         }
757 }
758
759 static struct grep_expr *compile_pattern_not(struct grep_pat **list)
760 {
761         struct grep_pat *p;
762         struct grep_expr *x;
763
764         p = *list;
765         if (!p)
766                 return NULL;
767         switch (p->token) {
768         case GREP_NOT:
769                 if (!p->next)
770                         die("--not not followed by pattern expression");
771                 *list = p->next;
772                 x = xcalloc(1, sizeof (struct grep_expr));
773                 x->node = GREP_NODE_NOT;
774                 x->u.unary = compile_pattern_not(list);
775                 if (!x->u.unary)
776                         die("--not followed by non pattern expression");
777                 return x;
778         default:
779                 return compile_pattern_atom(list);
780         }
781 }
782
783 static struct grep_expr *compile_pattern_and(struct grep_pat **list)
784 {
785         struct grep_pat *p;
786         struct grep_expr *x, *y, *z;
787
788         x = compile_pattern_not(list);
789         p = *list;
790         if (p && p->token == GREP_AND) {
791                 if (!p->next)
792                         die("--and not followed by pattern expression");
793                 *list = p->next;
794                 y = compile_pattern_and(list);
795                 if (!y)
796                         die("--and not followed by pattern expression");
797                 z = xcalloc(1, sizeof (struct grep_expr));
798                 z->node = GREP_NODE_AND;
799                 z->u.binary.left = x;
800                 z->u.binary.right = y;
801                 return z;
802         }
803         return x;
804 }
805
806 static struct grep_expr *compile_pattern_or(struct grep_pat **list)
807 {
808         struct grep_pat *p;
809         struct grep_expr *x, *y, *z;
810
811         x = compile_pattern_and(list);
812         p = *list;
813         if (x && p && p->token != GREP_CLOSE_PAREN) {
814                 y = compile_pattern_or(list);
815                 if (!y)
816                         die("not a pattern expression %s", p->pattern);
817                 z = xcalloc(1, sizeof (struct grep_expr));
818                 z->node = GREP_NODE_OR;
819                 z->u.binary.left = x;
820                 z->u.binary.right = y;
821                 return z;
822         }
823         return x;
824 }
825
826 static struct grep_expr *compile_pattern_expr(struct grep_pat **list)
827 {
828         return compile_pattern_or(list);
829 }
830
831 static void indent(int in)
832 {
833         while (in-- > 0)
834                 fputc(' ', stderr);
835 }
836
837 static void dump_grep_pat(struct grep_pat *p)
838 {
839         switch (p->token) {
840         case GREP_AND: fprintf(stderr, "*and*"); break;
841         case GREP_OPEN_PAREN: fprintf(stderr, "*(*"); break;
842         case GREP_CLOSE_PAREN: fprintf(stderr, "*)*"); break;
843         case GREP_NOT: fprintf(stderr, "*not*"); break;
844         case GREP_OR: fprintf(stderr, "*or*"); break;
845
846         case GREP_PATTERN: fprintf(stderr, "pattern"); break;
847         case GREP_PATTERN_HEAD: fprintf(stderr, "pattern_head"); break;
848         case GREP_PATTERN_BODY: fprintf(stderr, "pattern_body"); break;
849         }
850
851         switch (p->token) {
852         default: break;
853         case GREP_PATTERN_HEAD:
854                 fprintf(stderr, "<head %d>", p->field); break;
855         case GREP_PATTERN_BODY:
856                 fprintf(stderr, "<body>"); break;
857         }
858         switch (p->token) {
859         default: break;
860         case GREP_PATTERN_HEAD:
861         case GREP_PATTERN_BODY:
862         case GREP_PATTERN:
863                 fprintf(stderr, "%.*s", (int)p->patternlen, p->pattern);
864                 break;
865         }
866         fputc('\n', stderr);
867 }
868
869 static void dump_grep_expression_1(struct grep_expr *x, int in)
870 {
871         indent(in);
872         switch (x->node) {
873         case GREP_NODE_TRUE:
874                 fprintf(stderr, "true\n");
875                 break;
876         case GREP_NODE_ATOM:
877                 dump_grep_pat(x->u.atom);
878                 break;
879         case GREP_NODE_NOT:
880                 fprintf(stderr, "(not\n");
881                 dump_grep_expression_1(x->u.unary, in+1);
882                 indent(in);
883                 fprintf(stderr, ")\n");
884                 break;
885         case GREP_NODE_AND:
886                 fprintf(stderr, "(and\n");
887                 dump_grep_expression_1(x->u.binary.left, in+1);
888                 dump_grep_expression_1(x->u.binary.right, in+1);
889                 indent(in);
890                 fprintf(stderr, ")\n");
891                 break;
892         case GREP_NODE_OR:
893                 fprintf(stderr, "(or\n");
894                 dump_grep_expression_1(x->u.binary.left, in+1);
895                 dump_grep_expression_1(x->u.binary.right, in+1);
896                 indent(in);
897                 fprintf(stderr, ")\n");
898                 break;
899         }
900 }
901
902 static void dump_grep_expression(struct grep_opt *opt)
903 {
904         struct grep_expr *x = opt->pattern_expression;
905
906         if (opt->all_match)
907                 fprintf(stderr, "[all-match]\n");
908         dump_grep_expression_1(x, 0);
909         fflush(NULL);
910 }
911
912 static struct grep_expr *grep_true_expr(void)
913 {
914         struct grep_expr *z = xcalloc(1, sizeof(*z));
915         z->node = GREP_NODE_TRUE;
916         return z;
917 }
918
919 static struct grep_expr *grep_or_expr(struct grep_expr *left, struct grep_expr *right)
920 {
921         struct grep_expr *z = xcalloc(1, sizeof(*z));
922         z->node = GREP_NODE_OR;
923         z->u.binary.left = left;
924         z->u.binary.right = right;
925         return z;
926 }
927
928 static struct grep_expr *prep_header_patterns(struct grep_opt *opt)
929 {
930         struct grep_pat *p;
931         struct grep_expr *header_expr;
932         struct grep_expr *(header_group[GREP_HEADER_FIELD_MAX]);
933         enum grep_header_field fld;
934
935         if (!opt->header_list)
936                 return NULL;
937
938         for (p = opt->header_list; p; p = p->next) {
939                 if (p->token != GREP_PATTERN_HEAD)
940                         BUG("a non-header pattern in grep header list.");
941                 if (p->field < GREP_HEADER_FIELD_MIN ||
942                     GREP_HEADER_FIELD_MAX <= p->field)
943                         BUG("unknown header field %d", p->field);
944                 compile_regexp(p, opt);
945         }
946
947         for (fld = 0; fld < GREP_HEADER_FIELD_MAX; fld++)
948                 header_group[fld] = NULL;
949
950         for (p = opt->header_list; p; p = p->next) {
951                 struct grep_expr *h;
952                 struct grep_pat *pp = p;
953
954                 h = compile_pattern_atom(&pp);
955                 if (!h || pp != p->next)
956                         BUG("malformed header expr");
957                 if (!header_group[p->field]) {
958                         header_group[p->field] = h;
959                         continue;
960                 }
961                 header_group[p->field] = grep_or_expr(h, header_group[p->field]);
962         }
963
964         header_expr = NULL;
965
966         for (fld = 0; fld < GREP_HEADER_FIELD_MAX; fld++) {
967                 if (!header_group[fld])
968                         continue;
969                 if (!header_expr)
970                         header_expr = grep_true_expr();
971                 header_expr = grep_or_expr(header_group[fld], header_expr);
972         }
973         return header_expr;
974 }
975
976 static struct grep_expr *grep_splice_or(struct grep_expr *x, struct grep_expr *y)
977 {
978         struct grep_expr *z = x;
979
980         while (x) {
981                 assert(x->node == GREP_NODE_OR);
982                 if (x->u.binary.right &&
983                     x->u.binary.right->node == GREP_NODE_TRUE) {
984                         x->u.binary.right = y;
985                         break;
986                 }
987                 x = x->u.binary.right;
988         }
989         return z;
990 }
991
992 static void compile_grep_patterns_real(struct grep_opt *opt)
993 {
994         struct grep_pat *p;
995         struct grep_expr *header_expr = prep_header_patterns(opt);
996
997         for (p = opt->pattern_list; p; p = p->next) {
998                 switch (p->token) {
999                 case GREP_PATTERN: /* atom */
1000                 case GREP_PATTERN_HEAD:
1001                 case GREP_PATTERN_BODY:
1002                         compile_regexp(p, opt);
1003                         break;
1004                 default:
1005                         opt->extended = 1;
1006                         break;
1007                 }
1008         }
1009
1010         if (opt->all_match || header_expr)
1011                 opt->extended = 1;
1012         else if (!opt->extended && !opt->debug)
1013                 return;
1014
1015         p = opt->pattern_list;
1016         if (p)
1017                 opt->pattern_expression = compile_pattern_expr(&p);
1018         if (p)
1019                 die("incomplete pattern expression: %s", p->pattern);
1020
1021         if (!header_expr)
1022                 return;
1023
1024         if (!opt->pattern_expression)
1025                 opt->pattern_expression = header_expr;
1026         else if (opt->all_match)
1027                 opt->pattern_expression = grep_splice_or(header_expr,
1028                                                          opt->pattern_expression);
1029         else
1030                 opt->pattern_expression = grep_or_expr(opt->pattern_expression,
1031                                                        header_expr);
1032         opt->all_match = 1;
1033 }
1034
1035 void compile_grep_patterns(struct grep_opt *opt)
1036 {
1037         compile_grep_patterns_real(opt);
1038         if (opt->debug)
1039                 dump_grep_expression(opt);
1040 }
1041
1042 static void free_pattern_expr(struct grep_expr *x)
1043 {
1044         switch (x->node) {
1045         case GREP_NODE_TRUE:
1046         case GREP_NODE_ATOM:
1047                 break;
1048         case GREP_NODE_NOT:
1049                 free_pattern_expr(x->u.unary);
1050                 break;
1051         case GREP_NODE_AND:
1052         case GREP_NODE_OR:
1053                 free_pattern_expr(x->u.binary.left);
1054                 free_pattern_expr(x->u.binary.right);
1055                 break;
1056         }
1057         free(x);
1058 }
1059
1060 void free_grep_patterns(struct grep_opt *opt)
1061 {
1062         struct grep_pat *p, *n;
1063
1064         for (p = opt->pattern_list; p; p = n) {
1065                 n = p->next;
1066                 switch (p->token) {
1067                 case GREP_PATTERN: /* atom */
1068                 case GREP_PATTERN_HEAD:
1069                 case GREP_PATTERN_BODY:
1070                         if (p->pcre1_regexp)
1071                                 free_pcre1_regexp(p);
1072                         else if (p->pcre2_pattern)
1073                                 free_pcre2_pattern(p);
1074                         else
1075                                 regfree(&p->regexp);
1076                         free(p->pattern);
1077                         break;
1078                 default:
1079                         break;
1080                 }
1081                 free(p);
1082         }
1083
1084         if (!opt->extended)
1085                 return;
1086         free_pattern_expr(opt->pattern_expression);
1087 }
1088
1089 static char *end_of_line(char *cp, unsigned long *left)
1090 {
1091         unsigned long l = *left;
1092         while (l && *cp != '\n') {
1093                 l--;
1094                 cp++;
1095         }
1096         *left = l;
1097         return cp;
1098 }
1099
1100 static int word_char(char ch)
1101 {
1102         return isalnum(ch) || ch == '_';
1103 }
1104
1105 static void output_color(struct grep_opt *opt, const void *data, size_t size,
1106                          const char *color)
1107 {
1108         if (want_color(opt->color) && color && color[0]) {
1109                 opt->output(opt, color, strlen(color));
1110                 opt->output(opt, data, size);
1111                 opt->output(opt, GIT_COLOR_RESET, strlen(GIT_COLOR_RESET));
1112         } else
1113                 opt->output(opt, data, size);
1114 }
1115
1116 static void output_sep(struct grep_opt *opt, char sign)
1117 {
1118         if (opt->null_following_name)
1119                 opt->output(opt, "\0", 1);
1120         else
1121                 output_color(opt, &sign, 1, opt->colors[GREP_COLOR_SEP]);
1122 }
1123
1124 static void show_name(struct grep_opt *opt, const char *name)
1125 {
1126         output_color(opt, name, strlen(name), opt->colors[GREP_COLOR_FILENAME]);
1127         opt->output(opt, opt->null_following_name ? "\0" : "\n", 1);
1128 }
1129
1130 static int patmatch(struct grep_pat *p, char *line, char *eol,
1131                     regmatch_t *match, int eflags)
1132 {
1133         int hit;
1134
1135         if (p->pcre1_regexp)
1136                 hit = !pcre1match(p, line, eol, match, eflags);
1137         else if (p->pcre2_pattern)
1138                 hit = !pcre2match(p, line, eol, match, eflags);
1139         else
1140                 hit = !regexec_buf(&p->regexp, line, eol - line, 1, match,
1141                                    eflags);
1142
1143         return hit;
1144 }
1145
1146 static int strip_timestamp(char *bol, char **eol_p)
1147 {
1148         char *eol = *eol_p;
1149         int ch;
1150
1151         while (bol < --eol) {
1152                 if (*eol != '>')
1153                         continue;
1154                 *eol_p = ++eol;
1155                 ch = *eol;
1156                 *eol = '\0';
1157                 return ch;
1158         }
1159         return 0;
1160 }
1161
1162 static struct {
1163         const char *field;
1164         size_t len;
1165 } header_field[] = {
1166         { "author ", 7 },
1167         { "committer ", 10 },
1168         { "reflog ", 7 },
1169 };
1170
1171 static int match_one_pattern(struct grep_pat *p, char *bol, char *eol,
1172                              enum grep_context ctx,
1173                              regmatch_t *pmatch, int eflags)
1174 {
1175         int hit = 0;
1176         int saved_ch = 0;
1177         const char *start = bol;
1178
1179         if ((p->token != GREP_PATTERN) &&
1180             ((p->token == GREP_PATTERN_HEAD) != (ctx == GREP_CONTEXT_HEAD)))
1181                 return 0;
1182
1183         if (p->token == GREP_PATTERN_HEAD) {
1184                 const char *field;
1185                 size_t len;
1186                 assert(p->field < ARRAY_SIZE(header_field));
1187                 field = header_field[p->field].field;
1188                 len = header_field[p->field].len;
1189                 if (strncmp(bol, field, len))
1190                         return 0;
1191                 bol += len;
1192                 switch (p->field) {
1193                 case GREP_HEADER_AUTHOR:
1194                 case GREP_HEADER_COMMITTER:
1195                         saved_ch = strip_timestamp(bol, &eol);
1196                         break;
1197                 default:
1198                         break;
1199                 }
1200         }
1201
1202  again:
1203         hit = patmatch(p, bol, eol, pmatch, eflags);
1204
1205         if (hit && p->word_regexp) {
1206                 if ((pmatch[0].rm_so < 0) ||
1207                     (eol - bol) < pmatch[0].rm_so ||
1208                     (pmatch[0].rm_eo < 0) ||
1209                     (eol - bol) < pmatch[0].rm_eo)
1210                         die("regexp returned nonsense");
1211
1212                 /* Match beginning must be either beginning of the
1213                  * line, or at word boundary (i.e. the last char must
1214                  * not be a word char).  Similarly, match end must be
1215                  * either end of the line, or at word boundary
1216                  * (i.e. the next char must not be a word char).
1217                  */
1218                 if ( ((pmatch[0].rm_so == 0) ||
1219                       !word_char(bol[pmatch[0].rm_so-1])) &&
1220                      ((pmatch[0].rm_eo == (eol-bol)) ||
1221                       !word_char(bol[pmatch[0].rm_eo])) )
1222                         ;
1223                 else
1224                         hit = 0;
1225
1226                 /* Words consist of at least one character. */
1227                 if (pmatch->rm_so == pmatch->rm_eo)
1228                         hit = 0;
1229
1230                 if (!hit && pmatch[0].rm_so + bol + 1 < eol) {
1231                         /* There could be more than one match on the
1232                          * line, and the first match might not be
1233                          * strict word match.  But later ones could be!
1234                          * Forward to the next possible start, i.e. the
1235                          * next position following a non-word char.
1236                          */
1237                         bol = pmatch[0].rm_so + bol + 1;
1238                         while (word_char(bol[-1]) && bol < eol)
1239                                 bol++;
1240                         eflags |= REG_NOTBOL;
1241                         if (bol < eol)
1242                                 goto again;
1243                 }
1244         }
1245         if (p->token == GREP_PATTERN_HEAD && saved_ch)
1246                 *eol = saved_ch;
1247         if (hit) {
1248                 pmatch[0].rm_so += bol - start;
1249                 pmatch[0].rm_eo += bol - start;
1250         }
1251         return hit;
1252 }
1253
1254 static int match_expr_eval(struct grep_opt *opt, struct grep_expr *x, char *bol,
1255                            char *eol, enum grep_context ctx, ssize_t *col,
1256                            ssize_t *icol, int collect_hits)
1257 {
1258         int h = 0;
1259
1260         if (!x)
1261                 die("Not a valid grep expression");
1262         switch (x->node) {
1263         case GREP_NODE_TRUE:
1264                 h = 1;
1265                 break;
1266         case GREP_NODE_ATOM:
1267                 {
1268                         regmatch_t tmp;
1269                         h = match_one_pattern(x->u.atom, bol, eol, ctx,
1270                                               &tmp, 0);
1271                         if (h && (*col < 0 || tmp.rm_so < *col))
1272                                 *col = tmp.rm_so;
1273                 }
1274                 break;
1275         case GREP_NODE_NOT:
1276                 /*
1277                  * Upon visiting a GREP_NODE_NOT, col and icol become swapped.
1278                  */
1279                 h = !match_expr_eval(opt, x->u.unary, bol, eol, ctx, icol, col,
1280                                      0);
1281                 break;
1282         case GREP_NODE_AND:
1283                 h = match_expr_eval(opt, x->u.binary.left, bol, eol, ctx, col,
1284                                     icol, 0);
1285                 if (h || opt->columnnum) {
1286                         /*
1287                          * Don't short-circuit AND when given --column, since a
1288                          * NOT earlier in the tree may turn this into an OR. In
1289                          * this case, see the below comment.
1290                          */
1291                         h &= match_expr_eval(opt, x->u.binary.right, bol, eol,
1292                                              ctx, col, icol, 0);
1293                 }
1294                 break;
1295         case GREP_NODE_OR:
1296                 if (!(collect_hits || opt->columnnum)) {
1297                         /*
1298                          * Don't short-circuit OR when given --column (or
1299                          * collecting hits) to ensure we don't skip a later
1300                          * child that would produce an earlier match.
1301                          */
1302                         return (match_expr_eval(opt, x->u.binary.left, bol, eol,
1303                                                 ctx, col, icol, 0) ||
1304                                 match_expr_eval(opt, x->u.binary.right, bol,
1305                                                 eol, ctx, col, icol, 0));
1306                 }
1307                 h = match_expr_eval(opt, x->u.binary.left, bol, eol, ctx, col,
1308                                     icol, 0);
1309                 if (collect_hits)
1310                         x->u.binary.left->hit |= h;
1311                 h |= match_expr_eval(opt, x->u.binary.right, bol, eol, ctx, col,
1312                                      icol, collect_hits);
1313                 break;
1314         default:
1315                 die("Unexpected node type (internal error) %d", x->node);
1316         }
1317         if (collect_hits)
1318                 x->hit |= h;
1319         return h;
1320 }
1321
1322 static int match_expr(struct grep_opt *opt, char *bol, char *eol,
1323                       enum grep_context ctx, ssize_t *col,
1324                       ssize_t *icol, int collect_hits)
1325 {
1326         struct grep_expr *x = opt->pattern_expression;
1327         return match_expr_eval(opt, x, bol, eol, ctx, col, icol, collect_hits);
1328 }
1329
1330 static int match_line(struct grep_opt *opt, char *bol, char *eol,
1331                       ssize_t *col, ssize_t *icol,
1332                       enum grep_context ctx, int collect_hits)
1333 {
1334         struct grep_pat *p;
1335         int hit = 0;
1336
1337         if (opt->extended)
1338                 return match_expr(opt, bol, eol, ctx, col, icol,
1339                                   collect_hits);
1340
1341         /* we do not call with collect_hits without being extended */
1342         for (p = opt->pattern_list; p; p = p->next) {
1343                 regmatch_t tmp;
1344                 if (match_one_pattern(p, bol, eol, ctx, &tmp, 0)) {
1345                         hit |= 1;
1346                         if (!opt->columnnum) {
1347                                 /*
1348                                  * Without --column, any single match on a line
1349                                  * is enough to know that it needs to be
1350                                  * printed. With --column, scan _all_ patterns
1351                                  * to find the earliest.
1352                                  */
1353                                 break;
1354                         }
1355                         if (*col < 0 || tmp.rm_so < *col)
1356                                 *col = tmp.rm_so;
1357                 }
1358         }
1359         return hit;
1360 }
1361
1362 static int match_next_pattern(struct grep_pat *p, char *bol, char *eol,
1363                               enum grep_context ctx,
1364                               regmatch_t *pmatch, int eflags)
1365 {
1366         regmatch_t match;
1367
1368         if (!match_one_pattern(p, bol, eol, ctx, &match, eflags))
1369                 return 0;
1370         if (match.rm_so < 0 || match.rm_eo < 0)
1371                 return 0;
1372         if (pmatch->rm_so >= 0 && pmatch->rm_eo >= 0) {
1373                 if (match.rm_so > pmatch->rm_so)
1374                         return 1;
1375                 if (match.rm_so == pmatch->rm_so && match.rm_eo < pmatch->rm_eo)
1376                         return 1;
1377         }
1378         pmatch->rm_so = match.rm_so;
1379         pmatch->rm_eo = match.rm_eo;
1380         return 1;
1381 }
1382
1383 static int next_match(struct grep_opt *opt, char *bol, char *eol,
1384                       enum grep_context ctx, regmatch_t *pmatch, int eflags)
1385 {
1386         struct grep_pat *p;
1387         int hit = 0;
1388
1389         pmatch->rm_so = pmatch->rm_eo = -1;
1390         if (bol < eol) {
1391                 for (p = opt->pattern_list; p; p = p->next) {
1392                         switch (p->token) {
1393                         case GREP_PATTERN: /* atom */
1394                         case GREP_PATTERN_HEAD:
1395                         case GREP_PATTERN_BODY:
1396                                 hit |= match_next_pattern(p, bol, eol, ctx,
1397                                                           pmatch, eflags);
1398                                 break;
1399                         default:
1400                                 break;
1401                         }
1402                 }
1403         }
1404         return hit;
1405 }
1406
1407 static void show_line_header(struct grep_opt *opt, const char *name,
1408                              unsigned lno, ssize_t cno, char sign)
1409 {
1410         if (opt->heading && opt->last_shown == 0) {
1411                 output_color(opt, name, strlen(name), opt->colors[GREP_COLOR_FILENAME]);
1412                 opt->output(opt, "\n", 1);
1413         }
1414         opt->last_shown = lno;
1415
1416         if (!opt->heading && opt->pathname) {
1417                 output_color(opt, name, strlen(name), opt->colors[GREP_COLOR_FILENAME]);
1418                 output_sep(opt, sign);
1419         }
1420         if (opt->linenum) {
1421                 char buf[32];
1422                 xsnprintf(buf, sizeof(buf), "%d", lno);
1423                 output_color(opt, buf, strlen(buf), opt->colors[GREP_COLOR_LINENO]);
1424                 output_sep(opt, sign);
1425         }
1426         /*
1427          * Treat 'cno' as the 1-indexed offset from the start of a non-context
1428          * line to its first match. Otherwise, 'cno' is 0 indicating that we are
1429          * being called with a context line.
1430          */
1431         if (opt->columnnum && cno) {
1432                 char buf[32];
1433                 xsnprintf(buf, sizeof(buf), "%"PRIuMAX, (uintmax_t)cno);
1434                 output_color(opt, buf, strlen(buf), opt->colors[GREP_COLOR_COLUMNNO]);
1435                 output_sep(opt, sign);
1436         }
1437 }
1438
1439 static void show_line(struct grep_opt *opt, char *bol, char *eol,
1440                       const char *name, unsigned lno, ssize_t cno, char sign)
1441 {
1442         int rest = eol - bol;
1443         const char *match_color = NULL;
1444         const char *line_color = NULL;
1445
1446         if (opt->file_break && opt->last_shown == 0) {
1447                 if (opt->show_hunk_mark)
1448                         opt->output(opt, "\n", 1);
1449         } else if (opt->pre_context || opt->post_context || opt->funcbody) {
1450                 if (opt->last_shown == 0) {
1451                         if (opt->show_hunk_mark) {
1452                                 output_color(opt, "--", 2, opt->colors[GREP_COLOR_SEP]);
1453                                 opt->output(opt, "\n", 1);
1454                         }
1455                 } else if (lno > opt->last_shown + 1) {
1456                         output_color(opt, "--", 2, opt->colors[GREP_COLOR_SEP]);
1457                         opt->output(opt, "\n", 1);
1458                 }
1459         }
1460         if (!opt->only_matching) {
1461                 /*
1462                  * In case the line we're being called with contains more than
1463                  * one match, leave printing each header to the loop below.
1464                  */
1465                 show_line_header(opt, name, lno, cno, sign);
1466         }
1467         if (opt->color || opt->only_matching) {
1468                 regmatch_t match;
1469                 enum grep_context ctx = GREP_CONTEXT_BODY;
1470                 int ch = *eol;
1471                 int eflags = 0;
1472
1473                 if (opt->color) {
1474                         if (sign == ':')
1475                                 match_color = opt->colors[GREP_COLOR_MATCH_SELECTED];
1476                         else
1477                                 match_color = opt->colors[GREP_COLOR_MATCH_CONTEXT];
1478                         if (sign == ':')
1479                                 line_color = opt->colors[GREP_COLOR_SELECTED];
1480                         else if (sign == '-')
1481                                 line_color = opt->colors[GREP_COLOR_CONTEXT];
1482                         else if (sign == '=')
1483                                 line_color = opt->colors[GREP_COLOR_FUNCTION];
1484                 }
1485                 *eol = '\0';
1486                 while (next_match(opt, bol, eol, ctx, &match, eflags)) {
1487                         if (match.rm_so == match.rm_eo)
1488                                 break;
1489
1490                         if (opt->only_matching)
1491                                 show_line_header(opt, name, lno, cno, sign);
1492                         else
1493                                 output_color(opt, bol, match.rm_so, line_color);
1494                         output_color(opt, bol + match.rm_so,
1495                                      match.rm_eo - match.rm_so, match_color);
1496                         if (opt->only_matching)
1497                                 opt->output(opt, "\n", 1);
1498                         bol += match.rm_eo;
1499                         cno += match.rm_eo;
1500                         rest -= match.rm_eo;
1501                         eflags = REG_NOTBOL;
1502                 }
1503                 *eol = ch;
1504         }
1505         if (!opt->only_matching) {
1506                 output_color(opt, bol, rest, line_color);
1507                 opt->output(opt, "\n", 1);
1508         }
1509 }
1510
1511 int grep_use_locks;
1512
1513 /*
1514  * This lock protects access to the gitattributes machinery, which is
1515  * not thread-safe.
1516  */
1517 pthread_mutex_t grep_attr_mutex;
1518
1519 static inline void grep_attr_lock(void)
1520 {
1521         if (grep_use_locks)
1522                 pthread_mutex_lock(&grep_attr_mutex);
1523 }
1524
1525 static inline void grep_attr_unlock(void)
1526 {
1527         if (grep_use_locks)
1528                 pthread_mutex_unlock(&grep_attr_mutex);
1529 }
1530
1531 static int match_funcname(struct grep_opt *opt, struct grep_source *gs, char *bol, char *eol)
1532 {
1533         xdemitconf_t *xecfg = opt->priv;
1534         if (xecfg && !xecfg->find_func) {
1535                 grep_source_load_driver(gs, opt->repo->index);
1536                 if (gs->driver->funcname.pattern) {
1537                         const struct userdiff_funcname *pe = &gs->driver->funcname;
1538                         xdiff_set_find_func(xecfg, pe->pattern, pe->cflags);
1539                 } else {
1540                         xecfg = opt->priv = NULL;
1541                 }
1542         }
1543
1544         if (xecfg) {
1545                 char buf[1];
1546                 return xecfg->find_func(bol, eol - bol, buf, 1,
1547                                         xecfg->find_func_priv) >= 0;
1548         }
1549
1550         if (bol == eol)
1551                 return 0;
1552         if (isalpha(*bol) || *bol == '_' || *bol == '$')
1553                 return 1;
1554         return 0;
1555 }
1556
1557 static void show_funcname_line(struct grep_opt *opt, struct grep_source *gs,
1558                                char *bol, unsigned lno)
1559 {
1560         while (bol > gs->buf) {
1561                 char *eol = --bol;
1562
1563                 while (bol > gs->buf && bol[-1] != '\n')
1564                         bol--;
1565                 lno--;
1566
1567                 if (lno <= opt->last_shown)
1568                         break;
1569
1570                 if (match_funcname(opt, gs, bol, eol)) {
1571                         show_line(opt, bol, eol, gs->name, lno, 0, '=');
1572                         break;
1573                 }
1574         }
1575 }
1576
1577 static int is_empty_line(const char *bol, const char *eol);
1578
1579 static void show_pre_context(struct grep_opt *opt, struct grep_source *gs,
1580                              char *bol, char *end, unsigned lno)
1581 {
1582         unsigned cur = lno, from = 1, funcname_lno = 0, orig_from;
1583         int funcname_needed = !!opt->funcname, comment_needed = 0;
1584
1585         if (opt->pre_context < lno)
1586                 from = lno - opt->pre_context;
1587         if (from <= opt->last_shown)
1588                 from = opt->last_shown + 1;
1589         orig_from = from;
1590         if (opt->funcbody) {
1591                 if (match_funcname(opt, gs, bol, end))
1592                         comment_needed = 1;
1593                 else
1594                         funcname_needed = 1;
1595                 from = opt->last_shown + 1;
1596         }
1597
1598         /* Rewind. */
1599         while (bol > gs->buf && cur > from) {
1600                 char *next_bol = bol;
1601                 char *eol = --bol;
1602
1603                 while (bol > gs->buf && bol[-1] != '\n')
1604                         bol--;
1605                 cur--;
1606                 if (comment_needed && (is_empty_line(bol, eol) ||
1607                                        match_funcname(opt, gs, bol, eol))) {
1608                         comment_needed = 0;
1609                         from = orig_from;
1610                         if (cur < from) {
1611                                 cur++;
1612                                 bol = next_bol;
1613                                 break;
1614                         }
1615                 }
1616                 if (funcname_needed && match_funcname(opt, gs, bol, eol)) {
1617                         funcname_lno = cur;
1618                         funcname_needed = 0;
1619                         if (opt->funcbody)
1620                                 comment_needed = 1;
1621                         else
1622                                 from = orig_from;
1623                 }
1624         }
1625
1626         /* We need to look even further back to find a function signature. */
1627         if (opt->funcname && funcname_needed)
1628                 show_funcname_line(opt, gs, bol, cur);
1629
1630         /* Back forward. */
1631         while (cur < lno) {
1632                 char *eol = bol, sign = (cur == funcname_lno) ? '=' : '-';
1633
1634                 while (*eol != '\n')
1635                         eol++;
1636                 show_line(opt, bol, eol, gs->name, cur, 0, sign);
1637                 bol = eol + 1;
1638                 cur++;
1639         }
1640 }
1641
1642 static int should_lookahead(struct grep_opt *opt)
1643 {
1644         struct grep_pat *p;
1645
1646         if (opt->extended)
1647                 return 0; /* punt for too complex stuff */
1648         if (opt->invert)
1649                 return 0;
1650         for (p = opt->pattern_list; p; p = p->next) {
1651                 if (p->token != GREP_PATTERN)
1652                         return 0; /* punt for "header only" and stuff */
1653         }
1654         return 1;
1655 }
1656
1657 static int look_ahead(struct grep_opt *opt,
1658                       unsigned long *left_p,
1659                       unsigned *lno_p,
1660                       char **bol_p)
1661 {
1662         unsigned lno = *lno_p;
1663         char *bol = *bol_p;
1664         struct grep_pat *p;
1665         char *sp, *last_bol;
1666         regoff_t earliest = -1;
1667
1668         for (p = opt->pattern_list; p; p = p->next) {
1669                 int hit;
1670                 regmatch_t m;
1671
1672                 hit = patmatch(p, bol, bol + *left_p, &m, 0);
1673                 if (!hit || m.rm_so < 0 || m.rm_eo < 0)
1674                         continue;
1675                 if (earliest < 0 || m.rm_so < earliest)
1676                         earliest = m.rm_so;
1677         }
1678
1679         if (earliest < 0) {
1680                 *bol_p = bol + *left_p;
1681                 *left_p = 0;
1682                 return 1;
1683         }
1684         for (sp = bol + earliest; bol < sp && sp[-1] != '\n'; sp--)
1685                 ; /* find the beginning of the line */
1686         last_bol = sp;
1687
1688         for (sp = bol; sp < last_bol; sp++) {
1689                 if (*sp == '\n')
1690                         lno++;
1691         }
1692         *left_p -= last_bol - bol;
1693         *bol_p = last_bol;
1694         *lno_p = lno;
1695         return 0;
1696 }
1697
1698 static int fill_textconv_grep(struct repository *r,
1699                               struct userdiff_driver *driver,
1700                               struct grep_source *gs)
1701 {
1702         struct diff_filespec *df;
1703         char *buf;
1704         size_t size;
1705
1706         if (!driver || !driver->textconv)
1707                 return grep_source_load(gs);
1708
1709         /*
1710          * The textconv interface is intimately tied to diff_filespecs, so we
1711          * have to pretend to be one. If we could unify the grep_source
1712          * and diff_filespec structs, this mess could just go away.
1713          */
1714         df = alloc_filespec(gs->path);
1715         switch (gs->type) {
1716         case GREP_SOURCE_OID:
1717                 fill_filespec(df, gs->identifier, 1, 0100644);
1718                 break;
1719         case GREP_SOURCE_FILE:
1720                 fill_filespec(df, &null_oid, 0, 0100644);
1721                 break;
1722         default:
1723                 BUG("attempt to textconv something without a path?");
1724         }
1725
1726         /*
1727          * fill_textconv is not remotely thread-safe; it modifies the global
1728          * diff tempfile structure, writes to the_repo's odb and might
1729          * internally call thread-unsafe functions such as the
1730          * prepare_packed_git() lazy-initializator. Because of the last two, we
1731          * must ensure mutual exclusion between this call and the object reading
1732          * API, thus we use obj_read_lock() here.
1733          *
1734          * TODO: allowing text conversion to run in parallel with object
1735          * reading operations might increase performance in the multithreaded
1736          * non-worktreee git-grep with --textconv.
1737          */
1738         obj_read_lock();
1739         size = fill_textconv(r, driver, df, &buf);
1740         obj_read_unlock();
1741         free_filespec(df);
1742
1743         /*
1744          * The normal fill_textconv usage by the diff machinery would just keep
1745          * the textconv'd buf separate from the diff_filespec. But much of the
1746          * grep code passes around a grep_source and assumes that its "buf"
1747          * pointer is the beginning of the thing we are searching. So let's
1748          * install our textconv'd version into the grep_source, taking care not
1749          * to leak any existing buffer.
1750          */
1751         grep_source_clear_data(gs);
1752         gs->buf = buf;
1753         gs->size = size;
1754
1755         return 0;
1756 }
1757
1758 static int is_empty_line(const char *bol, const char *eol)
1759 {
1760         while (bol < eol && isspace(*bol))
1761                 bol++;
1762         return bol == eol;
1763 }
1764
1765 static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int collect_hits)
1766 {
1767         char *bol;
1768         char *peek_bol = NULL;
1769         unsigned long left;
1770         unsigned lno = 1;
1771         unsigned last_hit = 0;
1772         int binary_match_only = 0;
1773         unsigned count = 0;
1774         int try_lookahead = 0;
1775         int show_function = 0;
1776         struct userdiff_driver *textconv = NULL;
1777         enum grep_context ctx = GREP_CONTEXT_HEAD;
1778         xdemitconf_t xecfg;
1779
1780         if (!opt->status_only && gs->name == NULL)
1781                 BUG("grep call which could print a name requires "
1782                     "grep_source.name be non-NULL");
1783
1784         if (!opt->output)
1785                 opt->output = std_output;
1786
1787         if (opt->pre_context || opt->post_context || opt->file_break ||
1788             opt->funcbody) {
1789                 /* Show hunk marks, except for the first file. */
1790                 if (opt->last_shown)
1791                         opt->show_hunk_mark = 1;
1792                 /*
1793                  * If we're using threads then we can't easily identify
1794                  * the first file.  Always put hunk marks in that case
1795                  * and skip the very first one later in work_done().
1796                  */
1797                 if (opt->output != std_output)
1798                         opt->show_hunk_mark = 1;
1799         }
1800         opt->last_shown = 0;
1801
1802         if (opt->allow_textconv) {
1803                 grep_source_load_driver(gs, opt->repo->index);
1804                 /*
1805                  * We might set up the shared textconv cache data here, which
1806                  * is not thread-safe. Also, get_oid_with_context() and
1807                  * parse_object() might be internally called. As they are not
1808                  * currently thread-safe and might be racy with object reading,
1809                  * obj_read_lock() must be called.
1810                  */
1811                 grep_attr_lock();
1812                 obj_read_lock();
1813                 textconv = userdiff_get_textconv(opt->repo, gs->driver);
1814                 obj_read_unlock();
1815                 grep_attr_unlock();
1816         }
1817
1818         /*
1819          * We know the result of a textconv is text, so we only have to care
1820          * about binary handling if we are not using it.
1821          */
1822         if (!textconv) {
1823                 switch (opt->binary) {
1824                 case GREP_BINARY_DEFAULT:
1825                         if (grep_source_is_binary(gs, opt->repo->index))
1826                                 binary_match_only = 1;
1827                         break;
1828                 case GREP_BINARY_NOMATCH:
1829                         if (grep_source_is_binary(gs, opt->repo->index))
1830                                 return 0; /* Assume unmatch */
1831                         break;
1832                 case GREP_BINARY_TEXT:
1833                         break;
1834                 default:
1835                         BUG("unknown binary handling mode");
1836                 }
1837         }
1838
1839         memset(&xecfg, 0, sizeof(xecfg));
1840         opt->priv = &xecfg;
1841
1842         try_lookahead = should_lookahead(opt);
1843
1844         if (fill_textconv_grep(opt->repo, textconv, gs) < 0)
1845                 return 0;
1846
1847         bol = gs->buf;
1848         left = gs->size;
1849         while (left) {
1850                 char *eol, ch;
1851                 int hit;
1852                 ssize_t cno;
1853                 ssize_t col = -1, icol = -1;
1854
1855                 /*
1856                  * look_ahead() skips quickly to the line that possibly
1857                  * has the next hit; don't call it if we need to do
1858                  * something more than just skipping the current line
1859                  * in response to an unmatch for the current line.  E.g.
1860                  * inside a post-context window, we will show the current
1861                  * line as a context around the previous hit when it
1862                  * doesn't hit.
1863                  */
1864                 if (try_lookahead
1865                     && !(last_hit
1866                          && (show_function ||
1867                              lno <= last_hit + opt->post_context))
1868                     && look_ahead(opt, &left, &lno, &bol))
1869                         break;
1870                 eol = end_of_line(bol, &left);
1871                 ch = *eol;
1872                 *eol = 0;
1873
1874                 if ((ctx == GREP_CONTEXT_HEAD) && (eol == bol))
1875                         ctx = GREP_CONTEXT_BODY;
1876
1877                 hit = match_line(opt, bol, eol, &col, &icol, ctx, collect_hits);
1878                 *eol = ch;
1879
1880                 if (collect_hits)
1881                         goto next_line;
1882
1883                 /* "grep -v -e foo -e bla" should list lines
1884                  * that do not have either, so inversion should
1885                  * be done outside.
1886                  */
1887                 if (opt->invert)
1888                         hit = !hit;
1889                 if (opt->unmatch_name_only) {
1890                         if (hit)
1891                                 return 0;
1892                         goto next_line;
1893                 }
1894                 if (hit) {
1895                         count++;
1896                         if (opt->status_only)
1897                                 return 1;
1898                         if (opt->name_only) {
1899                                 show_name(opt, gs->name);
1900                                 return 1;
1901                         }
1902                         if (opt->count)
1903                                 goto next_line;
1904                         if (binary_match_only) {
1905                                 opt->output(opt, "Binary file ", 12);
1906                                 output_color(opt, gs->name, strlen(gs->name),
1907                                              opt->colors[GREP_COLOR_FILENAME]);
1908                                 opt->output(opt, " matches\n", 9);
1909                                 return 1;
1910                         }
1911                         /* Hit at this line.  If we haven't shown the
1912                          * pre-context lines, we would need to show them.
1913                          */
1914                         if (opt->pre_context || opt->funcbody)
1915                                 show_pre_context(opt, gs, bol, eol, lno);
1916                         else if (opt->funcname)
1917                                 show_funcname_line(opt, gs, bol, lno);
1918                         cno = opt->invert ? icol : col;
1919                         if (cno < 0) {
1920                                 /*
1921                                  * A negative cno indicates that there was no
1922                                  * match on the line. We are thus inverted and
1923                                  * being asked to show all lines that _don't_
1924                                  * match a given expression. Therefore, set cno
1925                                  * to 0 to suggest the whole line matches.
1926                                  */
1927                                 cno = 0;
1928                         }
1929                         show_line(opt, bol, eol, gs->name, lno, cno + 1, ':');
1930                         last_hit = lno;
1931                         if (opt->funcbody)
1932                                 show_function = 1;
1933                         goto next_line;
1934                 }
1935                 if (show_function && (!peek_bol || peek_bol < bol)) {
1936                         unsigned long peek_left = left;
1937                         char *peek_eol = eol;
1938
1939                         /*
1940                          * Trailing empty lines are not interesting.
1941                          * Peek past them to see if they belong to the
1942                          * body of the current function.
1943                          */
1944                         peek_bol = bol;
1945                         while (is_empty_line(peek_bol, peek_eol)) {
1946                                 peek_bol = peek_eol + 1;
1947                                 peek_eol = end_of_line(peek_bol, &peek_left);
1948                         }
1949
1950                         if (match_funcname(opt, gs, peek_bol, peek_eol))
1951                                 show_function = 0;
1952                 }
1953                 if (show_function ||
1954                     (last_hit && lno <= last_hit + opt->post_context)) {
1955                         /* If the last hit is within the post context,
1956                          * we need to show this line.
1957                          */
1958                         show_line(opt, bol, eol, gs->name, lno, col + 1, '-');
1959                 }
1960
1961         next_line:
1962                 bol = eol + 1;
1963                 if (!left)
1964                         break;
1965                 left--;
1966                 lno++;
1967         }
1968
1969         if (collect_hits)
1970                 return 0;
1971
1972         if (opt->status_only)
1973                 return opt->unmatch_name_only;
1974         if (opt->unmatch_name_only) {
1975                 /* We did not see any hit, so we want to show this */
1976                 show_name(opt, gs->name);
1977                 return 1;
1978         }
1979
1980         xdiff_clear_find_func(&xecfg);
1981         opt->priv = NULL;
1982
1983         /* NEEDSWORK:
1984          * The real "grep -c foo *.c" gives many "bar.c:0" lines,
1985          * which feels mostly useless but sometimes useful.  Maybe
1986          * make it another option?  For now suppress them.
1987          */
1988         if (opt->count && count) {
1989                 char buf[32];
1990                 if (opt->pathname) {
1991                         output_color(opt, gs->name, strlen(gs->name),
1992                                      opt->colors[GREP_COLOR_FILENAME]);
1993                         output_sep(opt, ':');
1994                 }
1995                 xsnprintf(buf, sizeof(buf), "%u\n", count);
1996                 opt->output(opt, buf, strlen(buf));
1997                 return 1;
1998         }
1999         return !!last_hit;
2000 }
2001
2002 static void clr_hit_marker(struct grep_expr *x)
2003 {
2004         /* All-hit markers are meaningful only at the very top level
2005          * OR node.
2006          */
2007         while (1) {
2008                 x->hit = 0;
2009                 if (x->node != GREP_NODE_OR)
2010                         return;
2011                 x->u.binary.left->hit = 0;
2012                 x = x->u.binary.right;
2013         }
2014 }
2015
2016 static int chk_hit_marker(struct grep_expr *x)
2017 {
2018         /* Top level nodes have hit markers.  See if they all are hits */
2019         while (1) {
2020                 if (x->node != GREP_NODE_OR)
2021                         return x->hit;
2022                 if (!x->u.binary.left->hit)
2023                         return 0;
2024                 x = x->u.binary.right;
2025         }
2026 }
2027
2028 int grep_source(struct grep_opt *opt, struct grep_source *gs)
2029 {
2030         /*
2031          * we do not have to do the two-pass grep when we do not check
2032          * buffer-wide "all-match".
2033          */
2034         if (!opt->all_match)
2035                 return grep_source_1(opt, gs, 0);
2036
2037         /* Otherwise the toplevel "or" terms hit a bit differently.
2038          * We first clear hit markers from them.
2039          */
2040         clr_hit_marker(opt->pattern_expression);
2041         grep_source_1(opt, gs, 1);
2042
2043         if (!chk_hit_marker(opt->pattern_expression))
2044                 return 0;
2045
2046         return grep_source_1(opt, gs, 0);
2047 }
2048
2049 int grep_buffer(struct grep_opt *opt, char *buf, unsigned long size)
2050 {
2051         struct grep_source gs;
2052         int r;
2053
2054         grep_source_init(&gs, GREP_SOURCE_BUF, NULL, NULL, NULL);
2055         gs.buf = buf;
2056         gs.size = size;
2057
2058         r = grep_source(opt, &gs);
2059
2060         grep_source_clear(&gs);
2061         return r;
2062 }
2063
2064 void grep_source_init(struct grep_source *gs, enum grep_source_type type,
2065                       const char *name, const char *path,
2066                       const void *identifier)
2067 {
2068         gs->type = type;
2069         gs->name = xstrdup_or_null(name);
2070         gs->path = xstrdup_or_null(path);
2071         gs->buf = NULL;
2072         gs->size = 0;
2073         gs->driver = NULL;
2074
2075         switch (type) {
2076         case GREP_SOURCE_FILE:
2077                 gs->identifier = xstrdup(identifier);
2078                 break;
2079         case GREP_SOURCE_OID:
2080                 gs->identifier = oiddup(identifier);
2081                 break;
2082         case GREP_SOURCE_BUF:
2083                 gs->identifier = NULL;
2084                 break;
2085         }
2086 }
2087
2088 void grep_source_clear(struct grep_source *gs)
2089 {
2090         FREE_AND_NULL(gs->name);
2091         FREE_AND_NULL(gs->path);
2092         FREE_AND_NULL(gs->identifier);
2093         grep_source_clear_data(gs);
2094 }
2095
2096 void grep_source_clear_data(struct grep_source *gs)
2097 {
2098         switch (gs->type) {
2099         case GREP_SOURCE_FILE:
2100         case GREP_SOURCE_OID:
2101                 FREE_AND_NULL(gs->buf);
2102                 gs->size = 0;
2103                 break;
2104         case GREP_SOURCE_BUF:
2105                 /* leave user-provided buf intact */
2106                 break;
2107         }
2108 }
2109
2110 static int grep_source_load_oid(struct grep_source *gs)
2111 {
2112         enum object_type type;
2113
2114         gs->buf = read_object_file(gs->identifier, &type, &gs->size);
2115         if (!gs->buf)
2116                 return error(_("'%s': unable to read %s"),
2117                              gs->name,
2118                              oid_to_hex(gs->identifier));
2119         return 0;
2120 }
2121
2122 static int grep_source_load_file(struct grep_source *gs)
2123 {
2124         const char *filename = gs->identifier;
2125         struct stat st;
2126         char *data;
2127         size_t size;
2128         int i;
2129
2130         if (lstat(filename, &st) < 0) {
2131         err_ret:
2132                 if (errno != ENOENT)
2133                         error_errno(_("failed to stat '%s'"), filename);
2134                 return -1;
2135         }
2136         if (!S_ISREG(st.st_mode))
2137                 return -1;
2138         size = xsize_t(st.st_size);
2139         i = open(filename, O_RDONLY);
2140         if (i < 0)
2141                 goto err_ret;
2142         data = xmallocz(size);
2143         if (st.st_size != read_in_full(i, data, size)) {
2144                 error_errno(_("'%s': short read"), filename);
2145                 close(i);
2146                 free(data);
2147                 return -1;
2148         }
2149         close(i);
2150
2151         gs->buf = data;
2152         gs->size = size;
2153         return 0;
2154 }
2155
2156 static int grep_source_load(struct grep_source *gs)
2157 {
2158         if (gs->buf)
2159                 return 0;
2160
2161         switch (gs->type) {
2162         case GREP_SOURCE_FILE:
2163                 return grep_source_load_file(gs);
2164         case GREP_SOURCE_OID:
2165                 return grep_source_load_oid(gs);
2166         case GREP_SOURCE_BUF:
2167                 return gs->buf ? 0 : -1;
2168         }
2169         BUG("invalid grep_source type to load");
2170 }
2171
2172 void grep_source_load_driver(struct grep_source *gs,
2173                              struct index_state *istate)
2174 {
2175         if (gs->driver)
2176                 return;
2177
2178         grep_attr_lock();
2179         if (gs->path)
2180                 gs->driver = userdiff_find_by_path(istate, gs->path);
2181         if (!gs->driver)
2182                 gs->driver = userdiff_find_by_name("default");
2183         grep_attr_unlock();
2184 }
2185
2186 static int grep_source_is_binary(struct grep_source *gs,
2187                                  struct index_state *istate)
2188 {
2189         grep_source_load_driver(gs, istate);
2190         if (gs->driver->binary != -1)
2191                 return gs->driver->binary;
2192
2193         if (!grep_source_load(gs))
2194                 return buffer_is_binary(gs->buf, gs->size);
2195
2196         return 0;
2197 }