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