shell/math: remove special code to handle a?b?c:d:e, it works without it now

The "hack" to virtually parenthesize ? EXPR : made this unnecessary.
The expression is effectively a?(b?(c):d):e and thus b?c:d is evaluated
before continuing with the second :

function                                             old     new   delta
evaluate_string                                     1148    1132     -16

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2023-06-15 11:19:15 +02:00
parent 5f56a03882
commit 61a4959251
5 changed files with 9 additions and 9 deletions

View File

@ -0,0 +1 @@
3:3

View File

@ -0,0 +1,2 @@
exec 2>&1
echo 3:$((0?1:2?3:4?5:6?7:8))

View File

@ -0,0 +1 @@
3:3

View File

@ -0,0 +1,2 @@
exec 2>&1
echo 3:$((0?1:2?3:4?5:6?7:8))

View File

@ -840,15 +840,9 @@ evaluate_string(arith_state_t *math_state, const char *expr)
if (prev_prec < prec
|| (prev_prec == prec && is_right_associative(prec))
) {
/* Unless a?b?c:d:... and we are at the second : */
if (op != TOK_CONDITIONAL_SEP
|| prev_op != TOK_CONDITIONAL_SEP
) {
/* ...x~y@: push @ on opstack */
opstackptr++; /* undo removal of ~ op */
goto push_op;
}
/* else: a?b?c:d:. Evaluate b?c:d, replace it on stack with result. Then repeat */
/* ...x~y@: push @ on opstack */
opstackptr++; /* undo removal of ~ op */
goto push_op;
}
/* else: ...x~y@. Evaluate x~y, replace it on stack with result. Then repeat */
}