- 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.
No binary (build failed)
—
(log yok)
| @@ -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 | |
| @@ -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 { | |
| @@ -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 */ | |
| @@ -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 | |