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:
parent
168579a34c
commit
18e8b61292
35
shell/hush.c
35
shell/hush.c
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user