diff.c: associate a flag with each pattern and use it for compiling regex
authorBrandon Casey <casey@nrlssc.navy.mil>
Thu, 18 Sep 2008 22:42:48 +0000 (17:42 -0500)
committerJunio C Hamano <gitster@pobox.com>
Fri, 19 Sep 2008 03:06:23 +0000 (20:06 -0700)
This is in preparation for allowing extended regular expression patterns.

Signed-off-by: Brandon Casey <casey@nrlssc.navy.mil>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff.c
xdiff-interface.c
xdiff-interface.h

diff --git a/diff.c b/diff.c
index 406a76a..6881cf4 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -97,13 +97,14 @@ static int parse_lldiff_command(const char *var, const char *ep, const char *val
 struct funcname_pattern_entry {
        char *name;
        char *pattern;
 struct funcname_pattern_entry {
        char *name;
        char *pattern;
+       int cflags;
 };
 static struct funcname_pattern_list {
        struct funcname_pattern_list *next;
        struct funcname_pattern_entry e;
 } *funcname_pattern_list;
 
 };
 static struct funcname_pattern_list {
        struct funcname_pattern_list *next;
        struct funcname_pattern_entry e;
 } *funcname_pattern_list;
 
-static int parse_funcname_pattern(const char *var, const char *ep, const char *value)
+static int parse_funcname_pattern(const char *var, const char *ep, const char *value, int cflags)
 {
        const char *name;
        int namelen;
 {
        const char *name;
        int namelen;
@@ -123,6 +124,7 @@ static int parse_funcname_pattern(const char *var, const char *ep, const char *v
        }
        free(pp->e.pattern);
        pp->e.pattern = xstrdup(value);
        }
        free(pp->e.pattern);
        pp->e.pattern = xstrdup(value);
+       pp->e.cflags = cflags;
        return 0;
 }
 
        return 0;
 }
 
@@ -185,7 +187,8 @@ int git_diff_basic_config(const char *var, const char *value, void *cb)
                        if (!strcmp(ep, ".funcname")) {
                                if (!value)
                                        return config_error_nonbool(var);
                        if (!strcmp(ep, ".funcname")) {
                                if (!value)
                                        return config_error_nonbool(var);
-                               return parse_funcname_pattern(var, ep, value);
+                               return parse_funcname_pattern(var, ep, value,
+                                       0);
                        }
                }
        }
                        }
                }
        }
@@ -1395,16 +1398,16 @@ static const struct funcname_pattern_entry builtin_funcname_pattern[] = {
                        "new\\|return\\|switch\\|throw\\|while\\)\n"
                        "^[     ]*\\(\\([       ]*"
                        "[A-Za-z_][A-Za-z_0-9]*\\)\\{2,\\}"
                        "new\\|return\\|switch\\|throw\\|while\\)\n"
                        "^[     ]*\\(\\([       ]*"
                        "[A-Za-z_][A-Za-z_0-9]*\\)\\{2,\\}"
-                       "[      ]*([^;]*\\)$" },
+                       "[      ]*([^;]*\\)$", 0 },
        { "pascal", "^\\(\\(procedure\\|function\\|constructor\\|"
                        "destructor\\|interface\\|implementation\\|"
                        "initialization\\|finalization\\)[ \t]*.*\\)$"
                        "\\|"
        { "pascal", "^\\(\\(procedure\\|function\\|constructor\\|"
                        "destructor\\|interface\\|implementation\\|"
                        "initialization\\|finalization\\)[ \t]*.*\\)$"
                        "\\|"
-                       "^\\(.*=[ \t]*\\(class\\|record\\).*\\)$"
-                       },
-       { "bibtex", "\\(@[a-zA-Z]\\{1,\\}[ \t]*{\\{0,1\\}[ \t]*[^ \t\"@',\\#}{~%]*\\).*$" },
-       { "tex", "^\\(\\\\\\(\\(sub\\)*section\\|chapter\\|part\\)\\*\\{0,1\\}{.*\\)$" },
-       { "ruby", "^\\s*\\(\\(class\\|module\\|def\\)\\s.*\\)$" },
+                       "^\\(.*=[ \t]*\\(class\\|record\\).*\\)$",
+                       },
+       { "bibtex", "\\(@[a-zA-Z]\\{1,\\}[ \t]*{\\{0,1\\}[ \t]*[^ \t\"@',\\#}{~%]*\\).*$", 0 },
+       { "tex", "^\\(\\\\\\(\\(sub\\)*section\\|chapter\\|part\\)\\*\\{0,1\\}{.*\\)$", 0 },
+       { "ruby", "^\\s*\\(\\(class\\|module\\|def\\)\\s.*\\)$", 0 },
 };
 
 static const struct funcname_pattern_entry *diff_funcname_pattern(struct diff_filespec *one)
 };
 
 static const struct funcname_pattern_entry *diff_funcname_pattern(struct diff_filespec *one)
@@ -1530,7 +1533,7 @@ static void builtin_diff(const char *name_a,
                xecfg.ctxlen = o->context;
                xecfg.flags = XDL_EMIT_FUNCNAMES;
                if (pe)
                xecfg.ctxlen = o->context;
                xecfg.flags = XDL_EMIT_FUNCNAMES;
                if (pe)
-                       xdiff_set_find_func(&xecfg, pe->pattern);
+                       xdiff_set_find_func(&xecfg, pe->pattern, pe->cflags);
                if (!diffopts)
                        ;
                else if (!prefixcmp(diffopts, "--unified="))
                if (!diffopts)
                        ;
                else if (!prefixcmp(diffopts, "--unified="))
index 61dc5c5..2c81f40 100644 (file)
@@ -206,7 +206,7 @@ static long ff_regexp(const char *line, long len,
        return result;
 }
 
        return result;
 }
 
-void xdiff_set_find_func(xdemitconf_t *xecfg, const char *value)
+void xdiff_set_find_func(xdemitconf_t *xecfg, const char *value, int cflags)
 {
        int i;
        struct ff_regs *regs;
 {
        int i;
        struct ff_regs *regs;
@@ -231,7 +231,7 @@ void xdiff_set_find_func(xdemitconf_t *xecfg, const char *value)
                        expression = buffer = xstrndup(value, ep - value);
                else
                        expression = value;
                        expression = buffer = xstrndup(value, ep - value);
                else
                        expression = value;
-               if (regcomp(&reg->re, expression, 0))
+               if (regcomp(&reg->re, expression, cflags))
                        die("Invalid regexp to look for hunk header: %s", expression);
                free(buffer);
                value = ep + 1;
                        die("Invalid regexp to look for hunk header: %s", expression);
                free(buffer);
                value = ep + 1;
index f7f791d..33cab9d 100644 (file)
@@ -21,6 +21,6 @@ int parse_hunk_header(char *line, int len,
 int read_mmfile(mmfile_t *ptr, const char *filename);
 int buffer_is_binary(const char *ptr, unsigned long size);
 
 int read_mmfile(mmfile_t *ptr, const char *filename);
 int buffer_is_binary(const char *ptr, unsigned long size);
 
-extern void xdiff_set_find_func(xdemitconf_t *xecfg, const char *line);
+extern void xdiff_set_find_func(xdemitconf_t *xecfg, const char *line, int cflags);
 
 #endif
 
 #endif