Use a standard vector instead of the home-made version. I used a vector
of plain pointers, because the cli_ui_out_data object doesn't own the
streams objects (i.e. they shouldn't be deleted when the vector is
deleted).
gdb/ChangeLog:
* cli-out.h (cli_ui_out_data) <streams>: Change type to
std::vector.
* cli-out.c: Remove vec.h include.
(cli_uiout_dtor): Update.
(cli_field_fmt): Update.
(cli_spaces): Update.
(cli_text): Update.
(cli_message): Update.
(cli_flush): Update.
(cli_redirect): Update.
(out_field_fmt): Update.
(field_separator): Update.
(cli_out_data_ctor): Update.
(cli_out_new): Update.
(cli_out_set_stream): Update.
This copies a lot of code from readline, but this is temporary.
Readline currently doesn't export what we need.
The plan is to have something that has been working for awhile,
and then we'll have a complete story to present to the readline
maintainers.
gdb/ChangeLog:
* cli-out.c: #include completer.h, readline/readline.h.
(cli_mld_crlf, cli_mld_putch, cli_mld_puts): New functions.
(cli_mld_flush, cld_mld_erase_entire_line): Ditto.
(cli_mld_beep, cli_mld_read_key, cli_display_match_list): Ditto.
* cli-out.h (cli_display_match_list): Declare.
* completer.c (MB_INVALIDCH, MB_NULLWCH): New macros.
(ELLIPSIS_LEN): Ditto.
(gdb_get_y_or_n, gdb_display_match_list_pager): New functions.
(gdb_path_isdir, gdb_printable_part, gdb_fnwidth): Ditto.
(gdb_fnprint, gdb_print_filename): Ditto.
(gdb_complete_get_screenwidth, gdb_display_match_list_1): Ditto.
(gdb_display_match_list): Ditto.
* completer.h (mld_crlf_ftype, mld_putch_ftype): New typedefs.
(mld_puts_ftype, mld_flush_ftype, mld_erase_entire_line_ftype): Ditto.
(mld_beep_ftype, mld_read_key_ftype): Ditto.
(match_list_displayer): New struct.
(gdb_display_match_list): Declare.
* top.c (init_main): Set rl_completion_display_matches_hook.
* tui/tui-io.c: #include completer.h.
(printable_part, PUTX, print_filename, get_y_or_n): Delete.
(tui_mld_crlf, tui_mld_putch, tui_mld_puts): New functions.
(tui_mld_flush, tui_mld_erase_entire_line, tui_mld_beep): Ditto.
(tui_mld_getc, tui_mld_read_key): Ditto.
(tui_rl_display_match_list): Rewrite.
(tui_handle_resize_during_io): New arg for_completion. All callers
updated.
This patch constifies ui_out_impl in struct ui_out, and various
instances of ui_out_impl.
This removes a couple of FIXME comments (near cli_ui_out_impl and
mi_ui_out_impl) that did not make sense to me.
Tested by rebuilding.
2014-02-28 Tom Tromey <tromey@redhat.com>
* cli-out.c (cli_ui_out_impl): Now const. Remove comment.
* cli-out.h (cli_ui_out_impl): Now const.
* mi/mi-out.c (mi_ui_out_impl): Now const. Remove comment.
* ui-out.c (struct ui_out) <impl>: Now const.
(default_ui_out_impl): Now const.
(ui_out_new): Make 'impl' parameter const.
* ui-out.h (ui_out_new): Update.
Two modifications:
1. The addition of 2013 to the copyright year range for every file;
2. The use of a single year range, instead of potentially multiple
year ranges, as approved by the FSF.
* breakpoint.c (save_breakpoints): Use RETURN_MASK_ALL.
* cli-out.c: Include vec.h.
(cli_field_fmt, cli_spaces, cli_text, cli_message, cli_flush): New
variable stream, initialize it, use it.
(cli_redirect): New function comment. Replace the stream and
original_stream fields by the new streams field. Remove the
original_stream != NULL conditional, assert error on NULL instead.
(out_field_fmt, field_separator): New variable stream, initialize it, use it.
(cli_out_data_ctor): Assert non-NULL stream. Replace the stream and
original_stream fields by the new streams field.
(cli_out_set_stream): Replace the stream field by the new streams
field.
* cli-out.h: Include vec.h.
(ui_filep): New typedef, call DEF_VEC_P for it.
(struct cli_ui_out_data): Replace the stream and original_stream
fields by the new streams field.
* cli/cli-logging.c (set_logging_redirect): Call ui_out_redirect with
NULL first. Extend the comment.
(handle_redirections): Call ui_out_redirect with output.
* python/py-breakpoint.c (bppy_get_commands): Move ui_out_redirect
calls outside of the TRY_CATCH block.
gdb/testsuite/
* gdb.base/ui-redirect.exp: New file.
* tui/tui-out.c: Include cli-out.h.
(tui_table_begin, tui_table_body, tui_table_end, tui_table_header)
(tui_begin, tui_end, tui_field_int, tui_field_skip)
(tui_field_string, tui_field_fmt, tui_spaces, tui_text)
(tui_message, tui_wrap_hint, tui_flush): Delete forward
declarations.
(struct ui_out_data): Rename to...
(struct tui_ui_out_data): ... this. Remove `stream' and
`suppress_output' fields, and inherit cli_ui_out_data.
(tui_out_data): New typedef.
(tui_ui_out_impl): Don't initialize fields staticaly.
(tui_table_begin, tui_table_body, tui_table_end, tui_table_header)
(tui_begin, tui_end): Delete.
(tui_field_int): Adjust to delegate most work to the base type.
(tui_field_skip): Delete.
(tui_field_string, tui_field_fmt): Adjust comment. Adjust to
delegate most work to the base type.
(tui_spaces): Delete.
(tui_text): Adjust to delegate most work to the base type.
(tui_message): Delete.
(tui_wrap_hint): Delete.
(tui_flush): Delete.
(out_field_fmt): Delete.
(field_separator): Delete.
(tui_out_new): Adjust to initialize the base type.
(_initialize_tui_out): Initialize tui_ui_out_impl.
* cli-out.c (struct ui_out_data): Moved out to cli-out.h, renamed
cli_ui_out_data.
(cli_out_data): Adjust.
(cli_ui_out_impl): Make extern.
(cli_table_header, cli_field_int, cli_field_skip): Use
uo_field_string instead of cli_field_string.
(cli_redirect): Adjust to use cli_out_data.
(cli_out_data_ctor): New.
(cli_out_new): Use it.
* cli-out.h (struct ui_file): Remove forward declaration.
(struct cli_ui_out_data): New, moved from cli-out.c, and renamed.
(cli_ui_out_impl): Declare.
(cli_out_data_ctor): Declare.
* ui-out.c (struct ui_out) <data>: Change type to void pointer.
(uo_field_string): No longer static.
(ui_out_data): Change return type to void pointer.
(ui_out_new): Change `data' parameter type to void pointer.
* ui-out.h (struct ui_out_data): Don't forward declare.
(ui_out_data): Change return type to void pointer.
(ui_out_new): Change `data' parameter type to void pointer.
(uo_field_string): Declare.