2009-12-07 Tristan Gingold <gingold@adacore.com>
[deliverable/binutils-gdb.git] / gdb / mi / mi-console.c
CommitLineData
fb40c209 1/* MI Console code.
349c5d5f 2
0fb0cc75
JB
3 Copyright (C) 2000, 2001, 2002, 2007, 2008, 2009
4 Free Software Foundation, Inc.
349c5d5f 5
ab91fdd5 6 Contributed by Cygnus Solutions (a Red Hat company).
fb40c209
AC
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
fb40c209
AC
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
fb40c209
AC
22
23#include "defs.h"
24#include "mi-console.h"
27b82ed2 25#include "gdb_string.h"
fb40c209 26
fb40c209
AC
27/* MI-console: send output to std-out but correcty encapsulated */
28
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
42int mi_console_file_magic;
43
44struct ui_file *
45mi_console_file_new (struct ui_file *raw,
4389a95a 46 const char *prefix, char quote)
fb40c209
AC
47{
48 struct ui_file *ui_file = ui_file_new ();
49 struct mi_console_file *mi_console = XMALLOC (struct mi_console_file);
50 mi_console->magic = &mi_console_file_magic;
51 mi_console->raw = raw;
52 mi_console->buffer = mem_fileopen ();
53 mi_console->prefix = prefix;
4389a95a 54 mi_console->quote = quote;
fb40c209
AC
55 set_ui_file_fputs (ui_file, mi_console_file_fputs);
56 set_ui_file_flush (ui_file, mi_console_file_flush);
57 set_ui_file_data (ui_file, mi_console, mi_console_file_delete);
58 return ui_file;
59}
60
61static void
62mi_console_file_delete (struct ui_file *file)
63{
64 struct mi_console_file *mi_console = ui_file_data (file);
65 if (mi_console->magic != &mi_console_file_magic)
8e65ff28 66 internal_error (__FILE__, __LINE__,
e2e0b3e5 67 _("mi_console_file_delete: bad magic number"));
b8c9b27d 68 xfree (mi_console);
fb40c209
AC
69}
70
71static void
72mi_console_file_fputs (const char *buf,
73 struct ui_file *file)
74{
75 struct mi_console_file *mi_console = ui_file_data (file);
76 if (mi_console->magic != &mi_console_file_magic)
8e65ff28
AC
77 internal_error (__FILE__, __LINE__,
78 "mi_console_file_fputs: bad magic number");
fb40c209
AC
79 /* Append the text to our internal buffer */
80 fputs_unfiltered (buf, mi_console->buffer);
81 /* Flush when an embedded \n */
82 if (strchr (buf, '\n') != NULL)
83 gdb_flush (file);
84}
85
86/* Transform a byte sequence into a console output packet. */
87static void
88mi_console_raw_packet (void *data,
89 const char *buf,
90 long length_buf)
91{
92 struct mi_console_file *mi_console = data;
93 if (mi_console->magic != &mi_console_file_magic)
8e65ff28 94 internal_error (__FILE__, __LINE__,
e2e0b3e5 95 _("mi_console_file_transform: bad magic number"));
fb40c209
AC
96
97 if (length_buf > 0)
98 {
99 fputs_unfiltered (mi_console->prefix, mi_console->raw);
4389a95a
AC
100 if (mi_console->quote)
101 {
102 fputs_unfiltered ("\"", mi_console->raw);
103 fputstrn_unfiltered (buf, length_buf, mi_console->quote, mi_console->raw);
104 fputs_unfiltered ("\"\n", mi_console->raw);
105 }
106 else
107 {
108 fputstrn_unfiltered (buf, length_buf, 0, mi_console->raw);
109 fputs_unfiltered ("\n", mi_console->raw);
110 }
fb40c209
AC
111 gdb_flush (mi_console->raw);
112 }
113}
114
115static void
116mi_console_file_flush (struct ui_file *file)
117{
118 struct mi_console_file *mi_console = ui_file_data (file);
119 if (mi_console->magic != &mi_console_file_magic)
8e65ff28 120 internal_error (__FILE__, __LINE__,
e2e0b3e5 121 _("mi_console_file_flush: bad magic number"));
fb40c209
AC
122 ui_file_put (mi_console->buffer, mi_console_raw_packet, mi_console);
123 ui_file_rewind (mi_console->buffer);
124}
This page took 0.839356 seconds and 4 git commands to generate.