diff options
Diffstat (limited to 'gdb/mi/mi-console.c')
-rw-r--r-- | gdb/mi/mi-console.c | 135 |
1 files changed, 33 insertions, 102 deletions
diff --git a/gdb/mi/mi-console.c b/gdb/mi/mi-console.c index afb5e94c1a9..7c1c2acc37b 100644 --- a/gdb/mi/mi-console.c +++ b/gdb/mi/mi-console.c @@ -26,118 +26,56 @@ #include "defs.h" #include "mi-console.h" -static ui_file_fputs_ftype mi_console_file_fputs; -static ui_file_flush_ftype mi_console_file_flush; -static ui_file_delete_ftype mi_console_file_delete; - -struct mi_console_file - { - int *magic; - struct ui_file *raw; - struct ui_file *buffer; - const char *prefix; - char quote; - }; - -/* Use the address of this otherwise-unused global as a magic number - identifying this class of ui_file objects. */ -static int mi_console_file_magic; /* Create a console that wraps the given output stream RAW with the string PREFIX and quoting it with QUOTE. */ -struct ui_file * -mi_console_file_new (struct ui_file *raw, const char *prefix, char quote) -{ - struct ui_file *ui_file = ui_file_new (); - struct mi_console_file *mi_console = XNEW (struct mi_console_file); - - mi_console->magic = &mi_console_file_magic; - mi_console->raw = raw; - mi_console->buffer = mem_fileopen (); - mi_console->prefix = prefix; - mi_console->quote = quote; - set_ui_file_fputs (ui_file, mi_console_file_fputs); - set_ui_file_flush (ui_file, mi_console_file_flush); - set_ui_file_data (ui_file, mi_console, mi_console_file_delete); - - return ui_file; -} - -static void -mi_console_file_delete (struct ui_file *file) -{ - struct mi_console_file *mi_console - = (struct mi_console_file *) ui_file_data (file); - - if (mi_console->magic != &mi_console_file_magic) - internal_error (__FILE__, __LINE__, - _("mi_console_file_delete: bad magic number")); +mi_console_file::mi_console_file (ui_file *raw, const char *prefix, char quote) + : m_raw (raw), + m_prefix (prefix), + m_quote (quote) +{} - xfree (mi_console); -} - -static void -mi_console_file_fputs (const char *buf, struct ui_file *file) +void +mi_console_file::write (const char *buf, long length_buf) { - struct mi_console_file *mi_console - = (struct mi_console_file *) ui_file_data (file); - - if (mi_console->magic != &mi_console_file_magic) - internal_error (__FILE__, __LINE__, - "mi_console_file_fputs: bad magic number"); - + size_t prev_size = m_buffer.size (); /* Append the text to our internal buffer. */ - fputs_unfiltered (buf, mi_console->buffer); - /* Flush when an embedded newline is present anywhere in the buffer. */ - if (strchr (buf, '\n') != NULL) - gdb_flush (file); + m_buffer.write (buf, length_buf); + /* Flush when an embedded newline is present anywhere in the + buffer. */ + if (strchr (m_buffer.c_str () + prev_size, '\n') != NULL) + this->flush (); } -/* Transform a byte sequence into a console output packet. */ - -static void -mi_console_raw_packet (void *data, const char *buf, long length_buf) +void +mi_console_file::flush () { - struct mi_console_file *mi_console = (struct mi_console_file *) data; - - if (mi_console->magic != &mi_console_file_magic) - internal_error (__FILE__, __LINE__, - _("mi_console_raw_packet: bad magic number")); + const std::string &str = m_buffer.string (); - if (length_buf > 0) + /* Transform a byte sequence into a console output packet. */ + if (!str.empty ()) { - fputs_unfiltered (mi_console->prefix, mi_console->raw); - if (mi_console->quote) + size_t length_buf = str.size (); + const char *buf = str.data (); + + fputs_unfiltered (m_prefix, m_raw); + if (m_quote) { - fputc_unfiltered (mi_console->quote, mi_console->raw); - fputstrn_unfiltered (buf, length_buf, - mi_console->quote, mi_console->raw); - fputc_unfiltered (mi_console->quote, mi_console->raw); - fputc_unfiltered ('\n', mi_console->raw); + fputc_unfiltered (m_quote, m_raw); + fputstrn_unfiltered (buf, length_buf, m_quote, m_raw); + fputc_unfiltered (m_quote, m_raw); + fputc_unfiltered ('\n', m_raw); } else { - fputstrn_unfiltered (buf, length_buf, 0, mi_console->raw); - fputc_unfiltered ('\n', mi_console->raw); + fputstrn_unfiltered (buf, length_buf, 0, m_raw); + fputc_unfiltered ('\n', m_raw); } - gdb_flush (mi_console->raw); + gdb_flush (m_raw); } -} - -static void -mi_console_file_flush (struct ui_file *file) -{ - struct mi_console_file *mi_console - = (struct mi_console_file *) ui_file_data (file); - - if (mi_console->magic != &mi_console_file_magic) - internal_error (__FILE__, __LINE__, - _("mi_console_file_flush: bad magic number")); - - ui_file_put (mi_console->buffer, mi_console_raw_packet, mi_console); - ui_file_rewind (mi_console->buffer); + m_buffer.clear (); } /* Change the underlying stream of the console directly; this is @@ -145,14 +83,7 @@ mi_console_file_flush (struct ui_file *file) logging enable/disable. */ void -mi_console_set_raw (struct ui_file *file, struct ui_file *raw) +mi_console_file::set_raw (ui_file *raw) { - struct mi_console_file *mi_console - = (struct mi_console_file *) ui_file_data (file); - - if (mi_console->magic != &mi_console_file_magic) - internal_error (__FILE__, __LINE__, - _("mi_console_file_set_raw: bad magic number")); - - mi_console->raw = raw; + m_raw = raw; } |