diff options
-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 9ce6ab667..8aaeeaf9f 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) | |||
4358 | { | 4358 | { |
4359 | BcStatus s; | 4359 | BcStatus s; |
4360 | size_t i; | 4360 | size_t i; |
4361 | BcInstPtr *ip; | ||
4362 | 4361 | ||
4363 | if (type == BC_LEX_KEY_BREAK) { | 4362 | if (type == BC_LEX_KEY_BREAK) { |
4364 | if (p->exits.len == 0) RETURN_STATUS(bc_error_bad_token()); | 4363 | BcInstPtr *ipp; |
4365 | |||
4366 | i = p->exits.len - 1; | ||
4367 | ip = bc_vec_item(&p->exits, i); | ||
4368 | |||
4369 | while (!ip->func && i < p->exits.len) | ||
4370 | ip = bc_vec_item(&p->exits, i--); | ||
4371 | if (i >= p->exits.len && !ip->func) | ||
4372 | RETURN_STATUS(bc_error_bad_token()); | ||
4373 | 4364 | ||
4374 | i = ip->idx; | 4365 | i = p->exits.len; |
4366 | for (;;) { | ||
4367 | if (i == 0) // none of the enclosing blocks is a loop | ||
4368 | RETURN_STATUS(bc_error_bad_token()); | ||
4369 | ipp = bc_vec_item(&p->exits, --i); | ||
4370 | if (ipp->func != 0) | ||
4371 | break; | ||
4372 | } | ||
4373 | i = ipp->idx; | ||
4375 | } | 4374 | } |
4376 | else | 4375 | else |
4377 | i = *((size_t *) bc_vec_top(&p->conds)); | 4376 | i = *((size_t *) bc_vec_top(&p->conds)); |