diff options
author | Chet Ramey <chet.ramey@case.edu> | 2011-11-22 20:02:35 -0500 |
---|---|---|
committer | Chet Ramey <chet.ramey@case.edu> | 2011-11-22 20:02:35 -0500 |
commit | b4839c27f75ca05d8a26144df76e17cf71ee648f (patch) | |
tree | 938423950791d2ebf754eca37319dfad1e253733 /parse.y | |
parent | 47a7673055e4f82ee6c803df04eb1e2a87e717b7 (diff) | |
download | android_external_bash-b4839c27f75ca05d8a26144df76e17cf71ee648f.tar.gz android_external_bash-b4839c27f75ca05d8a26144df76e17cf71ee648f.tar.bz2 android_external_bash-b4839c27f75ca05d8a26144df76e17cf71ee648f.zip |
Bash-4.2 patch 12
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 47 |
1 files changed, 47 insertions, 0 deletions
@@ -3842,6 +3842,7 @@ xparse_dolparen (base, string, indp, flags) int flags; { sh_parser_state_t ps; + sh_input_line_state_t ls; int orig_ind, nc, sflags; char *ret, *s, *ep, *ostring; @@ -3849,10 +3850,12 @@ xparse_dolparen (base, string, indp, flags) orig_ind = *indp; ostring = string; +/*itrace("xparse_dolparen: size = %d shell_input_line = `%s'", shell_input_line_size, shell_input_line);*/ sflags = SEVAL_NONINT|SEVAL_NOHIST|SEVAL_NOFREE; if (flags & SX_NOLONGJMP) sflags |= SEVAL_NOLONGJMP; save_parser_state (&ps); + save_input_line_state (&ls); /*(*/ parser_state |= PST_CMDSUBST|PST_EOFTOKEN; /* allow instant ')' */ /*(*/ @@ -3861,6 +3864,8 @@ xparse_dolparen (base, string, indp, flags) restore_parser_state (&ps); reset_parser (); + /* reset_parser clears shell_input_line and associated variables */ + restore_input_line_state (&ls); if (interactive) token_to_read = 0; @@ -5908,6 +5913,12 @@ save_parser_state (ps) ps->expand_aliases = expand_aliases; ps->echo_input_at_read = echo_input_at_read; + ps->token = token; + ps->token_buffer_size = token_buffer_size; + /* Force reallocation on next call to read_token_word */ + token = 0; + token_buffer_size = 0; + return (ps); } @@ -5949,6 +5960,42 @@ restore_parser_state (ps) expand_aliases = ps->expand_aliases; echo_input_at_read = ps->echo_input_at_read; + + FREE (token); + token = ps->token; + token_buffer_size = ps->token_buffer_size; +} + +sh_input_line_state_t * +save_input_line_state (ls) + sh_input_line_state_t *ls; +{ + if (ls == 0) + ls = (sh_input_line_state_t *)xmalloc (sizeof (sh_input_line_state_t)); + if (ls == 0) + return ((sh_input_line_state_t *)NULL); + + ls->input_line = shell_input_line; + ls->input_line_size = shell_input_line_size; + ls->input_line_len = shell_input_line_len; + ls->input_line_index = shell_input_line_index; + + /* force reallocation */ + shell_input_line = 0; + shell_input_line_size = shell_input_line_len = shell_input_line_index = 0; +} + +void +restore_input_line_state (ls) + sh_input_line_state_t *ls; +{ + FREE (shell_input_line); + shell_input_line = ls->input_line; + shell_input_line_size = ls->input_line_size; + shell_input_line_len = ls->input_line_len; + shell_input_line_index = ls->input_line_index; + + set_line_mbstate (); } /************************************************ |