From c41535fdc41896a2e881e1386eb3be9dff6ca6c4 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Tue, 8 May 2012 18:49:42 +0000 Subject: [PATCH] Display the ">" prompt in interactive mode while reading canned commands, even when the current interpreter is MI. interps.c (interp_set_temp): New function. interps.h (interp_set_temp): Add prototype. cli/cli-script.c (restore_interp): New cleanup function. (read_command_lines): Temporarily override the current interpreter with CLI and arrange for restoring the original one. --- gdb/ChangeLog | 13 +++++++++++++ gdb/cli/cli-script.c | 23 +++++++++++++++++++++-- gdb/interps.c | 12 ++++++++++++ gdb/interps.h | 1 + 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0a7266db3a..17039cb572 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,16 @@ +2012-05-08 Eli Zaretskii + + Display the ">" prompt in interactive mode while reading canned + commands, even when the current interpreter is MI. + + * interps.c (interp_set_temp): New function. + + * interps.h (interp_set_temp): Add prototype. + + * cli/cli-script.c (restore_interp): New cleanup function. + (read_command_lines): Temporarily override the current interpreter + with CLI and arrange for restoring the original one. + 2012-05-12 Joel Sherrill * microblaze-rom.c (_initialize_picobug_rom): Add prototype. diff --git a/gdb/cli/cli-script.c b/gdb/cli/cli-script.c index cfa1c771c5..4b6c416914 100644 --- a/gdb/cli/cli-script.c +++ b/gdb/cli/cli-script.c @@ -1178,6 +1178,12 @@ recurse_read_control_structure (char * (*read_next_line_func) (void), return ret; } +static void +restore_interp (void *arg) +{ + interp_set_temp (interp_name ((struct interp *)arg)); +} + /* Read lines from the input stream and accumulate them in a chain of struct command_line's, which is then returned. For input from a terminal, the special command "end" is used to mark the end of the @@ -1210,8 +1216,21 @@ read_command_lines (char *prompt_arg, int from_tty, int parse_commands, } } - head = read_command_lines_1 (read_next_line, parse_commands, - validator, closure); + + /* Reading commands assumes the CLI behavior, so temporarily + override the current interpreter with CLI. */ + if (current_interp_named_p (INTERP_CONSOLE)) + head = read_command_lines_1 (read_next_line, parse_commands, + validator, closure); + else + { + struct interp *old_interp = interp_set_temp (INTERP_CONSOLE); + struct cleanup *old_chain = make_cleanup (restore_interp, old_interp); + + head = read_command_lines_1 (read_next_line, parse_commands, + validator, closure); + do_cleanups (old_chain); + } if (deprecated_readline_end_hook && from_tty && input_from_terminal_p ()) { diff --git a/gdb/interps.c b/gdb/interps.c index 36ed520427..23e5a1051c 100644 --- a/gdb/interps.c +++ b/gdb/interps.c @@ -253,6 +253,18 @@ interp_ui_out (struct interp *interp) return current_interpreter->procs->ui_out_proc (current_interpreter); } +/* Temporarily overrides the current interpreter. */ +struct interp * +interp_set_temp (const char *name) +{ + struct interp *interp = interp_lookup (name); + struct interp *old_interp = current_interpreter; + + if (interp) + current_interpreter = interp; + return old_interp; +} + /* Returns the interpreter's cookie. */ void * diff --git a/gdb/interps.h b/gdb/interps.h index 99431ee146..bbf083814a 100644 --- a/gdb/interps.h +++ b/gdb/interps.h @@ -69,6 +69,7 @@ extern struct interp *interp_lookup (const char *name); extern struct ui_out *interp_ui_out (struct interp *interp); extern void *interp_data (struct interp *interp); extern const char *interp_name (struct interp *interp); +extern struct interp *interp_set_temp (const char *name); extern int current_interp_named_p (const char *name); extern int current_interp_display_prompt_p (void); -- 2.34.1