diff options
author | Johannes Schindelin <johannes.schindelin@gmx.de> | 2017-08-08 16:46:39 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2017-08-09 13:52:17 +0200 |
commit | 3bef5d89b0c667e9fb7d1d9b44ba9b30d4d084e4 (patch) | |
tree | 5f31bceb5e2b239d88f6465cc76f313a4d5ddc98 /shell/shell_common.c | |
parent | 5856dc74be79fa288f481e1f19077518ae6d8303 (diff) | |
download | busybox-w32-3bef5d89b0c667e9fb7d1d9b44ba9b30d4d084e4.tar.gz busybox-w32-3bef5d89b0c667e9fb7d1d9b44ba9b30d4d084e4.tar.bz2 busybox-w32-3bef5d89b0c667e9fb7d1d9b44ba9b30d4d084e4.zip |
ash: implement -d DELIM option for read
The POSIX standard only requires the read builtin to handle -r:
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html
However, Bash introduced the option -d <DELIM> to override IFS for
just one invocation, and it is quite useful.
It is also super easy to implement in BusyBox' ash, so let's do that.
The motivation: This option is used by Git's test suite.
function old new delta
.rodata 163505 163587 +82
shell_builtin_read 1244 1289 +45
readcmd 233 259 +26
builtin_read 258 263 +5
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 4/0 up/down: 158/0) Total: 158 bytes
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell/shell_common.c')
-rw-r--r-- | shell/shell_common.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/shell/shell_common.c b/shell/shell_common.c index a9f8d8413..2db8ea3e2 100644 --- a/shell/shell_common.c +++ b/shell/shell_common.c | |||
@@ -54,7 +54,8 @@ shell_builtin_read(void FAST_FUNC (*setvar)(const char *name, const char *val), | |||
54 | const char *opt_n, | 54 | const char *opt_n, |
55 | const char *opt_p, | 55 | const char *opt_p, |
56 | const char *opt_t, | 56 | const char *opt_t, |
57 | const char *opt_u | 57 | const char *opt_u, |
58 | const char *opt_d | ||
58 | ) | 59 | ) |
59 | { | 60 | { |
60 | struct pollfd pfd[1]; | 61 | struct pollfd pfd[1]; |
@@ -237,14 +238,17 @@ shell_builtin_read(void FAST_FUNC (*setvar)(const char *name, const char *val), | |||
237 | continue; | 238 | continue; |
238 | } | 239 | } |
239 | } | 240 | } |
240 | if (c == '\n') | 241 | if (opt_d) { |
242 | if (c == *opt_d) | ||
243 | break; | ||
244 | } else if (c == '\n') | ||
241 | break; | 245 | break; |
242 | 246 | ||
243 | /* $IFS splitting. NOT done if we run "read" | 247 | /* $IFS splitting. NOT done if we run "read" |
244 | * without variable names (bash compat). | 248 | * without variable names (bash compat). |
245 | * Thus, "read" and "read REPLY" are not the same. | 249 | * Thus, "read" and "read REPLY" are not the same. |
246 | */ | 250 | */ |
247 | if (argv[0]) { | 251 | if (!opt_d && argv[0]) { |
248 | /* http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_05 */ | 252 | /* http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_05 */ |
249 | const char *is_ifs = strchr(ifs, c); | 253 | const char *is_ifs = strchr(ifs, c); |
250 | if (startword && is_ifs) { | 254 | if (startword && is_ifs) { |