bc: further zbc_vm_stdin() optimizations
authorDenys Vlasenko <vda.linux@googlemail.com>
Thu, 13 Dec 2018 16:36:41 +0000 (17:36 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 13 Dec 2018 16:36:41 +0000 (17:36 +0100)
function                                             old     new   delta
bc_vm_run                                            534     514     -20

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
miscutils/bc.c

index 7ab320a4d334b2ef7a4c3c230feebadc7a6560d8..9c7e69fc182795dc08fc9b9ced2273dc39f79efe 100644 (file)
@@ -7072,11 +7072,9 @@ static BC_STATUS zbc_vm_stdin(void)
                        else if (buf.v[0] == G.sbgn)
                                str += 1;
                } else {
-                       size_t i;
-                       for (i = 0; i < len; ++i) {
-                               char c = string[i];
-
-                               if (i - 1 > len || string[i - 1] != '\\') {
+                       while (*string) {
+                               char c = *string;
+                               if (string != buf.v && string[-1] != '\\') {
                                        // checking applet type is cheaper than accessing sbgn/send
                                        if (IS_DC) // dc: sbgn = send = '"'
                                                str ^= (c == '"');
@@ -7087,16 +7085,15 @@ static BC_STATUS zbc_vm_stdin(void)
                                                        str += 1;
                                        }
                                }
-
-                               if (c == '/' && !comment && string[i + 1] == '*') {
+                               string++;
+                               if (c == '/' && *string == '*') {
                                        comment = true;
                                        break;
                                }
-                               else if (c == '*' && comment && string[i + 1] == '/')
+                               if (c == '*' && *string == '/')
                                        comment = false;
                        }
-
-                       if (str || comment || string[len - 2] == '\\') {
+                       if (str || comment || string[-2] == '\\') {
                                bc_vec_concat(&buffer, buf.v);
                                continue;
                        }