[git commit] shell: more efficient check for EOL in read

Denys Vlasenko vda.linux at googlemail.com
Wed Aug 9 12:04:07 UTC 2017


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

function                                             old     new   delta
shell_builtin_read                                  1334    1320     -14

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 shell/shell_common.c | 7 +++----
 shell/shell_common.h | 5 +++++
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/shell/shell_common.c b/shell/shell_common.c
index 2db8ea3..7a0799e 100644
--- a/shell/shell_common.c
+++ b/shell/shell_common.c
@@ -65,6 +65,7 @@ shell_builtin_read(void FAST_FUNC (*setvar)(const char *name, const char *val),
 	int nchars; /* -n NUM */
 	char **pp;
 	char *buffer;
+	char delim;
 	struct termios tty, old_tty;
 	const char *retval;
 	int bufpos; /* need to be able to hold -1 */
@@ -185,6 +186,7 @@ shell_builtin_read(void FAST_FUNC (*setvar)(const char *name, const char *val),
 		end_ms += (unsigned)monotonic_ms();
 	buffer = NULL;
 	bufpos = 0;
+	delim = opt_d ? *opt_d : '\n';
 	do {
 		char c;
 		int timeout;
@@ -238,10 +240,7 @@ shell_builtin_read(void FAST_FUNC (*setvar)(const char *name, const char *val),
 				continue;
 			}
 		}
-		if (opt_d) {
-			if (c == *opt_d)
-				break;
-		} else if (c == '\n')
+		if (c == delim) /* '\n' or -d CHAR */
 			break;
 
 		/* $IFS splitting. NOT done if we run "read"
diff --git a/shell/shell_common.h b/shell/shell_common.h
index 1b79bff..875fd9e 100644
--- a/shell/shell_common.h
+++ b/shell/shell_common.h
@@ -34,6 +34,11 @@ enum {
 	BUILTIN_READ_SILENT = 1 << 0,
 	BUILTIN_READ_RAW    = 1 << 1,
 };
+//TODO? do not provide bashisms if not asked for:
+//#if !ENABLE_HUSH_BASH_COMPAT && !ENABLE_ASH_BASH_COMPAT
+//#define shell_builtin_read(setvar,argv,ifs,read_flags,n,p,t,u,d)
+//	shell_builtin_read(setvar,argv,ifs,read_flags)
+//#endif
 const char* FAST_FUNC
 shell_builtin_read(void FAST_FUNC (*setvar)(const char *name, const char *val),
 	char       **argv,


More information about the busybox-cvs mailing list