diff options
author | Andrew Cagney <cagney@redhat.com> | 2000-02-23 00:25:43 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 2000-02-23 00:25:43 +0000 |
commit | fb40c20903110ed8af9701ce7c2635abd3770d52 (patch) | |
tree | 9f99a85a7d64fa61cfa9a167e006e2f747716d42 /gdb/mi/mi-console.c | |
parent | e6c6b6fe2d24c8be4909c7e3c0dd1a937819ffe9 (diff) | |
download | gdb-fb40c20903110ed8af9701ce7c2635abd3770d52.zip gdb-fb40c20903110ed8af9701ce7c2635abd3770d52.tar.gz gdb-fb40c20903110ed8af9701ce7c2635abd3770d52.tar.bz2 |
Add mi/ and testsuite/gdb.mi/ subdirectories.
Add --enable-gdbmi option to configury.
Add mi rules to Makefile.in
Add mi conditional output to event-top.c infrun.c main.c top.c.
Add -i=mi option.
Diffstat (limited to 'gdb/mi/mi-console.c')
-rw-r--r-- | gdb/mi/mi-console.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/gdb/mi/mi-console.c b/gdb/mi/mi-console.c new file mode 100644 index 0000000..3bf6a73 --- /dev/null +++ b/gdb/mi/mi-console.c @@ -0,0 +1,118 @@ +/* MI Console code. + Copyright (C) 2000, Free Software Foundation, Inc. + Contributed by Cygnus Solutions. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include "defs.h" +#include "mi-console.h" +#include <string.h> + +/* Convenience macro for allocting typesafe memory. */ + +#undef XMALLOC +#define XMALLOC(TYPE) (TYPE*) xmalloc (sizeof (TYPE)) + +/* MI-console: send output to std-out but correcty encapsulated */ + +static ui_file_fputs_ftype mi_console_file_fputs; +static ui_file_flush_ftype mi_console_file_flush; +static ui_file_delete_ftype mi_console_file_delete; + +struct mi_console_file + { + int *magic; + struct ui_file *raw; + struct ui_file *buffer; + const char *prefix; + }; + +int mi_console_file_magic; + +struct ui_file * +mi_console_file_new (struct ui_file *raw, + const char *prefix) +{ + struct ui_file *ui_file = ui_file_new (); + struct mi_console_file *mi_console = XMALLOC (struct mi_console_file); + mi_console->magic = &mi_console_file_magic; + mi_console->raw = raw; + mi_console->buffer = mem_fileopen (); + mi_console->prefix = prefix; + set_ui_file_fputs (ui_file, mi_console_file_fputs); + set_ui_file_flush (ui_file, mi_console_file_flush); + set_ui_file_data (ui_file, mi_console, mi_console_file_delete); + return ui_file; +} + +static void +mi_console_file_delete (struct ui_file *file) +{ + struct mi_console_file *mi_console = ui_file_data (file); + if (mi_console->magic != &mi_console_file_magic) + internal_error ("mi_console_file_delete: bad magic number"); + free (mi_console); +} + +static void +mi_console_file_fputs (const char *buf, + struct ui_file *file) +{ + struct mi_console_file *mi_console = ui_file_data (file); + if (mi_console->magic != &mi_console_file_magic) + internal_error ("mi_console_file_fputs: bad magic number"); + /* Append the text to our internal buffer */ + fputs_unfiltered (buf, mi_console->buffer); + /* Flush when an embedded \n */ + if (strchr (buf, '\n') != NULL) + gdb_flush (file); +} + +/* Transform a byte sequence into a console output packet. */ +static void +mi_console_raw_packet (void *data, + const char *buf, + long length_buf) +{ + struct mi_console_file *mi_console = data; + if (mi_console->magic != &mi_console_file_magic) + internal_error ("mi_console_file_transform: bad magic number"); + + if (length_buf > 0) + { + fputs_unfiltered (mi_console->prefix, mi_console->raw); + fputs_unfiltered ("\"", mi_console->raw); + fputstrn_unfiltered (buf, length_buf, '"', mi_console->raw); + fputs_unfiltered ("\"\n", mi_console->raw); + gdb_flush (mi_console->raw); + } +} + +static void +mi_console_file_flush (struct ui_file *file) +{ + struct mi_console_file *mi_console = ui_file_data (file); + if (mi_console->magic != &mi_console_file_magic) + internal_error ("mi_console_file_flush: bad magic number"); + ui_file_put (mi_console->buffer, mi_console_raw_packet, mi_console); + ui_file_rewind (mi_console->buffer); +} + +/* Local variables: */ +/* change-log-default-name: "ChangeLog-mi" */ +/* End: */ |