aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-12-13 18:16:39 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2018-12-13 18:16:39 +0100
commitb7e61e3e4adc774d18b6377cdd6434dd7ce0c2be (patch)
treee9f83934ac714c349423905a35a618f5a3baf9fe
parent818b602c8859cd935083e183eb772becc26acfb3 (diff)
downloadbusybox-b7e61e3e4adc774d18b6377cdd6434dd7ce0c2be.tar.gz
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 <vda.linux@googlemail.com>
-rw-r--r--miscutils/bc.c69
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) {