grep: move logic to compile header pattern into a separate helper
The callers should be queuing only GREP_PATTERN_HEAD elements to the header_list queue; simplify the switch and guard it with an assert. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
e22148f406
commit
95ce9ce296
45
grep.c
45
grep.c
@ -189,29 +189,31 @@ static struct grep_expr *compile_pattern_expr(struct grep_pat **list)
|
||||
return compile_pattern_or(list);
|
||||
}
|
||||
|
||||
static struct grep_expr *prep_header_patterns(struct grep_opt *opt)
|
||||
{
|
||||
struct grep_pat *p;
|
||||
struct grep_expr *header_expr;
|
||||
|
||||
if (!opt->header_list)
|
||||
return NULL;
|
||||
p = opt->header_list;
|
||||
header_expr = compile_pattern_expr(&p);
|
||||
if (p)
|
||||
die("incomplete pattern expression: %s", p->pattern);
|
||||
for (p = opt->header_list; p; p = p->next) {
|
||||
if (p->token != GREP_PATTERN_HEAD)
|
||||
die("bug: a non-header pattern in grep header list.");
|
||||
if (p->field < 0 || GREP_HEADER_FIELD_MAX <= p->field)
|
||||
die("bug: unknown header field %d", p->field);
|
||||
compile_regexp(p, opt);
|
||||
}
|
||||
return header_expr;
|
||||
}
|
||||
|
||||
void compile_grep_patterns(struct grep_opt *opt)
|
||||
{
|
||||
struct grep_pat *p;
|
||||
struct grep_expr *header_expr = NULL;
|
||||
|
||||
if (opt->header_list) {
|
||||
p = opt->header_list;
|
||||
header_expr = compile_pattern_expr(&p);
|
||||
if (p)
|
||||
die("incomplete pattern expression: %s", p->pattern);
|
||||
for (p = opt->header_list; p; p = p->next) {
|
||||
switch (p->token) {
|
||||
case GREP_PATTERN: /* atom */
|
||||
case GREP_PATTERN_HEAD:
|
||||
case GREP_PATTERN_BODY:
|
||||
compile_regexp(p, opt);
|
||||
break;
|
||||
default:
|
||||
opt->extended = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
struct grep_expr *header_expr = prep_header_patterns(opt);
|
||||
|
||||
for (p = opt->pattern_list; p; p = p->next) {
|
||||
switch (p->token) {
|
||||
@ -231,9 +233,6 @@ void compile_grep_patterns(struct grep_opt *opt)
|
||||
else if (!opt->extended)
|
||||
return;
|
||||
|
||||
/* Then bundle them up in an expression.
|
||||
* A classic recursive descent parser would do.
|
||||
*/
|
||||
p = opt->pattern_list;
|
||||
if (p)
|
||||
opt->pattern_expression = compile_pattern_expr(&p);
|
||||
|
Loading…
Reference in New Issue
Block a user