ui->input_interactive_p = ISATTY (ui->instream);
- ui->m_gdb_stdin = stdio_fileopen (ui->instream);
- ui->m_gdb_stdout = stdio_fileopen (ui->outstream);
- ui->m_gdb_stderr = stderr_fileopen (ui->errstream);
+ ui->m_gdb_stdin = new stdio_file (ui->instream);
+ ui->m_gdb_stdout = new stdio_file (ui->outstream);
+ ui->m_gdb_stderr = new stderr_file (ui->errstream);
ui->m_gdb_stdlog = ui->m_gdb_stderr;
ui->prompt_state = PROMPT_NEEDED;
static void
free_ui (struct ui *ui)
{
- ui_file_delete (ui->m_gdb_stdin);
- ui_file_delete (ui->m_gdb_stdout);
- ui_file_delete (ui->m_gdb_stderr);
+ delete ui->m_gdb_stdin;
+ delete ui->m_gdb_stdout;
+ delete ui->m_gdb_stderr;
xfree (ui);
}
std::string
execute_command_to_string (char *p, int from_tty)
{
- struct ui_file *str_file;
struct cleanup *cleanup;
/* GDB_STDOUT should be better already restored during these
scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0);
- str_file = mem_fileopen ();
+ string_file str_file;
- make_cleanup_ui_file_delete (str_file);
-
- current_uiout->redirect (str_file);
+ current_uiout->redirect (&str_file);
make_cleanup_ui_out_redirect_pop (current_uiout);
scoped_restore save_stdout
- = make_scoped_restore (&gdb_stdout, str_file);
+ = make_scoped_restore (&gdb_stdout, &str_file);
scoped_restore save_stderr
- = make_scoped_restore (&gdb_stderr, str_file);
+ = make_scoped_restore (&gdb_stderr, &str_file);
scoped_restore save_stdlog
- = make_scoped_restore (&gdb_stdlog, str_file);
+ = make_scoped_restore (&gdb_stdlog, &str_file);
scoped_restore save_stdtarg
- = make_scoped_restore (&gdb_stdtarg, str_file);
+ = make_scoped_restore (&gdb_stdtarg, &str_file);
scoped_restore save_stdtargerr
- = make_scoped_restore (&gdb_stdtargerr, str_file);
+ = make_scoped_restore (&gdb_stdtargerr, &str_file);
execute_command (p, from_tty);
- std::string retval = ui_file_as_string (str_file);
-
do_cleanups (cleanup);
- return retval;
+ return std::move (str_file.string ());
}
\f
if (cleanup->target_is_async_orig)
target_async (0);
- /* Display our prompt and prevent double prompt display. */
- display_gdb_prompt (prompt);
+ /* Display our prompt and prevent double prompt display. Don't pass
+ down a NULL prompt, since that has special meaning for
+ display_gdb_prompt -- it indicates a request to print the primary
+ prompt, while we want a secondary prompt here. */
+ display_gdb_prompt (prompt != NULL ? prompt : "");
if (ui->command_editing)
rl_already_prompted = 1;
if (cmd != NULL)
break;
+ /* Got partial input. I.e., got a line that ends with a
+ continuation character (backslash). Suppress printing the
+ prompt again. */
prompt = NULL;
}
int
quit_confirm (void)
{
- struct ui_file *stb;
- struct cleanup *old_chain;
-
/* Don't even ask if we're only debugging a core file inferior. */
if (!have_live_inferiors ())
return 1;
/* Build the query string as a single string. */
- stb = mem_fileopen ();
- old_chain = make_cleanup_ui_file_delete (stb);
-
- fprintf_filtered (stb, _("A debugging session is active.\n\n"));
- iterate_over_inferiors (print_inferior_quit_action, stb);
- fprintf_filtered (stb, _("\nQuit anyway? "));
+ string_file stb;
- std::string str = ui_file_as_string (stb);
-
- do_cleanups (old_chain);
+ stb.puts (_("A debugging session is active.\n\n"));
+ iterate_over_inferiors (print_inferior_quit_action, &stb);
+ stb.puts (_("\nQuit anyway? "));
- return query ("%s", str.c_str ());
+ return query ("%s", stb.c_str ());
}
/* Prepare to exit GDB cleanly by undoing any changes made to the