0004-bc-fold-xc_lex_more_input-into-peek_inbuf.patch 2.71 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
From 2747f6195b94db6c1adf2eae243df5c0a01d39f2 Mon Sep 17 00:00:00 2001
From: Denys Vlasenko <vda.linux@googlemail.com>
Date: Mon, 31 Dec 2018 18:48:10 +0100
Subject: [PATCH 04/84] bc: fold xc_lex_more_input() into peek_inbuf()

function                                             old     new   delta
peek_inbuf                                            69      56     -13

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
---
 miscutils/bc.c | 31 +++++++++----------------------
 1 file changed, 9 insertions(+), 22 deletions(-)

diff --git a/miscutils/bc.c b/miscutils/bc.c
index de6f9aab8..72c23542c 100644
--- a/miscutils/bc.c
+++ b/miscutils/bc.c
@@ -2727,20 +2727,6 @@ static BC_STATUS zxc_num_parse(BcNum *n, const char *val, unsigned base_t)
 }
 #define zxc_num_parse(...) (zxc_num_parse(__VA_ARGS__) COMMA_SUCCESS)
 
-static bool xc_lex_more_input(void)
-{
-	BcParse *p = &G.prs;
-
-	bc_vec_pop_all(&G.input_buffer);
-
-	xc_read_line(&G.input_buffer, G.prs.lex_input_fp);
-
-	p->lex_inbuf = G.input_buffer.v;
-//	bb_error_msg("G.input_buffer.len:%d '%s'", G.input_buffer.len, G.input_buffer.v);
-
-	return G.input_buffer.len > 1;
-}
-
 // p->lex_inbuf points to the current string to be parsed.
 // if p->lex_inbuf points to '\0', it's either EOF or it points after
 // last processed line's terminating '\n' (and more reading needs to be done
@@ -2774,10 +2760,13 @@ static bool xc_lex_more_input(void)
 // end"         - ...prints "str#\<newline>end"
 static char peek_inbuf(void)
 {
-	if (*G.prs.lex_inbuf == '\0') {
-		if (G.prs.lex_input_fp)
-			if (!xc_lex_more_input())
-				G.prs.lex_input_fp = NULL;
+	if (*G.prs.lex_inbuf == '\0'
+	 && G.prs.lex_input_fp
+	) {
+		xc_read_line(&G.input_buffer, G.prs.lex_input_fp);
+		G.prs.lex_inbuf = G.input_buffer.v;
+		if (G.input_buffer.len <= 1) // on EOF, len is 1 (NUL byte)
+			G.prs.lex_input_fp = NULL;
 	}
 	return *G.prs.lex_inbuf;
 }
@@ -2796,7 +2785,7 @@ static void xc_lex_lineComment(void)
 	// Try: echo -n '#foo' | bc
 	p->lex = XC_LEX_WHITESPACE;
 
-	// We depend here on input being done in whole lines:
+	// Not peek_inbuf(): we depend on input being done in whole lines:
 	// '\0' which isn't the EOF can only be seen after '\n'.
 	while ((c = *p->lex_inbuf) != '\n' && c != '\0')
 		p->lex_inbuf++;
@@ -5281,17 +5270,15 @@ static BC_STATUS zxc_program_read(void)
 		IF_DC(s = zdc_parse_exprs_until_eof());
 	}
 	if (s) goto exec_err;
-
 	if (G.prs.lex != XC_LEX_NLINE && G.prs.lex != XC_LEX_EOF) {
 		s = bc_error("bad read() expression");
 		goto exec_err;
 	}
+	xc_parse_push(XC_INST_RET);
 
 	ip.func = BC_PROG_READ;
 	ip.inst_idx = 0;
 	IF_BC(ip.results_len_before_call = G.prog.results.len;)
-
-	xc_parse_push(XC_INST_RET);
 	bc_vec_push(&G.prog.exestack, &ip);
 
  exec_err:
-- 
2.16.2