Change setup_breakpoint_reporting to return a scoped_restore
[deliverable/binutils-gdb.git] / gdb / mi / mi-console.c
CommitLineData
fb40c209 1/* MI Console code.
349c5d5f 2
61baf725 3 Copyright (C) 2000-2017 Free Software Foundation, Inc.
349c5d5f 4
ab91fdd5 5 Contributed by Cygnus Solutions (a Red Hat company).
fb40c209
AC
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
fb40c209
AC
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
fb40c209 21
2b03b41d
SS
22/* An MI console is a kind of ui_file stream that sends output to
23 stdout, but encapsulated and prefixed with a distinctive string;
24 for instance, error output is normally identified by a leading
25 "&". */
26
fb40c209
AC
27#include "defs.h"
28#include "mi-console.h"
2b03b41d
SS
29
30/* Create a console that wraps the given output stream RAW with the
31 string PREFIX and quoting it with QUOTE. */
fb40c209 32
d7e74731
PA
33mi_console_file::mi_console_file (ui_file *raw, const char *prefix, char quote)
34 : m_raw (raw),
35 m_prefix (prefix),
36 m_quote (quote)
37{}
2b03b41d 38
d7e74731
PA
39void
40mi_console_file::write (const char *buf, long length_buf)
fb40c209 41{
d7e74731 42 size_t prev_size = m_buffer.size ();
2b03b41d 43 /* Append the text to our internal buffer. */
d7e74731
PA
44 m_buffer.write (buf, length_buf);
45 /* Flush when an embedded newline is present anywhere in the
46 buffer. */
47 if (strchr (m_buffer.c_str () + prev_size, '\n') != NULL)
48 this->flush ();
fb40c209
AC
49}
50
d7e74731
PA
51void
52mi_console_file::flush ()
fb40c209 53{
d7e74731 54 const std::string &str = m_buffer.string ();
fb40c209 55
d7e74731
PA
56 /* Transform a byte sequence into a console output packet. */
57 if (!str.empty ())
fb40c209 58 {
d7e74731
PA
59 size_t length_buf = str.size ();
60 const char *buf = str.data ();
61
62 fputs_unfiltered (m_prefix, m_raw);
63 if (m_quote)
4389a95a 64 {
d7e74731
PA
65 fputc_unfiltered (m_quote, m_raw);
66 fputstrn_unfiltered (buf, length_buf, m_quote, m_raw);
67 fputc_unfiltered (m_quote, m_raw);
68 fputc_unfiltered ('\n', m_raw);
4389a95a
AC
69 }
70 else
71 {
d7e74731
PA
72 fputstrn_unfiltered (buf, length_buf, 0, m_raw);
73 fputc_unfiltered ('\n', m_raw);
4389a95a 74 }
d7e74731 75 gdb_flush (m_raw);
fb40c209 76 }
37ce89eb 77
d7e74731 78 m_buffer.clear ();
37ce89eb
SS
79}
80
81/* Change the underlying stream of the console directly; this is
82 useful as a minimum-impact way to reflect external changes like
83 logging enable/disable. */
84
85void
d7e74731 86mi_console_file::set_raw (ui_file *raw)
37ce89eb 87{
d7e74731 88 m_raw = raw;
fb40c209 89}
This page took 1.419242 seconds and 4 git commands to generate.