aboutsummaryrefslogtreecommitdiffstats
path: root/bashhist.c
diff options
context:
space:
mode:
authorJari Aalto <jari.aalto@cante.net>2002-07-17 14:10:11 +0000
committerJari Aalto <jari.aalto@cante.net>2009-09-12 16:46:55 +0000
commit7117c2d221b2aed4ede8600f6a36b7c1454b4f55 (patch)
treeb792f26ecca68813c51ed5ba2e381790758ef31b /bashhist.c
parentf73dda092b33638d2d5e9c35375f687a607b5403 (diff)
downloadandroid_external_bash-7117c2d221b2aed4ede8600f6a36b7c1454b4f55.tar.gz
android_external_bash-7117c2d221b2aed4ede8600f6a36b7c1454b4f55.tar.bz2
android_external_bash-7117c2d221b2aed4ede8600f6a36b7c1454b4f55.zip
Imported from ../bash-2.05b.tar.gz.
Diffstat (limited to 'bashhist.c')
-rw-r--r--bashhist.c129
1 files changed, 86 insertions, 43 deletions
diff --git a/bashhist.c b/bashhist.c
index b89758a..8090266 100644
--- a/bashhist.c
+++ b/bashhist.c
@@ -57,6 +57,8 @@ extern int errno;
#endif
static int histignore_item_func __P((struct ign *));
+static int check_history_control __P((char *));
+static void really_add_history __P((char *));
static struct ignorevar histignore =
{
@@ -87,8 +89,8 @@ int history_lines_in_file;
int history_expansion_inhibited;
#endif
-/* By default, every line is saved in the history individually. I.e.,
- if the user enters:
+/* With the old default, every line was saved in the history individually.
+ I.e., if the user enters:
bash$ for i in a b c
> do
> echo $i
@@ -114,9 +116,16 @@ int history_expansion_inhibited;
11 history
The user can then recall the whole command all at once instead
of just being able to recall one line at a time.
+
+ This is now enabled by default.
*/
int command_oriented_history = 1;
+/* Set to 1 if the first line of a possibly-multi-line command was saved
+ in the history list. Managed by maybe_add_history(), but global so
+ the history-manipluating builtins can see it. */
+int current_command_first_line_saved = 0;
+
/* Non-zero means to store newlines in the history list when using
command_oriented_history rather than trying to use semicolons. */
int literal_history;
@@ -493,26 +502,61 @@ filter_comments (line)
}
#endif
-/* Add LINE to the history list depending on the value of HISTORY_CONTROL. */
-void
-maybe_add_history (line)
+/* Check LINE against what HISTCONTROL says to do. Returns 1 if the line
+ should be saved; 0 if it should be discarded. */
+static int
+check_history_control (line)
char *line;
{
- static int first_line_saved = 0;
HIST_ENTRY *temp;
+ int r;
+ switch (history_control)
+ {
+ case 0: /* nothing */
+ return 1;
+ case 1: /* ignorespace */
+ return (*line != ' ');
+ case 3: /* ignoreboth */
+ if (*line == ' ')
+ return 0;
+ /* FALLTHROUGH if case == 3 (`ignoreboth') */
+ case 2: /* ignoredups */
+ using_history ();
+ temp = previous_history ();
+
+ r = (temp == 0 || STREQ (temp->line, line) == 0);
+
+ using_history ();
+ return r;
+ }
+
+ return 0;
+}
+
+/* Add LINE to the history list, handling possibly multi-line compound
+ commands. We note whether or not we save the first line of each command
+ (which is usually the entire command and history entry), and don't add
+ the second and subsequent lines of a multi-line compound command if we
+ didn't save the first line. We don't usually save shell comment lines in
+ compound commands in the history, because they could have the effect of
+ commenting out the rest of the command when the entire command is saved as
+ a single history entry (when COMMAND_ORIENTED_HISTORY is enabled). If
+ LITERAL_HISTORY is set, we're saving lines in the history with embedded
+ newlines, so it's OK to save comment lines. We also make sure to save
+ multiple-line quoted strings or other constructs. */
+void
+maybe_add_history (line)
+ char *line;
+{
hist_last_line_added = 0;
/* Don't use the value of history_control to affect the second
and subsequent lines of a multi-line command (old code did
this only when command_oriented_history is enabled). */
-#if 0
- if (command_oriented_history && current_command_line_count > 1)
-#else
if (current_command_line_count > 1)
-#endif
{
- if (first_line_saved &&
+ if (current_command_first_line_saved &&
(literal_history || dstack.delimiter_depth != 0 || shell_comment (line) == 0))
bash_add_history (line);
return;
@@ -520,36 +564,29 @@ maybe_add_history (line)
/* This is the first line of a (possible multi-line) command. Note whether
or not we should save the first line and remember it. */
- first_line_saved = 0;
+ current_command_first_line_saved = check_add_history (line, 0);
+}
- switch (history_control)
+/* Just check LINE against HISTCONTROL and HISTIGNORE and add it to the
+ history if it's OK. Used by `history -s' as well as maybe_add_history().
+ Returns 1 if the line was saved in the history, 0 otherwise. */
+int
+check_add_history (line, force)
+ char *line;
+ int force;
+{
+ if (check_history_control (line) && history_should_ignore (line) == 0)
{
- case 0:
- first_line_saved = 1;
- break;
- case 1:
- if (*line != ' ')
- first_line_saved = 1;
- break;
- case 3:
- if (*line == ' ')
- break;
- /* FALLTHROUGH if case == 3 (`ignoreboth') */
- case 2:
- using_history ();
- temp = previous_history ();
-
- if (temp == 0 || STREQ (temp->line, line) == 0)
- first_line_saved = 1;
-
- using_history ();
- break;
+ if (force)
+ {
+ really_add_history (line);
+ using_history ();
+ }
+ else
+ bash_add_history (line);
+ return 1;
}
-
- if (first_line_saved && history_should_ignore (line) == 0)
- bash_add_history (line);
- else
- first_line_saved = 0;
+ return 0;
}
/* Add a line to the history list.
@@ -607,14 +644,20 @@ bash_add_history (line)
}
if (add_it)
- {
- hist_last_line_added = 1;
- add_history (line);
- history_lines_this_session++;
- }
+ really_add_history (line);
+
using_history ();
}
+static void
+really_add_history (line)
+ char *line;
+{
+ hist_last_line_added = 1;
+ add_history (line);
+ history_lines_this_session++;
+}
+
int
history_number ()
{