blob: a271567cf7a435bdf24193be14583a0db2138502 [file] [log] [blame]
Jari Aalto726f6381996-08-26 18:22:31 +00001/* bashhist.c -- bash interface to the GNU history library. */
2
Jari Aaltob80f6442004-07-27 13:29:18 +00003/* Copyright (C) 1993-2004 Free Software Foundation, Inc.
Jari Aalto726f6381996-08-26 18:22:31 +00004
5 This file is part of GNU Bash, the Bourne Again SHell.
6
7 Bash is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 Bash is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License along
18 with Bash; see the file COPYING. If not, write to the Free Software
Jari Aaltobb706242000-03-17 21:46:59 +000019 Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
Jari Aalto726f6381996-08-26 18:22:31 +000020
Jari Aaltoccc6cda1996-12-23 17:02:34 +000021#include "config.h"
22
23#if defined (HISTORY)
24
25#if defined (HAVE_UNISTD_H)
Jari Aaltocce855b1998-04-17 19:52:44 +000026# ifdef _MINIX
27# include <sys/types.h>
28# endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +000029# include <unistd.h>
30#endif
31
32#include "bashtypes.h"
Jari Aalto726f6381996-08-26 18:22:31 +000033#include <stdio.h>
34#include <errno.h>
35#include "bashansi.h"
36#include "posixstat.h"
37#include "filecntl.h"
Jari Aaltod166f041997-06-05 14:59:13 +000038
Jari Aaltob80f6442004-07-27 13:29:18 +000039#include "bashintl.h"
40
Jari Aalto726f6381996-08-26 18:22:31 +000041#include "shell.h"
42#include "flags.h"
Jari Aaltoccc6cda1996-12-23 17:02:34 +000043#include "input.h"
44#include "parser.h" /* for the struct dstack stuff. */
45#include "pathexp.h" /* for the struct ignorevar stuff */
Jari Aaltof73dda02001-11-13 17:56:06 +000046#include "bashhist.h" /* matching prototypes and declarations */
Jari Aaltoccc6cda1996-12-23 17:02:34 +000047#include "builtins/common.h"
Jari Aaltod166f041997-06-05 14:59:13 +000048
Jari Aalto726f6381996-08-26 18:22:31 +000049#include <readline/history.h>
Jari Aaltof73dda02001-11-13 17:56:06 +000050#include <glob/glob.h>
51#include <glob/strmatch.h>
Jari Aaltoccc6cda1996-12-23 17:02:34 +000052
53#if defined (READLINE)
54# include "bashline.h"
Jari Aaltob80f6442004-07-27 13:29:18 +000055extern int rl_done, rl_dispatching; /* should really include readline.h */
Jari Aaltoccc6cda1996-12-23 17:02:34 +000056#endif
57
58#if !defined (errno)
59extern int errno;
60#endif
61
Jari Aaltof73dda02001-11-13 17:56:06 +000062static int histignore_item_func __P((struct ign *));
Jari Aalto7117c2d2002-07-17 14:10:11 +000063static int check_history_control __P((char *));
Jari Aaltob80f6442004-07-27 13:29:18 +000064static void hc_erasedups __P((char *));
Jari Aalto7117c2d2002-07-17 14:10:11 +000065static void really_add_history __P((char *));
Jari Aaltoccc6cda1996-12-23 17:02:34 +000066
67static struct ignorevar histignore =
68{
69 "HISTIGNORE",
70 (struct ign *)0,
71 0,
72 (char *)0,
Jari Aaltof73dda02001-11-13 17:56:06 +000073 (sh_iv_item_func_t *)histignore_item_func,
Jari Aaltoccc6cda1996-12-23 17:02:34 +000074};
75
76#define HIGN_EXPAND 0x01
Jari Aalto726f6381996-08-26 18:22:31 +000077
78/* Declarations of bash history variables. */
79/* Non-zero means to remember lines typed to the shell on the history
80 list. This is different than the user-controlled behaviour; this
81 becomes zero when we read lines from a file, for example. */
82int remember_on_history = 1;
83
Jari Aaltob80f6442004-07-27 13:29:18 +000084/* The number of lines that Bash has added to this history session. The
85 difference between the number of the top element in the history list
86 (offset from history_base) and the number of lines in the history file.
87 Appending this session's history to the history file resets this to 0. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +000088int history_lines_this_session;
Jari Aalto726f6381996-08-26 18:22:31 +000089
90/* The number of lines that Bash has read from the history file. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +000091int history_lines_in_file;
Jari Aalto726f6381996-08-26 18:22:31 +000092
Jari Aaltoccc6cda1996-12-23 17:02:34 +000093#if defined (BANG_HISTORY)
Jari Aalto726f6381996-08-26 18:22:31 +000094/* Non-zero means do no history expansion on this line, regardless
95 of what history_expansion says. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +000096int history_expansion_inhibited;
97#endif
Jari Aalto726f6381996-08-26 18:22:31 +000098
Jari Aalto7117c2d2002-07-17 14:10:11 +000099/* With the old default, every line was saved in the history individually.
100 I.e., if the user enters:
Jari Aalto726f6381996-08-26 18:22:31 +0000101 bash$ for i in a b c
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000102 > do
103 > echo $i
104 > done
Jari Aalto726f6381996-08-26 18:22:31 +0000105 Each line will be individually saved in the history.
106 bash$ history
107 10 for i in a b c
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000108 11 do
109 12 echo $i
110 13 done
111 14 history
Jari Aalto726f6381996-08-26 18:22:31 +0000112 If the variable command_oriented_history is set, multiple lines
113 which form one command will be saved as one history entry.
114 bash$ for i in a b c
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000115 > do
116 > echo $i
117 > done
118 bash$ history
Jari Aalto726f6381996-08-26 18:22:31 +0000119 10 for i in a b c
120 do
121 echo $i
122 done
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000123 11 history
Jari Aalto726f6381996-08-26 18:22:31 +0000124 The user can then recall the whole command all at once instead
125 of just being able to recall one line at a time.
Jari Aalto7117c2d2002-07-17 14:10:11 +0000126
127 This is now enabled by default.
Jari Aalto726f6381996-08-26 18:22:31 +0000128 */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000129int command_oriented_history = 1;
130
Jari Aalto7117c2d2002-07-17 14:10:11 +0000131/* Set to 1 if the first line of a possibly-multi-line command was saved
132 in the history list. Managed by maybe_add_history(), but global so
133 the history-manipluating builtins can see it. */
134int current_command_first_line_saved = 0;
135
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000136/* Non-zero means to store newlines in the history list when using
137 command_oriented_history rather than trying to use semicolons. */
138int literal_history;
139
140/* Non-zero means to append the history to the history file at shell
141 exit, even if the history has been stifled. */
142int force_append_history;
Jari Aalto726f6381996-08-26 18:22:31 +0000143
Jari Aaltob80f6442004-07-27 13:29:18 +0000144/* A nit for picking at history saving. Flags have the following values:
145
146 Value == 0 means save all lines parsed by the shell on the history.
147 Value & HC_IGNSPACE means save all lines that do not start with a space.
148 Value & HC_IGNDUPS means save all lines that do not match the last
149 line saved.
150 Value & HC_ERASEDUPS means to remove all other matching lines from the
151 history list before saving the latest line. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000152int history_control;
153
Jari Aaltod166f041997-06-05 14:59:13 +0000154/* Set to 1 if the last command was added to the history list successfully
155 as a separate history entry; set to 0 if the line was ignored or added
156 to a previous entry as part of command-oriented-history processing. */
157int hist_last_line_added;
158
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000159#if defined (READLINE)
160/* If non-zero, and readline is being used, the user is offered the
161 chance to re-edit a failed history expansion. */
162int history_reediting;
163
164/* If non-zero, and readline is being used, don't directly execute a
165 line with history substitution. Reload it into the editing buffer
166 instead and let the user further edit and confirm with a newline. */
167int hist_verify;
Jari Aaltod166f041997-06-05 14:59:13 +0000168
169#endif /* READLINE */
Jari Aalto726f6381996-08-26 18:22:31 +0000170
Jari Aaltof73dda02001-11-13 17:56:06 +0000171/* Non-zero means to not save function definitions in the history list. */
172int dont_save_function_defs;
173
Jari Aalto726f6381996-08-26 18:22:31 +0000174/* Variables declared in other files used here. */
Jari Aalto726f6381996-08-26 18:22:31 +0000175extern int current_command_line_count;
Jari Aalto726f6381996-08-26 18:22:31 +0000176
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000177extern struct dstack dstack;
178
Jari Aaltof73dda02001-11-13 17:56:06 +0000179static int bash_history_inhibit_expansion __P((char *, int));
180#if defined (READLINE)
181static void re_edit __P((char *));
182#endif
183static int history_expansion_p __P((char *));
184static int shell_comment __P((char *));
185static int should_expand __P((char *));
186static HIST_ENTRY *last_history_entry __P((void));
187static char *expand_histignore_pattern __P((char *));
188static int history_should_ignore __P((char *));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000189
Jari Aaltod166f041997-06-05 14:59:13 +0000190/* Is the history expansion starting at string[i] one that should not
191 be expanded? */
192static int
193bash_history_inhibit_expansion (string, i)
194 char *string;
195 int i;
196{
197 /* The shell uses ! as a pattern negation character in globbing [...]
198 expressions, so let those pass without expansion. */
199 if (i > 0 && (string[i - 1] == '[') && member (']', string + i + 1))
200 return (1);
201 /* The shell uses ! as the indirect expansion character, so let those
202 expansions pass as well. */
203 else if (i > 1 && string[i - 1] == '{' && string[i - 2] == '$' &&
204 member ('}', string + i + 1))
205 return (1);
Jari Aaltocce855b1998-04-17 19:52:44 +0000206#if defined (EXTENDED_GLOB)
207 else if (extended_glob && i > 1 && string[i+1] == '(' && member (')', string + i + 2))
208 return (1);
209#endif
Jari Aaltod166f041997-06-05 14:59:13 +0000210 else
211 return (0);
212}
213
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000214void
215bash_initialize_history ()
216{
217 history_quotes_inhibit_expansion = 1;
218 history_search_delimiter_chars = ";&()|<>";
Jari Aaltod166f041997-06-05 14:59:13 +0000219 history_inhibit_expansion_function = bash_history_inhibit_expansion;
Jari Aaltob80f6442004-07-27 13:29:18 +0000220 sv_histchars ("histchars");
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000221}
222
223void
224bash_history_reinit (interact)
225 int interact;
226{
227#if defined (BANG_HISTORY)
228 history_expansion = interact != 0;
229 history_expansion_inhibited = 1;
230#endif
231 remember_on_history = interact != 0;
Jari Aaltod166f041997-06-05 14:59:13 +0000232 history_inhibit_expansion_function = bash_history_inhibit_expansion;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000233}
234
235void
236bash_history_disable ()
237{
238 remember_on_history = 0;
239#if defined (BANG_HISTORY)
240 history_expansion_inhibited = 1;
241#endif
242}
243
244void
245bash_history_enable ()
246{
247 remember_on_history = 1;
248#if defined (BANG_HISTORY)
249 history_expansion_inhibited = 0;
250#endif
Jari Aaltod166f041997-06-05 14:59:13 +0000251 history_inhibit_expansion_function = bash_history_inhibit_expansion;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000252 sv_history_control ("HISTCONTROL");
253 sv_histignore ("HISTIGNORE");
254}
Jari Aalto726f6381996-08-26 18:22:31 +0000255
256/* Load the history list from the history file. */
257void
258load_history ()
259{
260 char *hf;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000261 struct stat buf;
Jari Aalto726f6381996-08-26 18:22:31 +0000262
263 /* Truncate history file for interactive shells which desire it.
264 Note that the history file is automatically truncated to the
265 size of HISTSIZE if the user does not explicitly set the size
266 differently. */
267 set_if_not ("HISTFILESIZE", get_string_value ("HISTSIZE"));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000268 sv_histsize ("HISTFILESIZE");
Jari Aalto726f6381996-08-26 18:22:31 +0000269
270 /* Read the history in HISTFILE into the history list. */
271 hf = get_string_value ("HISTFILE");
272
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000273 if (hf && *hf && stat (hf, &buf) == 0)
Jari Aalto726f6381996-08-26 18:22:31 +0000274 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000275 read_history (hf);
276 using_history ();
277 history_lines_in_file = where_history ();
Jari Aalto726f6381996-08-26 18:22:31 +0000278 }
279}
280
Jari Aaltod166f041997-06-05 14:59:13 +0000281#ifdef INCLUDE_UNUSED
Jari Aalto726f6381996-08-26 18:22:31 +0000282/* Write the existing history out to the history file. */
283void
284save_history ()
285{
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000286 char *hf;
287 struct stat buf;
Jari Aalto726f6381996-08-26 18:22:31 +0000288
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000289 hf = get_string_value ("HISTFILE");
290 if (hf && *hf && stat (hf, &buf) == 0)
Jari Aalto726f6381996-08-26 18:22:31 +0000291 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000292 /* Append only the lines that occurred this session to
293 the history file. */
294 using_history ();
Jari Aalto726f6381996-08-26 18:22:31 +0000295
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000296 if (history_lines_this_session < where_history () || force_append_history)
297 append_history (history_lines_this_session, hf);
298 else
299 write_history (hf);
Jari Aalto726f6381996-08-26 18:22:31 +0000300
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000301 sv_histsize ("HISTFILESIZE");
Jari Aalto726f6381996-08-26 18:22:31 +0000302 }
303}
Jari Aaltod166f041997-06-05 14:59:13 +0000304#endif
Jari Aalto726f6381996-08-26 18:22:31 +0000305
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000306int
307maybe_append_history (filename)
308 char *filename;
309{
310 int fd, result;
311 struct stat buf;
312
313 result = EXECUTION_SUCCESS;
314 if (history_lines_this_session && (history_lines_this_session < where_history ()))
315 {
316 /* If the filename was supplied, then create it if necessary. */
317 if (stat (filename, &buf) == -1 && errno == ENOENT)
318 {
Jari Aaltob72432f1999-02-19 17:11:39 +0000319 fd = open (filename, O_WRONLY|O_CREAT, 0600);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000320 if (fd < 0)
321 {
Jari Aaltob80f6442004-07-27 13:29:18 +0000322 builtin_error (_("%s: cannot create: %s"), filename, strerror (errno));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000323 return (EXECUTION_FAILURE);
324 }
325 close (fd);
326 }
327 result = append_history (history_lines_this_session, filename);
328 history_lines_in_file += history_lines_this_session;
329 history_lines_this_session = 0;
330 }
331 return (result);
332}
333
Jari Aalto726f6381996-08-26 18:22:31 +0000334/* If this is an interactive shell, then append the lines executed
335 this session to the history file. */
336int
337maybe_save_shell_history ()
338{
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000339 int result;
340 char *hf;
341 struct stat buf;
Jari Aalto726f6381996-08-26 18:22:31 +0000342
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000343 result = 0;
Jari Aalto726f6381996-08-26 18:22:31 +0000344 if (history_lines_this_session)
345 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000346 hf = get_string_value ("HISTFILE");
Jari Aalto726f6381996-08-26 18:22:31 +0000347
348 if (hf && *hf)
349 {
Jari Aalto726f6381996-08-26 18:22:31 +0000350 /* If the file doesn't exist, then create it. */
351 if (stat (hf, &buf) == -1)
352 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000353 int file;
Jari Aaltob72432f1999-02-19 17:11:39 +0000354 file = open (hf, O_CREAT | O_TRUNC | O_WRONLY, 0600);
Jari Aalto726f6381996-08-26 18:22:31 +0000355 if (file != -1)
356 close (file);
357 }
358
359 /* Now actually append the lines if the history hasn't been
360 stifled. If the history has been stifled, rewrite the
361 history file. */
362 using_history ();
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000363 if (history_lines_this_session <= where_history () || force_append_history)
Jari Aalto726f6381996-08-26 18:22:31 +0000364 {
365 result = append_history (history_lines_this_session, hf);
366 history_lines_in_file += history_lines_this_session;
367 }
368 else
369 {
370 result = write_history (hf);
371 history_lines_in_file = history_lines_this_session;
372 }
373 history_lines_this_session = 0;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000374
375 sv_histsize ("HISTFILESIZE");
Jari Aalto726f6381996-08-26 18:22:31 +0000376 }
377 }
378 return (result);
379}
380
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000381#if defined (READLINE)
Jari Aalto726f6381996-08-26 18:22:31 +0000382/* Tell readline () that we have some text for it to edit. */
383static void
384re_edit (text)
385 char *text;
386{
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000387 if (bash_input.type == st_stdin)
Jari Aalto726f6381996-08-26 18:22:31 +0000388 bash_re_edit (text);
Jari Aalto726f6381996-08-26 18:22:31 +0000389}
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000390#endif /* READLINE */
391
392/* Return 1 if this line needs history expansion. */
393static int
394history_expansion_p (line)
395 char *line;
396{
397 register char *s;
398
399 for (s = line; *s; s++)
400 if (*s == history_expansion_char || *s == history_subst_char)
401 return 1;
402 return 0;
403}
Jari Aalto726f6381996-08-26 18:22:31 +0000404
405/* Do pre-processing on LINE. If PRINT_CHANGES is non-zero, then
406 print the results of expanding the line if there were any changes.
407 If there is an error, return NULL, otherwise the expanded line is
408 returned. If ADDIT is non-zero the line is added to the history
409 list after history expansion. ADDIT is just a suggestion;
410 REMEMBER_ON_HISTORY can veto, and does.
411 Right now this does history expansion. */
412char *
413pre_process_line (line, print_changes, addit)
414 char *line;
415 int print_changes, addit;
416{
417 char *history_value;
418 char *return_value;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000419 int expanded;
Jari Aalto726f6381996-08-26 18:22:31 +0000420
421 return_value = line;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000422 expanded = 0;
Jari Aalto726f6381996-08-26 18:22:31 +0000423
424# if defined (BANG_HISTORY)
425 /* History expand the line. If this results in no errors, then
426 add that line to the history if ADDIT is non-zero. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000427 if (!history_expansion_inhibited && history_expansion && history_expansion_p (line))
Jari Aalto726f6381996-08-26 18:22:31 +0000428 {
429 expanded = history_expand (line, &history_value);
430
431 if (expanded)
432 {
433 if (print_changes)
434 {
435 if (expanded < 0)
Jari Aaltocce855b1998-04-17 19:52:44 +0000436 internal_error ("%s", history_value);
Jari Aaltod166f041997-06-05 14:59:13 +0000437#if defined (READLINE)
Jari Aaltobb706242000-03-17 21:46:59 +0000438 else if (hist_verify == 0 || expanded == 2)
Jari Aaltod166f041997-06-05 14:59:13 +0000439#else
440 else
441#endif
Jari Aalto726f6381996-08-26 18:22:31 +0000442 fprintf (stderr, "%s\n", history_value);
443 }
444
445 /* If there was an error, return NULL. */
446 if (expanded < 0 || expanded == 2) /* 2 == print only */
447 {
Jari Aaltob80f6442004-07-27 13:29:18 +0000448# if defined (READLINE)
449 if (expanded == 2 && rl_dispatching == 0 && *history_value)
450# else
451 if (expanded == 2 && *history_value)
452# endif /* !READLINE */
453 maybe_add_history (history_value);
454
Jari Aalto726f6381996-08-26 18:22:31 +0000455 free (history_value);
456
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000457# if defined (READLINE)
Jari Aalto726f6381996-08-26 18:22:31 +0000458 /* New hack. We can allow the user to edit the
459 failed history expansion. */
Jari Aaltob80f6442004-07-27 13:29:18 +0000460 if (history_reediting && expanded < 0 && rl_done)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000461 re_edit (line);
462# endif /* READLINE */
Jari Aalto726f6381996-08-26 18:22:31 +0000463 return ((char *)NULL);
464 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000465
466# if defined (READLINE)
467 if (hist_verify && expanded == 1)
468 {
469 re_edit (history_value);
470 return ((char *)NULL);
471 }
472# endif
Jari Aalto726f6381996-08-26 18:22:31 +0000473 }
474
475 /* Let other expansions know that return_value can be free'ed,
476 and that a line has been added to the history list. Note
477 that we only add lines that have something in them. */
478 expanded = 1;
479 return_value = history_value;
480 }
481# endif /* BANG_HISTORY */
482
483 if (addit && remember_on_history && *return_value)
484 maybe_add_history (return_value);
485
Jari Aaltod166f041997-06-05 14:59:13 +0000486#if 0
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000487 if (expanded == 0)
Jari Aalto726f6381996-08-26 18:22:31 +0000488 return_value = savestring (line);
Jari Aaltod166f041997-06-05 14:59:13 +0000489#endif
Jari Aalto726f6381996-08-26 18:22:31 +0000490
491 return (return_value);
492}
493
Jari Aaltobb706242000-03-17 21:46:59 +0000494/* Return 1 if the first non-whitespace character in LINE is a `#', indicating
495 * that the line is a shell comment. */
496static int
497shell_comment (line)
498 char *line;
499{
500 char *p;
501
502 for (p = line; p && *p && whitespace (*p); p++)
503 ;
504 return (p && *p == '#');
505}
506
Jari Aaltof73dda02001-11-13 17:56:06 +0000507#ifdef INCLUDE_UNUSED
Jari Aaltobb706242000-03-17 21:46:59 +0000508/* Remove shell comments from LINE. A `#' and anything after it is a comment.
509 This isn't really useful yet, since it doesn't handle quoting. */
510static char *
511filter_comments (line)
512 char *line;
513{
514 char *p;
515
516 for (p = line; p && *p && *p != '#'; p++)
517 ;
518 if (p && *p == '#')
519 *p = '\0';
520 return (line);
521}
Jari Aaltof73dda02001-11-13 17:56:06 +0000522#endif
Jari Aaltobb706242000-03-17 21:46:59 +0000523
Jari Aalto7117c2d2002-07-17 14:10:11 +0000524/* Check LINE against what HISTCONTROL says to do. Returns 1 if the line
525 should be saved; 0 if it should be discarded. */
526static int
527check_history_control (line)
528 char *line;
529{
530 HIST_ENTRY *temp;
531 int r;
532
Jari Aaltob80f6442004-07-27 13:29:18 +0000533 if (history_control == 0)
534 return 1;
535
536 /* ignorespace or ignoreboth */
537 if ((history_control & HC_IGNSPACE) && *line == ' ')
538 return 0;
539
540 /* ignoredups or ignoreboth */
541 if (history_control & HC_IGNDUPS)
Jari Aalto7117c2d2002-07-17 14:10:11 +0000542 {
Jari Aalto7117c2d2002-07-17 14:10:11 +0000543 using_history ();
544 temp = previous_history ();
545
546 r = (temp == 0 || STREQ (temp->line, line) == 0);
547
548 using_history ();
Jari Aaltob80f6442004-07-27 13:29:18 +0000549
550 if (r == 0)
551 return r;
Jari Aalto7117c2d2002-07-17 14:10:11 +0000552 }
553
Jari Aaltob80f6442004-07-27 13:29:18 +0000554 return 1;
555}
556
557/* Remove all entries matching LINE from the history list. Triggered when
558 HISTCONTROL includes `erasedups'. */
559static void
560hc_erasedups (line)
561 char *line;
562{
563 HIST_ENTRY *temp;
564 int r;
565
566 using_history ();
567 while (temp = previous_history ())
568 {
569 if (STREQ (temp->line, line))
570 {
571 r = where_history ();
572 remove_history (r);
573 }
574 }
575 using_history ();
Jari Aalto7117c2d2002-07-17 14:10:11 +0000576}
577
578/* Add LINE to the history list, handling possibly multi-line compound
579 commands. We note whether or not we save the first line of each command
580 (which is usually the entire command and history entry), and don't add
581 the second and subsequent lines of a multi-line compound command if we
582 didn't save the first line. We don't usually save shell comment lines in
583 compound commands in the history, because they could have the effect of
584 commenting out the rest of the command when the entire command is saved as
585 a single history entry (when COMMAND_ORIENTED_HISTORY is enabled). If
586 LITERAL_HISTORY is set, we're saving lines in the history with embedded
587 newlines, so it's OK to save comment lines. We also make sure to save
588 multiple-line quoted strings or other constructs. */
Jari Aalto726f6381996-08-26 18:22:31 +0000589void
590maybe_add_history (line)
591 char *line;
592{
Jari Aalto28ef6c32001-04-06 19:14:31 +0000593 hist_last_line_added = 0;
Jari Aalto726f6381996-08-26 18:22:31 +0000594
595 /* Don't use the value of history_control to affect the second
Jari Aaltocce855b1998-04-17 19:52:44 +0000596 and subsequent lines of a multi-line command (old code did
597 this only when command_oriented_history is enabled). */
Jari Aaltocce855b1998-04-17 19:52:44 +0000598 if (current_command_line_count > 1)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000599 {
Jari Aalto7117c2d2002-07-17 14:10:11 +0000600 if (current_command_first_line_saved &&
Jari Aalto28ef6c32001-04-06 19:14:31 +0000601 (literal_history || dstack.delimiter_depth != 0 || shell_comment (line) == 0))
Jari Aaltobb706242000-03-17 21:46:59 +0000602 bash_add_history (line);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000603 return;
604 }
Jari Aalto726f6381996-08-26 18:22:31 +0000605
Jari Aalto28ef6c32001-04-06 19:14:31 +0000606 /* This is the first line of a (possible multi-line) command. Note whether
607 or not we should save the first line and remember it. */
Jari Aalto7117c2d2002-07-17 14:10:11 +0000608 current_command_first_line_saved = check_add_history (line, 0);
609}
Jari Aalto28ef6c32001-04-06 19:14:31 +0000610
Jari Aalto7117c2d2002-07-17 14:10:11 +0000611/* Just check LINE against HISTCONTROL and HISTIGNORE and add it to the
612 history if it's OK. Used by `history -s' as well as maybe_add_history().
613 Returns 1 if the line was saved in the history, 0 otherwise. */
614int
615check_add_history (line, force)
616 char *line;
617 int force;
618{
619 if (check_history_control (line) && history_should_ignore (line) == 0)
Jari Aalto726f6381996-08-26 18:22:31 +0000620 {
Jari Aaltob80f6442004-07-27 13:29:18 +0000621 /* We're committed to saving the line. If the user has requested it,
622 remove other matching lines from the history. */
623 if (history_control & HC_ERASEDUPS)
624 hc_erasedups (line);
625
Jari Aalto7117c2d2002-07-17 14:10:11 +0000626 if (force)
627 {
628 really_add_history (line);
629 using_history ();
630 }
631 else
632 bash_add_history (line);
633 return 1;
Jari Aalto726f6381996-08-26 18:22:31 +0000634 }
Jari Aalto7117c2d2002-07-17 14:10:11 +0000635 return 0;
Jari Aalto726f6381996-08-26 18:22:31 +0000636}
637
638/* Add a line to the history list.
639 The variable COMMAND_ORIENTED_HISTORY controls the style of history
640 remembering; when non-zero, and LINE is not the first line of a
641 complete parser construct, append LINE to the last history line instead
642 of adding it as a new line. */
Jari Aaltod166f041997-06-05 14:59:13 +0000643void
Jari Aalto726f6381996-08-26 18:22:31 +0000644bash_add_history (line)
645 char *line;
646{
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000647 int add_it, offset, curlen;
648 HIST_ENTRY *current, *old;
649 char *chars_to_add, *new_line;
Jari Aalto726f6381996-08-26 18:22:31 +0000650
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000651 add_it = 1;
Jari Aalto726f6381996-08-26 18:22:31 +0000652 if (command_oriented_history && current_command_line_count > 1)
653 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000654 chars_to_add = literal_history ? "\n" : history_delimiting_chars ();
Jari Aalto726f6381996-08-26 18:22:31 +0000655
656 using_history ();
Jari Aalto726f6381996-08-26 18:22:31 +0000657 current = previous_history ();
658
659 if (current)
660 {
661 /* If the previous line ended with an escaped newline (escaped
662 with backslash, but otherwise unquoted), then remove the quoted
663 newline, since that is what happens when the line is parsed. */
Jari Aalto726f6381996-08-26 18:22:31 +0000664 curlen = strlen (current->line);
665
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000666 if (dstack.delimiter_depth == 0 && current->line[curlen - 1] == '\\' &&
Jari Aalto726f6381996-08-26 18:22:31 +0000667 current->line[curlen - 2] != '\\')
668 {
669 current->line[curlen - 1] = '\0';
670 curlen--;
671 chars_to_add = "";
672 }
673
Jari Aaltof73dda02001-11-13 17:56:06 +0000674 new_line = (char *)xmalloc (1
675 + curlen
676 + strlen (line)
677 + strlen (chars_to_add));
Jari Aalto726f6381996-08-26 18:22:31 +0000678 sprintf (new_line, "%s%s%s", current->line, chars_to_add, line);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000679 offset = where_history ();
Jari Aalto726f6381996-08-26 18:22:31 +0000680 old = replace_history_entry (offset, new_line, current->data);
681 free (new_line);
682
683 if (old)
Jari Aaltob80f6442004-07-27 13:29:18 +0000684 free_history_entry (old);
685
Jari Aalto726f6381996-08-26 18:22:31 +0000686 add_it = 0;
687 }
688 }
689
690 if (add_it)
Jari Aalto7117c2d2002-07-17 14:10:11 +0000691 really_add_history (line);
692
Jari Aalto726f6381996-08-26 18:22:31 +0000693 using_history ();
694}
695
Jari Aalto7117c2d2002-07-17 14:10:11 +0000696static void
697really_add_history (line)
698 char *line;
699{
700 hist_last_line_added = 1;
701 add_history (line);
702 history_lines_this_session++;
703}
704
Jari Aalto726f6381996-08-26 18:22:31 +0000705int
706history_number ()
707{
708 using_history ();
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000709 return (get_string_value ("HISTSIZE") ? history_base + where_history () : 1);
Jari Aalto726f6381996-08-26 18:22:31 +0000710}
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000711
712static int
713should_expand (s)
714 char *s;
715{
716 char *p;
717
718 for (p = s; p && *p; p++)
719 {
720 if (*p == '\\')
721 p++;
722 else if (*p == '&')
723 return 1;
724 }
725 return 0;
726}
727
728static int
729histignore_item_func (ign)
730 struct ign *ign;
731{
732 if (should_expand (ign->val))
733 ign->flags |= HIGN_EXPAND;
734 return (0);
735}
736
737void
738setup_history_ignore (varname)
739 char *varname;
740{
741 setup_ignore_patterns (&histignore);
742}
743
744static HIST_ENTRY *
745last_history_entry ()
746{
747 HIST_ENTRY *he;
748
749 using_history ();
750 he = previous_history ();
751 using_history ();
752 return he;
753}
754
755char *
756last_history_line ()
757{
758 HIST_ENTRY *he;
759
760 he = last_history_entry ();
761 if (he == 0)
762 return ((char *)NULL);
763 return he->line;
764}
765
766static char *
767expand_histignore_pattern (pat)
768 char *pat;
769{
770 HIST_ENTRY *phe;
Jari Aaltobb706242000-03-17 21:46:59 +0000771 char *ret;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000772
773 phe = last_history_entry ();
774
775 if (phe == (HIST_ENTRY *)0)
776 return (savestring (pat));
777
Jari Aaltobb706242000-03-17 21:46:59 +0000778 ret = strcreplace (pat, '&', phe->line, 1);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000779
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000780 return ret;
781}
782
783/* Return 1 if we should not put LINE into the history according to the
784 patterns in HISTIGNORE. */
785static int
786history_should_ignore (line)
787 char *line;
788{
789 register int i, match;
790 char *npat;
791
792 if (histignore.num_ignores == 0)
793 return 0;
794
795 for (i = match = 0; i < histignore.num_ignores; i++)
796 {
797 if (histignore.ignores[i].flags & HIGN_EXPAND)
798 npat = expand_histignore_pattern (histignore.ignores[i].val);
799 else
800 npat = histignore.ignores[i].val;
801
Jari Aaltof73dda02001-11-13 17:56:06 +0000802 match = strmatch (npat, line, FNMATCH_EXTFLAG) != FNM_NOMATCH;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000803
804 if (histignore.ignores[i].flags & HIGN_EXPAND)
805 free (npat);
806
807 if (match)
808 break;
809 }
810
811 return match;
812}
813#endif /* HISTORY */