@@ -96,32 +96,37 @@ static int parse_lldiff_command(const char *var, const char *ep, const char *val
9696 * to define a customized regexp to find the beginning of a function to
9797 * be used for hunk header lines of "diff -p" style output.
9898 */
99- static struct funcname_pattern {
99+ struct funcname_pattern_entry {
100100 char * name ;
101101 char * pattern ;
102- struct funcname_pattern * next ;
102+ int cflags ;
103+ };
104+ static struct funcname_pattern_list {
105+ struct funcname_pattern_list * next ;
106+ struct funcname_pattern_entry e ;
103107} * funcname_pattern_list ;
104108
105- static int parse_funcname_pattern (const char * var , const char * ep , const char * value )
109+ static int parse_funcname_pattern (const char * var , const char * ep , const char * value , int cflags )
106110{
107111 const char * name ;
108112 int namelen ;
109- struct funcname_pattern * pp ;
113+ struct funcname_pattern_list * pp ;
110114
111115 name = var + 5 ; /* "diff." */
112116 namelen = ep - name ;
113117
114118 for (pp = funcname_pattern_list ; pp ; pp = pp -> next )
115- if (!strncmp (pp -> name , name , namelen ) && !pp -> name [namelen ])
119+ if (!strncmp (pp -> e . name , name , namelen ) && !pp -> e . name [namelen ])
116120 break ;
117121 if (!pp ) {
118122 pp = xcalloc (1 , sizeof (* pp ));
119- pp -> name = xmemdupz (name , namelen );
123+ pp -> e . name = xmemdupz (name , namelen );
120124 pp -> next = funcname_pattern_list ;
121125 funcname_pattern_list = pp ;
122126 }
123- free (pp -> pattern );
124- pp -> pattern = xstrdup (value );
127+ free (pp -> e .pattern );
128+ pp -> e .pattern = xstrdup (value );
129+ pp -> e .cflags = cflags ;
125130 return 0 ;
126131}
127132
@@ -194,7 +199,13 @@ int git_diff_basic_config(const char *var, const char *value, void *cb)
194199 if (!strcmp (ep , ".funcname" )) {
195200 if (!value )
196201 return config_error_nonbool (var );
197- return parse_funcname_pattern (var , ep , value );
202+ return parse_funcname_pattern (var , ep , value ,
203+ 0 );
204+ } else if (!strcmp (ep , ".xfuncname" )) {
205+ if (!value )
206+ return config_error_nonbool (var );
207+ return parse_funcname_pattern (var , ep , value ,
208+ REG_EXTENDED );
198209 }
199210 }
200211 }
@@ -1400,42 +1411,45 @@ int diff_filespec_is_binary(struct diff_filespec *one)
14001411 return one -> is_binary ;
14011412}
14021413
1403- static const char * funcname_pattern (const char * ident )
1414+ static const struct funcname_pattern_entry * funcname_pattern (const char * ident )
14041415{
1405- struct funcname_pattern * pp ;
1416+ struct funcname_pattern_list * pp ;
14061417
14071418 for (pp = funcname_pattern_list ; pp ; pp = pp -> next )
1408- if (!strcmp (ident , pp -> name ))
1409- return pp -> pattern ;
1419+ if (!strcmp (ident , pp -> e . name ))
1420+ return & pp -> e ;
14101421 return NULL ;
14111422}
14121423
1413- static struct builtin_funcname_pattern {
1414- const char * name ;
1415- const char * pattern ;
1416- } builtin_funcname_pattern [] = {
1417- { "bibtex" , "\\(@[a-zA-Z]\\{1,\\}[ \t]*{\\{0,1\\}[ \t]*[^ \t\"@',\\#}{~%]*\\).*$" },
1418- { "html" , "^\\s*\\(<[Hh][1-6]\\s.*>.*\\)$" },
1419- { "java" , "!^[ ]*\\(catch\\|do\\|for\\|if\\|instanceof\\|"
1420- "new\\|return\\|switch\\|throw\\|while\\)\n"
1421- "^[ ]*\\(\\([ ]*"
1422- "[A-Za-z_][A-Za-z_0-9]*\\)\\{2,\\}"
1423- "[ ]*([^;]*\\)$" },
1424- { "pascal" , "^\\(\\(procedure\\|function\\|constructor\\|"
1425- "destructor\\|interface\\|implementation\\|"
1426- "initialization\\|finalization\\)[ \t]*.*\\)$"
1427- "\\|"
1428- "^\\(.*=[ \t]*\\(class\\|record\\).*\\)$"
1429- },
1430- { "php" , "^[\t ]*\\(\\(function\\|class\\).*\\)" },
1431- { "python" , "^\\s*\\(\\(class\\|def\\)\\s.*\\)$" },
1432- { "ruby" , "^\\s*\\(\\(class\\|module\\|def\\)\\s.*\\)$" },
1433- { "tex" , "^\\(\\\\\\(\\(sub\\)*section\\|chapter\\|part\\)\\*\\{0,1\\}{.*\\)$" },
1424+ static const struct funcname_pattern_entry builtin_funcname_pattern [] = {
1425+ { "bibtex" , "(@[a-zA-Z]{1,}[ \t]*\\{{0,1}[ \t]*[^ \t\"@',\\#}{~%]*).*$" ,
1426+ REG_EXTENDED },
1427+ { "html" , "^[ \t]*(<[Hh][1-6][ \t].*>.*)$" , REG_EXTENDED },
1428+ { "java" ,
1429+ "!^[ \t]*(catch|do|for|if|instanceof|new|return|switch|throw|while)\n"
1430+ "^[ \t]*(([ \t]*[A-Za-z_][A-Za-z_0-9]*){2,}[ \t]*\\([^;]*)$" ,
1431+ REG_EXTENDED },
1432+ { "pascal" ,
1433+ "^((procedure|function|constructor|destructor|interface|"
1434+ "implementation|initialization|finalization)[ \t]*.*)$"
1435+ "\n"
1436+ "^(.*=[ \t]*(class|record).*)$" ,
1437+ REG_EXTENDED },
1438+ { "php" , "^[\t ]*((function|class).*)" , REG_EXTENDED },
1439+ { "python" , "^[ \t]*((class|def)[ \t].*)$" , REG_EXTENDED },
1440+ { "ruby" , "^[ \t]*((class|module|def)[ \t].*)$" ,
1441+ REG_EXTENDED },
1442+ { "bibtex" , "(@[a-zA-Z]{1,}[ \t]*\\{{0,1}[ \t]*[^ \t\"@',\\#}{~%]*).*$" ,
1443+ REG_EXTENDED },
1444+ { "tex" ,
1445+ "^(\\\\((sub)*section|chapter|part)\\*{0,1}\\{.*)$" ,
1446+ REG_EXTENDED },
14341447};
14351448
1436- static const char * diff_funcname_pattern (struct diff_filespec * one )
1449+ static const struct funcname_pattern_entry * diff_funcname_pattern (struct diff_filespec * one )
14371450{
1438- const char * ident , * pattern ;
1451+ const char * ident ;
1452+ const struct funcname_pattern_entry * pe ;
14391453 int i ;
14401454
14411455 diff_filespec_check_attr (one );
@@ -1450,17 +1464,17 @@ static const char *diff_funcname_pattern(struct diff_filespec *one)
14501464 return funcname_pattern ("default" );
14511465
14521466 /* Look up custom "funcname.$ident" regexp from config. */
1453- pattern = funcname_pattern (ident );
1454- if (pattern )
1455- return pattern ;
1467+ pe = funcname_pattern (ident );
1468+ if (pe )
1469+ return pe ;
14561470
14571471 /*
14581472 * And define built-in fallback patterns here. Note that
14591473 * these can be overridden by the user's config settings.
14601474 */
14611475 for (i = 0 ; i < ARRAY_SIZE (builtin_funcname_pattern ); i ++ )
14621476 if (!strcmp (ident , builtin_funcname_pattern [i ].name ))
1463- return builtin_funcname_pattern [i ]. pattern ;
1477+ return & builtin_funcname_pattern [i ];
14641478
14651479 return NULL ;
14661480}
@@ -1556,11 +1570,11 @@ static void builtin_diff(const char *name_a,
15561570 xdemitconf_t xecfg ;
15571571 xdemitcb_t ecb ;
15581572 struct emit_callback ecbdata ;
1559- const char * funcname_pattern ;
1573+ const struct funcname_pattern_entry * pe ;
15601574
1561- funcname_pattern = diff_funcname_pattern (one );
1562- if (!funcname_pattern )
1563- funcname_pattern = diff_funcname_pattern (two );
1575+ pe = diff_funcname_pattern (one );
1576+ if (!pe )
1577+ pe = diff_funcname_pattern (two );
15641578
15651579 memset (& xecfg , 0 , sizeof (xecfg ));
15661580 memset (& ecbdata , 0 , sizeof (ecbdata ));
@@ -1572,8 +1586,8 @@ static void builtin_diff(const char *name_a,
15721586 xpp .flags = XDF_NEED_MINIMAL | o -> xdl_opts ;
15731587 xecfg .ctxlen = o -> context ;
15741588 xecfg .flags = XDL_EMIT_FUNCNAMES ;
1575- if (funcname_pattern )
1576- xdiff_set_find_func (& xecfg , funcname_pattern );
1589+ if (pe )
1590+ xdiff_set_find_func (& xecfg , pe -> pattern , pe -> cflags );
15771591 if (!diffopts )
15781592 ;
15791593 else if (!prefixcmp (diffopts , "--unified=" ))
0 commit comments