aboutsummaryrefslogtreecommitdiff
path: root/gdb/cli-out.c
diff options
context:
space:
mode:
authorDoug Evans <xdje42@gmail.com>2015-01-31 14:11:54 -0800
committerDoug Evans <xdje42@gmail.com>2015-01-31 14:11:54 -0800
commit82083d6dbbc0b2f6a76095582c6e7ffb3e06432a (patch)
treebe2581d31b188398863a27e60e2ac2ad69c0d910 /gdb/cli-out.c
parentf57d2163da62044205c3f53e0ecf186923296b63 (diff)
downloadgdb-82083d6dbbc0b2f6a76095582c6e7ffb3e06432a.zip
gdb-82083d6dbbc0b2f6a76095582c6e7ffb3e06432a.tar.gz
gdb-82083d6dbbc0b2f6a76095582c6e7ffb3e06432a.tar.bz2
Unify CLI/TUI interface to readline tab completion.
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.
Diffstat (limited to 'gdb/cli-out.c')
-rw-r--r--gdb/cli-out.c84
1 files changed, 83 insertions, 1 deletions
diff --git a/gdb/cli-out.c b/gdb/cli-out.c
index 76222c6..48f2a04 100644
--- a/gdb/cli-out.c
+++ b/gdb/cli-out.c
@@ -23,11 +23,12 @@
#include "defs.h"
#include "ui-out.h"
#include "cli-out.h"
+#include "completer.h"
#include "vec.h"
+#include "readline/readline.h"
typedef struct cli_ui_out_data cli_out_data;
-
/* Prototypes for local functions */
static void cli_text (struct ui_out *uiout, const char *string);
@@ -416,3 +417,84 @@ cli_out_set_stream (struct ui_out *uiout, struct ui_file *stream)
return old;
}
+
+/* CLI interface to display tab-completion matches. */
+
+/* CLI version of displayer.crlf. */
+
+static void
+cli_mld_crlf (const struct match_list_displayer *displayer)
+{
+ rl_crlf ();
+}
+
+/* CLI version of displayer.putch. */
+
+static void
+cli_mld_putch (const struct match_list_displayer *displayer, int ch)
+{
+ putc (ch, rl_outstream);
+}
+
+/* CLI version of displayer.puts. */
+
+static void
+cli_mld_puts (const struct match_list_displayer *displayer, const char *s)
+{
+ fputs (s, rl_outstream);
+}
+
+/* CLI version of displayer.flush. */
+
+static void
+cli_mld_flush (const struct match_list_displayer *displayer)
+{
+ fflush (rl_outstream);
+}
+
+/* CLI version of displayer.erase_entire_line. */
+
+static void
+cli_mld_erase_entire_line (const struct match_list_displayer *displayer)
+{
+ extern void _rl_erase_entire_line (void);
+
+ _rl_erase_entire_line ();
+}
+
+/* CLI version of displayer.beep. */
+
+static void
+cli_mld_beep (const struct match_list_displayer *displayer)
+{
+ rl_ding ();
+}
+
+/* CLI version of displayer.read_key. */
+
+static int
+cli_mld_read_key (const struct match_list_displayer *displayer)
+{
+ return rl_read_key ();
+}
+
+/* CLI version of rl_completion_display_matches_hook.
+ See gdb_display_match_list for a description of the arguments. */
+
+void
+cli_display_match_list (char **matches, int len, int max)
+{
+ struct match_list_displayer displayer;
+
+ rl_get_screen_size (&displayer.height, &displayer.width);
+ displayer.crlf = cli_mld_crlf;
+ displayer.putch = cli_mld_putch;
+ displayer.puts = cli_mld_puts;
+ displayer.flush = cli_mld_flush;
+ displayer.erase_entire_line = cli_mld_erase_entire_line;
+ displayer.beep = cli_mld_beep;
+ displayer.read_key = cli_mld_read_key;
+
+ gdb_display_match_list (matches, len, max, &displayer);
+ rl_forced_update_display ();
+}