]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/mi/mi-console.c
update copyright year range in GDB files
[thirdparty/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"
fb40c209
AC
29static ui_file_fputs_ftype mi_console_file_fputs;
30static ui_file_flush_ftype mi_console_file_flush;
31static ui_file_delete_ftype mi_console_file_delete;
32
33struct mi_console_file
34 {
35 int *magic;
36 struct ui_file *raw;
37 struct ui_file *buffer;
38 const char *prefix;
4389a95a 39 char quote;
fb40c209
AC
40 };
41
2b03b41d
SS
42/* Use the address of this otherwise-unused global as a magic number
43 identifying this class of ui_file objects. */
44static int mi_console_file_magic;
45
46/* Create a console that wraps the given output stream RAW with the
47 string PREFIX and quoting it with QUOTE. */
fb40c209
AC
48
49struct ui_file *
2b03b41d 50mi_console_file_new (struct ui_file *raw, const char *prefix, char quote)
fb40c209
AC
51{
52 struct ui_file *ui_file = ui_file_new ();
70ba0933 53 struct mi_console_file *mi_console = XNEW (struct mi_console_file);
102040f0 54
fb40c209
AC
55 mi_console->magic = &mi_console_file_magic;
56 mi_console->raw = raw;
57 mi_console->buffer = mem_fileopen ();
58 mi_console->prefix = prefix;
4389a95a 59 mi_console->quote = quote;
fb40c209
AC
60 set_ui_file_fputs (ui_file, mi_console_file_fputs);
61 set_ui_file_flush (ui_file, mi_console_file_flush);
62 set_ui_file_data (ui_file, mi_console, mi_console_file_delete);
2b03b41d 63
fb40c209
AC
64 return ui_file;
65}
66
67static void
68mi_console_file_delete (struct ui_file *file)
69{
19ba03f4
SM
70 struct mi_console_file *mi_console
71 = (struct mi_console_file *) ui_file_data (file);
102040f0 72
fb40c209 73 if (mi_console->magic != &mi_console_file_magic)
8e65ff28 74 internal_error (__FILE__, __LINE__,
e2e0b3e5 75 _("mi_console_file_delete: bad magic number"));
2b03b41d 76
b8c9b27d 77 xfree (mi_console);
fb40c209
AC
78}
79
80static void
2b03b41d 81mi_console_file_fputs (const char *buf, struct ui_file *file)
fb40c209 82{
19ba03f4
SM
83 struct mi_console_file *mi_console
84 = (struct mi_console_file *) ui_file_data (file);
102040f0 85
fb40c209 86 if (mi_console->magic != &mi_console_file_magic)
8e65ff28
AC
87 internal_error (__FILE__, __LINE__,
88 "mi_console_file_fputs: bad magic number");
2b03b41d
SS
89
90 /* Append the text to our internal buffer. */
fb40c209 91 fputs_unfiltered (buf, mi_console->buffer);
2b03b41d 92 /* Flush when an embedded newline is present anywhere in the buffer. */
fb40c209
AC
93 if (strchr (buf, '\n') != NULL)
94 gdb_flush (file);
95}
96
2b03b41d
SS
97/* Transform a byte sequence into a console output packet. */
98
fb40c209 99static void
2b03b41d 100mi_console_raw_packet (void *data, const char *buf, long length_buf)
fb40c209 101{
19ba03f4 102 struct mi_console_file *mi_console = (struct mi_console_file *) data;
102040f0 103
fb40c209 104 if (mi_console->magic != &mi_console_file_magic)
8e65ff28 105 internal_error (__FILE__, __LINE__,
2b03b41d 106 _("mi_console_raw_packet: bad magic number"));
fb40c209
AC
107
108 if (length_buf > 0)
109 {
110 fputs_unfiltered (mi_console->prefix, mi_console->raw);
4389a95a
AC
111 if (mi_console->quote)
112 {
303a33fa 113 fputc_unfiltered (mi_console->quote, mi_console->raw);
9a2b4c1b
MS
114 fputstrn_unfiltered (buf, length_buf,
115 mi_console->quote, mi_console->raw);
303a33fa
SM
116 fputc_unfiltered (mi_console->quote, mi_console->raw);
117 fputc_unfiltered ('\n', mi_console->raw);
4389a95a
AC
118 }
119 else
120 {
121 fputstrn_unfiltered (buf, length_buf, 0, mi_console->raw);
303a33fa 122 fputc_unfiltered ('\n', mi_console->raw);
4389a95a 123 }
fb40c209
AC
124 gdb_flush (mi_console->raw);
125 }
126}
127
128static void
129mi_console_file_flush (struct ui_file *file)
130{
19ba03f4
SM
131 struct mi_console_file *mi_console
132 = (struct mi_console_file *) ui_file_data (file);
102040f0 133
fb40c209 134 if (mi_console->magic != &mi_console_file_magic)
8e65ff28 135 internal_error (__FILE__, __LINE__,
e2e0b3e5 136 _("mi_console_file_flush: bad magic number"));
2b03b41d 137
fb40c209
AC
138 ui_file_put (mi_console->buffer, mi_console_raw_packet, mi_console);
139 ui_file_rewind (mi_console->buffer);
37ce89eb
SS
140
141}
142
143/* Change the underlying stream of the console directly; this is
144 useful as a minimum-impact way to reflect external changes like
145 logging enable/disable. */
146
147void
148mi_console_set_raw (struct ui_file *file, struct ui_file *raw)
149{
19ba03f4
SM
150 struct mi_console_file *mi_console
151 = (struct mi_console_file *) ui_file_data (file);
37ce89eb
SS
152
153 if (mi_console->magic != &mi_console_file_magic)
154 internal_error (__FILE__, __LINE__,
155 _("mi_console_file_set_raw: bad magic number"));
156
157 mi_console->raw = raw;
fb40c209 158}