diff options
author | Denys Vlasenko | 2018-12-16 19:47:40 +0100 |
---|---|---|
committer | Denys Vlasenko | 2018-12-16 19:47:40 +0100 |
commit | 563d93c9a4e2a784dfbec6703c572fb88eb99332 (patch) | |
tree | ea3f51b2ff14f2aced5f723564dfb92a90658c14 | |
parent | a50576a415a9b5d384a28c9bd4b55a4df2974248 (diff) | |
download | busybox-563d93c9a4e2a784dfbec6703c572fb88eb99332.zip busybox-563d93c9a4e2a784dfbec6703c572fb88eb99332.tar.gz |
bc: simplify zbc_parse_break_or_continue(), logic is the same
function old new delta
zbc_parse_stmt_possibly_auto 2259 2224 -35
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-35) Total: -35 bytes
text data bss dec hex filename
982218 485 7296 989999 f1b2f busybox_old
982183 485 7296 989964 f1b0c busybox_unstripped
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | miscutils/bc.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c index 9ce6ab6..8aaeeaf 100644 --- a/miscutils/bc.c +++ b/miscutils/bc.c @@ -4358,20 +4358,19 @@ static BC_STATUS zbc_parse_break_or_continue(BcParse *p, BcLexType type) { BcStatus s; size_t i; - BcInstPtr *ip; if (type == BC_LEX_KEY_BREAK) { - if (p->exits.len == 0) RETURN_STATUS(bc_error_bad_token()); - - i = p->exits.len - 1; - ip = bc_vec_item(&p->exits, i); - - while (!ip->func && i < p->exits.len) - ip = bc_vec_item(&p->exits, i--); - if (i >= p->exits.len && !ip->func) - RETURN_STATUS(bc_error_bad_token()); + BcInstPtr *ipp; - i = ip->idx; + i = p->exits.len; + for (;;) { + if (i == 0) // none of the enclosing blocks is a loop + RETURN_STATUS(bc_error_bad_token()); + ipp = bc_vec_item(&p->exits, --i); + if (ipp->func != 0) + break; + } + i = ipp->idx; } else i = *((size_t *) bc_vec_top(&p->conds)); |