diff options
author | Denys Vlasenko | 2018-02-13 15:30:13 +0100 |
---|---|---|
committer | Denys Vlasenko | 2018-02-13 15:31:19 +0100 |
commit | aa617ac09703f31e9f80836f8d8f9349b52578ee (patch) | |
tree | 8fcfa982a5067107e514c3b299571bd5feb7099a /shell | |
parent | 8de5b9f88ba9fe2f203abab9ca7d85129c3eb679 (diff) | |
download | busybox-aa617ac09703f31e9f80836f8d8f9349b52578ee.zip busybox-aa617ac09703f31e9f80836f8d8f9349b52578ee.tar.gz |
hush: simplify process_command_subs()
Incidentally, this fixes LINENO bug here:
echo "1:${LINENO}"
echo "2:`echo; echo`" # was counting lines in the `cmd` output as LINENO++
echo "3:${LINENO}"
function old new delta
parse_and_run_file 53 71 +18
expand_vars_to_list 1187 1164 -23
setup_file_in_str 25 - -25
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 1/1 up/down: 18/-48) Total: -30 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell')
-rw-r--r-- | shell/hush.c | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/shell/hush.c b/shell/hush.c index 8f1017e..e005b0a 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -6614,24 +6614,22 @@ static void parse_and_run_stream(struct in_str *inp, int end_trigger) static void parse_and_run_string(const char *s) { struct in_str input; + //IF_HUSH_LINENO_VAR(unsigned sv = G.lineno;) + setup_string_in_str(&input, s); parse_and_run_stream(&input, '\0'); + //IF_HUSH_LINENO_VAR(G.lineno = sv;) } static void parse_and_run_file(FILE *f) { struct in_str input; -#if ENABLE_HUSH_LINENO_VAR - unsigned sv; + IF_HUSH_LINENO_VAR(unsigned sv = G.lineno;) - sv = G.lineno; - G.lineno = 1; -#endif + IF_HUSH_LINENO_VAR(G.lineno = 1;) setup_file_in_str(&input, f); parse_and_run_stream(&input, ';'); -#if ENABLE_HUSH_LINENO_VAR - G.lineno = sv; -#endif + IF_HUSH_LINENO_VAR(G.lineno = sv;) } #if ENABLE_HUSH_TICK @@ -6744,16 +6742,16 @@ static FILE *generate_stream_from_string(const char *s, pid_t *pid_p) static int process_command_subs(o_string *dest, const char *s) { FILE *fp; - struct in_str pipe_str; pid_t pid; int status, ch, eol_cnt; fp = generate_stream_from_string(s, &pid); /* Now send results of command back into original context */ - setup_file_in_str(&pipe_str, fp); eol_cnt = 0; - while ((ch = i_getch(&pipe_str)) != EOF) { + while ((ch = getc(fp)) != EOF) { + if (ch == '\0') + continue; if (ch == '\n') { eol_cnt++; continue; |