[git commit] bc: further simplification in zbc_vm_stdin()

Denys Vlasenko vda.linux at googlemail.com
Thu Dec 13 17:16:39 UTC 2018


commit: https://git.busybox.net/busybox/commit/?id=b7e61e3e4adc774d18b6377cdd6434dd7ce0c2be
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

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 at googlemail.com>
---
 miscutils/bc.c | 69 +++++++++++++++++++++++++++++-----------------------------
 1 file 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) {


More information about the busybox-cvs mailing list