Add a history function that takes a FILE pointer; needed for Capsicum.

From Eitan Adler
This commit is contained in:
christos 2014-05-11 01:05:17 +00:00
parent 7e3e102eb9
commit 58ced3d761
4 changed files with 42 additions and 14 deletions

View File

@ -1,6 +1,6 @@
.\" $NetBSD: editline.3,v 1.80 2013/07/12 17:48:29 christos Exp $
.\" $NetBSD: editline.3,v 1.81 2014/05/11 01:05:17 christos Exp $
.\"
.\" Copyright (c) 1997-2013 The NetBSD Foundation, Inc.
.\" Copyright (c) 1997-2014 The NetBSD Foundation, Inc.
.\" All rights reserved.
.\"
.\" This file was contributed to The NetBSD Foundation by Luke Mewburn.
@ -26,7 +26,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
.Dd July 12, 2013
.Dd May 10, 2014
.Dt EDITLINE 3
.Os
.Sh NAME
@ -761,6 +761,11 @@ Load the history list stored in
.It Dv H_SAVE , Fa "const char *file"
Save the history list to
.Fa file .
.It Dv H_SAVE_FP , Fa "FILE *fp"
Save the history list to the opened
.Fa fp
.Ft FILE
pointer .
.It Dv H_SETUNIQUE , Fa "int unique"
Set flag that adjacent identical event strings should not be entered
into the history.

View File

@ -1,4 +1,4 @@
/* $NetBSD: hist.h,v 1.13 2011/07/28 20:50:55 christos Exp $ */
/* $NetBSD: hist.h,v 1.14 2014/05/11 01:05:17 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@ -73,6 +73,7 @@ typedef struct el_history_t {
#define HIST_SET(el, num) HIST_FUN(el, H_SET, num)
#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_FP(el, fp) HIST_FUN(el, H_SAVE_FP fp)
protected int hist_init(EditLine *);
protected void hist_end(EditLine *);

View File

@ -1,4 +1,4 @@
/* $NetBSD: histedit.h,v 1.51 2013/07/12 17:48:29 christos Exp $ */
/* $NetBSD: histedit.h,v 1.52 2014/05/11 01:05:17 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@ -224,6 +224,7 @@ int history(History *, HistEvent *, int, ...);
#define H_NEXT_EVDATA 23 /* , const int, histdata_t *); */
#define H_DELDATA 24 /* , int, histdata_t *);*/
#define H_REPLACE 25 /* , const char *, histdata_t); */
#define H_SAVE_FP 26 /* , FILE *); */

View File

@ -1,4 +1,4 @@
/* $NetBSD: history.c,v 1.46 2011/11/18 20:39:18 christos Exp $ */
/* $NetBSD: history.c,v 1.47 2014/05/11 01:05:17 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)history.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: history.c,v 1.46 2011/11/18 20:39:18 christos Exp $");
__RCSID("$NetBSD: history.c,v 1.47 2014/05/11 01:05:17 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
@ -105,6 +105,7 @@ private int history_getunique(TYPE(History) *, TYPE(HistEvent) *);
private int history_set_fun(TYPE(History) *, TYPE(History) *);
private int history_load(TYPE(History) *, const char *);
private int history_save(TYPE(History) *, const char *);
private int history_save_fp(TYPE(History) *, FILE *);
private int history_prev_event(TYPE(History) *, TYPE(HistEvent) *, int);
private int history_next_event(TYPE(History) *, TYPE(HistEvent) *, int);
private int history_next_string(TYPE(History) *, TYPE(HistEvent) *, const Char *);
@ -784,13 +785,12 @@ done:
}
/* history_save():
/* history_save_fp():
* TYPE(History) save function
*/
private int
history_save(TYPE(History) *h, const char *fname)
history_save_fp(TYPE(History) *h, FILE *fp)
{
FILE *fp;
TYPE(HistEvent) ev;
int i = -1, retval;
size_t len, max_size;
@ -800,9 +800,6 @@ history_save(TYPE(History) *h, const char *fname)
static ct_buffer_t conv;
#endif
if ((fp = fopen(fname, "w")) == NULL)
return -1;
if (fchmod(fileno(fp), S_IRUSR|S_IWUSR) == -1)
goto done;
if (fputs(hist_cookie, fp) == EOF)
@ -831,11 +828,29 @@ history_save(TYPE(History) *h, const char *fname)
oomem:
h_free(ptr);
done:
(void) fclose(fp);
return i;
}
/* history_save():
* History save function
*/
private int
history_save(TYPE(History) *h, const char *fname)
{
FILE *fp;
int i;
if ((fp = fopen(fname, "w")) == NULL)
return -1;
i = history_save_fp(h, fp);
(void) fclose(fp);
return i;
}
/* history_prev_event():
* Find the previous event, with number given
*/
@ -1016,6 +1031,12 @@ FUNW(history)(TYPE(History) *h, TYPE(HistEvent) *ev, int fun, ...)
he_seterrev(ev, _HE_HIST_WRITE);
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:
retval = history_prev_event(h, ev, va_arg(va, int));
break;