bfd:
[deliverable/binutils-gdb.git] / gdb / mi / mi-console.c
CommitLineData
fb40c209 1/* MI Console code.
349c5d5f 2
9b254dd1 3 Copyright (C) 2000, 2001, 2002, 2007, 2008 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
AC
21
22#include "defs.h"
23#include "mi-console.h"
27b82ed2 24#include "gdb_string.h"
fb40c209 25
fb40c209
AC
26/* MI-console: send output to std-out but correcty encapsulated */
27
28static ui_file_fputs_ftype mi_console_file_fputs;
29static ui_file_flush_ftype mi_console_file_flush;
30static ui_file_delete_ftype mi_console_file_delete;
31
32struct mi_console_file
33 {
34 int *magic;
35 struct ui_file *raw;
36 struct ui_file *buffer;
37 const char *prefix;
4389a95a 38 char quote;
fb40c209
AC
39 };
40
41int mi_console_file_magic;
42
43struct ui_file *
44mi_console_file_new (struct ui_file *raw,
4389a95a 45 const char *prefix, char quote)
fb40c209
AC
46{
47 struct ui_file *ui_file = ui_file_new ();
48 struct mi_console_file *mi_console = XMALLOC (struct mi_console_file);
49 mi_console->magic = &mi_console_file_magic;
50 mi_console->raw = raw;
51 mi_console->buffer = mem_fileopen ();
52 mi_console->prefix = prefix;
4389a95a 53 mi_console->quote = quote;
fb40c209
AC
54 set_ui_file_fputs (ui_file, mi_console_file_fputs);
55 set_ui_file_flush (ui_file, mi_console_file_flush);
56 set_ui_file_data (ui_file, mi_console, mi_console_file_delete);
57 return ui_file;
58}
59
60static void
61mi_console_file_delete (struct ui_file *file)
62{
63 struct mi_console_file *mi_console = ui_file_data (file);
64 if (mi_console->magic != &mi_console_file_magic)
8e65ff28 65 internal_error (__FILE__, __LINE__,
e2e0b3e5 66 _("mi_console_file_delete: bad magic number"));
b8c9b27d 67 xfree (mi_console);
fb40c209
AC
68}
69
70static void
71mi_console_file_fputs (const char *buf,
72 struct ui_file *file)
73{
74 struct mi_console_file *mi_console = ui_file_data (file);
75 if (mi_console->magic != &mi_console_file_magic)
8e65ff28
AC
76 internal_error (__FILE__, __LINE__,
77 "mi_console_file_fputs: bad magic number");
fb40c209
AC
78 /* Append the text to our internal buffer */
79 fputs_unfiltered (buf, mi_console->buffer);
80 /* Flush when an embedded \n */
81 if (strchr (buf, '\n') != NULL)
82 gdb_flush (file);
83}
84
85/* Transform a byte sequence into a console output packet. */
86static void
87mi_console_raw_packet (void *data,
88 const char *buf,
89 long length_buf)
90{
91 struct mi_console_file *mi_console = data;
92 if (mi_console->magic != &mi_console_file_magic)
8e65ff28 93 internal_error (__FILE__, __LINE__,
e2e0b3e5 94 _("mi_console_file_transform: bad magic number"));
fb40c209
AC
95
96 if (length_buf > 0)
97 {
98 fputs_unfiltered (mi_console->prefix, mi_console->raw);
4389a95a
AC
99 if (mi_console->quote)
100 {
101 fputs_unfiltered ("\"", mi_console->raw);
102 fputstrn_unfiltered (buf, length_buf, mi_console->quote, mi_console->raw);
103 fputs_unfiltered ("\"\n", mi_console->raw);
104 }
105 else
106 {
107 fputstrn_unfiltered (buf, length_buf, 0, mi_console->raw);
108 fputs_unfiltered ("\n", mi_console->raw);
109 }
fb40c209
AC
110 gdb_flush (mi_console->raw);
111 }
112}
113
114static void
115mi_console_file_flush (struct ui_file *file)
116{
117 struct mi_console_file *mi_console = ui_file_data (file);
118 if (mi_console->magic != &mi_console_file_magic)
8e65ff28 119 internal_error (__FILE__, __LINE__,
e2e0b3e5 120 _("mi_console_file_flush: bad magic number"));
fb40c209
AC
121 ui_file_put (mi_console->buffer, mi_console_raw_packet, mi_console);
122 ui_file_rewind (mi_console->buffer);
123}
This page took 0.696339 seconds and 4 git commands to generate.