aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-07-20 14:24:56 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2018-07-20 16:27:26 +0200
commit18e8b6129298c02f7b5ccc17fee6bccc01a8968f (patch)
tree8b619c709da0259dc759ff6683dcd18fe89f5f72 /shell
parent168579a34c6fc6c2f2cd20256367ceb61f50bf68 (diff)
downloadbusybox-w32-18e8b6129298c02f7b5ccc17fee6bccc01a8968f.tar.gz
busybox-w32-18e8b6129298c02f7b5ccc17fee6bccc01a8968f.tar.bz2
busybox-w32-18e8b6129298c02f7b5ccc17fee6bccc01a8968f.zip
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>
Diffstat (limited to 'shell')
-rw-r--r--shell/hush.c35
1 files changed, 16 insertions, 19 deletions
diff --git a/shell/hush.c b/shell/hush.c
index 2d4e3fa66..fca67dc17 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -475,6 +475,7 @@
475#endif 475#endif
476 476
477#define SPECIAL_VAR_SYMBOL_STR "\3" 477#define SPECIAL_VAR_SYMBOL_STR "\3"
478#define SPECIAL_VAR_SYMBOL_CHR '\3'
478#define SPECIAL_VAR_SYMBOL 3 479#define SPECIAL_VAR_SYMBOL 3
479/* The "variable" with name "\1" emits string "\3". Testcase: "echo ^C" */ 480/* The "variable" with name "\1" emits string "\3". Testcase: "echo ^C" */
480#define SPECIAL_VAR_QUOTED_SVS 1 481#define SPECIAL_VAR_QUOTED_SVS 1
@@ -5797,7 +5798,6 @@ static char *encode_then_expand_vararg(const char *str, int handle_squotes, int
5797 5798
5798 for (;;) { 5799 for (;;) {
5799 int ch; 5800 int ch;
5800 int next;
5801 5801
5802 ch = i_getch(&input); 5802 ch = i_getch(&input);
5803 if (ch == EOF) { 5803 if (ch == EOF) {
@@ -5837,10 +5837,6 @@ static char *encode_then_expand_vararg(const char *str, int handle_squotes, int
5837 o_addqchr(&dest, ch); 5837 o_addqchr(&dest, ch);
5838 continue; 5838 continue;
5839 } 5839 }
5840 next = '\0';
5841 if (ch != '\n') {
5842 next = i_peek(&input);
5843 }
5844 if (ch == '$') { 5840 if (ch == '$') {
5845 if (!parse_dollar(NULL, &dest, &input, /*quote_mask:*/ 0x80)) { 5841 if (!parse_dollar(NULL, &dest, &input, /*quote_mask:*/ 0x80)) {
5846 debug_printf_parse("%s: error: parse_dollar returned 0 (error)\n", __func__); 5842 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
5956#endif /* BASH_PATTERN_SUBST */ 5952#endif /* BASH_PATTERN_SUBST */
5957 5953
5958static int append_str_maybe_ifs_split(o_string *output, int n, 5954static int append_str_maybe_ifs_split(o_string *output, int n,
5959 int first_ch, const char *val) 5955 int first_ch, const char *val)
5960{ 5956{
5961 if (!(first_ch & 0x80)) { /* unquoted $VAR */ 5957 if (!(first_ch & 0x80)) { /* unquoted $VAR */
5962 debug_printf_expand("unquoted '%s', output->o_escape:%d\n", val, 5958 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)
6348 6344
6349 while ((p = strchr(arg, SPECIAL_VAR_SYMBOL)) != NULL) { 6345 while ((p = strchr(arg, SPECIAL_VAR_SYMBOL)) != NULL) {
6350 char first_ch; 6346 char first_ch;
6351 const char *val = NULL;
6352#if ENABLE_FEATURE_SH_MATH 6347#if ENABLE_FEATURE_SH_MATH
6353 char arith_buf[sizeof(arith_t)*3 + 2]; 6348 char arith_buf[sizeof(arith_t)*3 + 2];
6354#endif 6349#endif
@@ -6424,19 +6419,23 @@ static NOINLINE int expand_vars_to_list(o_string *output, int n, char *arg)
6424 } 6419 }
6425 break; 6420 break;
6426 } 6421 }
6427 case SPECIAL_VAR_SYMBOL: /* <SPECIAL_VAR_SYMBOL><SPECIAL_VAR_SYMBOL> */ 6422 case SPECIAL_VAR_SYMBOL: {
6423 /* <SPECIAL_VAR_SYMBOL><SPECIAL_VAR_SYMBOL> */
6428 /* "Empty variable", used to make "" etc to not disappear */ 6424 /* "Empty variable", used to make "" etc to not disappear */
6429 output->has_quoted_part = 1; 6425 output->has_quoted_part = 1;
6430 arg++;
6431 cant_be_null = 0x80; 6426 cant_be_null = 0x80;
6427 arg++;
6432 break; 6428 break;
6429 }
6433 case SPECIAL_VAR_QUOTED_SVS: 6430 case SPECIAL_VAR_QUOTED_SVS:
6434 /* <SPECIAL_VAR_SYMBOL><SPECIAL_VAR_QUOTED_SVS><SPECIAL_VAR_SYMBOL> */ 6431 /* <SPECIAL_VAR_SYMBOL><SPECIAL_VAR_QUOTED_SVS><SPECIAL_VAR_SYMBOL> */
6432 /* "^C variable", represents literal ^C char (possible in scripts) */
6433 o_addchr(output, SPECIAL_VAR_SYMBOL_CHR);
6435 arg++; 6434 arg++;
6436 val = SPECIAL_VAR_SYMBOL_STR;
6437 break; 6435 break;
6438#if ENABLE_HUSH_TICK 6436#if ENABLE_HUSH_TICK
6439 case '`': { /* <SPECIAL_VAR_SYMBOL>`cmd<SPECIAL_VAR_SYMBOL> */ 6437 case '`': {
6438 /* <SPECIAL_VAR_SYMBOL>`cmd<SPECIAL_VAR_SYMBOL> */
6440 o_string subst_result = NULL_O_STRING; 6439 o_string subst_result = NULL_O_STRING;
6441 6440
6442 *p = '\0'; /* replace trailing <SPECIAL_VAR_SYMBOL> */ 6441 *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)
6450 debug_printf_subst("SUBST RES:%d '%s'\n", G.last_exitcode, subst_result.data); 6449 debug_printf_subst("SUBST RES:%d '%s'\n", G.last_exitcode, subst_result.data);
6451 n = append_str_maybe_ifs_split(output, n, first_ch, subst_result.data); 6450 n = append_str_maybe_ifs_split(output, n, first_ch, subst_result.data);
6452 o_free_unsafe(&subst_result); 6451 o_free_unsafe(&subst_result);
6453 goto restore; 6452 break;
6454 } 6453 }
6455#endif 6454#endif
6456#if ENABLE_FEATURE_SH_MATH 6455#if ENABLE_FEATURE_SH_MATH
6457 case '+': { /* <SPECIAL_VAR_SYMBOL>+cmd<SPECIAL_VAR_SYMBOL> */ 6456 case '+': {
6457 /* <SPECIAL_VAR_SYMBOL>+arith<SPECIAL_VAR_SYMBOL> */
6458 arith_t res; 6458 arith_t res;
6459 6459
6460 arg++; /* skip '+' */ 6460 arg++; /* skip '+' */
@@ -6463,19 +6463,16 @@ static NOINLINE int expand_vars_to_list(o_string *output, int n, char *arg)
6463 res = expand_and_evaluate_arith(arg, NULL); 6463 res = expand_and_evaluate_arith(arg, NULL);
6464 debug_printf_subst("ARITH RES '"ARITH_FMT"'\n", res); 6464 debug_printf_subst("ARITH RES '"ARITH_FMT"'\n", res);
6465 sprintf(arith_buf, ARITH_FMT, res); 6465 sprintf(arith_buf, ARITH_FMT, res);
6466 val = arith_buf; 6466 o_addstr(output, arith_buf);
6467 break; 6467 break;
6468 } 6468 }
6469#endif 6469#endif
6470 default: 6470 default:
6471 /* <SPECIAL_VAR_SYMBOL>varname[ops]<SPECIAL_VAR_SYMBOL> */
6471 n = expand_one_var(output, n, first_ch, arg, &p); 6472 n = expand_one_var(output, n, first_ch, arg, &p);
6472 goto restore; 6473 break;
6473 } /* switch (char after <SPECIAL_VAR_SYMBOL>) */ 6474 } /* switch (char after <SPECIAL_VAR_SYMBOL>) */
6474 6475
6475 if (val && val[0]) {
6476 o_addQstr(output, val);
6477 }
6478 restore:
6479 /* Restore NULL'ed SPECIAL_VAR_SYMBOL. 6476 /* Restore NULL'ed SPECIAL_VAR_SYMBOL.
6480 * Do the check to avoid writing to a const string. */ 6477 * Do the check to avoid writing to a const string. */
6481 if (*p != SPECIAL_VAR_SYMBOL) 6478 if (*p != SPECIAL_VAR_SYMBOL)