From d98e5c65c3c69373dab56a7f9af8780c1a8123b2 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Fri, 10 Sep 2010 10:44:23 +0200 Subject: [PATCH] hush: better function and parameter names Also, trim code which isn't needed for non-bash compat. No logic changes. Signed-off-by: Denys Vlasenko --- shell/hush.c | 75 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 55 insertions(+), 20 deletions(-) diff --git a/shell/hush.c b/shell/hush.c index f49a39b0f..920d9638c 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -3733,16 +3733,34 @@ static int parse_dollar(o_string *as_string, } #if BB_MMU -#define parse_stream_dquoted(as_string, dest, input, dquote_end, dquoted) \ - parse_stream_dquoted(dest, input, dquote_end, dquoted) +# if ENABLE_HUSH_BASH_COMPAT +#define encode_string(as_string, dest, input, dquote_end, process_bkslash) \ + encode_string(dest, input, dquote_end, process_bkslash) +# else +/* only ${var/pattern/repl} (its pattern part) needs additional mode */ +#define encode_string(as_string, dest, input, dquote_end, process_bkslash) \ + encode_string(dest, input, dquote_end) +# endif #define as_string NULL + +#else /* !MMU */ + +# if ENABLE_HUSH_BASH_COMPAT +/* all parameters are needed, no macro tricks */ +# else +#define encode_string(as_string, dest, input, dquote_end, process_bkslash) \ + encode_string(as_string, dest, input, dquote_end) +# endif #endif -static int parse_stream_dquoted(o_string *as_string, +static int encode_string(o_string *as_string, o_string *dest, struct in_str *input, int dquote_end, - int dquoted) + int process_bkslash) { +#if !ENABLE_HUSH_BASH_COMPAT + const int process_bkslash = 1; +#endif int ch; int next; @@ -3751,7 +3769,7 @@ static int parse_stream_dquoted(o_string *as_string, if (ch != EOF) nommu_addchr(as_string, ch); if (ch == dquote_end) { /* may be only '"' or EOF */ - debug_printf_parse("parse_stream_dquoted return 0\n"); + debug_printf_parse("encode_string return 0\n"); return 0; } /* note: can't move it above ch == dquote_end check! */ @@ -3765,7 +3783,7 @@ static int parse_stream_dquoted(o_string *as_string, } debug_printf_parse("\" ch=%c (%d) escape=%d\n", ch, ch, !!(dest->o_expflags & EXP_FLAG_ESC_GLOB_CHARS)); - if (dquoted && ch == '\\') { + if (process_bkslash && ch == '\\') { if (next == EOF) { syntax_error("\\"); xfunc_die(); @@ -3775,21 +3793,21 @@ static int parse_stream_dquoted(o_string *as_string, * only when followed by one of the following characters: * $, `, ", \, or . A double quote may be quoted * within double quotes by preceding it with a backslash." - * NB: in (unquoted) heredoc, above does not apply to ". + * NB: in (unquoted) heredoc, above does not apply to ", + * therefore we check for it by "next == dquote_end" cond. */ - if (next == dquote_end || strchr("$`\\\n", next) != NULL) { + if (next == dquote_end || strchr("$`\\\n", next)) { ch = i_getch(input); /* eat next */ if (ch == '\n') goto again; /* skip \ */ } /* else: ch remains == '\\', and we double it */ - o_addqchr(dest, ch); + o_addqchr(dest, ch); /* \c if c is s glob char, else just c */ nommu_addchr(as_string, ch); goto again; } if (ch == '$') { -//CHECK: 0x80? or dquoted? if (parse_dollar(as_string, dest, input, /*quote_mask:*/ 0x80) != 0) { - debug_printf_parse("parse_stream_dquoted return 1: " + debug_printf_parse("encode_string return 1: " "parse_dollar returned non-0\n"); return 1; } @@ -4162,7 +4180,7 @@ static struct pipe *parse_stream(char **pstring, dest.has_quoted_part = 1; if (dest.o_assignment == NOT_ASSIGNMENT) dest.o_expflags |= EXP_FLAG_ESC_GLOB_CHARS; - if (parse_stream_dquoted(&ctx.as_string, &dest, input, '"', /*dquoted:*/ 1)) + if (encode_string(&ctx.as_string, &dest, input, '"', /*process_bkslash:*/ 1)) goto parse_error; dest.o_expflags &= ~EXP_FLAG_ESC_GLOB_CHARS; break; @@ -4335,6 +4353,11 @@ static struct pipe *parse_stream(char **pstring, /*** Execution routines ***/ /* Expansion can recurse, need forward decls: */ +#if !ENABLE_HUSH_BASH_COMPAT +/* only ${var/pattern/repl} (its pattern part) needs additional mode */ +#define expand_string_to_string(str, do_unbackslash) \ + expand_string_to_string(str) +#endif static char *expand_string_to_string(const char *str, int do_unbackslash); static int process_command_subs(o_string *dest, const char *s); @@ -4387,8 +4410,17 @@ static int expand_on_ifs(o_string *output, int n, const char *str) * Returns malloced string. * As an optimization, we return NULL if expansion is not needed. */ -static char *expand_pseudo_dquoted(const char *str, int dquoted, int do_unbackslash) +#if !ENABLE_HUSH_BASH_COMPAT +/* only ${var/pattern/repl} (its pattern part) needs additional mode */ +#define encode_then_expand_string(str, process_bkslash, do_unbackslash) \ + encode_then_expand_string(str) +#endif +static char *encode_then_expand_string(const char *str, int process_bkslash, int do_unbackslash) { +//#if !ENABLE_HUSH_BASH_COMPAT +// const int process_bkslash = 1; +// const int do_unbackslash = 1; +//#endif char *exp_str; struct in_str input; o_string dest = NULL_O_STRING; @@ -4406,7 +4438,7 @@ static char *expand_pseudo_dquoted(const char *str, int dquoted, int do_unbacksl * echo $(($a + `echo 1`)) $((1 + $((2)) )) */ setup_string_in_str(&input, str); - parse_stream_dquoted(NULL, &dest, &input, EOF, dquoted); + encode_string(NULL, &dest, &input, EOF, process_bkslash); //bb_error_msg("'%s' -> '%s'", str, dest.data); exp_str = expand_string_to_string(dest.data, /*unbackslash:*/ do_unbackslash); //bb_error_msg("'%s' -> '%s'", dest.data, exp_str); @@ -4424,7 +4456,7 @@ static arith_t expand_and_evaluate_arith(const char *arg, int *errcode_p) hooks.lookupvar = get_local_var_value; hooks.setvar = set_local_var_from_halves; //hooks.endofname = endofname; - exp_str = expand_pseudo_dquoted(arg, /*dquoted:*/ 1, /*unbackslash:*/ 1); + exp_str = encode_then_expand_string(arg, /*process_bkslash:*/ 1, /*unbackslash:*/ 1); res = arith(exp_str ? exp_str : arg, errcode_p, &hooks); free(exp_str); return res; @@ -4594,7 +4626,7 @@ static NOINLINE const char *expand_one_var(char **to_be_freed_pp, char *arg, cha //TODO: avoid xstrdup unless needed // (see HACK ALERT below for an example) val = to_be_freed = xstrdup(val); - exp_exp_word = expand_pseudo_dquoted(exp_word, /*dquoted:*/ 1, /*unbackslash:*/ 1); + exp_exp_word = encode_then_expand_string(exp_word, /*process_bkslash:*/ 1, /*unbackslash:*/ 1); if (exp_exp_word) exp_word = exp_exp_word; loc = scan_and_match(to_be_freed, exp_word, scan_flags); @@ -4631,7 +4663,7 @@ static NOINLINE const char *expand_one_var(char **to_be_freed_pp, char *arg, cha * (note that a*z _pattern_ is never globbed!) */ char *pattern, *repl, *t; - pattern = expand_pseudo_dquoted(exp_word, /*dquoted:*/ 0, /*unbackslash:*/ 0); + pattern = encode_then_expand_string(exp_word, /*process_bkslash:*/ 0, /*unbackslash:*/ 0); if (!pattern) pattern = xstrdup(exp_word); debug_printf_varexp("pattern:'%s'->'%s'\n", exp_word, pattern); @@ -4639,7 +4671,7 @@ static NOINLINE const char *expand_one_var(char **to_be_freed_pp, char *arg, cha exp_word = p; p = strchr(p, SPECIAL_VAR_SYMBOL); *p = '\0'; - repl = expand_pseudo_dquoted(exp_word, /*dquoted:*/ arg0 & 0x80, /*unbackslash:*/ 1); + repl = encode_then_expand_string(exp_word, /*process_bkslash:*/ arg0 & 0x80, /*unbackslash:*/ 1); debug_printf_varexp("repl:'%s'->'%s'\n", exp_word, repl); /* HACK ALERT. We depend here on the fact that * G.global_argv and results of utoa and get_local_var_value @@ -4724,7 +4756,7 @@ static NOINLINE const char *expand_one_var(char **to_be_freed_pp, char *arg, cha debug_printf_expand("expand: op:%c (null:%s) test:%i\n", exp_op, (exp_save == ':') ? "true" : "false", use_word); if (use_word) { - to_be_freed = expand_pseudo_dquoted(exp_word, /*dquoted:*/ 1, /*unbackslash:*/ 1); + to_be_freed = encode_then_expand_string(exp_word, /*process_bkslash:*/ 1, /*unbackslash:*/ 1); if (to_be_freed) exp_word = to_be_freed; if (exp_op == '?') { @@ -4998,6 +5030,9 @@ static char **expand_strvec_to_strvec_singleword_noglob(char **argv) */ static char *expand_string_to_string(const char *str, int do_unbackslash) { +#if !ENABLE_HUSH_BASH_COMPAT + const int do_unbackslash = 1; +#endif char *argv[2], **list; debug_printf_expand("string_to_string<='%s'\n", str); @@ -5468,7 +5503,7 @@ static void setup_heredoc(struct redir_struct *redir) expanded = NULL; if (!(redir->rd_dup & HEREDOC_QUOTED)) { - expanded = expand_pseudo_dquoted(heredoc, /*dquoted:*/ 1, /*unbackslash:*/ 1); + expanded = encode_then_expand_string(heredoc, /*process_bkslash:*/ 1, /*unbackslash:*/ 1); if (expanded) heredoc = expanded; }