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>
This commit is contained in:
Denys Vlasenko 2018-02-13 15:30:13 +01:00
parent 8de5b9f88b
commit aa617ac097

View File

@ -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) static void parse_and_run_string(const char *s)
{ {
struct in_str input; struct in_str input;
//IF_HUSH_LINENO_VAR(unsigned sv = G.lineno;)
setup_string_in_str(&input, s); setup_string_in_str(&input, s);
parse_and_run_stream(&input, '\0'); parse_and_run_stream(&input, '\0');
//IF_HUSH_LINENO_VAR(G.lineno = sv;)
} }
static void parse_and_run_file(FILE *f) static void parse_and_run_file(FILE *f)
{ {
struct in_str input; struct in_str input;
#if ENABLE_HUSH_LINENO_VAR IF_HUSH_LINENO_VAR(unsigned sv = G.lineno;)
unsigned sv;
sv = G.lineno; IF_HUSH_LINENO_VAR(G.lineno = 1;)
G.lineno = 1;
#endif
setup_file_in_str(&input, f); setup_file_in_str(&input, f);
parse_and_run_stream(&input, ';'); parse_and_run_stream(&input, ';');
#if ENABLE_HUSH_LINENO_VAR IF_HUSH_LINENO_VAR(G.lineno = sv;)
G.lineno = sv;
#endif
} }
#if ENABLE_HUSH_TICK #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) static int process_command_subs(o_string *dest, const char *s)
{ {
FILE *fp; FILE *fp;
struct in_str pipe_str;
pid_t pid; pid_t pid;
int status, ch, eol_cnt; int status, ch, eol_cnt;
fp = generate_stream_from_string(s, &pid); fp = generate_stream_from_string(s, &pid);
/* Now send results of command back into original context */ /* Now send results of command back into original context */
setup_file_in_str(&pipe_str, fp);
eol_cnt = 0; eol_cnt = 0;
while ((ch = i_getch(&pipe_str)) != EOF) { while ((ch = getc(fp)) != EOF) {
if (ch == '\0')
continue;
if (ch == '\n') { if (ch == '\n') {
eol_cnt++; eol_cnt++;
continue; continue;