bc: simplify zbc_parse_break_or_continue(), logic is the same
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 16 Dec 2018 18:47:40 +0000 (19:47 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 16 Dec 2018 18:47:40 +0000 (19:47 +0100)
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>
miscutils/bc.c

index 9ce6ab66741361c0638a358c423879656f80c142..8aaeeaf9f94af7598a7158cdb2e36ebed8150d0a 100644 (file)
@@ -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));