This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [commit] Convert tui to interps mechanism
- From: Elena Zannoni <ezannoni at redhat dot com>
- To: Andrew Cagney <ac131313 at redhat dot com>
- Cc: gdb-patches at sources dot redhat dot com
- Date: Fri, 14 Feb 2003 13:39:28 -0500
- Subject: Re: [commit] Convert tui to interps mechanism
- References: <3E4CF570.1040906@redhat.com>
there is a problem with the visibility of tui_active in cli-* files, I
think ifdef TUI is missing in cli-decode.c
elena
Andrew Cagney writes:
> Hello,
>
> This patch shuffles the TUI code so that it is started via the interps
> mechanism As part of this it replaces --tui / tui_version with code
> that just sets interpreter_p to "tui", that way --tui also just triggers
> the interps mechanism.
>
> The tui appears to work.
>
> committed,
> Andrew
> 2003-02-14 Andrew Cagney <ac131313@redhat.com>
>
> * main.c (tui_version): Delete variable.
> (captured_main): When --tui, set interpreter_p to "tui" instead of
> enabling tui_version.
> * printcmd.c (display_command) [TUI]: Test tui_active instead of
> tui_version.
> * cli/cli-decode.c (lookup_cmd_composition): Ditto.
> * cli/cli-cmds.c (disassemble_command): Ditto.
> * defs.h (tui_version): Delete declaration.
> * Makefile.in (SUBDIR_TUI_SRCS): Add "tui/tui-interp.c".
> (tui-interp.o): Add rules.
> (SUBDIR_TUI_OBS): Add "tui-interp.o".
>
> Index: Makefile.in
> ===================================================================
> RCS file: /cvs/src/src/gdb/Makefile.in,v
> retrieving revision 1.330
> diff -u -r1.330 Makefile.in
> --- Makefile.in 13 Feb 2003 18:07:24 -0000 1.330
> +++ Makefile.in 14 Feb 2003 13:49:43 -0000
> @@ -194,11 +194,13 @@
> #
> SUBDIR_TUI_OBS = \
> tui-file.o tui.o tuiData.o tuiSource.o tuiStack.o tuiIO.o \
> + tui-interp.o \
> tuiGeneralWin.o tuiLayout.o tuiWin.o tuiCommand.o \
> tuiDisassem.o tuiSourceWin.o tuiRegs.o tuiDataWin.o \
> tui-out.o tui-hooks.o
> SUBDIR_TUI_SRCS = \
> tui/tui-file.c tui/tui.c tui/tuiData.c tui/tuiSource.c \
> + tui/tui-interp.c \
> tui/tuiStack.c tui/tuiIO.c \
> tui/tuiGeneralWin.c tui/tuiLayout.c \
> tui/tuiWin.c tui/tuiCommand.c \
> @@ -2573,6 +2575,10 @@
> $(tuiRegs_h) $(tuiWin_h) $(tuiStack_h) $(tuiDataWin_h) \
> $(tuiSourceWin_h) $(readline_h)
> $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/tui/tui-hooks.c
> +tui-interp.o: $(srcdir)/tui/tui-interp.c $(defs_h) $(interps_h) $(top_h) \
> + $(event_top_h) $(event_loop_h) $(ui_out_h) $(tui_tuiData_h) \
> + $(readline_h) $(tui_tuiWin_h) $(tui_h) $(tui_tuiIO_h)
> + $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/tui/tui-interp.c
> tui-out.o: $(srcdir)/tui/tui-out.c $(defs_h) $(ui_out_h) $(tui_h) \
> $(gdb_string_h) $(gdb_assert_h)
> $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/tui/tui-out.c
> Index: defs.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/defs.h,v
> retrieving revision 1.112
> diff -u -r1.112 defs.h
> --- defs.h 4 Feb 2003 18:07:00 -0000 1.112
> +++ defs.h 14 Feb 2003 13:49:43 -0000
> @@ -160,9 +160,6 @@
> /* Check if a character is one of the commonly used C++ marker characters. */
> extern int is_cplus_marker (int);
>
> -/* use tui interface if non-zero */
> -extern int tui_version;
> -
> /* enable xdb commands if set */
> extern int xdb_commands;
>
> Index: main.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/main.c,v
> retrieving revision 1.28
> diff -u -r1.28 main.c
> --- main.c 13 Feb 2003 18:07:24 -0000 1.28
> +++ main.c 14 Feb 2003 13:49:43 -0000
> @@ -60,9 +60,6 @@
> do_setshow_command will free it. */
> char *interpreter_p;
>
> -/* Whether this is the command line version or not */
> -int tui_version = 0;
> -
> /* Whether xdb commands will be handled */
> int xdb_commands = 0;
>
> @@ -245,7 +242,7 @@
> {"async", no_argument, &event_loop_p, 1},
> {"noasync", no_argument, &event_loop_p, 0},
> #if defined(TUI)
> - {"tui", no_argument, &tui_version, 1},
> + {"tui", no_argument, 0, 14},
> #endif
> {"xdb", no_argument, &xdb_commands, 1},
> {"dbx", no_argument, &dbx_commands, 1},
> @@ -339,6 +336,11 @@
> display_time = 1;
> display_space = 1;
> break;
> + case 14:
> + /* --tui is equivalent to -i=tui. */
> + xfree (interpreter_p);
> + interpreter_p = xstrdup ("tui");
> + break;
> case 'f':
> annotation_level = 1;
> /* We have probably been invoked from emacs. Disable window interface. */
> @@ -455,18 +457,7 @@
> if (print_help || print_version)
> {
> use_windows = 0;
> -#ifdef TUI
> - /* Disable the TUI as well. */
> - tui_version = 0;
> -#endif
> }
> -
> -#ifdef TUI
> - /* An explicit --tui flag overrides the default UI, which is the
> - window system. */
> - if (tui_version)
> - use_windows = 0;
> -#endif
>
> if (set_args)
> {
> Index: printcmd.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/printcmd.c,v
> retrieving revision 1.51
> diff -u -r1.51 printcmd.c
> --- printcmd.c 4 Feb 2003 21:37:03 -0000 1.51
> +++ printcmd.c 14 Feb 2003 13:49:43 -0000
> @@ -1363,7 +1363,9 @@
> int display_it = 1;
>
> #if defined(TUI)
> - if (tui_version && *exp == '$')
> + /* NOTE: cagney/2003-02-13 The `tui_active' was previously
> + `tui_version'. */
> + if (tui_active && *exp == '$')
> display_it = (tui_set_layout (exp) == TUI_FAILURE);
> #endif
>
> Index: cli/cli-cmds.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/cli/cli-cmds.c,v
> retrieving revision 1.26
> diff -u -r1.26 cli-cmds.c
> --- cli/cli-cmds.c 10 Dec 2002 00:30:43 -0000 1.26
> +++ cli/cli-cmds.c 14 Feb 2003 13:49:43 -0000
> @@ -852,7 +852,9 @@
> if (find_pc_partial_function (pc, &name, &low, &high) == 0)
> error ("No function contains program counter for selected frame.\n");
> #if defined(TUI)
> - else if (tui_version)
> + /* NOTE: cagney/2003-02-13 The `tui_active' was previously
> + `tui_version'. */
> + else if (tui_active)
> low = tuiGetLowDisassemblyAddress (low, pc);
> #endif
> low += FUNCTION_START_OFFSET;
> @@ -864,7 +866,9 @@
> if (find_pc_partial_function (pc, &name, &low, &high) == 0)
> error ("No function contains specified address.\n");
> #if defined(TUI)
> - else if (tui_version)
> + /* NOTE: cagney/2003-02-13 The `tui_active' was previously
> + `tui_version'. */
> + else if (tui_active)
> low = tuiGetLowDisassemblyAddress (low, pc);
> #endif
> low += FUNCTION_START_OFFSET;
> Index: cli/cli-decode.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/cli/cli-decode.c,v
> retrieving revision 1.28
> diff -u -r1.28 cli-decode.c
> --- cli/cli-decode.c 30 Jul 2002 13:45:14 -0000 1.28
> +++ cli/cli-decode.c 14 Feb 2003 13:49:43 -0000
> @@ -923,9 +923,11 @@
> /* Treating underscores as part of command words is important
> so that "set args_foo()" doesn't get interpreted as
> "set args _foo()". */
> + /* NOTE: cagney/2003-02-13 The `tui_active' was previously
> + `tui_version'. */
> for (p = *text;
> *p && (isalnum (*p) || *p == '-' || *p == '_' ||
> - (tui_version &&
> + (tui_active &&
> (*p == '+' || *p == '<' || *p == '>' || *p == '$')) ||
> (xdb_commands && (*p == '!' || *p == '/' || *p == '?')));
> p++)
> @@ -1293,9 +1295,11 @@
> /* Treating underscores as part of command words is important
> so that "set args_foo()" doesn't get interpreted as
> "set args _foo()". */
> + /* NOTE: cagney/2003-02-13 The `tui_active' was previously
> + `tui_version'. */
> for (p = text;
> *p && (isalnum (*p) || *p == '-' || *p == '_' ||
> - (tui_version &&
> + (tui_active &&
> (*p == '+' || *p == '<' || *p == '>' || *p == '$')) ||
> (xdb_commands && (*p == '!' || *p == '/' || *p == '?')));
> p++)
> Index: tui/ChangeLog
> ===================================================================
> RCS file: /cvs/src/src/gdb/tui/ChangeLog,v
> retrieving revision 1.107
> diff -u -r1.107 ChangeLog
> --- tui/ChangeLog 12 Feb 2003 15:14:35 -0000 1.107
> +++ tui/ChangeLog 14 Feb 2003 13:49:43 -0000
> @@ -1,3 +1,20 @@
> +2003-02-14 Andrew Cagney <ac131313@redhat.com>
> +
> + * tui.c (tui_enable, tui_disable): Don't modify tui_version.
> + (tui_is_window_visible, tui_get_command_dimension): Test
> + tui_active instead of tui_version.
> +
> +2003-02-13 Andrew Cagney <ac131313@redhat.com>
> +
> + * tuiData.h (tui_version): Delete declaration.
> +
> + * tui-hooks.c (tui_init_hook, tui_event_loop): Delete function,
> + moved to "tui-interp.c".
> + (tui_exit, tui_command_loop): Ditto.
> + (_initialize_tui): Don't initialize init_ui_hook. Initialize
> + target_new_objfile_hook.
> + * tui-interp.c: New file.
> +
> 2003-02-12 Andrew Cagney <ac131313@redhat.com>
>
> * tuiIO.c (tui_prep_terminal): Add one notused parameter.
> Index: tui/tui-hooks.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/tui/tui-hooks.c,v
> retrieving revision 1.11
> diff -u -r1.11 tui-hooks.c
> --- tui/tui-hooks.c 29 Nov 2002 19:15:16 -0000 1.11
> +++ tui/tui-hooks.c 14 Feb 2003 13:49:43 -0000
> @@ -69,8 +69,6 @@
> int tui_target_has_run = 0;
>
> static void (* tui_target_new_objfile_chain) (struct objfile*);
> -static void tui_event_loop (void);
> -static void tui_command_loop (void);
>
> static void
> tui_new_objfile_hook (struct objfile* objfile)
> @@ -325,131 +323,12 @@
> set_gdb_event_hooks (tui_old_event_hooks);
> }
>
> -/* Cleanup the tui before exiting. */
> -static void
> -tui_exit (void)
> -{
> - /* Disable the tui. Curses mode is left leaving the screen
> - in a clean state (see endwin()). */
> - tui_disable ();
> -}
> -
> -/* Initialize all the necessary variables, start the event loop,
> - register readline, and stdin, start the loop. */
> -static void
> -tui_command_loop (void)
> -{
> - int length;
> - char *a_prompt;
> - char *gdb_prompt = get_prompt ();
> -
> - /* If we are using readline, set things up and display the first
> - prompt, otherwise just print the prompt. */
> - if (async_command_editing_p)
> - {
> - /* Tell readline what the prompt to display is and what function it
> - will need to call after a whole line is read. This also displays
> - the first prompt. */
> - length = strlen (PREFIX (0)) + strlen (gdb_prompt) + strlen (SUFFIX (0)) + 1;
> - a_prompt = (char *) xmalloc (length);
> - strcpy (a_prompt, PREFIX (0));
> - strcat (a_prompt, gdb_prompt);
> - strcat (a_prompt, SUFFIX (0));
> - rl_callback_handler_install (a_prompt, input_handler);
> - }
> - else
> - display_gdb_prompt (0);
> -
> - /* Now it's time to start the event loop. */
> - tui_event_loop ();
> -}
> +void _initialize_tui_hooks (void);
>
> -/* Start up the event loop. This is the entry point to the event loop
> - from the command loop. */
> -
> -static void
> -tui_event_loop (void)
> -{
> - /* Loop until there is nothing to do. This is the entry point to the
> - event loop engine. gdb_do_one_event, called via catch_errors()
> - will process one event for each invocation. It blocks waits for
> - an event and then processes it. >0 when an event is processed, 0
> - when catch_errors() caught an error and <0 when there are no
> - longer any event sources registered. */
> - while (1)
> - {
> - int result = catch_errors (gdb_do_one_event, 0, "", RETURN_MASK_ALL);
> - if (result < 0)
> - break;
> -
> - /* Update gdb output according to TUI mode. Since catch_errors
> - preserves the uiout from changing, this must be done at top
> - level of event loop. */
> - if (tui_active)
> - uiout = tui_out;
> - else
> - uiout = tui_old_uiout;
> -
> - if (result == 0)
> - {
> - /* FIXME: this should really be a call to a hook that is
> - interface specific, because interfaces can display the
> - prompt in their own way. */
> - display_gdb_prompt (0);
> - /* This call looks bizarre, but it is required. If the user
> - entered a command that caused an error,
> - after_char_processing_hook won't be called from
> - rl_callback_read_char_wrapper. Using a cleanup there
> - won't work, since we want this function to be called
> - after a new prompt is printed. */
> - if (after_char_processing_hook)
> - (*after_char_processing_hook) ();
> - /* Maybe better to set a flag to be checked somewhere as to
> - whether display the prompt or not. */
> - }
> - }
> -
> - /* We are done with the event loop. There are no more event sources
> - to listen to. So we exit GDB. */
> - return;
> -}
> -
> -/* Initialize the tui by installing several gdb hooks, initializing
> - the tui IO and preparing the readline with the kind binding. */
> -static void
> -tui_init_hook (char *argv0)
> +void
> +_initialize_tui_hooks (void)
> {
> - /* Don't enable the TUI if a specific interpreter is installed. */
> - if (interpreter_p)
> - return;
> -
> - /* Install exit handler to leave the screen in a good shape. */
> - atexit (tui_exit);
> -
> - initializeStaticData ();
> -
> /* Install the permanent hooks. */
> tui_target_new_objfile_chain = target_new_objfile_hook;
> target_new_objfile_hook = tui_new_objfile_hook;
> -
> - tui_initialize_io ();
> - tui_initialize_readline ();
> -
> - /* Tell gdb to use the tui_command_loop as the main loop. */
> - command_loop_hook = tui_command_loop;
> -
> - /* Decide in which mode to start using GDB (based on -tui). */
> - if (tui_version)
> - {
> - tui_enable ();
> - }
> }
> -
> -/* Initialize the tui. */
> -void
> -_initialize_tui (void)
> -{
> - /* Setup initialization hook. */
> - init_ui_hook = tui_init_hook;
> -}
> -
> Index: tui/tui-interp.c
> ===================================================================
> RCS file: tui/tui-interp.c
> diff -N tui/tui-interp.c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ tui/tui-interp.c 14 Feb 2003 13:49:43 -0000
> @@ -0,0 +1,180 @@
> +/* TUI Interpreter definitions for GDB, the GNU debugger.
> +
> + Copyright 2003 Free Software Foundation, Inc.
> +
> + 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
> + (at your option) any later version.
> +
> + This program is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + 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. */
> +
> +#include "defs.h"
> +#include "interps.h"
> +#include "top.h"
> +#include "event-top.h"
> +#include "event-loop.h"
> +#include "ui-out.h"
> +#include "tui/tuiData.h"
> +#include "readline/readline.h"
> +#include "tui/tuiWin.h"
> +#include "tui/tui.h"
> +#include "tui/tuiIO.h"
> +
> +/* Cleanup the tui before exiting. */
> +
> +static void
> +tui_exit (void)
> +{
> + /* Disable the tui. Curses mode is left leaving the screen
> + in a clean state (see endwin()). */
> + tui_disable ();
> +}
> +
> +/* These implement the TUI interpreter. */
> +
> +static void *
> +tui_init (void)
> +{
> + /* Install exit handler to leave the screen in a good shape. */
> + atexit (tui_exit);
> +
> + initializeStaticData ();
> +
> + tui_initialize_io ();
> + tui_initialize_readline ();
> +
> + return NULL;
> +}
> +
> +static int
> +tui_resume (void *data)
> +{
> + gdb_setup_readline ();
> + tui_enable ();
> + return 1;
> +}
> +
> +static int
> +tui_suspend (void *data)
> +{
> + tui_disable ();
> + return 1;
> +}
> +
> +/* Display the prompt if we are silent. */
> +
> +static int
> +tui_display_prompt_p (void *data)
> +{
> + if (interp_quiet_p (NULL))
> + return 0;
> + else
> + return 1;
> +}
> +
> +static int
> +tui_exec (void *data, const char *command_str)
> +{
> + internal_error (__FILE__, __LINE__, "tui_exec called");
> +}
> +
> +
> +/* Initialize all the necessary variables, start the event loop,
> + register readline, and stdin, start the loop. */
> +
> +static void
> +tui_command_loop (void *data)
> +{
> + int length;
> + char *a_prompt;
> + char *gdb_prompt = get_prompt ();
> +
> + /* If we are using readline, set things up and display the first
> + prompt, otherwise just print the prompt. */
> + if (async_command_editing_p)
> + {
> + /* Tell readline what the prompt to display is and what function
> + it will need to call after a whole line is read. This also
> + displays the first prompt. */
> + length = strlen (PREFIX (0)) + strlen (gdb_prompt) + strlen (SUFFIX (0)) + 1;
> + a_prompt = (char *) xmalloc (length);
> + strcpy (a_prompt, PREFIX (0));
> + strcat (a_prompt, gdb_prompt);
> + strcat (a_prompt, SUFFIX (0));
> + rl_callback_handler_install (a_prompt, input_handler);
> + }
> + else
> + display_gdb_prompt (0);
> +
> + /* Loop until there is nothing to do. This is the entry point to the
> + event loop engine. gdb_do_one_event, called via catch_errors()
> + will process one event for each invocation. It blocks waits for
> + an event and then processes it. >0 when an event is processed, 0
> + when catch_errors() caught an error and <0 when there are no
> + longer any event sources registered. */
> + while (1)
> + {
> + int result = catch_errors (gdb_do_one_event, 0, "", RETURN_MASK_ALL);
> + if (result < 0)
> + break;
> +
> + /* Update gdb output according to TUI mode. Since catch_errors
> + preserves the uiout from changing, this must be done at top
> + level of event loop. */
> + if (tui_active)
> + uiout = tui_out;
> + else
> + uiout = tui_old_uiout;
> +
> + if (result == 0)
> + {
> + /* FIXME: this should really be a call to a hook that is
> + interface specific, because interfaces can display the
> + prompt in their own way. */
> + display_gdb_prompt (0);
> + /* This call looks bizarre, but it is required. If the user
> + entered a command that caused an error,
> + after_char_processing_hook won't be called from
> + rl_callback_read_char_wrapper. Using a cleanup there
> + won't work, since we want this function to be called
> + after a new prompt is printed. */
> + if (after_char_processing_hook)
> + (*after_char_processing_hook) ();
> + /* Maybe better to set a flag to be checked somewhere as to
> + whether display the prompt or not. */
> + }
> + }
> +
> + /* We are done with the event loop. There are no more event sources
> + to listen to. So we exit GDB. */
> + return;
> +}
> +
> +void
> +_initialize_tui_interp (void)
> +{
> + static const struct interp_procs procs = {
> + tui_init,
> + tui_resume,
> + tui_suspend,
> + tui_exec,
> + tui_display_prompt_p,
> + tui_command_loop,
> + };
> + struct interp *tui_interp;
> +
> + /* Create a default uiout builder for the TUI. */
> + tui_out = tui_out_new (gdb_stdout);
> + interp_add (interp_new ("tui", NULL, tui_out, &procs));
> +}
> Index: tui/tui.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/tui/tui.c,v
> retrieving revision 1.29
> diff -u -r1.29 tui.c
> --- tui/tui.c 12 Feb 2003 15:14:36 -0000 1.29
> +++ tui/tui.c 14 Feb 2003 13:49:43 -0000
> @@ -393,7 +393,6 @@
>
> tui_setup_io (1);
>
> - tui_version = 1;
> tui_active = 1;
> if (deprecated_selected_frame)
> tuiShowFrameInfo (deprecated_selected_frame);
> @@ -435,7 +434,6 @@
> /* Update gdb's knowledge of its terminal. */
> target_terminal_save_ours ();
>
> - tui_version = 0;
> tui_active = 0;
> tui_update_gdb_sizes ();
> }
> @@ -563,7 +561,7 @@
> int
> tui_is_window_visible (TuiWinType type)
> {
> - if (tui_version == 0)
> + if (tui_active == 0)
> return 0;
>
> if (winList[type] == 0)
> @@ -575,7 +573,7 @@
> int
> tui_get_command_dimension (int *width, int *height)
> {
> - if (!tui_version || !m_winPtrNotNull (cmdWin))
> + if (!tui_active || !m_winPtrNotNull (cmdWin))
> {
> return 0;
> }
> Index: tui/tuiData.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/tui/tuiData.h,v
> retrieving revision 1.12
> diff -u -r1.12 tuiData.h
> --- tui/tuiData.h 1 Sep 2002 10:49:00 -0000 1.12
> +++ tui/tuiData.h 14 Feb 2003 13:49:44 -0000
> @@ -328,7 +328,6 @@
>
> /* Global Data */
> extern TuiWinInfoPtr winList[MAX_MAJOR_WINDOWS];
> -extern int tui_version;
>
> /* Macros */
> #define srcWin winList[SRC_WIN]