X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fmi%2Fmi-out.c;h=1e941758cc5d1f58be7bfe54fa7687b260cf6d8b;hb=a1b7d1984a2ab493678efa1fa5c4cff683e61a71;hp=b2c02e69d0002ffffabec7a7c789320133e05c79;hpb=a7c14aa534277d20e70a657c9d9298a517268c3c;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/mi/mi-out.c b/gdb/mi/mi-out.c index b2c02e69d0..1e941758cc 100644 --- a/gdb/mi/mi-out.c +++ b/gdb/mi/mi-out.c @@ -1,12 +1,15 @@ /* MI Command Set - output generating routines. - Copyright 2000 Free Software Foundation, Inc. + + Copyright (C) 2000, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010 + Free Software Foundation, Inc. + Contributed by Cygnus Solutions (a Red Hat company). 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 + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -15,27 +18,20 @@ 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. */ + along with this program. If not, see . */ #include "defs.h" #include "ui-out.h" #include "mi-out.h" -/* Convenience macro for allocting typesafe memory. */ - -#ifndef XMALLOC -#define XMALLOC(TYPE) (TYPE*) xmalloc (sizeof (TYPE)) -#endif - struct ui_out_data { int suppress_field_separator; - int first_header; + int suppress_output; int mi_version; struct ui_file *buffer; }; +typedef struct ui_out_data mi_out_data; /* These are the MI output functions */ @@ -59,11 +55,12 @@ static void mi_field_string (struct ui_out *uiout, int fldno, int width, static void mi_field_fmt (struct ui_out *uiout, int fldno, int width, enum ui_align align, const char *fldname, const char *format, - va_list args); + va_list args) ATTRIBUTE_PRINTF (6, 0); static void mi_spaces (struct ui_out *uiout, int numspaces); static void mi_text (struct ui_out *uiout, const char *string); static void mi_message (struct ui_out *uiout, int verbosity, - const char *format, va_list args); + const char *format, va_list args) + ATTRIBUTE_PRINTF (3, 0); static void mi_wrap_hint (struct ui_out *uiout, char *identstring); static void mi_flush (struct ui_out *uiout); @@ -88,7 +85,9 @@ struct ui_out_impl mi_ui_out_impl = mi_text, mi_message, mi_wrap_hint, - mi_flush + mi_flush, + NULL, + 1, /* Needs MI hacks. */ }; /* Prototypes for local functions */ @@ -99,19 +98,20 @@ static void mi_open (struct ui_out *uiout, const char *name, enum ui_out_type type); static void mi_close (struct ui_out *uiout, enum ui_out_type type); -static void out_field_fmt (struct ui_out *uiout, int fldno, char *fldname, - char *format,...); - /* Mark beginning of a table */ void -mi_table_begin (struct ui_out *uiout, int nbrofcols, +mi_table_begin (struct ui_out *uiout, + int nr_cols, int nr_rows, const char *tblid) { - struct ui_out_data *data = ui_out_data (uiout); mi_open (uiout, tblid, ui_out_type_tuple); - data->first_header = 0; + mi_field_int (uiout, -1/*fldno*/, -1/*width*/, -1/*alin*/, + "nr_rows", nr_rows); + mi_field_int (uiout, -1/*fldno*/, -1/*width*/, -1/*alin*/, + "nr_cols", nr_cols); + mi_open (uiout, "hdr", ui_out_type_list); } /* Mark beginning of a table body */ @@ -119,10 +119,12 @@ mi_table_begin (struct ui_out *uiout, int nbrofcols, void mi_table_body (struct ui_out *uiout) { - struct ui_out_data *data = ui_out_data (uiout); + mi_out_data *data = ui_out_data (uiout); + if (data->suppress_output) + return; /* close the table header line if there were any headers */ - if (data->first_header) - mi_close (uiout, ui_out_type_tuple); + mi_close (uiout, ui_out_type_list); + mi_open (uiout, "body", ui_out_type_list); } /* Mark end of a table */ @@ -130,23 +132,28 @@ mi_table_body (struct ui_out *uiout) void mi_table_end (struct ui_out *uiout) { - struct ui_out_data *data = ui_out_data (uiout); + mi_out_data *data = ui_out_data (uiout); + data->suppress_output = 0; + mi_close (uiout, ui_out_type_list); /* body */ mi_close (uiout, ui_out_type_tuple); } /* Specify table header */ void -mi_table_header (struct ui_out *uiout, int width, int alignment, +mi_table_header (struct ui_out *uiout, int width, enum ui_align alignment, const char *col_name, const char *colhdr) { - struct ui_out_data *data = ui_out_data (uiout); - if (!data->first_header++) - { - mi_open (uiout, "hdr", ui_out_type_tuple); - } - mi_field_string (uiout, 0, width, alignment, 0, colhdr); + mi_out_data *data = ui_out_data (uiout); + if (data->suppress_output) + return; + mi_open (uiout, NULL, ui_out_type_tuple); + mi_field_int (uiout, 0, 0, 0, "width", width); + mi_field_int (uiout, 0, 0, 0, "alignment", alignment); + mi_field_string (uiout, 0, 0, 0, "col_name", col_name); + mi_field_string (uiout, 0, width, alignment, "colhdr", colhdr); + mi_close (uiout, ui_out_type_tuple); } /* Mark beginning of a list */ @@ -157,7 +164,9 @@ mi_begin (struct ui_out *uiout, int level, const char *id) { - struct ui_out_data *data = ui_out_data (uiout); + mi_out_data *data = ui_out_data (uiout); + if (data->suppress_output) + return; mi_open (uiout, id, type); } @@ -168,17 +177,22 @@ mi_end (struct ui_out *uiout, enum ui_out_type type, int level) { - struct ui_out_data *data = ui_out_data (uiout); + mi_out_data *data = ui_out_data (uiout); + if (data->suppress_output) + return; mi_close (uiout, type); } /* output an int field */ void -mi_field_int (struct ui_out *uiout, int fldno, int width, int alignment, - const char *fldname, int value) +mi_field_int (struct ui_out *uiout, int fldno, int width, + enum ui_align alignment, const char *fldname, int value) { char buffer[20]; /* FIXME: how many chars long a %d can become? */ + mi_out_data *data = ui_out_data (uiout); + if (data->suppress_output) + return; sprintf (buffer, "%d", value); mi_field_string (uiout, fldno, width, alignment, fldname, buffer); @@ -187,9 +201,12 @@ mi_field_int (struct ui_out *uiout, int fldno, int width, int alignment, /* used to ommit a field */ void -mi_field_skip (struct ui_out *uiout, int fldno, int width, int alignment, - const char *fldname) +mi_field_skip (struct ui_out *uiout, int fldno, int width, + enum ui_align alignment, const char *fldname) { + mi_out_data *data = ui_out_data (uiout); + if (data->suppress_output) + return; mi_field_string (uiout, fldno, width, alignment, fldname, ""); } @@ -200,11 +217,13 @@ void mi_field_string (struct ui_out *uiout, int fldno, int width, - int align, + enum ui_align align, const char *fldname, const char *string) { - struct ui_out_data *data = ui_out_data (uiout); + mi_out_data *data = ui_out_data (uiout); + if (data->suppress_output) + return; field_separator (uiout); if (fldname) fprintf_unfiltered (data->buffer, "%s=", fldname); @@ -223,7 +242,9 @@ mi_field_fmt (struct ui_out *uiout, int fldno, const char *format, va_list args) { - struct ui_out_data *data = ui_out_data (uiout); + mi_out_data *data = ui_out_data (uiout); + if (data->suppress_output) + return; field_separator (uiout); if (fldname) fprintf_unfiltered (data->buffer, "%s=\"", fldname); @@ -259,43 +280,18 @@ mi_wrap_hint (struct ui_out *uiout, char *identstring) void mi_flush (struct ui_out *uiout) { - struct ui_out_data *data = ui_out_data (uiout); + mi_out_data *data = ui_out_data (uiout); gdb_flush (data->buffer); } /* local functions */ -/* Like mi_field_fmt, but takes a variable number of args - and makes a va_list and does not insert a separator */ - -/* VARARGS */ -static void -out_field_fmt (struct ui_out *uiout, int fldno, char *fldname, - char *format,...) -{ - struct ui_out_data *data = ui_out_data (uiout); - va_list args; - - field_separator (uiout); - if (fldname) - fprintf_unfiltered (data->buffer, "%s=\"", fldname); - else - fputs_unfiltered ("\"", data->buffer); - - va_start (args, format); - vfprintf_unfiltered (data->buffer, format, args); - - fputs_unfiltered ("\"", data->buffer); - - va_end (args); -} - /* access to ui_out format private members */ static void field_separator (struct ui_out *uiout) { - struct ui_out_data *data = ui_out_data (uiout); + mi_out_data *data = ui_out_data (uiout); if (data->suppress_field_separator) data->suppress_field_separator = 0; else @@ -307,7 +303,7 @@ mi_open (struct ui_out *uiout, const char *name, enum ui_out_type type) { - struct ui_out_data *data = ui_out_data (uiout); + mi_out_data *data = ui_out_data (uiout); field_separator (uiout); data->suppress_field_separator = 1; if (name) @@ -318,13 +314,10 @@ mi_open (struct ui_out *uiout, fputc_unfiltered ('{', data->buffer); break; case ui_out_type_list: - if (data->mi_version > 0) - fputc_unfiltered ('[', data->buffer); - else - fputc_unfiltered ('{', data->buffer); + fputc_unfiltered ('[', data->buffer); break; default: - internal_error (__FILE__, __LINE__, "bad switch"); + internal_error (__FILE__, __LINE__, _("bad switch")); } } @@ -332,20 +325,17 @@ static void mi_close (struct ui_out *uiout, enum ui_out_type type) { - struct ui_out_data *data = ui_out_data (uiout); + mi_out_data *data = ui_out_data (uiout); switch (type) { case ui_out_type_tuple: fputc_unfiltered ('}', data->buffer); break; case ui_out_type_list: - if (data->mi_version > 0) - fputc_unfiltered (']', data->buffer); - else - fputc_unfiltered ('}', data->buffer); + fputc_unfiltered (']', data->buffer); break; default: - internal_error (__FILE__, __LINE__, "bad switch"); + internal_error (__FILE__, __LINE__, _("bad switch")); } data->suppress_field_separator = 0; } @@ -355,7 +345,7 @@ mi_close (struct ui_out *uiout, void mi_out_buffered (struct ui_out *uiout, char *string) { - struct ui_out_data *data = ui_out_data (uiout); + mi_out_data *data = ui_out_data (uiout); fprintf_unfiltered (data->buffer, "%s", string); } @@ -364,7 +354,7 @@ mi_out_buffered (struct ui_out *uiout, char *string) void mi_out_rewind (struct ui_out *uiout) { - struct ui_out_data *data = ui_out_data (uiout); + mi_out_data *data = ui_out_data (uiout); ui_file_rewind (data->buffer); } @@ -380,19 +370,29 @@ void mi_out_put (struct ui_out *uiout, struct ui_file *stream) { - struct ui_out_data *data = ui_out_data (uiout); + mi_out_data *data = ui_out_data (uiout); ui_file_put (data->buffer, do_write, stream); ui_file_rewind (data->buffer); } +/* Current MI version. */ + +int +mi_version (struct ui_out *uiout) +{ + mi_out_data *data = ui_out_data (uiout); + return data->mi_version; +} + /* initalize private members at startup */ struct ui_out * mi_out_new (int mi_version) { int flags = 0; - struct ui_out_data *data = XMALLOC (struct ui_out_data); + mi_out_data *data = XMALLOC (mi_out_data); data->suppress_field_separator = 0; + data->suppress_output = 0; data->mi_version = mi_version; /* FIXME: This code should be using a ``string_file'' and not the TUI buffer hack. */