From: Denys Vlasenko Date: Thu, 13 Dec 2018 17:16:39 +0000 (+0100) Subject: bc: further simplification in zbc_vm_stdin() X-Git-Tag: 1_30_0~184 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=b7e61e3e4adc774d18b6377cdd6434dd7ce0c2be;p=oweals%2Fbusybox.git bc: further simplification in zbc_vm_stdin() function old new delta bc_vm_run 500 523 +23 bc_vec_concat 66 - -66 ------------------------------------------------------------------------------ (add/remove: 0/1 grow/shrink: 1/0 up/down: 23/-66) Total: -43 bytes Signed-off-by: Denys Vlasenko --- diff --git a/miscutils/bc.c b/miscutils/bc.c index 74847a328..bc2947161 100644 --- a/miscutils/bc.c +++ b/miscutils/bc.c @@ -7058,50 +7058,49 @@ static BC_STATUS zbc_vm_stdin(void) comment = false; str = 0; for (;;) { - size_t len; + char *string; bc_read_line(&buf); - len = buf.len - 1; - if (len == 0) // "" buf means EOF + if (buf.len <= 1) // "" buf means EOF break; - if (len == 1) { - if (str && buf.v[0] == G.send) - str -= 1; - else if (buf.v[0] == G.sbgn) - str += 1; - } else { - char *string = buf.v; - while (*string) { - char c = *string; - if (string == buf.v || string[-1] != '\\') { - // checking applet type is cheaper than accessing sbgn/send - if (IS_BC) // bc: sbgn = send = '"' - str ^= (c == '"'); - else { // dc: sbgn = '[', send = ']' - if (c == ']') - str -= 1; - else if (c == '[') - str += 1; - } - } - string++; - if (c == '/' && *string == '*') { - comment = true; - string++; - continue; - } - if (c == '*' && *string == '/') { - comment = false; - string++; + + string = buf.v; + while (*string) { + char c = *string; + if (string == buf.v || string[-1] != '\\') { + // checking applet type is cheaper than accessing sbgn/send + if (IS_BC) // bc: sbgn = send = '"' + str ^= (c == '"'); + else { // dc: sbgn = '[', send = ']' + if (c == ']') + str -= 1; + else if (c == '[') + str += 1; } } - if (str || comment || string[-2] == '\\') { - bc_vec_concat(&buffer, buf.v); + string++; + if (c == '/' && *string == '*') { + comment = true; + string++; continue; } + if (c == '*' && *string == '/') { + comment = false; + string++; + } } - bc_vec_concat(&buffer, buf.v); + if (str || comment) + continue; + + // Check for backslash+newline. + // we do not check that last char is '\n' - + // if it is not, then it's EOF, and looping back + // to bc_read_line() will detect it: + string -= 2; + if (string >= buf.v && *string == '\\') + continue; + s = zbc_vm_process(buffer.v); if (s) { if (ENABLE_FEATURE_CLEAN_UP && !G_ttyin) {