← Commit list

cde46f75c

Denys Vlasenko
Denys Vlasenko
2017-08-09
SUCCESS Duration: 141s

Subject

shell: more efficient check for EOL in read

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

shell/shell_common.c+3 -4
@@ -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"
shell/shell_common.h+5 -0
@@ -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,