i-bash/lib/readline/examples/histexamp.c

126 lines
2.8 KiB
C
Raw Normal View History

2009-01-12 13:36:28 +00:00
/* histexamp.c - history library example program. */
2002-07-17 14:10:11 +00:00
2009-01-12 13:36:28 +00:00
/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
This file is part of the GNU Readline Library (Readline), a library for
2002-07-17 14:10:11 +00:00
reading lines of text with interactive input and history editing.
2009-01-12 13:36:28 +00:00
Readline 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 3 of the License, or
2002-07-17 14:10:11 +00:00
(at your option) any later version.
2009-01-12 13:36:28 +00:00
Readline 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
2002-07-17 14:10:11 +00:00
GNU General Public License for more details.
2009-01-12 13:36:28 +00:00
You should have received a copy of the GNU General Public License
along with Readline. If not, see <http://www.gnu.org/licenses/>.
*/
2002-07-17 14:10:11 +00:00
2001-04-06 19:14:31 +00:00
#include <stdio.h>
#ifdef READLINE_LIBRARY
# include "history.h"
#else
# include <readline/history.h>
#endif
2005-12-07 14:08:12 +00:00
#include <string.h>
2001-04-06 19:14:31 +00:00
main (argc, argv)
int argc;
char **argv;
1996-08-26 18:22:31 +00:00
{
char line[1024], *t;
2004-07-27 13:29:18 +00:00
int len, done;
1996-08-26 18:22:31 +00:00
line[0] = 0;
2004-07-27 13:29:18 +00:00
done = 0;
1996-08-26 18:22:31 +00:00
using_history ();
while (!done)
{
printf ("history$ ");
fflush (stdout);
t = fgets (line, sizeof (line) - 1, stdin);
if (t && *t)
2004-07-27 13:29:18 +00:00
{
len = strlen (t);
if (t[len - 1] == '\n')
t[len - 1] = '\0';
}
1996-08-26 18:22:31 +00:00
if (!t)
2004-07-27 13:29:18 +00:00
strcpy (line, "quit");
1996-08-26 18:22:31 +00:00
if (line[0])
2004-07-27 13:29:18 +00:00
{
char *expansion;
int result;
1996-08-26 18:22:31 +00:00
2004-07-27 13:29:18 +00:00
using_history ();
1996-08-26 18:22:31 +00:00
2004-07-27 13:29:18 +00:00
result = history_expand (line, &expansion);
if (result)
fprintf (stderr, "%s\n", expansion);
1996-08-26 18:22:31 +00:00
2004-07-27 13:29:18 +00:00
if (result < 0 || result == 2)
{
free (expansion);
continue;
}
1996-08-26 18:22:31 +00:00
2004-07-27 13:29:18 +00:00
add_history (expansion);
strncpy (line, expansion, sizeof (line) - 1);
free (expansion);
}
1996-08-26 18:22:31 +00:00
if (strcmp (line, "quit") == 0)
2004-07-27 13:29:18 +00:00
done = 1;
1996-08-26 18:22:31 +00:00
else if (strcmp (line, "save") == 0)
2004-07-27 13:29:18 +00:00
write_history ("history_file");
1996-08-26 18:22:31 +00:00
else if (strcmp (line, "read") == 0)
2004-07-27 13:29:18 +00:00
read_history ("history_file");
1996-08-26 18:22:31 +00:00
else if (strcmp (line, "list") == 0)
2004-07-27 13:29:18 +00:00
{
register HIST_ENTRY **the_list;
register int i;
time_t tt;
char timestr[128];
the_list = history_list ();
if (the_list)
for (i = 0; the_list[i]; i++)
{
tt = history_get_time (the_list[i]);
if (tt)
strftime (timestr, sizeof (timestr), "%a %R", localtime(&tt));
else
strcpy (timestr, "??");
printf ("%d: %s: %s\n", i + history_base, timestr, the_list[i]->line);
}
}
1996-08-26 18:22:31 +00:00
else if (strncmp (line, "delete", 6) == 0)
2004-07-27 13:29:18 +00:00
{
int which;
if ((sscanf (line + 6, "%d", &which)) == 1)
{
HIST_ENTRY *entry = remove_history (which);
if (!entry)
fprintf (stderr, "No such entry %d\n", which);
else
{
free (entry->line);
free (entry);
}
}
else
{
fprintf (stderr, "non-numeric arg given to `delete'\n");
}
}
1996-08-26 18:22:31 +00:00
}
}