static struct grep_expr *compile_pattern_not(struct grep_pat **list) { struct grep_pat *p; struct grep_expr *x; p = *list; switch (p->token) { case GREP_NOT: if (!p->next) die("--not not followed by pattern expression"); *list = p->next; x = xcalloc(1, sizeof (struct grep_expr)); x->node = GREP_NODE_NOT; x->u.unary = compile_pattern_not(list); if (!x->u.unary) die("--not followed by non pattern expression"); return x; default: return compile_pattern_atom(list); } }
static struct grep_expr *compile_pattern_and(struct grep_pat **list) { struct grep_pat *p; struct grep_expr *x, *y, *z; x = compile_pattern_not(list); p = *list; if (p && p->token == GREP_AND) { if (!p->next) die("--and not followed by pattern expression"); *list = p->next; y = compile_pattern_and(list); if (!y) die("--and not followed by pattern expression"); z = xcalloc(1, sizeof (struct grep_expr)); z->node = GREP_NODE_AND; z->u.binary.left = x; z->u.binary.right = y; return z; } return x; }