diff options
| author | Toby Goodwin <toby@nqmail.org> | 2018-08-08 22:47:02 +0100 |
|---|---|---|
| committer | Toby Goodwin <toby@nqmail.org> | 2018-08-08 22:47:02 +0100 |
| commit | 30b5d93c057e582d10577796fe5fe296b4498ac2 (patch) | |
| tree | 9c320447a07fd58a8a21788c826d6b60161fae41 | |
| parent | 9d071b26bf1b1dcd71efb06dc4fb6c25803856a0 (diff) | |
improved implementation of if_state inspired by borkovic
| -rw-r--r-- | walk.c | 20 |
1 files changed, 10 insertions, 10 deletions
@@ -18,8 +18,9 @@ static bool isallpre(Node *); static bool dofork(bool); static void dopipe(Node *); static void loop_body(Node* n); -static int if_state = 2; /* last if, for "if not" interactive top-level */ -static int old_if_state = 2; + +enum if_state { if_false, if_true, if_nothing }; +enum if_state if_last = if_nothing; /* Tail-recursive version of walk() */ @@ -35,7 +36,6 @@ top: sigchk(); set(TRUE); return TRUE; } - if ((n->type != nIf) && (n->type != nIfnot)) if_state = 2; switch (n->type) { case nArgs: case nBackq: case nConcat: case nCount: case nFlat: case nLappend: case nRedir: case nVar: @@ -93,25 +93,25 @@ top: sigchk(); break; case nIf: { bool oldcond = cond; + enum if_state if_this; Node *true_cmd = n->u[1].p, *false_cmd = NULL; if (true_cmd != NULL && true_cmd->type == nElse) { false_cmd = true_cmd->u[1].p; true_cmd = true_cmd->u[0].p; } cond = TRUE; - if_state = walk(n->u[0].p, TRUE); + if_this = walk(n->u[0].p, TRUE); cond = oldcond; - old_if_state = if_state; - walk(if_state ? true_cmd : false_cmd, parent); - if_state = old_if_state; + if (if_last == if_nothing) if_last = if_this; + walk(if_this ? true_cmd : false_cmd, parent); break; } case nIfnot: { - if (if_state == 2) + if (if_last == if_nothing) rc_error("`if not' must follow `if'"); - if (if_state == 0) + if (if_last == if_false) walk(n->u[0].p, TRUE); - if_state = 2; + if_last = if_nothing; break; } case nWhile: { |