aboutsummaryrefslogtreecommitdiff
path: root/shell/shell_common.c
diff options
context:
space:
mode:
authorJohannes Schindelin <johannes.schindelin@gmx.de>2017-08-08 16:46:39 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2017-08-09 13:52:17 +0200
commit3bef5d89b0c667e9fb7d1d9b44ba9b30d4d084e4 (patch)
tree5f31bceb5e2b239d88f6465cc76f313a4d5ddc98 /shell/shell_common.c
parent5856dc74be79fa288f481e1f19077518ae6d8303 (diff)
downloadbusybox-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.c10
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) {