198944Sobrien/* MI Console code.
2130803Smarcel
3130803Smarcel   Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
4130803Smarcel
598944Sobrien   Contributed by Cygnus Solutions (a Red Hat company).
698944Sobrien
798944Sobrien   This file is part of GDB.
898944Sobrien
998944Sobrien   This program is free software; you can redistribute it and/or modify
1098944Sobrien   it under the terms of the GNU General Public License as published by
1198944Sobrien   the Free Software Foundation; either version 2 of the License, or
1298944Sobrien   (at your option) any later version.
1398944Sobrien
1498944Sobrien   This program is distributed in the hope that it will be useful,
1598944Sobrien   but WITHOUT ANY WARRANTY; without even the implied warranty of
1698944Sobrien   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1798944Sobrien   GNU General Public License for more details.
1898944Sobrien
1998944Sobrien   You should have received a copy of the GNU General Public License
2098944Sobrien   along with this program; if not, write to the Free Software
2198944Sobrien   Foundation, Inc., 59 Temple Place - Suite 330,
2298944Sobrien   Boston, MA 02111-1307, USA.  */
2398944Sobrien
2498944Sobrien#include "defs.h"
2598944Sobrien#include "mi-console.h"
2698944Sobrien#include "gdb_string.h"
2798944Sobrien
2898944Sobrien/* MI-console: send output to std-out but correcty encapsulated */
2998944Sobrien
3098944Sobrienstatic ui_file_fputs_ftype mi_console_file_fputs;
3198944Sobrienstatic ui_file_flush_ftype mi_console_file_flush;
3298944Sobrienstatic ui_file_delete_ftype mi_console_file_delete;
3398944Sobrien
3498944Sobrienstruct mi_console_file
3598944Sobrien  {
3698944Sobrien    int *magic;
3798944Sobrien    struct ui_file *raw;
3898944Sobrien    struct ui_file *buffer;
3998944Sobrien    const char *prefix;
40130803Smarcel    char quote;
4198944Sobrien  };
4298944Sobrien
4398944Sobrienint mi_console_file_magic;
4498944Sobrien
4598944Sobrienstruct ui_file *
4698944Sobrienmi_console_file_new (struct ui_file *raw,
47130803Smarcel		     const char *prefix, char quote)
4898944Sobrien{
4998944Sobrien  struct ui_file *ui_file = ui_file_new ();
5098944Sobrien  struct mi_console_file *mi_console = XMALLOC (struct mi_console_file);
5198944Sobrien  mi_console->magic = &mi_console_file_magic;
5298944Sobrien  mi_console->raw = raw;
5398944Sobrien  mi_console->buffer = mem_fileopen ();
5498944Sobrien  mi_console->prefix = prefix;
55130803Smarcel  mi_console->quote = quote;
5698944Sobrien  set_ui_file_fputs (ui_file, mi_console_file_fputs);
5798944Sobrien  set_ui_file_flush (ui_file, mi_console_file_flush);
5898944Sobrien  set_ui_file_data (ui_file, mi_console, mi_console_file_delete);
5998944Sobrien  return ui_file;
6098944Sobrien}
6198944Sobrien
6298944Sobrienstatic void
6398944Sobrienmi_console_file_delete (struct ui_file *file)
6498944Sobrien{
6598944Sobrien  struct mi_console_file *mi_console = ui_file_data (file);
6698944Sobrien  if (mi_console->magic != &mi_console_file_magic)
6798944Sobrien    internal_error (__FILE__, __LINE__,
6898944Sobrien		    "mi_console_file_delete: bad magic number");
6998944Sobrien  xfree (mi_console);
7098944Sobrien}
7198944Sobrien
7298944Sobrienstatic void
7398944Sobrienmi_console_file_fputs (const char *buf,
7498944Sobrien		       struct ui_file *file)
7598944Sobrien{
7698944Sobrien  struct mi_console_file *mi_console = ui_file_data (file);
7798944Sobrien  if (mi_console->magic != &mi_console_file_magic)
7898944Sobrien    internal_error (__FILE__, __LINE__,
7998944Sobrien		    "mi_console_file_fputs: bad magic number");
8098944Sobrien  /* Append the text to our internal buffer */
8198944Sobrien  fputs_unfiltered (buf, mi_console->buffer);
8298944Sobrien  /* Flush when an embedded \n */
8398944Sobrien  if (strchr (buf, '\n') != NULL)
8498944Sobrien    gdb_flush (file);
8598944Sobrien}
8698944Sobrien
8798944Sobrien/* Transform a byte sequence into a console output packet. */
8898944Sobrienstatic void
8998944Sobrienmi_console_raw_packet (void *data,
9098944Sobrien		       const char *buf,
9198944Sobrien		       long length_buf)
9298944Sobrien{
9398944Sobrien  struct mi_console_file *mi_console = data;
9498944Sobrien  if (mi_console->magic != &mi_console_file_magic)
9598944Sobrien    internal_error (__FILE__, __LINE__,
9698944Sobrien		    "mi_console_file_transform: bad magic number");
9798944Sobrien
9898944Sobrien  if (length_buf > 0)
9998944Sobrien    {
10098944Sobrien      fputs_unfiltered (mi_console->prefix, mi_console->raw);
101130803Smarcel      if (mi_console->quote)
102130803Smarcel	{
103130803Smarcel	  fputs_unfiltered ("\"", mi_console->raw);
104130803Smarcel	  fputstrn_unfiltered (buf, length_buf, mi_console->quote, mi_console->raw);
105130803Smarcel	  fputs_unfiltered ("\"\n", mi_console->raw);
106130803Smarcel	}
107130803Smarcel      else
108130803Smarcel	{
109130803Smarcel	  fputstrn_unfiltered (buf, length_buf, 0, mi_console->raw);
110130803Smarcel	  fputs_unfiltered ("\n", mi_console->raw);
111130803Smarcel	}
11298944Sobrien      gdb_flush (mi_console->raw);
11398944Sobrien    }
11498944Sobrien}
11598944Sobrien
11698944Sobrienstatic void
11798944Sobrienmi_console_file_flush (struct ui_file *file)
11898944Sobrien{
11998944Sobrien  struct mi_console_file *mi_console = ui_file_data (file);
12098944Sobrien  if (mi_console->magic != &mi_console_file_magic)
12198944Sobrien    internal_error (__FILE__, __LINE__,
12298944Sobrien		    "mi_console_file_flush: bad magic number");
12398944Sobrien  ui_file_put (mi_console->buffer, mi_console_raw_packet, mi_console);
12498944Sobrien  ui_file_rewind (mi_console->buffer);
12598944Sobrien}
126