From 2a3c1174c3c0db1140180fb3fc56ac324d1c0a7c Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Wed, 5 Jun 2019 09:17:16 +0100 Subject: Introduce gdb-specific %p format suffixes This introduces a few gdb-specific %p format suffixes. This is useful for emitting gdb-specific output in an ergonomic way. It also yields code that is more i18n-friendly. The comment before ui_out::message explains the details. Note that the tests had to change a little. When using one of the gdb printf functions with styling, there can be spurious style changes emitted to the output. This did not seem worthwhile to fix, as the low-level output functions are rather spaghetti-ish already, and I didn't want to make them even worse. This change also necessitated adding support for "*" as precision and width in format_pieces. These are used in various spots in gdb, and it seemed better to me to implement them than to remove the uses. gdb/ChangeLog 2019-10-01 Pedro Alves Tom Tromey * unittests/format_pieces-selftests.c: Add gdb_format parameter. (test_gdb_formats): New function. (run_tests): Call it. (test_format_specifier): Update. * utils.h (fputs_filtered): Update comment. (vfprintf_styled, vfprintf_styled_no_gdbfmt) (fputs_styled_unfiltered): Declare. * utils.c (fputs_styled_unfiltered): New function. (vfprintf_maybe_filtered): Add gdbfmt parameter. (vfprintf_filtered): Update. (vfprintf_unfiltered, vprintf_filtered): Update. (vfprintf_styled, vfprintf_styled_no_gdbfmt): New functions. * ui-out.h (enum ui_out_flag) : New constants. (enum class field_kind): New. (struct base_field_s, struct signed_field_s): New. (signed_field): New function. (struct string_field_s): New. (string_field): New function. (struct styled_string_s): New. (styled_string): New function. (class ui_out) : Add comment. : New methods. : Add style parameter. * ui-out.c (ui_out::call_do_message, ui_out::vmessage): New methods. (ui_out::message): Rewrite. * mi/mi-out.h (class mi_ui_out) : Add style parameter. * mi/mi-out.c (mi_ui_out::do_message): Add style parameter. * gdbsupport/format.h (class format_pieces) : Add gdb_extensions parameter. (class format_piece): Add parameter to constructor. (n_int_args): New field. * gdbsupport/format.c (format_pieces::format_pieces): Add gdb_extensions parameter. Handle '*'. * cli-out.h (class cli_ui_out) : Add style parameter. * cli-out.c (cli_ui_out::do_message): Add style parameter. Call vfprintf_styled_no_gdbfmt. (cli_ui_out::do_field_string, cli_ui_out::do_spaces) (cli_ui_out::do_text, cli_ui_out::field_separator): Allow unfiltered output. * ui-style.h (struct ui_file_style) : New method. gdb/testsuite/ChangeLog 2019-10-01 Tom Tromey * gdb.base/style.exp: Update tests. --- gdb/utils.h | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'gdb/utils.h') diff --git a/gdb/utils.h b/gdb/utils.h index 7df86be..76f0da6 100644 --- a/gdb/utils.h +++ b/gdb/utils.h @@ -350,7 +350,10 @@ extern struct ui_file *gdb_stdtargin; extern void set_screen_width_and_height (int width, int height); /* More generic printf like operations. Filtered versions may return - non-locally on error. */ + non-locally on error. As an extension over plain printf, these + support some GDB-specific format specifiers. Particularly useful + here are the styling formatters: '%p[', '%p]' and '%ps'. See + ui_out::message for details. */ extern void fputs_filtered (const char *, struct ui_file *); @@ -430,6 +433,20 @@ extern void fprintf_styled (struct ui_file *stream, ...) ATTRIBUTE_PRINTF (3, 4); +extern void vfprintf_styled (struct ui_file *stream, + const ui_file_style &style, + const char *fmt, + va_list args) + ATTRIBUTE_PRINTF (3, 0); + +/* Like vfprintf_styled, but do not process gdb-specific format + specifiers. */ +extern void vfprintf_styled_no_gdbfmt (struct ui_file *stream, + const ui_file_style &style, + bool filter, + const char *fmt, va_list args) + ATTRIBUTE_PRINTF (4, 0); + /* Like fputs_filtered, but styles the output according to STYLE, when appropriate. */ @@ -437,6 +454,12 @@ extern void fputs_styled (const char *linebuffer, const ui_file_style &style, struct ui_file *stream); +/* Unfiltered variant of fputs_styled. */ + +extern void fputs_styled_unfiltered (const char *linebuffer, + const ui_file_style &style, + struct ui_file *stream); + /* Like fputs_styled, but uses highlight_style to highlight the parts of STR that match HIGHLIGHT. */ -- cgit v1.1