diff options
Diffstat (limited to 'miscutils/bc.c')
-rw-r--r-- | miscutils/bc.c | 69 |
1 files changed, 34 insertions, 35 deletions
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) { |