/* Output generating routines for GDB.
- Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2001, 2002, 2004, 2005
+ Free Software Foundation, Inc.
Contributed by Cygnus Solutions.
Written by Fernando Nasser for Cygnus.
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. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA. */
#include "defs.h"
#include "gdb_string.h"
is always available. Stack/nested level 0 is reserved for the
top-level result. */
-enum { MAX_UI_OUT_LEVELS = 5 };
+enum { MAX_UI_OUT_LEVELS = 6 };
struct ui_out_level
{
int width, enum ui_align align,
const char *fldname,
const char *format,
- va_list args);
+ va_list args) ATTR_FORMAT (printf, 6, 0);
static void default_spaces (struct ui_out *uiout, int numspaces);
static void default_text (struct ui_out *uiout, const char *string);
static void default_message (struct ui_out *uiout, int verbosity,
const char *format,
- va_list args);
+ va_list args) ATTR_FORMAT (printf, 3, 0);
static void default_wrap_hint (struct ui_out *uiout, char *identstring);
static void default_flush (struct ui_out *uiout);
default_message,
default_wrap_hint,
default_flush,
+ NULL,
0, /* Does not need MI hacks. */
};
const char *string);
static void uo_field_fmt (struct ui_out *uiout, int fldno, int width,
enum ui_align align, const char *fldname,
- const char *format, va_list args);
+ const char *format, va_list args)
+ ATTR_FORMAT (printf, 6, 0);
static void uo_spaces (struct ui_out *uiout, int numspaces);
static void uo_text (struct ui_out *uiout, const char *string);
static void uo_message (struct ui_out *uiout, int verbosity,
- const char *format, va_list args);
+ const char *format, va_list args)
+ ATTR_FORMAT (printf, 3, 0);
static void uo_wrap_hint (struct ui_out *uiout, char *identstring);
static void uo_flush (struct ui_out *uiout);
+static int uo_redirect (struct ui_out *uiout, struct ui_file *outstream);
/* Prototypes for local functions */
static void verify_field (struct ui_out *uiout, int *fldno, int *width,
int *align);
-static void init_ui_out_state (struct ui_out *uiout);
-
/* exported functions (ui_out API) */
/* Mark beginning of a table */
-void
+static void
ui_out_table_begin (struct ui_out *uiout, int nbrofcols,
int nr_rows,
const char *tblid)
{
if (uiout->table.flag)
internal_error (__FILE__, __LINE__,
- "tables cannot be nested; table_begin found before \
-previous table_end.");
+ _("tables cannot be nested; table_begin found before \
+previous table_end."));
uiout->table.flag = 1;
uiout->table.body_flag = 0;
{
if (!uiout->table.flag)
internal_error (__FILE__, __LINE__,
- "table_body outside a table is not valid; it must be \
-after a table_begin and before a table_end.");
+ _("table_body outside a table is not valid; it must be \
+after a table_begin and before a table_end."));
if (uiout->table.body_flag)
internal_error (__FILE__, __LINE__,
- "extra table_body call not allowed; there must be \
-only one table_body after a table_begin and before a table_end.");
+ _("extra table_body call not allowed; there must be \
+only one table_body after a table_begin and before a table_end."));
if (uiout->table.header_next->colno != uiout->table.columns)
internal_error (__FILE__, __LINE__,
- "number of headers differ from number of table \
-columns.");
+ _("number of headers differ from number of table \
+columns."));
uiout->table.body_flag = 1;
uiout->table.header_next = uiout->table.header_first;
uo_table_body (uiout);
}
-void
+static void
ui_out_table_end (struct ui_out *uiout)
{
if (!uiout->table.flag)
internal_error (__FILE__, __LINE__,
- "misplaced table_end or missing table_begin.");
+ _("misplaced table_end or missing table_begin."));
uiout->table.entry_level = 0;
uiout->table.body_flag = 0;
{
if (!uiout->table.flag || uiout->table.body_flag)
internal_error (__FILE__, __LINE__,
- "table header must be specified after table_begin \
-and before table_body.");
+ _("table header must be specified after table_begin \
+and before table_body."));
append_header_to_list (uiout, width, alignment, col_name, colhdr);
uo_table_header (uiout, width, alignment, col_name, colhdr);
}
+static void
+do_cleanup_table_end (void *data)
+{
+ struct ui_out *ui_out = data;
+
+ ui_out_table_end (ui_out);
+}
+
+struct cleanup *
+make_cleanup_ui_out_table_begin_end (struct ui_out *ui_out, int nr_cols,
+ int nr_rows, const char *tblid)
+{
+ ui_out_table_begin (ui_out, nr_cols, nr_rows, tblid);
+ return make_cleanup (do_cleanup_table_end, ui_out);
+}
+
void
ui_out_begin (struct ui_out *uiout,
enum ui_out_type type,
int new_level;
if (uiout->table.flag && !uiout->table.body_flag)
internal_error (__FILE__, __LINE__,
- "table header or table_body expected; lists must be \
-specified after table_body.");
+ _("table header or table_body expected; lists must be \
+specified after table_body."));
/* Be careful to verify the ``field'' before the new tuple/list is
pushed onto the stack. That way the containing list/table/row is
uo_begin (uiout, type, new_level, id);
}
-void
-ui_out_list_begin (struct ui_out *uiout,
- const char *id)
-{
- ui_out_begin (uiout, ui_out_type_list, id);
-}
-
-void
-ui_out_tuple_begin (struct ui_out *uiout, const char *id)
-{
- ui_out_begin (uiout, ui_out_type_tuple, id);
-}
-
void
ui_out_end (struct ui_out *uiout,
enum ui_out_type type)
uo_end (uiout, type, old_level);
}
-void
-ui_out_list_end (struct ui_out *uiout)
-{
- ui_out_end (uiout, ui_out_type_list);
-}
-
-void
-ui_out_tuple_end (struct ui_out *uiout)
-{
- ui_out_end (uiout, ui_out_type_tuple);
-}
-
struct ui_out_end_cleanup_data
{
struct ui_out *uiout;
return make_cleanup (do_cleanup_end, end_cleanup_data);
}
-struct cleanup *
-make_cleanup_ui_out_begin_end (struct ui_out *uiout,
- enum ui_out_type type,
- const char *id)
-{
- ui_out_begin (uiout, type, id);
- return make_cleanup_ui_out_end (uiout, type);
-}
-
struct cleanup *
make_cleanup_ui_out_tuple_begin_end (struct ui_out *uiout,
const char *id)
{
- ui_out_tuple_begin (uiout, id);
+ ui_out_begin (uiout, ui_out_type_tuple, id);
return make_cleanup_ui_out_end (uiout, ui_out_type_tuple);
}
make_cleanup_ui_out_list_begin_end (struct ui_out *uiout,
const char *id)
{
- ui_out_list_begin (uiout, id);
+ ui_out_begin (uiout, ui_out_type_list, id);
return make_cleanup_ui_out_end (uiout, ui_out_type_list);
}
uo_field_int (uiout, fldno, width, align, fldname, value);
}
+void
+ui_out_field_fmt_int (struct ui_out *uiout,
+ int input_width,
+ enum ui_align input_align,
+ const char *fldname,
+ int value)
+{
+ int fldno;
+ int width;
+ int align;
+ struct ui_out_level *current = current_level (uiout);
+
+ verify_field (uiout, &fldno, &width, &align);
+
+ uo_field_int (uiout, fldno, input_width, input_align, fldname, value);
+}
+
void
ui_out_field_core_addr (struct ui_out *uiout,
const char *fldname,
{
char addstr[20];
- /* FIXME-32x64: need a print_address_numeric with field width */
- /* print_address_numeric (address, 1, local_stream); */
- strcpy (addstr, local_hex_string_custom ((unsigned long) address, "08l"));
+ /* FIXME: cagney/2002-05-03: Need local_address_string() function
+ that returns the language localized string formatted to a width
+ based on TARGET_ADDR_BIT. */
+ /* deprecated_print_address_numeric (address, 1, local_stream); */
+ if (TARGET_ADDR_BIT <= 32)
+ strcpy (addstr, hex_string_custom (address, 8));
+ else
+ strcpy (addstr, hex_string_custom (address, 16));
ui_out_field_string (uiout, fldname, addstr);
}
uo_flush (uiout);
}
+int
+ui_out_redirect (struct ui_out *uiout, struct ui_file *outstream)
+{
+ return uo_redirect (uiout, outstream);
+}
+
/* set the flags specified by the mask given */
int
ui_out_set_flags (struct ui_out *uiout, int mask)
uiout->impl->flush (uiout);
}
+int
+uo_redirect (struct ui_out *uiout, struct ui_file *outstream)
+{
+ if (!uiout->impl->redirect)
+ return -1;
+ uiout->impl->redirect (uiout, outstream);
+ return 0;
+}
+
/* local functions */
/* list of column headers manipulation routines */
{
if (!uiout->table.body_flag)
internal_error (__FILE__, __LINE__,
- "table_body missing; table fields must be \
-specified after table_body and inside a list.");
+ _("table_body missing; table fields must be \
+specified after table_body and inside a list."));
/* NOTE: cagney/2001-12-08: There was a check here to ensure
that this code was only executed when uiout->level was
greater than zero. That no longer applies - this code is run
{
if (*fldno != current->field_count)
internal_error (__FILE__, __LINE__,
- "ui-out internal error in handling headers.");
+ _("ui-out internal error in handling headers."));
}
else
{