From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23129 invoked by alias); 27 May 2019 17:29:32 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 23120 invoked by uid 89); 27 May 2019 17:29:32 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 spammy=H*MI:sk:2019050, saving, Save, eventtopc X-HELO: mail-wr1-f65.google.com Received: from mail-wr1-f65.google.com (HELO mail-wr1-f65.google.com) (209.85.221.65) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 27 May 2019 17:29:30 +0000 Received: by mail-wr1-f65.google.com with SMTP id d9so17539170wrx.0 for ; Mon, 27 May 2019 10:29:29 -0700 (PDT) Return-Path: Received: from ?IPv6:2001:8a0:f913:f700:4eeb:42ff:feef:f164? ([2001:8a0:f913:f700:4eeb:42ff:feef:f164]) by smtp.gmail.com with ESMTPSA id s62sm166436wmf.24.2019.05.27.10.29.26 (version=TLS1_3 cipher=AEAD-AES128-GCM-SHA256 bits=128/128); Mon, 27 May 2019 10:29:27 -0700 (PDT) Subject: Re: [RFAv3 1/6] Add previous_saved_command_line to allow a command to repeat a previous command. To: Philippe Waroquiers , gdb-patches@sourceware.org References: <20190504161753.15530-1-philippe.waroquiers@skynet.be> <20190504161753.15530-2-philippe.waroquiers@skynet.be> From: Pedro Alves Message-ID: <80035dbe-4682-eb51-9db2-c774e5f87a7a@redhat.com> Date: Mon, 27 May 2019 17:29:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 MIME-Version: 1.0 In-Reply-To: <20190504161753.15530-2-philippe.waroquiers@skynet.be> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-SW-Source: 2019-05/txt/msg00589.txt.bz2 On 5/4/19 5:17 PM, Philippe Waroquiers wrote: > Currently, a previous command can be repeated when the user types an > empty line. This is implemented in handle_line_of_input by > returning saved_command_line in case an empty line has been input. > > If we want a command to repeat the previous command, we need to save > the previous saved_command_line, as when a command runs, the saved_command_line > already contains the current command line of the command being executed. > > As suggested by Tom, the previous_saved_command_line is made static. > At the same time, saved_command_line is also made static. > The support functions/variables for the repeat command logic are now all > located inside top.c. > > gdb/ChangeLog > 2019-05-04 Philippe Waroquiers > > * top.h (saved_command_line): Remove declaration. > * top.c (previous_saved_command_line, previous_repeat_arguments): > New variables. > (saved_command_line): Make static, define together with other > 'repeat variables'. > (dont_repeat): Clear repeat_arguments. > (repeat_previous, get_saved_command_line, save_command_line): > New functions. > (gdb_init): Initialize saved_command_line > and previous_saved_command_line. > * main.c (captured_main_1): Remove saved_command_line initialization. > * event-top.c (handle_line_of_input): Update to use > the new 'repeat' related functions instead of direct access to > saved_command_line. > * command.h (repeat_previous, get_saved_command_line, > save_command_line): New declarations. > (dont_repeat): Add comment. > --- > gdb/command.h | 36 ++++++++++++++++++++++++- > gdb/event-top.c | 16 +++++------ > gdb/main.c | 2 -- > gdb/top.c | 70 +++++++++++++++++++++++++++++++++++++++++-------- > gdb/top.h | 1 - > 5 files changed, 101 insertions(+), 24 deletions(-) > > diff --git a/gdb/command.h b/gdb/command.h > index 4a239a7196..ea3a58f81c 100644 > --- a/gdb/command.h > +++ b/gdb/command.h > @@ -448,7 +448,29 @@ extern void cmd_show_list (struct cmd_list_element *, int, const char *); > > extern void error_no_arg (const char *) ATTRIBUTE_NORETURN; > > -extern void dont_repeat (void); > + > +/* Command line saving and repetition. > + Each input line executed is saved for possibly be repeated either s/saved for ... be/saved to ... be/ > + when the user types an empty line, or be repeated by a command > + that wants to repeat the previously executed command. The below > + functions are controlling command repetition. */ s/are controlling/control/ > + > +/* Commands call dont_repeat if they do not want to be repeated by null > + lines or by repeat_previous (). */ > + > +extern void dont_repeat (); > + > +/* Command call repeat_previous if they want to repeat the previous command. s/Command call/Commands call/ > + Such commands repeating the previous command must indicate s/Such commands repeating/Such commands that repeat/ > + to not repeat themselves, to avoid recursive repeat. > + repeat_previous will mark the current command as not repeating, > + and will ensure get_saved_command_line returns the previous command, > + so that the currently executing command can repeat it. */ > + > +extern void repeat_previous (); > + > +/* Prevent dont_repeat from working, and return a cleanup that > + restores the previous state. */ > > extern scoped_restore_tmpl prevent_dont_repeat (void); > > @@ -457,6 +479,18 @@ extern scoped_restore_tmpl prevent_dont_repeat (void); > > extern void set_repeat_arguments (const char *args); > > +/* Returns the saved command line to repeat. > + When a command is being executed, this is the currently executing > + command line, unless the currently executing command has called > + repeat_previous (): in this case, get_saved_command_line returns > + the previously saved command line. */ > + > +extern char *get_saved_command_line (); > + > +/* Takes a copy of CMD, for possible repetition. */ > + > +extern void save_command_line (const char *cmd); > + > /* Used to mark commands that don't do anything. If we just leave the > function field NULL, the command is interpreted as a help topic, or > as a class of commands. */ > diff --git a/gdb/event-top.c b/gdb/event-top.c > index 3ccf136ff1..b64b7462c7 100644 > --- a/gdb/event-top.c > +++ b/gdb/event-top.c > @@ -634,11 +634,10 @@ command_line_append_input_line (struct buffer *cmd_line_buffer, const char *rl) > If REPEAT, handle command repetitions: > > - If the input command line is NOT empty, the command returned is > - copied into the global 'saved_command_line' var so that it can > - be repeated later. > + saved using save_command_line () so that it can be repeated later. > > - - OTOH, if the input command line IS empty, return the previously > - saved command instead of the empty input line. > + - OTOH, if the input command line IS empty, return the saved > + command instead of the empty input line. > */ > > char * > @@ -673,7 +672,7 @@ handle_line_of_input (struct buffer *cmd_line_buffer, > server_command = startswith (cmd, SERVER_COMMAND_PREFIX); > if (server_command) > { > - /* Note that we don't set `saved_command_line'. Between this > + /* Note that we don't call `save_command_line'. Between this > and the check in dont_repeat, this insures that repeating > will still do the right thing. */ > return cmd + strlen (SERVER_COMMAND_PREFIX); > @@ -713,7 +712,7 @@ handle_line_of_input (struct buffer *cmd_line_buffer, > for (p1 = cmd; *p1 == ' ' || *p1 == '\t'; p1++) > ; > if (repeat && *p1 == '\0') > - return saved_command_line; > + return get_saved_command_line (); > > /* Add command to history if appropriate. Note: lines consisting > solely of comments are also added to the command history. This > @@ -728,9 +727,8 @@ handle_line_of_input (struct buffer *cmd_line_buffer, > /* Save into global buffer if appropriate. */ > if (repeat) > { > - xfree (saved_command_line); > - saved_command_line = xstrdup (cmd); > - return saved_command_line; > + save_command_line (cmd); > + return get_saved_command_line (); > } > else > return cmd; > diff --git a/gdb/main.c b/gdb/main.c > index 35df1e497f..ef9bfe8fc6 100644 > --- a/gdb/main.c > +++ b/gdb/main.c > @@ -499,8 +499,6 @@ captured_main_1 (struct captured_main_args *context) > > notice_open_fds (); > > - saved_command_line = (char *) xstrdup (""); > - > #ifdef __MINGW32__ > /* Ensure stderr is unbuffered. A Cygwin pty or pipe is implemented > as a Windows pipe, and Windows buffers on pipes. */ > diff --git a/gdb/top.c b/gdb/top.c > index bacd684dba..70f685ffad 100644 > --- a/gdb/top.c > +++ b/gdb/top.c > @@ -134,8 +134,26 @@ show_confirm (struct ui_file *file, int from_tty, > char *current_directory; > > /* The last command line executed on the console. Used for command > - repetitions. */ > -char *saved_command_line; > + repetitions when the user enters an empty line. */ > + > +static char *saved_command_line; > + > +/* If not NULL, the arguments that should be passed if > + saved_command_line is repeated. */ > + > +static const char *repeat_arguments; > + > +/* The previous last command line executed on the console. Used for command > + repetitions when a command want to relaunch the previously launched s/a command want/a command wants/ > + command. We need this as when a command is running, saved_command_line > + already contains the line of the currently executing command. */ > + > +char *previous_saved_command_line; > + > +/* If not NULL, the arguments that should be passed if the > + previous_saved_command_line is repeated. */ > + > +static const char *previous_repeat_arguments; > > /* Nonzero if the current command is modified by "server ". This > affects things like recording into the command history, commands > @@ -521,11 +539,6 @@ maybe_wait_sync_command_done (int was_sync) > wait_sync_command_done (); > } > > -/* If not NULL, the arguments that should be passed if the current > - command is repeated. */ > - > -static const char *repeat_arguments; > - > /* See command.h. */ > > void > @@ -695,7 +708,7 @@ execute_command_to_string (const char *p, int from_tty, > > static int suppress_dont_repeat = 0; > > -/* Commands call this if they do not want to be repeated by null lines. */ > +/* See command.h */ > > void > dont_repeat (void) > @@ -709,11 +722,27 @@ dont_repeat (void) > thing read from stdin in line and don't want to delete it. Null > lines won't repeat here in any case. */ > if (ui->instream == ui->stdin_stream) > - *saved_command_line = 0; > + { > + *saved_command_line = 0; > + repeat_arguments = NULL; > + } > +} > + > +/* See command.h */ > + > +void > +repeat_previous () > +{ > + /* Do not repeat this command, as this command is a repeating command. */ > + dont_repeat (); > + > + /* We cannot free saved_command_line, as this line is being executed, > + so swap it with previous_saved_command_line. */ > + std::swap (previous_saved_command_line, saved_command_line); > + std::swap (previous_repeat_arguments, repeat_arguments); > } > > -/* Prevent dont_repeat from working, and return a cleanup that > - restores the previous state. */ > +/* See command.h. */ > > scoped_restore_tmpl > prevent_dont_repeat (void) > @@ -721,6 +750,22 @@ prevent_dont_repeat (void) > return make_scoped_restore (&suppress_dont_repeat, 1); > } > > +char * > +get_saved_command_line () Add usual /* See foo.h */ comment. > +{ > + return saved_command_line; > +} > + > +void > +save_command_line (const char *cmd) Ditto. > +{ > + xfree (previous_saved_command_line); > + previous_saved_command_line = saved_command_line; > + previous_repeat_arguments = repeat_arguments; > + saved_command_line = xstrdup (cmd); > + repeat_arguments = NULL; > +} > + > > /* Read a line from the stream "instream" without command line editing. > > @@ -2179,6 +2224,9 @@ The second argument is the terminal the UI runs on.\n"), &cmdlist); > void > gdb_init (char *argv0) > { > + saved_command_line = (char *) xstrdup (""); > + previous_saved_command_line = (char *) xstrdup (""); Drop the unnecessary casts. > + > if (pre_init_ui_hook) > pre_init_ui_hook (); > > diff --git a/gdb/top.h b/gdb/top.h > index 025d9389d6..aab03c13d6 100644 > --- a/gdb/top.h > +++ b/gdb/top.h > @@ -217,7 +217,6 @@ extern void ui_register_input_event_handler (struct ui *ui); > extern void ui_unregister_input_event_handler (struct ui *ui); > > /* From top.c. */ > -extern char *saved_command_line; > extern int confirm; > extern int inhibit_gdbinit; > extern const char gdbinit[]; > Thanks, Pedro Alves