@@ -35,6 +35,9 @@ get_line_type(const char *line)
35
35
for (type = 0 ; type < line_rules ; type ++ ) {
36
36
struct line_rule * rule = & line_rule [type ];
37
37
38
+ if (rule -> regex && !regexec (rule -> regex , line , 0 , NULL , 0 ))
39
+ return type ;
40
+
38
41
/* Case insensitive search matches Signed-off-by lines better. */
39
42
if (rule -> linelen && linelen >= rule -> linelen &&
40
43
!strncasecmp (rule -> line , line , rule -> linelen ))
@@ -89,7 +92,7 @@ get_line_info(const char *prefix, enum line_type type)
89
92
}
90
93
91
94
static struct line_info *
92
- init_line_info (const char * prefix , const char * name , size_t namelen , const char * line , size_t linelen )
95
+ init_line_info (const char * prefix , const char * name , size_t namelen , const char * line , size_t linelen , regex_t * regex )
93
96
{
94
97
struct line_rule * rule ;
95
98
@@ -101,6 +104,7 @@ init_line_info(const char *prefix, const char *name, size_t namelen, const char
101
104
rule -> namelen = namelen ;
102
105
rule -> line = line ;
103
106
rule -> linelen = linelen ;
107
+ rule -> regex = regex ;
104
108
105
109
rule -> info .prefix = prefix ;
106
110
rule -> info .fg = COLOR_DEFAULT ;
@@ -110,7 +114,7 @@ init_line_info(const char *prefix, const char *name, size_t namelen, const char
110
114
}
111
115
112
116
#define INIT_BUILTIN_LINE_INFO (type , line ) \
113
- init_line_info(NULL, #type, STRING_SIZE(#type), (line), STRING_SIZE(line))
117
+ init_line_info(NULL, #type, STRING_SIZE(#type), (line), STRING_SIZE(line), NULL )
114
118
115
119
static struct line_rule *
116
120
find_line_rule (struct line_rule * query )
@@ -145,11 +149,15 @@ add_line_rule(const char *prefix, struct line_rule *query)
145
149
if (query -> name )
146
150
return NULL ;
147
151
148
- /* Quoted line. */
149
- query -> line = strndup (query -> line , query -> linelen );
150
- if (!query -> line )
151
- return NULL ;
152
- return init_line_info (prefix , "" , 0 , query -> line , query -> linelen );
152
+ return init_line_info (prefix , "" , 0 , query -> line , query -> linelen , query -> regex );
153
+ }
154
+
155
+ /* When a rule already exists and we are just adding view-specific
156
+ * colors, query->line and query->regex can be freed. */
157
+ free ((void * ) query -> line );
158
+ if (query -> regex ) {
159
+ regfree (query -> regex );
160
+ free (query -> regex );
153
161
}
154
162
155
163
for (info = & rule -> info ; info ; last = info , info = info -> next )
0 commit comments