From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32174 invoked by alias); 14 Feb 2003 18:35:22 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 32152 invoked from network); 14 Feb 2003 18:35:22 -0000 Received: from unknown (HELO mx1.redhat.com) (172.16.49.200) by 172.16.49.205 with SMTP; 14 Feb 2003 18:35:22 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id h1EIZLf23426 for ; Fri, 14 Feb 2003 13:35:21 -0500 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [172.16.52.156]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id h1EIZLa02159; Fri, 14 Feb 2003 13:35:21 -0500 Received: from localhost.redhat.com (romulus-int.sfbay.redhat.com [172.16.27.46]) by pobox.corp.redhat.com (8.11.6/8.11.6) with ESMTP id h1EIZKZ07216; Fri, 14 Feb 2003 13:35:20 -0500 Received: by localhost.redhat.com (Postfix, from userid 469) id 22F9EFF79; Fri, 14 Feb 2003 13:39:29 -0500 (EST) From: Elena Zannoni MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <15949.14304.932486.922410@localhost.redhat.com> Date: Fri, 14 Feb 2003 18:35:00 -0000 To: Andrew Cagney Cc: gdb-patches@sources.redhat.com Subject: Re: [commit] Convert tui to interps mechanism In-Reply-To: <3E4CF570.1040906@redhat.com> References: <3E4CF570.1040906@redhat.com> X-SW-Source: 2003-02/txt/msg00332.txt.bz2 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 > > * 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 > + > + * 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 > + > + * 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 > > * 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]