aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorRobert Griebl <griebl@gmx.de>2002-12-03 22:45:46 +0000
committerRobert Griebl <griebl@gmx.de>2002-12-03 22:45:46 +0000
commit350d26bbbb127284cefb877b8380049e65665b15 (patch)
tree82f389342d1b840a6daf6a9b0e9ada9eba108693 /shell
parent3ba7ceebfc8035fa618c99b27f6995a5bc6997ac (diff)
downloadbusybox-350d26bbbb127284cefb877b8380049e65665b15.tar.gz
- the number of commands in the history list is now configureable via the
config system - added a new config option to allow persistant history lists. This is currently only used by ash, but the calls ({load,save}_history) could be added to the other shells as well.
Diffstat (limited to 'shell')
-rw-r--r--shell/ash.c9
-rw-r--r--shell/cmdedit.c56
-rw-r--r--shell/cmdedit.h3
-rw-r--r--shell/config.in2
4 files changed, 69 insertions, 1 deletions
diff --git a/shell/ash.c b/shell/ash.c
index d20618d3c..bec37cfcc 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -7356,6 +7356,10 @@ int ash_main(int argc, char **argv)
if (sflag || minusc == NULL) {
state4: /* XXX ??? - why isn't this before the "if" statement */
+#ifdef CONFIG_FEATURE_COMMAND_SAVEHISTORY
+ if ( iflag )
+ load_history ( ".ash_history" );
+#endif
cmdloop(1);
}
#if PROFILE
@@ -7546,6 +7550,11 @@ static int exitcmd(int argc, char **argv)
{
if (stoppedjobs())
return 0;
+#ifdef CONFIG_FEATURE_COMMAND_SAVEHISTORY
+ if ( iflag )
+ save_history ( ".ash_history" );
+#endif
+
if (argc > 1)
exitstatus = number(argv[1]);
else
diff --git a/shell/cmdedit.c b/shell/cmdedit.c
index b6e743eb4..73378e659 100644
--- a/shell/cmdedit.c
+++ b/shell/cmdedit.c
@@ -90,7 +90,12 @@
/* Maximum length of the linked list for the command line history */
-#define MAX_HISTORY 15
+#ifndef CONFIG_FEATURE_COMMAND_HISTORY
+#define MAX_HISTORY 15
+#else
+#define MAX_HISTORY CONFIG_FEATURE_COMMAND_HISTORY
+#endif
+
#if MAX_HISTORY < 1
#warning cmdedit: You set MAX_HISTORY < 1. The history algorithm switched off.
#else
@@ -1125,6 +1130,55 @@ static int get_next_history(void)
return 0;
}
}
+
+
+extern void load_history ( char *fromfile )
+{
+#ifdef CONFIG_FEATURE_COMMAND_SAVEHISTORY
+ FILE *fp;
+
+ // cleanup old
+ while ( n_history ) {
+ if ( history [n_history - 1] )
+ free ( history [n_history - 1] );
+ n_history--;
+ }
+
+ if (( fp = fopen ( fromfile, "r" ))) {
+ char buffer [256];
+ int i, l;
+
+ for ( i = 0; i < MAX_HISTORY; i++ ) {
+ if ( !fgets ( buffer, sizeof( buffer ) - 1, fp ))
+ break;
+ l = xstrlen ( buffer );
+ if ( l && buffer [l - 1] == '\n' )
+ buffer [l - 1] = 0;
+ history [n_history++] = xstrdup ( buffer );
+ }
+ fclose ( fp );
+ }
+ cur_history = n_history;
+#endif
+}
+
+extern void save_history ( char *tofile )
+{
+#ifdef CONFIG_FEATURE_COMMAND_SAVEHISTORY
+ FILE *fp = fopen ( tofile, "w" );
+
+ if ( fp ) {
+ int i;
+
+ for ( i = 0; i < n_history; i++ ) {
+ fputs ( history [i], fp );
+ fputc ( '\n', fp );
+ }
+ fclose ( fp );
+ }
+#endif
+}
+
#endif
enum {
diff --git a/shell/cmdedit.h b/shell/cmdedit.h
index 83893572a..045588dc1 100644
--- a/shell/cmdedit.h
+++ b/shell/cmdedit.h
@@ -3,4 +3,7 @@
int cmdedit_read_input(char* promptStr, char* command);
+void load_history ( char *fromfile );
+void save_history ( char *tofile );
+
#endif /* CMDEDIT_H */
diff --git a/shell/config.in b/shell/config.in
index b34c23845..cb1365b9d 100644
--- a/shell/config.in
+++ b/shell/config.in
@@ -52,6 +52,8 @@ comment 'Bourne Shell Options'
bool 'command line editing' CONFIG_FEATURE_COMMAND_EDITING
bool 'tab completion' CONFIG_FEATURE_COMMAND_TAB_COMPLETION
bool 'username completion' CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION
+int 'history size' CONFIG_FEATURE_COMMAND_HISTORY 15
+bool 'history saving (currently only ash)' CONFIG_FEATURE_COMMAND_SAVEHISTORY
bool 'Standalone shell' CONFIG_FEATURE_SH_STANDALONE_SHELL
bool 'Standalone shell -- applets always win' CONFIG_FEATURE_SH_APPLETS_ALWAYS_WIN
bool 'Fancy shell prompts' CONFIG_FEATURE_SH_FANCY_PROMPT