|
|
|
@ -54,6 +54,8 @@ static struct grep_expr *compile_pattern_atom(struct grep_pat **list)
@@ -54,6 +54,8 @@ static struct grep_expr *compile_pattern_atom(struct grep_pat **list)
|
|
|
|
|
struct grep_expr *x; |
|
|
|
|
|
|
|
|
|
p = *list; |
|
|
|
|
if (!p) |
|
|
|
|
return NULL; |
|
|
|
|
switch (p->token) { |
|
|
|
|
case GREP_PATTERN: /* atom */ |
|
|
|
|
case GREP_PATTERN_HEAD: |
|
|
|
@ -66,8 +68,6 @@ static struct grep_expr *compile_pattern_atom(struct grep_pat **list)
@@ -66,8 +68,6 @@ static struct grep_expr *compile_pattern_atom(struct grep_pat **list)
|
|
|
|
|
case GREP_OPEN_PAREN: |
|
|
|
|
*list = p->next; |
|
|
|
|
x = compile_pattern_or(list); |
|
|
|
|
if (!x) |
|
|
|
|
return NULL; |
|
|
|
|
if (!*list || (*list)->token != GREP_CLOSE_PAREN) |
|
|
|
|
die("unmatched parenthesis"); |
|
|
|
|
*list = (*list)->next; |
|
|
|
@ -83,6 +83,8 @@ static struct grep_expr *compile_pattern_not(struct grep_pat **list)
@@ -83,6 +83,8 @@ static struct grep_expr *compile_pattern_not(struct grep_pat **list)
|
|
|
|
|
struct grep_expr *x; |
|
|
|
|
|
|
|
|
|
p = *list; |
|
|
|
|
if (!p) |
|
|
|
|
return NULL; |
|
|
|
|
switch (p->token) { |
|
|
|
|
case GREP_NOT: |
|
|
|
|
if (!p->next) |
|
|
|
@ -361,6 +363,8 @@ static int match_expr_eval(struct grep_opt *o,
@@ -361,6 +363,8 @@ static int match_expr_eval(struct grep_opt *o,
|
|
|
|
|
{ |
|
|
|
|
int h = 0; |
|
|
|
|
|
|
|
|
|
if (!x) |
|
|
|
|
die("Not a valid grep expression"); |
|
|
|
|
switch (x->node) { |
|
|
|
|
case GREP_NODE_ATOM: |
|
|
|
|
h = match_one_pattern(o, x->u.atom, bol, eol, ctx); |
|
|
|
|