From 350d26bbbb127284cefb877b8380049e65665b15 Mon Sep 17 00:00:00 2001 From: Robert Griebl Date: Tue, 3 Dec 2002 22:45:46 +0000 Subject: [PATCH] - 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. --- shell/ash.c | 9 ++++++++ shell/cmdedit.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++- shell/cmdedit.h | 3 +++ shell/config.in | 2 ++ 4 files changed, 69 insertions(+), 1 deletion(-) 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