bc: further simplification in zbc_vm_stdin()
authorDenys Vlasenko <vda.linux@googlemail.com>
Thu, 13 Dec 2018 17:16:39 +0000 (18:16 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 13 Dec 2018 17:16:39 +0000 (18:16 +0100)
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>
miscutils/bc.c

index 74847a32812c83fbc873085cdf01fcb034e368ef..bc294716150aee2768b2a3afe8ac24c98362813b 100644 (file)
@@ -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) {