regex: use regexec_buf()
[gitweb.git] / grep.c
diff --git a/grep.c b/grep.c
index b58c7c64342698737f9c11b20457bd30ca1fc727..8ed56236f049a47490f2c14d999a13e21b98fd2c 100644 (file)
--- a/grep.c
+++ b/grep.c
@@ -31,14 +31,14 @@ void init_grep_defaults(void)
        opt->max_depth = -1;
        opt->pattern_type_option = GREP_PATTERN_TYPE_UNSPECIFIED;
        opt->extended_regexp_option = 0;
-       strcpy(opt->color_context, "");
-       strcpy(opt->color_filename, "");
-       strcpy(opt->color_function, "");
-       strcpy(opt->color_lineno, "");
-       strcpy(opt->color_match_context, GIT_COLOR_BOLD_RED);
-       strcpy(opt->color_match_selected, GIT_COLOR_BOLD_RED);
-       strcpy(opt->color_selected, "");
-       strcpy(opt->color_sep, GIT_COLOR_CYAN);
+       color_set(opt->color_context, "");
+       color_set(opt->color_filename, "");
+       color_set(opt->color_function, "");
+       color_set(opt->color_lineno, "");
+       color_set(opt->color_match_context, GIT_COLOR_BOLD_RED);
+       color_set(opt->color_match_selected, GIT_COLOR_BOLD_RED);
+       color_set(opt->color_selected, "");
+       color_set(opt->color_sep, GIT_COLOR_CYAN);
        opt->color = -1;
 }
 
@@ -151,14 +151,14 @@ void grep_init(struct grep_opt *opt, const char *prefix)
        opt->regflags = def->regflags;
        opt->relative = def->relative;
 
-       strcpy(opt->color_context, def->color_context);
-       strcpy(opt->color_filename, def->color_filename);
-       strcpy(opt->color_function, def->color_function);
-       strcpy(opt->color_lineno, def->color_lineno);
-       strcpy(opt->color_match_context, def->color_match_context);
-       strcpy(opt->color_match_selected, def->color_match_selected);
-       strcpy(opt->color_selected, def->color_selected);
-       strcpy(opt->color_sep, def->color_sep);
+       color_set(opt->color_context, def->color_context);
+       color_set(opt->color_filename, def->color_filename);
+       color_set(opt->color_function, def->color_function);
+       color_set(opt->color_lineno, def->color_lineno);
+       color_set(opt->color_match_context, def->color_match_context);
+       color_set(opt->color_match_selected, def->color_match_selected);
+       color_set(opt->color_selected, def->color_selected);
+       color_set(opt->color_sep, def->color_sep);
 }
 
 void grep_commit_pattern_type(enum grep_pattern_type pattern_type, struct grep_opt *opt)
@@ -306,9 +306,9 @@ static NORETURN void compile_regexp_failed(const struct grep_pat *p,
        char where[1024];
 
        if (p->no)
-               sprintf(where, "In '%s' at %d, ", p->origin, p->no);
+               xsnprintf(where, sizeof(where), "In '%s' at %d, ", p->origin, p->no);
        else if (p->origin)
-               sprintf(where, "%s, ", p->origin);
+               xsnprintf(where, sizeof(where), "%s, ", p->origin);
        else
                where[0] = 0;
 
@@ -848,17 +848,6 @@ static int fixmatch(struct grep_pat *p, char *line, char *eol,
        }
 }
 
-static int regmatch(const regex_t *preg, char *line, char *eol,
-                   regmatch_t *match, int eflags)
-{
-#ifdef REG_STARTEND
-       match->rm_so = 0;
-       match->rm_eo = eol - line;
-       eflags |= REG_STARTEND;
-#endif
-       return regexec(preg, line, 1, match, eflags);
-}
-
 static int patmatch(struct grep_pat *p, char *line, char *eol,
                    regmatch_t *match, int eflags)
 {
@@ -869,7 +858,8 @@ static int patmatch(struct grep_pat *p, char *line, char *eol,
        else if (p->pcre_regexp)
                hit = !pcrematch(p, line, eol, match, eflags);
        else
-               hit = !regmatch(&p->regexp, line, eol, match, eflags);
+               hit = !regexec_buf(&p->regexp, line, eol - line, 1, match,
+                                  eflags);
 
        return hit;
 }
@@ -1741,7 +1731,7 @@ static int grep_source_load_file(struct grep_source *gs)
        i = open(filename, O_RDONLY);
        if (i < 0)
                goto err_ret;
-       data = xmalloc(size + 1);
+       data = xmallocz(size);
        if (st.st_size != read_in_full(i, data, size)) {
                error(_("'%s': short read %s"), filename, strerror(errno));
                close(i);
@@ -1749,7 +1739,6 @@ static int grep_source_load_file(struct grep_source *gs)
                return -1;
        }
        close(i);
-       data[size] = 0;
 
        gs->buf = data;
        gs->size = size;