hush: remove pointless "next" var, simplify expand_vars_to_list()

function                                             old     new   delta
o_addstr                                               -      26     +26
expand_vars_to_list                                 1112    1117      +5
encode_then_expand_vararg                            398     382     -16
parse_dollar                                         779     762     -17
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/2 up/down: 31/-33)             Total: -2 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-07-20 14:24:56 +02:00
parent 168579a34c
commit 18e8b61292

View File

@ -475,6 +475,7 @@
#endif #endif
#define SPECIAL_VAR_SYMBOL_STR "\3" #define SPECIAL_VAR_SYMBOL_STR "\3"
#define SPECIAL_VAR_SYMBOL_CHR '\3'
#define SPECIAL_VAR_SYMBOL 3 #define SPECIAL_VAR_SYMBOL 3
/* The "variable" with name "\1" emits string "\3". Testcase: "echo ^C" */ /* The "variable" with name "\1" emits string "\3". Testcase: "echo ^C" */
#define SPECIAL_VAR_QUOTED_SVS 1 #define SPECIAL_VAR_QUOTED_SVS 1
@ -5797,7 +5798,6 @@ static char *encode_then_expand_vararg(const char *str, int handle_squotes, int
for (;;) { for (;;) {
int ch; int ch;
int next;
ch = i_getch(&input); ch = i_getch(&input);
if (ch == EOF) { if (ch == EOF) {
@ -5837,10 +5837,6 @@ static char *encode_then_expand_vararg(const char *str, int handle_squotes, int
o_addqchr(&dest, ch); o_addqchr(&dest, ch);
continue; continue;
} }
next = '\0';
if (ch != '\n') {
next = i_peek(&input);
}
if (ch == '$') { if (ch == '$') {
if (!parse_dollar(NULL, &dest, &input, /*quote_mask:*/ 0x80)) { if (!parse_dollar(NULL, &dest, &input, /*quote_mask:*/ 0x80)) {
debug_printf_parse("%s: error: parse_dollar returned 0 (error)\n", __func__); debug_printf_parse("%s: error: parse_dollar returned 0 (error)\n", __func__);
@ -5956,7 +5952,7 @@ static char *replace_pattern(char *val, const char *pattern, const char *repl, c
#endif /* BASH_PATTERN_SUBST */ #endif /* BASH_PATTERN_SUBST */
static int append_str_maybe_ifs_split(o_string *output, int n, static int append_str_maybe_ifs_split(o_string *output, int n,
int first_ch, const char *val) int first_ch, const char *val)
{ {
if (!(first_ch & 0x80)) { /* unquoted $VAR */ if (!(first_ch & 0x80)) { /* unquoted $VAR */
debug_printf_expand("unquoted '%s', output->o_escape:%d\n", val, debug_printf_expand("unquoted '%s', output->o_escape:%d\n", val,
@ -6348,7 +6344,6 @@ static NOINLINE int expand_vars_to_list(o_string *output, int n, char *arg)
while ((p = strchr(arg, SPECIAL_VAR_SYMBOL)) != NULL) { while ((p = strchr(arg, SPECIAL_VAR_SYMBOL)) != NULL) {
char first_ch; char first_ch;
const char *val = NULL;
#if ENABLE_FEATURE_SH_MATH #if ENABLE_FEATURE_SH_MATH
char arith_buf[sizeof(arith_t)*3 + 2]; char arith_buf[sizeof(arith_t)*3 + 2];
#endif #endif
@ -6424,19 +6419,23 @@ static NOINLINE int expand_vars_to_list(o_string *output, int n, char *arg)
} }
break; break;
} }
case SPECIAL_VAR_SYMBOL: /* <SPECIAL_VAR_SYMBOL><SPECIAL_VAR_SYMBOL> */ case SPECIAL_VAR_SYMBOL: {
/* <SPECIAL_VAR_SYMBOL><SPECIAL_VAR_SYMBOL> */
/* "Empty variable", used to make "" etc to not disappear */ /* "Empty variable", used to make "" etc to not disappear */
output->has_quoted_part = 1; output->has_quoted_part = 1;
arg++;
cant_be_null = 0x80; cant_be_null = 0x80;
arg++;
break; break;
}
case SPECIAL_VAR_QUOTED_SVS: case SPECIAL_VAR_QUOTED_SVS:
/* <SPECIAL_VAR_SYMBOL><SPECIAL_VAR_QUOTED_SVS><SPECIAL_VAR_SYMBOL> */ /* <SPECIAL_VAR_SYMBOL><SPECIAL_VAR_QUOTED_SVS><SPECIAL_VAR_SYMBOL> */
/* "^C variable", represents literal ^C char (possible in scripts) */
o_addchr(output, SPECIAL_VAR_SYMBOL_CHR);
arg++; arg++;
val = SPECIAL_VAR_SYMBOL_STR;
break; break;
#if ENABLE_HUSH_TICK #if ENABLE_HUSH_TICK
case '`': { /* <SPECIAL_VAR_SYMBOL>`cmd<SPECIAL_VAR_SYMBOL> */ case '`': {
/* <SPECIAL_VAR_SYMBOL>`cmd<SPECIAL_VAR_SYMBOL> */
o_string subst_result = NULL_O_STRING; o_string subst_result = NULL_O_STRING;
*p = '\0'; /* replace trailing <SPECIAL_VAR_SYMBOL> */ *p = '\0'; /* replace trailing <SPECIAL_VAR_SYMBOL> */
@ -6450,11 +6449,12 @@ static NOINLINE int expand_vars_to_list(o_string *output, int n, char *arg)
debug_printf_subst("SUBST RES:%d '%s'\n", G.last_exitcode, subst_result.data); debug_printf_subst("SUBST RES:%d '%s'\n", G.last_exitcode, subst_result.data);
n = append_str_maybe_ifs_split(output, n, first_ch, subst_result.data); n = append_str_maybe_ifs_split(output, n, first_ch, subst_result.data);
o_free_unsafe(&subst_result); o_free_unsafe(&subst_result);
goto restore; break;
} }
#endif #endif
#if ENABLE_FEATURE_SH_MATH #if ENABLE_FEATURE_SH_MATH
case '+': { /* <SPECIAL_VAR_SYMBOL>+cmd<SPECIAL_VAR_SYMBOL> */ case '+': {
/* <SPECIAL_VAR_SYMBOL>+arith<SPECIAL_VAR_SYMBOL> */
arith_t res; arith_t res;
arg++; /* skip '+' */ arg++; /* skip '+' */
@ -6463,19 +6463,16 @@ static NOINLINE int expand_vars_to_list(o_string *output, int n, char *arg)
res = expand_and_evaluate_arith(arg, NULL); res = expand_and_evaluate_arith(arg, NULL);
debug_printf_subst("ARITH RES '"ARITH_FMT"'\n", res); debug_printf_subst("ARITH RES '"ARITH_FMT"'\n", res);
sprintf(arith_buf, ARITH_FMT, res); sprintf(arith_buf, ARITH_FMT, res);
val = arith_buf; o_addstr(output, arith_buf);
break; break;
} }
#endif #endif
default: default:
/* <SPECIAL_VAR_SYMBOL>varname[ops]<SPECIAL_VAR_SYMBOL> */
n = expand_one_var(output, n, first_ch, arg, &p); n = expand_one_var(output, n, first_ch, arg, &p);
goto restore; break;
} /* switch (char after <SPECIAL_VAR_SYMBOL>) */ } /* switch (char after <SPECIAL_VAR_SYMBOL>) */
if (val && val[0]) {
o_addQstr(output, val);
}
restore:
/* Restore NULL'ed SPECIAL_VAR_SYMBOL. /* Restore NULL'ed SPECIAL_VAR_SYMBOL.
* Do the check to avoid writing to a const string. */ * Do the check to avoid writing to a const string. */
if (*p != SPECIAL_VAR_SYMBOL) if (*p != SPECIAL_VAR_SYMBOL)