diff --git a/Makefile b/Makefile index 5d17057..a285410 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,5 @@ +linenoise_example: linenoise.h linenoise.c + linenoise_example: linenoise.c example.c $(CC) -Wall -W -Os -g -o linenoise_example linenoise.c example.c diff --git a/example.c b/example.c index 22e5188..b3f9e9e 100644 --- a/example.c +++ b/example.c @@ -5,10 +5,12 @@ int main(void) { char *line; + linenoiseHistoryLoad("history.txt"); /* Load the history at startup */ while((line = linenoise("hello> ")) != NULL) { if (line[0] != '\0') { printf("echo: '%s'\n", line); linenoiseHistoryAdd(line); + linenoiseHistorySave("history.txt"); /* Save every new entry */ } free(line); } diff --git a/linenoise.c b/linenoise.c index 6a1aa60..b7c6b73 100644 --- a/linenoise.c +++ b/linenoise.c @@ -431,3 +431,39 @@ int linenoiseHistorySetMaxLen(int len) { history_len = history_max_len; return 1; } + +/* Save the history in the specified file. On success 0 is returned + * otherwise -1 is returned. */ +int linenoiseHistorySave(char *filename) { + FILE *fp = fopen(filename,"w"); + int j; + + if (fp == NULL) return -1; + for (j = 0; j < history_len; j++) + fprintf(fp,"%s\n",history[j]); + fclose(fp); + return 0; +} + +/* Load the history from the specified file. If the file does not exist + * zero is returned and no operation is performed. + * + * If the file exists and the operation succeeded 0 is returned, otherwise + * on error -1 is returned. */ +int linenoiseHistoryLoad(char *filename) { + FILE *fp = fopen(filename,"r"); + char buf[LINENOISE_MAX_LINE]; + + if (fp == NULL) return -1; + + while (fgets(buf,LINENOISE_MAX_LINE,fp) != NULL) { + char *p; + + p = strchr(buf,'\r'); + if (!p) p = strchr(buf,'\n'); + if (p) *p = '\0'; + linenoiseHistoryAdd(buf); + } + fclose(fp); + return 0; +} diff --git a/linenoise.h b/linenoise.h index 57bf9d1..0d76aea 100644 --- a/linenoise.h +++ b/linenoise.h @@ -37,5 +37,7 @@ char *linenoise(const char *prompt); int linenoiseHistoryAdd(const char *line); int linenoiseHistorySetMaxLen(int len); +int linenoiseHistorySave(char *filename); +int linenoiseHistoryLoad(char *filename); #endif /* __LINENOISE_H */