Update year range in copyright notice of all files owned by the GDB project.
[deliverable/binutils-gdb.git] / gdb / mi / mi-console.c
CommitLineData
fb40c209 1/* MI Console code.
349c5d5f 2
32d0add0 3 Copyright (C) 2000-2015 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{
70 struct mi_console_file *mi_console = ui_file_data (file);
102040f0 71
fb40c209 72 if (mi_console->magic != &mi_console_file_magic)
8e65ff28 73 internal_error (__FILE__, __LINE__,
e2e0b3e5 74 _("mi_console_file_delete: bad magic number"));
2b03b41d 75
b8c9b27d 76 xfree (mi_console);
fb40c209
AC
77}
78
79static void
2b03b41d 80mi_console_file_fputs (const char *buf, struct ui_file *file)
fb40c209
AC
81{
82 struct mi_console_file *mi_console = ui_file_data (file);
102040f0 83
fb40c209 84 if (mi_console->magic != &mi_console_file_magic)
8e65ff28
AC
85 internal_error (__FILE__, __LINE__,
86 "mi_console_file_fputs: bad magic number");
2b03b41d
SS
87
88 /* Append the text to our internal buffer. */
fb40c209 89 fputs_unfiltered (buf, mi_console->buffer);
2b03b41d 90 /* Flush when an embedded newline is present anywhere in the buffer. */
fb40c209
AC
91 if (strchr (buf, '\n') != NULL)
92 gdb_flush (file);
93}
94
2b03b41d
SS
95/* Transform a byte sequence into a console output packet. */
96
fb40c209 97static void
2b03b41d 98mi_console_raw_packet (void *data, const char *buf, long length_buf)
fb40c209
AC
99{
100 struct mi_console_file *mi_console = data;
102040f0 101
fb40c209 102 if (mi_console->magic != &mi_console_file_magic)
8e65ff28 103 internal_error (__FILE__, __LINE__,
2b03b41d 104 _("mi_console_raw_packet: bad magic number"));
fb40c209
AC
105
106 if (length_buf > 0)
107 {
108 fputs_unfiltered (mi_console->prefix, mi_console->raw);
4389a95a
AC
109 if (mi_console->quote)
110 {
303a33fa 111 fputc_unfiltered (mi_console->quote, mi_console->raw);
9a2b4c1b
MS
112 fputstrn_unfiltered (buf, length_buf,
113 mi_console->quote, mi_console->raw);
303a33fa
SM
114 fputc_unfiltered (mi_console->quote, mi_console->raw);
115 fputc_unfiltered ('\n', mi_console->raw);
4389a95a
AC
116 }
117 else
118 {
119 fputstrn_unfiltered (buf, length_buf, 0, mi_console->raw);
303a33fa 120 fputc_unfiltered ('\n', mi_console->raw);
4389a95a 121 }
fb40c209
AC
122 gdb_flush (mi_console->raw);
123 }
124}
125
126static void
127mi_console_file_flush (struct ui_file *file)
128{
129 struct mi_console_file *mi_console = ui_file_data (file);
102040f0 130
fb40c209 131 if (mi_console->magic != &mi_console_file_magic)
8e65ff28 132 internal_error (__FILE__, __LINE__,
e2e0b3e5 133 _("mi_console_file_flush: bad magic number"));
2b03b41d 134
fb40c209
AC
135 ui_file_put (mi_console->buffer, mi_console_raw_packet, mi_console);
136 ui_file_rewind (mi_console->buffer);
37ce89eb
SS
137
138}
139
140/* Change the underlying stream of the console directly; this is
141 useful as a minimum-impact way to reflect external changes like
142 logging enable/disable. */
143
144void
145mi_console_set_raw (struct ui_file *file, struct ui_file *raw)
146{
147 struct mi_console_file *mi_console = ui_file_data (file);
148
149 if (mi_console->magic != &mi_console_file_magic)
150 internal_error (__FILE__, __LINE__,
151 _("mi_console_file_set_raw: bad magic number"));
152
153 mi_console->raw = raw;
fb40c209 154}
This page took 1.184823 seconds and 4 git commands to generate.