libedit: add H_SAVE_FP which saves history to a file pointer.

H_SAVE_FP is similar to H_SAVE but operates on a FILE* instead of a filename.
This is useful when operating in capability mode.

Reviewed by:	christos@NetBSD.org, pfg
This commit is contained in:
Eitan Adler 2014-05-11 01:44:11 +00:00
parent bdf49e3953
commit 8be8ad916f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=265863
4 changed files with 35 additions and 9 deletions

View File

@ -682,6 +682,9 @@ Load the history list stored in
.It Dv H_SAVE , Fa "const char *file" .It Dv H_SAVE , Fa "const char *file"
Save the history list to Save the history list to
.Fa file . .Fa file .
.It Dv H_SAVE_FP , Fa "FILE*"
Save the history list to the opened
.Fa FILE* .
.It Dv H_SETUNIQUE , Fa "int unique" .It Dv H_SETUNIQUE , Fa "int unique"
Set flag that adjacent identical event strings should not be entered Set flag that adjacent identical event strings should not be entered
into the history. into the history.

View File

@ -65,6 +65,7 @@ typedef struct el_history_t {
#define HIST_SET(el, num) HIST_FUN(el, H_SET, num) #define HIST_SET(el, num) HIST_FUN(el, H_SET, num)
#define HIST_LOAD(el, fname) HIST_FUN(el, H_LOAD fname) #define HIST_LOAD(el, fname) HIST_FUN(el, H_LOAD fname)
#define HIST_SAVE(el, fname) HIST_FUN(el, H_SAVE fname) #define HIST_SAVE(el, fname) HIST_FUN(el, H_SAVE fname)
#define HIST_SAVE_FP(el, fp) HIST_FUN(el, H_SAVE_FP fp)
protected int hist_init(EditLine *); protected int hist_init(EditLine *);
protected void hist_end(EditLine *); protected void hist_end(EditLine *);

View File

@ -208,6 +208,7 @@ int history(History *, HistEvent *, int, ...);
#define H_NEXT_EVDATA 23 /* , const int, histdata_t *); */ #define H_NEXT_EVDATA 23 /* , const int, histdata_t *); */
#define H_DELDATA 24 /* , int, histdata_t *);*/ #define H_DELDATA 24 /* , int, histdata_t *);*/
#define H_REPLACE 25 /* , const char *, histdata_t); */ #define H_REPLACE 25 /* , const char *, histdata_t); */
#define H_SAVE_FP 26 /* , FILE*); */
/* /*

View File

@ -103,6 +103,7 @@ private int history_getunique(History *, HistEvent *);
private int history_set_fun(History *, History *); private int history_set_fun(History *, History *);
private int history_load(History *, const char *); private int history_load(History *, const char *);
private int history_save(History *, const char *); private int history_save(History *, const char *);
private int history_save_fp(History *, FILE*);
private int history_prev_event(History *, HistEvent *, int); private int history_prev_event(History *, HistEvent *, int);
private int history_next_event(History *, HistEvent *, int); private int history_next_event(History *, HistEvent *, int);
private int history_next_string(History *, HistEvent *, const char *); private int history_next_string(History *, HistEvent *, const char *);
@ -773,22 +774,16 @@ history_load(History *h, const char *fname)
return (i); return (i);
} }
/* history_save_fp():
/* history_save(): * History save with open FILE*
* History save function
*/ */
private int private int history_save_fp(History *h, FILE* fp)
history_save(History *h, const char *fname)
{ {
FILE *fp;
HistEvent ev; HistEvent ev;
int i = -1, retval; int i = -1, retval;
size_t len, max_size; size_t len, max_size;
char *ptr; char *ptr;
if ((fp = fopen(fname, "w")) == NULL)
return (-1);
if (fchmod(fileno(fp), S_IRUSR|S_IWUSR) == -1) if (fchmod(fileno(fp), S_IRUSR|S_IWUSR) == -1)
goto done; goto done;
if (fputs(hist_cookie, fp) == EOF) if (fputs(hist_cookie, fp) == EOF)
@ -815,6 +810,26 @@ history_save(History *h, const char *fname)
} }
oomem: oomem:
h_free((ptr_t)ptr); h_free((ptr_t)ptr);
done:
return (i);
}
/* history_save():
* History save function
*/
private int
history_save(History *h, const char *fname)
{
FILE *fp;
int i;
if ((fp = fopen(fname, "w")) == NULL)
return (-1);
i = history_save_fp(h, fp);
done: done:
(void) fclose(fp); (void) fclose(fp);
return (i); return (i);
@ -1001,6 +1016,12 @@ history(History *h, HistEvent *ev, int fun, ...)
he_seterrev(ev, _HE_HIST_WRITE); he_seterrev(ev, _HE_HIST_WRITE);
break; break;
case H_SAVE_FP:
retval = history_save_fp(h, va_arg(va, FILE*));
if (retval == -1)
he_seterrev(ev, _HE_HIST_WRITE);
break;
case H_PREV_EVENT: case H_PREV_EVENT:
retval = history_prev_event(h, ev, va_arg(va, int)); retval = history_prev_event(h, ev, va_arg(va, int));
break; break;