aboutsummaryrefslogtreecommitdiffstats
path: root/parse.y
diff options
context:
space:
mode:
authorChet Ramey <chet.ramey@case.edu>2011-11-22 20:02:35 -0500
committerChet Ramey <chet.ramey@case.edu>2011-11-22 20:02:35 -0500
commitb4839c27f75ca05d8a26144df76e17cf71ee648f (patch)
tree938423950791d2ebf754eca37319dfad1e253733 /parse.y
parent47a7673055e4f82ee6c803df04eb1e2a87e717b7 (diff)
downloadandroid_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.y47
1 files changed, 47 insertions, 0 deletions
diff --git a/parse.y b/parse.y
index 65ec86a..bf569e1 100644
--- a/parse.y
+++ b/parse.y
@@ -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 ();
}
/************************************************