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>
Junio C Hamano committed
Sep 12, 2010 at 19:30 UTC
95ce9ce296e1636a2b78e73b96905d781ef2ddc7
1 file changed
+22
-23
grep.c
+22
-23
@@ -189,29 +189,31 @@ static struct grep_expr *compile_pattern_expr(struct grep_pat **list)
189
return compile_pattern_or(list);
190
}
191
192
-void compile_grep_patterns(struct grep_opt *opt)
192
+static struct grep_expr *prep_header_patterns(struct grep_opt *opt)
193
{
194
struct grep_pat *p;
195
- struct grep_expr *header_expr = NULL;
196
-
197
- if (opt->header_list) {
198
- p = opt->header_list;
199
- header_expr = compile_pattern_expr(&p);
200
- if (p)
201
- die("incomplete pattern expression: %s", p->pattern);
202
- for (p = opt->header_list; p; p = p->next) {
203
- switch (p->token) {
204
- case GREP_PATTERN: /* atom */
205
- case GREP_PATTERN_HEAD:
206
- case GREP_PATTERN_BODY:
207
- compile_regexp(p, opt);
208
- break;
209
- default:
210
- opt->extended = 1;
211
- break;
212
- }
213
- }
195
+ struct grep_expr *header_expr;
196
+
197
+ if (!opt->header_list)
198
+ return NULL;
199
+ p = opt->header_list;
200
+ header_expr = compile_pattern_expr(&p);
201
+ if (p)
202
+ die("incomplete pattern expression: %s", p->pattern);
203
+ for (p = opt->header_list; p; p = p->next) {
204
+ if (p->token != GREP_PATTERN_HEAD)
205
+ die("bug: a non-header pattern in grep header list.");
206
+ if (p->field < 0 || GREP_HEADER_FIELD_MAX <= p->field)
207
+ die("bug: unknown header field %d", p->field);
208
+ compile_regexp(p, opt);
209
}
210
+ return header_expr;
211
+}
212
+
213
+void compile_grep_patterns(struct grep_opt *opt)
214
+{
215
+ struct grep_pat *p;
216
+ struct grep_expr *header_expr = prep_header_patterns(opt);
217
218
for (p = opt->pattern_list; p; p = p->next) {
219
switch (p->token) {
@@ -231,9 +233,6 @@ void compile_grep_patterns(struct grep_opt *opt)
233
else if (!opt->extended)
234
return;
235
234
- /* Then bundle them up in an expression.
235
- * A classic recursive descent parser would do.
236
- */
236
p = opt->pattern_list;
237
if (p)
238
opt->pattern_expression = compile_pattern_expr(&p);