112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*	$NetBSD: history.c,v 1.46 2011/11/18 20:39:18 christos Exp $	*/
212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*-
412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Copyright (c) 1992, 1993
512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	The Regents of the University of California.  All rights reserved.
612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *
712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * This code is derived from software contributed to Berkeley by
812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Christos Zoulas of Cornell University.
912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *
1012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Redistribution and use in source and binary forms, with or without
1112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * modification, are permitted provided that the following conditions
1212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * are met:
1312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * 1. Redistributions of source code must retain the above copyright
1412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *    notice, this list of conditions and the following disclaimer.
1512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * 2. Redistributions in binary form must reproduce the above copyright
1612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *    notice, this list of conditions and the following disclaimer in the
1712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *    documentation and/or other materials provided with the distribution.
1812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * 3. Neither the name of the University nor the names of its contributors
1912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *    may be used to endorse or promote products derived from this software
2012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *    without specific prior written permission.
2112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *
2212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * SUCH DAMAGE.
3312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
3412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
3512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#ifndef NARROWCHAR
3612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include "config.h"
3712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif
3812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
3912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#if !defined(lint) && !defined(SCCSID)
4012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#if 0
4112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic char sccsid[] = "@(#)history.c	8.1 (Berkeley) 6/4/93";
4212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#else
4312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala__RCSID("$NetBSD: history.c,v 1.46 2011/11/18 20:39:18 christos Exp $");
4412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif
4512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif /* not lint && not SCCSID */
4612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
4712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
4812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * hist.c: TYPE(History) access functions
4912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
5012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <string.h>
5112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <stdlib.h>
5212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <stdarg.h>
5312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <vis.h>
5412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include <sys/stat.h>
5512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
5612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic const char hist_cookie[] = "_HiStOrY_V2_\n";
5712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
5812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include "histedit.h"
5912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#include "chartype.h"
6012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
6112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialatypedef int (*history_gfun_t)(void *, TYPE(HistEvent) *);
6212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialatypedef int (*history_efun_t)(void *, TYPE(HistEvent) *, const Char *);
6312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialatypedef void (*history_vfun_t)(void *, TYPE(HistEvent) *);
6412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialatypedef int (*history_sfun_t)(void *, TYPE(HistEvent) *, const int);
6512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
6612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastruct TYPE(history) {
6712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	void *h_ref;		/* Argument for history fcns	 */
6812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int h_ent;		/* Last entry point for history	 */
6912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_gfun_t h_first;	/* Get the first element	 */
7012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_gfun_t h_next;	/* Get the next element		 */
7112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_gfun_t h_last;	/* Get the last element		 */
7212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_gfun_t h_prev;	/* Get the previous element	 */
7312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_gfun_t h_curr;	/* Get the current element	 */
7412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_sfun_t h_set;	/* Set the current element	 */
7512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_sfun_t h_del;	/* Set the given element	 */
7612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_vfun_t h_clear;	/* Clear the history list	 */
7712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_efun_t h_enter;	/* Add an element		 */
7812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_efun_t h_add;	/* Append to an element		 */
7912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala};
8012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
8112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	HNEXT(h, ev)		(*(h)->h_next)((h)->h_ref, ev)
8212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	HFIRST(h, ev)		(*(h)->h_first)((h)->h_ref, ev)
8312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	HPREV(h, ev)		(*(h)->h_prev)((h)->h_ref, ev)
8412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	HLAST(h, ev)		(*(h)->h_last)((h)->h_ref, ev)
8512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	HCURR(h, ev)		(*(h)->h_curr)((h)->h_ref, ev)
8612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	HSET(h, ev, n)		(*(h)->h_set)((h)->h_ref, ev, n)
8712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	HCLEAR(h, ev)		(*(h)->h_clear)((h)->h_ref, ev)
8812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	HENTER(h, ev, str)	(*(h)->h_enter)((h)->h_ref, ev, str)
8912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	HADD(h, ev, str)	(*(h)->h_add)((h)->h_ref, ev, str)
9012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	HDEL(h, ev, n)		(*(h)->h_del)((h)->h_ref, ev, n)
9112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
9212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	h_strdup(a)	Strdup(a)
9312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	h_malloc(a)	malloc(a)
9412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	h_realloc(a, b)	realloc((a), (b))
9512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	h_free(a)	free(a)
9612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
9712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialatypedef struct {
9812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    int		num;
9912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    Char	*str;
10012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala} HistEventPrivate;
10112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
10212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
10312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
10412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_setsize(TYPE(History) *, TYPE(HistEvent) *, int);
10512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_getsize(TYPE(History) *, TYPE(HistEvent) *);
10612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_setunique(TYPE(History) *, TYPE(HistEvent) *, int);
10712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_getunique(TYPE(History) *, TYPE(HistEvent) *);
10812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_set_fun(TYPE(History) *, TYPE(History) *);
10912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_load(TYPE(History) *, const char *);
11012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_save(TYPE(History) *, const char *);
11112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_prev_event(TYPE(History) *, TYPE(HistEvent) *, int);
11212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_next_event(TYPE(History) *, TYPE(HistEvent) *, int);
11312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_next_string(TYPE(History) *, TYPE(HistEvent) *, const Char *);
11412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_prev_string(TYPE(History) *, TYPE(HistEvent) *, const Char *);
11512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
11612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
11712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/***********************************************************************/
11812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
11912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/*
12012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala * Builtin- history implementation
12112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
12212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialatypedef struct hentry_t {
12312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	TYPE(HistEvent) ev;		/* What we return		 */
12412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	void *data;		/* data				 */
12512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	struct hentry_t *next;	/* Next entry			 */
12612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	struct hentry_t *prev;	/* Previous entry		 */
12712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala} hentry_t;
12812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
12912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialatypedef struct history_t {
13012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	hentry_t list;		/* Fake list header element	*/
13112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	hentry_t *cursor;	/* Current element in the list	*/
13212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int max;		/* Maximum number of events	*/
13312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int cur;		/* Current number of events	*/
13412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int eventid;		/* For generation of unique event id	 */
13512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int flags;		/* TYPE(History) flags		*/
13612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define H_UNIQUE	1	/* Store only unique elements	*/
13712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala} history_t;
13812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
13912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_def_next(void *, TYPE(HistEvent) *);
14012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_def_first(void *, TYPE(HistEvent) *);
14112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_def_prev(void *, TYPE(HistEvent) *);
14212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_def_last(void *, TYPE(HistEvent) *);
14312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_def_curr(void *, TYPE(HistEvent) *);
14412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_def_set(void *, TYPE(HistEvent) *, const int);
14512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate void history_def_clear(void *, TYPE(HistEvent) *);
14612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_def_enter(void *, TYPE(HistEvent) *, const Char *);
14712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_def_add(void *, TYPE(HistEvent) *, const Char *);
14812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_def_del(void *, TYPE(HistEvent) *, const int);
14912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
15012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_def_init(void **, TYPE(HistEvent) *, int);
15112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_def_insert(history_t *, TYPE(HistEvent) *, const Char *);
15212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate void history_def_delete(history_t *, TYPE(HistEvent) *, hentry_t *);
15312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
15412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_deldata_nth(history_t *, TYPE(HistEvent) *, int, void **);
15512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int history_set_nth(void *, TYPE(HistEvent) *, int);
15612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
15712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	history_def_setsize(p, num)(void) (((history_t *)p)->max = (num))
15812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	history_def_getsize(p)  (((history_t *)p)->cur)
15912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	history_def_getunique(p) (((((history_t *)p)->flags) & H_UNIQUE) != 0)
16012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	history_def_setunique(p, uni) \
16112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    if (uni) \
16212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(((history_t *)p)->flags) |= H_UNIQUE; \
16312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    else \
16412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(((history_t *)p)->flags) &= ~H_UNIQUE
16512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
16612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	he_strerror(code)	he_errlist[code]
16712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	he_seterrev(evp, code)	{\
16812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				    evp->num = code;\
16912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				    evp->str = he_strerror(code);\
17012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				}
17112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
17212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* error messages */
17312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialastatic const Char *const he_errlist[] = {
17412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	STR("OK"),
17512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	STR("unknown error"),
17612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	STR("malloc() failed"),
17712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	STR("first event not found"),
17812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	STR("last event not found"),
17912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	STR("empty list"),
18012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	STR("no next event"),
18112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	STR("no previous event"),
18212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	STR("current event is invalid"),
18312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	STR("event not found"),
18412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	STR("can't read history from file"),
18512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	STR("can't write history"),
18612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	STR("required parameter(s) not supplied"),
18712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	STR("history size negative"),
18812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	STR("function not allowed with other history-functions-set the default"),
18912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	STR("bad parameters")
19012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala};
19112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* error codes */
19212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	_HE_OK                   0
19312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	_HE_UNKNOWN		 1
19412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	_HE_MALLOC_FAILED        2
19512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	_HE_FIRST_NOTFOUND       3
19612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	_HE_LAST_NOTFOUND        4
19712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	_HE_EMPTY_LIST           5
19812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	_HE_END_REACHED          6
19912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	_HE_START_REACHED	 7
20012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	_HE_CURR_INVALID	 8
20112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	_HE_NOT_FOUND		 9
20212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	_HE_HIST_READ		10
20312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	_HE_HIST_WRITE		11
20412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	_HE_PARAM_MISSING	12
20512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	_HE_SIZE_NEGATIVE	13
20612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	_HE_NOT_ALLOWED		14
20712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#define	_HE_BAD_PARAM		15
20812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
20912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_def_first():
21012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Default function to return the first event in the history.
21112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
21212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
21312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_def_first(void *p, TYPE(HistEvent) *ev)
21412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
21512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_t *h = (history_t *) p;
21612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
21712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->cursor = h->list.next;
21812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h->cursor != &h->list)
21912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*ev = h->cursor->ev;
22012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	else {
22112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		he_seterrev(ev, _HE_FIRST_NOTFOUND);
22212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
22312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
22412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
22512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
22612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
22712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
22812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
22912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_def_last():
23012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Default function to return the last event in the history.
23112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
23212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
23312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_def_last(void *p, TYPE(HistEvent) *ev)
23412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
23512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_t *h = (history_t *) p;
23612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
23712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->cursor = h->list.prev;
23812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h->cursor != &h->list)
23912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*ev = h->cursor->ev;
24012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	else {
24112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		he_seterrev(ev, _HE_LAST_NOTFOUND);
24212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
24312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
24412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
24512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
24612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
24712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
24812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
24912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_def_next():
25012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Default function to return the next event in the history.
25112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
25212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
25312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_def_next(void *p, TYPE(HistEvent) *ev)
25412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
25512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_t *h = (history_t *) p;
25612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
25712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h->cursor == &h->list) {
25812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		he_seterrev(ev, _HE_EMPTY_LIST);
25912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
26012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
26112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
26212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h->cursor->next == &h->list) {
26312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		he_seterrev(ev, _HE_END_REACHED);
26412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
26512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
26612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
26712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala        h->cursor = h->cursor->next;
26812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala        *ev = h->cursor->ev;
26912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
27012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
27112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
27212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
27312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
27412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_def_prev():
27512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Default function to return the previous event in the history.
27612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
27712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
27812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_def_prev(void *p, TYPE(HistEvent) *ev)
27912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
28012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_t *h = (history_t *) p;
28112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
28212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h->cursor == &h->list) {
28312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		he_seterrev(ev,
28412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		    (h->cur > 0) ? _HE_END_REACHED : _HE_EMPTY_LIST);
28512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
28612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
28712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
28812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h->cursor->prev == &h->list) {
28912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		he_seterrev(ev, _HE_START_REACHED);
29012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
29112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
29212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
29312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala        h->cursor = h->cursor->prev;
29412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala        *ev = h->cursor->ev;
29512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
29612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
29712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
29812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
29912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
30012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_def_curr():
30112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Default function to return the current event in the history.
30212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
30312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
30412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_def_curr(void *p, TYPE(HistEvent) *ev)
30512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
30612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_t *h = (history_t *) p;
30712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
30812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h->cursor != &h->list)
30912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*ev = h->cursor->ev;
31012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	else {
31112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		he_seterrev(ev,
31212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		    (h->cur > 0) ? _HE_CURR_INVALID : _HE_EMPTY_LIST);
31312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
31412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
31512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
31612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
31712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
31812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
31912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
32012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_def_set():
32112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Default function to set the current event in the history to the
32212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	given one.
32312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
32412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
32512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_def_set(void *p, TYPE(HistEvent) *ev, const int n)
32612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
32712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_t *h = (history_t *) p;
32812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
32912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h->cur == 0) {
33012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		he_seterrev(ev, _HE_EMPTY_LIST);
33112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
33212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
33312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h->cursor == &h->list || h->cursor->ev.num != n) {
33412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		for (h->cursor = h->list.next; h->cursor != &h->list;
33512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		    h->cursor = h->cursor->next)
33612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (h->cursor->ev.num == n)
33712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				break;
33812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
33912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h->cursor == &h->list) {
34012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		he_seterrev(ev, _HE_NOT_FOUND);
34112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
34212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
34312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
34412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
34512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
34612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
34712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_set_nth():
34812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Default function to set the current event in the history to the
34912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	n-th one.
35012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
35112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
35212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_set_nth(void *p, TYPE(HistEvent) *ev, int n)
35312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
35412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_t *h = (history_t *) p;
35512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
35612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h->cur == 0) {
35712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		he_seterrev(ev, _HE_EMPTY_LIST);
35812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
35912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
36012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (h->cursor = h->list.prev; h->cursor != &h->list;
36112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    h->cursor = h->cursor->prev)
36212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (n-- <= 0)
36312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			break;
36412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h->cursor == &h->list) {
36512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		he_seterrev(ev, _HE_NOT_FOUND);
36612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
36712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
36812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
36912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
37012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
37112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
37212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_def_add():
37312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Append string to element
37412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
37512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
37612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_def_add(void *p, TYPE(HistEvent) *ev, const Char *str)
37712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
37812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_t *h = (history_t *) p;
37912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	size_t len;
38012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	Char *s;
38112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEventPrivate *evp = (void *)&h->cursor->ev;
38212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
38312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h->cursor == &h->list)
38412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return history_def_enter(p, ev, str);
38512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	len = Strlen(evp->str) + Strlen(str) + 1;
38612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	s = h_malloc(len * sizeof(*s));
38712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (s == NULL) {
38812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		he_seterrev(ev, _HE_MALLOC_FAILED);
38912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
39012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
39112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void) Strncpy(s, h->cursor->ev.str, len);
39212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala        s[len - 1] = '\0';
39312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void) Strncat(s, str, len - Strlen(s) - 1);
39412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h_free(evp->str);
39512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	evp->str = s;
39612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	*ev = h->cursor->ev;
39712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
39812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
39912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
40012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
40112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
40212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_deldata_nth(history_t *h, TYPE(HistEvent) *ev,
40312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    int num, void **data)
40412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
40512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history_set_nth(h, ev, num) != 0)
40612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
40712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/* magic value to skip delete (just set to n-th history) */
40812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (data == (void **)-1)
40912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return 0;
41012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	ev->str = Strdup(h->cursor->ev.str);
41112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	ev->num = h->cursor->ev.num;
41212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (data)
41312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		*data = h->cursor->data;
41412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_def_delete(h, ev, h->cursor);
41512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
41612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
41712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
41812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
41912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_def_del():
42012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Delete element hp of the h list
42112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
42212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* ARGSUSED */
42312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
42412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_def_del(void *p, TYPE(HistEvent) *ev __attribute__((__unused__)),
42512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala    const int num)
42612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
42712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_t *h = (history_t *) p;
42812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history_def_set(h, ev, num) != 0)
42912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
43012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	ev->str = Strdup(h->cursor->ev.str);
43112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	ev->num = h->cursor->ev.num;
43212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_def_delete(h, ev, h->cursor);
43312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
43412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
43512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
43612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
43712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_def_delete():
43812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Delete element hp of the h list
43912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
44012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* ARGSUSED */
44112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate void
44212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_def_delete(history_t *h,
44312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		   TYPE(HistEvent) *ev __attribute__((__unused__)), hentry_t *hp)
44412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
44512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	HistEventPrivate *evp = (void *)&hp->ev;
44612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (hp == &h->list)
44712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		abort();
44812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h->cursor == hp) {
44912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		h->cursor = hp->prev;
45012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (h->cursor == &h->list)
45112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			h->cursor = hp->next;
45212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
45312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	hp->prev->next = hp->next;
45412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	hp->next->prev = hp->prev;
45512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h_free(evp->str);
45612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h_free(hp);
45712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->cur--;
45812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
45912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
46012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
46112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_def_insert():
46212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Insert element with string str in the h list
46312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
46412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
46512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_def_insert(history_t *h, TYPE(HistEvent) *ev, const Char *str)
46612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
46712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	hentry_t *c;
46812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
46912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	c = h_malloc(sizeof(*c));
47012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (c == NULL)
47112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto oomem;
47212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if ((c->ev.str = h_strdup(str)) == NULL) {
47312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		h_free(c);
47412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto oomem;
47512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
47612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	c->data = NULL;
47712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	c->ev.num = ++h->eventid;
47812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	c->next = h->list.next;
47912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	c->prev = &h->list;
48012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->list.next->prev = c;
48112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->list.next = c;
48212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->cur++;
48312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->cursor = c;
48412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
48512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	*ev = c->ev;
48612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
48712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaoomem:
48812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	he_seterrev(ev, _HE_MALLOC_FAILED);
48912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return -1;
49012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
49112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
49212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
49312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_def_enter():
49412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Default function to enter an item in the history
49512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
49612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
49712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_def_enter(void *p, TYPE(HistEvent) *ev, const Char *str)
49812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
49912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_t *h = (history_t *) p;
50012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
50112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if ((h->flags & H_UNIQUE) != 0 && h->list.next != &h->list &&
50212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    Strcmp(h->list.next->ev.str, str) == 0)
50312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    return 0;
50412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
50512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history_def_insert(h, ev, str) == -1)
50612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;	/* error, keep error message */
50712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
50812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	/*
50912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala         * Always keep at least one entry.
51012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala         * This way we don't have to check for the empty list.
51112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala         */
51212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	while (h->cur > h->max && h->cur > 0)
51312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		history_def_delete(h, ev, h->list.prev);
51412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
51512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 1;
51612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
51712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
51812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
51912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_def_init():
52012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Default history initialization function
52112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
52212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* ARGSUSED */
52312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
52412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_def_init(void **p, TYPE(HistEvent) *ev __attribute__((__unused__)), int n)
52512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
52612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_t *h = (history_t *) h_malloc(sizeof(*h));
52712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h == NULL)
52812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
52912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
53012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (n <= 0)
53112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		n = 0;
53212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->eventid = 0;
53312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->cur = 0;
53412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->max = n;
53512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->list.next = h->list.prev = &h->list;
53612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->list.ev.str = NULL;
53712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->list.ev.num = 0;
53812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->cursor = &h->list;
53912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->flags = 0;
54012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	*p = h;
54112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
54212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
54312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
54412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
54512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_def_clear():
54612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Default history cleanup function
54712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
54812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate void
54912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_def_clear(void *p, TYPE(HistEvent) *ev)
55012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
55112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_t *h = (history_t *) p;
55212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
55312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	while (h->list.prev != &h->list)
55412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		history_def_delete(h, ev, h->list.prev);
55512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->cursor = &h->list;
55612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->eventid = 0;
55712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->cur = 0;
55812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
55912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
56012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
56112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
56212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
56312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/************************************************************************/
56412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
56512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_init():
56612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Initialization function.
56712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
56812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialapublic TYPE(History) *
56912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaFUN(history,init)(void)
57012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
57112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	TYPE(HistEvent) ev;
57212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	TYPE(History) *h = (TYPE(History) *) h_malloc(sizeof(*h));
57312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h == NULL)
57412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
57512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
57612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (history_def_init(&h->h_ref, &ev, 0) == -1) {
57712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		h_free(h);
57812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return NULL;
57912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
58012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_ent = -1;
58112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_next = history_def_next;
58212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_first = history_def_first;
58312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_last = history_def_last;
58412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_prev = history_def_prev;
58512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_curr = history_def_curr;
58612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_set = history_def_set;
58712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_clear = history_def_clear;
58812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_enter = history_def_enter;
58912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_add = history_def_add;
59012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_del = history_def_del;
59112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
59212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return h;
59312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
59412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
59512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
59612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_end():
59712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	clean up history;
59812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
59912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialapublic void
60012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaFUN(history,end)(TYPE(History) *h)
60112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
60212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	TYPE(HistEvent) ev;
60312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
60412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h->h_next == history_def_next)
60512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		history_def_clear(h->h_ref, &ev);
60612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h_free(h->h_ref);
60712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h_free(h);
60812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
60912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
61012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
61112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
61212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_setsize():
61312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Set history number of events
61412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
61512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
61612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_setsize(TYPE(History) *h, TYPE(HistEvent) *ev, int num)
61712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
61812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
61912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h->h_next != history_def_next) {
62012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		he_seterrev(ev, _HE_NOT_ALLOWED);
62112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
62212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
62312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (num < 0) {
62412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		he_seterrev(ev, _HE_BAD_PARAM);
62512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
62612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
62712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_def_setsize(h->h_ref, num);
62812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
62912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
63012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
63112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
63212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_getsize():
63312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *      Get number of events currently in history
63412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
63512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
63612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_getsize(TYPE(History) *h, TYPE(HistEvent) *ev)
63712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
63812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h->h_next != history_def_next) {
63912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		he_seterrev(ev, _HE_NOT_ALLOWED);
64012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
64112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
64212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	ev->num = history_def_getsize(h->h_ref);
64312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (ev->num < -1) {
64412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		he_seterrev(ev, _HE_SIZE_NEGATIVE);
64512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
64612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
64712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
64812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
64912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
65012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
65112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_setunique():
65212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Set if adjacent equal events should not be entered in history.
65312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
65412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
65512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_setunique(TYPE(History) *h, TYPE(HistEvent) *ev, int uni)
65612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
65712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
65812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h->h_next != history_def_next) {
65912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		he_seterrev(ev, _HE_NOT_ALLOWED);
66012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
66112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
66212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	history_def_setunique(h->h_ref, uni);
66312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
66412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
66512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
66612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
66712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_getunique():
66812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Get if adjacent equal events should not be entered in history.
66912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
67012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
67112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_getunique(TYPE(History) *h, TYPE(HistEvent) *ev)
67212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
67312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h->h_next != history_def_next) {
67412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		he_seterrev(ev, _HE_NOT_ALLOWED);
67512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
67612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
67712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	ev->num = history_def_getunique(h->h_ref);
67812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
67912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
68012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
68112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
68212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_set_fun():
68312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Set history functions
68412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
68512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
68612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_set_fun(TYPE(History) *h, TYPE(History) *nh)
68712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
68812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	TYPE(HistEvent) ev;
68912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
69012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (nh->h_first == NULL || nh->h_next == NULL || nh->h_last == NULL ||
69112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    nh->h_prev == NULL || nh->h_curr == NULL || nh->h_set == NULL ||
69212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    nh->h_enter == NULL || nh->h_add == NULL || nh->h_clear == NULL ||
69312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    nh->h_del == NULL || nh->h_ref == NULL) {
69412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (h->h_next != history_def_next) {
69512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (history_def_init(&h->h_ref, &ev, 0) == -1)
69612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				return -1;
69712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			h->h_first = history_def_first;
69812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			h->h_next = history_def_next;
69912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			h->h_last = history_def_last;
70012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			h->h_prev = history_def_prev;
70112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			h->h_curr = history_def_curr;
70212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			h->h_set = history_def_set;
70312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			h->h_clear = history_def_clear;
70412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			h->h_enter = history_def_enter;
70512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			h->h_add = history_def_add;
70612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			h->h_del = history_def_del;
70712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
70812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
70912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
71012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (h->h_next == history_def_next)
71112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		history_def_clear(h->h_ref, &ev);
71212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
71312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_ent = -1;
71412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_first = nh->h_first;
71512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_next = nh->h_next;
71612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_last = nh->h_last;
71712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_prev = nh->h_prev;
71812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_curr = nh->h_curr;
71912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_set = nh->h_set;
72012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_clear = nh->h_clear;
72112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_enter = nh->h_enter;
72212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_add = nh->h_add;
72312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h->h_del = nh->h_del;
72412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
72512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return 0;
72612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
72712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
72812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
72912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_load():
73012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	TYPE(History) load function
73112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
73212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
73312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_load(TYPE(History) *h, const char *fname)
73412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
73512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	FILE *fp;
73612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char *line;
73712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	size_t sz, max_size;
73812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char *ptr;
73912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int i = -1;
74012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	TYPE(HistEvent) ev;
74112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#ifdef WIDECHAR
74212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	static ct_buffer_t conv;
74312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif
74412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
74512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if ((fp = fopen(fname, "r")) == NULL)
74612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return i;
74712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
74812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if ((line = fgetln(fp, &sz)) == NULL)
74912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto done;
75012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
75112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (strncmp(line, hist_cookie, sz) != 0)
75212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto done;
75312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
75412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	ptr = h_malloc((max_size = 1024) * sizeof(*ptr));
75512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (ptr == NULL)
75612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto done;
75712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (i = 0; (line = fgetln(fp, &sz)) != NULL; i++) {
75812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		char c = line[sz];
75912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
76012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (sz != 0 && line[sz - 1] == '\n')
76112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			line[--sz] = '\0';
76212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		else
76312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			line[sz] = '\0';
76412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
76512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (max_size < sz) {
76612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			char *nptr;
76712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			max_size = (sz + 1024) & (size_t)~1023;
76812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			nptr = h_realloc(ptr, max_size * sizeof(*ptr));
76912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (nptr == NULL) {
77012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				i = -1;
77112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				goto oomem;
77212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			}
77312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			ptr = nptr;
77412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
77512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		(void) strunvis(ptr, line);
77612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		line[sz] = c;
77712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (HENTER(h, &ev, ct_decode_string(ptr, &conv)) == -1) {
77812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			i = -1;
77912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			goto oomem;
78012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
78112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
78212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaoomem:
78312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h_free(ptr);
78412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialadone:
78512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void) fclose(fp);
78612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return i;
78712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
78812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
78912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
79012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_save():
79112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	TYPE(History) save function
79212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
79312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
79412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_save(TYPE(History) *h, const char *fname)
79512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
79612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	FILE *fp;
79712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	TYPE(HistEvent) ev;
79812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int i = -1, retval;
79912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	size_t len, max_size;
80012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	char *ptr;
80112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	const char *str;
80212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#ifdef WIDECHAR
80312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	static ct_buffer_t conv;
80412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala#endif
80512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
80612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if ((fp = fopen(fname, "w")) == NULL)
80712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		return -1;
80812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
80912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (fchmod(fileno(fp), S_IRUSR|S_IWUSR) == -1)
81012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto done;
81112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (fputs(hist_cookie, fp) == EOF)
81212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto done;
81312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	ptr = h_malloc((max_size = 1024) * sizeof(*ptr));
81412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	if (ptr == NULL)
81512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		goto done;
81612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (i = 0, retval = HLAST(h, &ev);
81712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    retval != -1;
81812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	    retval = HPREV(h, &ev), i++) {
81912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		str = ct_encode_string(ev.str, &conv);
82012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		len = strlen(str) * 4;
82112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (len >= max_size) {
82212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			char *nptr;
82312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			max_size = (len + 1024) & (size_t)~1023;
82412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			nptr = h_realloc(ptr, max_size * sizeof(*ptr));
82512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (nptr == NULL) {
82612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				i = -1;
82712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				goto oomem;
82812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			}
82912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			ptr = nptr;
83012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
83112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		(void) strvis(ptr, str, VIS_WHITE);
83212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		(void) fprintf(fp, "%s\n", ptr);
83312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
83412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaoomem:
83512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	h_free(ptr);
83612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialadone:
83712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	(void) fclose(fp);
83812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return i;
83912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
84012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
84112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
84212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_prev_event():
84312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Find the previous event, with number given
84412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
84512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
84612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_prev_event(TYPE(History) *h, TYPE(HistEvent) *ev, int num)
84712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
84812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int retval;
84912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
85012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (retval = HCURR(h, ev); retval != -1; retval = HPREV(h, ev))
85112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (ev->num == num)
85212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return 0;
85312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
85412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	he_seterrev(ev, _HE_NOT_FOUND);
85512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return -1;
85612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
85712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
85812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
85912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
86012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_next_evdata(TYPE(History) *h, TYPE(HistEvent) *ev, int num, void **d)
86112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
86212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int retval;
86312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
86412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (retval = HCURR(h, ev); retval != -1; retval = HPREV(h, ev))
86512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (ev->num == num) {
86612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			if (d)
86712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala				*d = ((history_t *)h->h_ref)->cursor->data;
86812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return 0;
86912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
87012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
87112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	he_seterrev(ev, _HE_NOT_FOUND);
87212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return -1;
87312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
87412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
87512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
87612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_next_event():
87712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Find the next event, with number given
87812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
87912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
88012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_next_event(TYPE(History) *h, TYPE(HistEvent) *ev, int num)
88112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
88212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int retval;
88312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
88412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (retval = HCURR(h, ev); retval != -1; retval = HNEXT(h, ev))
88512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (ev->num == num)
88612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return 0;
88712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
88812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	he_seterrev(ev, _HE_NOT_FOUND);
88912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return -1;
89012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
89112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
89212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
89312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_prev_string():
89412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Find the previous event beginning with string
89512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
89612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
89712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_prev_string(TYPE(History) *h, TYPE(HistEvent) *ev, const Char *str)
89812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
89912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	size_t len = Strlen(str);
90012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int retval;
90112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
90212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (retval = HCURR(h, ev); retval != -1; retval = HNEXT(h, ev))
90312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (Strncmp(str, ev->str, len) == 0)
90412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return 0;
90512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
90612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	he_seterrev(ev, _HE_NOT_FOUND);
90712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return -1;
90812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
90912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
91012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
91112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history_next_string():
91212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	Find the next event beginning with string
91312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
91412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaprivate int
91512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialahistory_next_string(TYPE(History) *h, TYPE(HistEvent) *ev, const Char *str)
91612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
91712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	size_t len = Strlen(str);
91812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int retval;
91912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
92012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	for (retval = HCURR(h, ev); retval != -1; retval = HPREV(h, ev))
92112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (Strncmp(str, ev->str, len) == 0)
92212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			return 0;
92312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
92412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	he_seterrev(ev, _HE_NOT_FOUND);
92512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return -1;
92612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
92712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
92812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
92912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala/* history():
93012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala *	User interface to history functions.
93112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala */
93212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fialaint
93312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd FialaFUNW(history)(TYPE(History) *h, TYPE(HistEvent) *ev, int fun, ...)
93412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala{
93512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	va_list va;
93612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	const Char *str;
93712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	int retval;
93812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
93912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	va_start(va, fun);
94012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
94112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	he_seterrev(ev, _HE_OK);
94212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
94312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	switch (fun) {
94412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_GETSIZE:
94512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = history_getsize(h, ev);
94612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
94712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
94812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_SETSIZE:
94912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = history_setsize(h, ev, va_arg(va, int));
95012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
95112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
95212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_GETUNIQUE:
95312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = history_getunique(h, ev);
95412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
95512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
95612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_SETUNIQUE:
95712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = history_setunique(h, ev, va_arg(va, int));
95812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
95912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
96012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_ADD:
96112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		str = va_arg(va, const Char *);
96212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = HADD(h, ev, str);
96312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
96412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
96512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_DEL:
96612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = HDEL(h, ev, va_arg(va, const int));
96712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
96812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
96912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_ENTER:
97012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		str = va_arg(va, const Char *);
97112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if ((retval = HENTER(h, ev, str)) != -1)
97212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			h->h_ent = ev->num;
97312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
97412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
97512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_APPEND:
97612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		str = va_arg(va, const Char *);
97712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if ((retval = HSET(h, ev, h->h_ent)) != -1)
97812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			retval = HADD(h, ev, str);
97912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
98012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
98112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_FIRST:
98212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = HFIRST(h, ev);
98312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
98412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
98512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_NEXT:
98612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = HNEXT(h, ev);
98712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
98812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
98912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_LAST:
99012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = HLAST(h, ev);
99112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
99212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
99312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_PREV:
99412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = HPREV(h, ev);
99512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
99612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
99712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_CURR:
99812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = HCURR(h, ev);
99912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
100012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
100112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_SET:
100212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = HSET(h, ev, va_arg(va, const int));
100312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
100412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
100512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_CLEAR:
100612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		HCLEAR(h, ev);
100712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = 0;
100812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
100912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
101012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_LOAD:
101112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = history_load(h, va_arg(va, const char *));
101212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (retval == -1)
101312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			he_seterrev(ev, _HE_HIST_READ);
101412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
101512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
101612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_SAVE:
101712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = history_save(h, va_arg(va, const char *));
101812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if (retval == -1)
101912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			he_seterrev(ev, _HE_HIST_WRITE);
102012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
102112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
102212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_PREV_EVENT:
102312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = history_prev_event(h, ev, va_arg(va, int));
102412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
102512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
102612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_NEXT_EVENT:
102712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = history_next_event(h, ev, va_arg(va, int));
102812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
102912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
103012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_PREV_STR:
103112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = history_prev_string(h, ev, va_arg(va, const Char *));
103212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
103312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
103412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_NEXT_STR:
103512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = history_next_string(h, ev, va_arg(va, const Char *));
103612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
103712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
103812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_FUNC:
103912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	{
104012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		TYPE(History) hf;
104112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
104212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		hf.h_ref = va_arg(va, void *);
104312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		h->h_ent = -1;
104412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		hf.h_first = va_arg(va, history_gfun_t);
104512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		hf.h_next = va_arg(va, history_gfun_t);
104612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		hf.h_last = va_arg(va, history_gfun_t);
104712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		hf.h_prev = va_arg(va, history_gfun_t);
104812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		hf.h_curr = va_arg(va, history_gfun_t);
104912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		hf.h_set = va_arg(va, history_sfun_t);
105012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		hf.h_clear = va_arg(va, history_vfun_t);
105112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		hf.h_enter = va_arg(va, history_efun_t);
105212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		hf.h_add = va_arg(va, history_efun_t);
105312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		hf.h_del = va_arg(va, history_sfun_t);
105412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
105512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if ((retval = history_set_fun(h, &hf)) == -1)
105612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			he_seterrev(ev, _HE_PARAM_MISSING);
105712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
105812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
105912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
106012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_END:
106112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		FUN(history,end)(h);
106212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = 0;
106312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
106412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
106512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_NEXT_EVDATA:
106612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	{
106712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		int num = va_arg(va, int);
106812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		void **d = va_arg(va, void **);
106912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = history_next_evdata(h, ev, num, d);
107012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
107112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
107212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
107312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_DELDATA:
107412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	{
107512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		int num = va_arg(va, int);
107612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		void **d = va_arg(va, void **);
107712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = history_deldata_nth((history_t *)h->h_ref, ev, num, d);
107812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
107912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
108012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
108112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	case H_REPLACE: /* only use after H_NEXT_EVDATA */
108212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	{
108312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		const Char *line = va_arg(va, const Char *);
108412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		void *d = va_arg(va, void *);
108512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		const Char *s;
108612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		if(!line || !(s = Strdup(line))) {
108712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			retval = -1;
108812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala			break;
108912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		}
109012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		((history_t *)h->h_ref)->cursor->ev.str = s;
109112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		((history_t *)h->h_ref)->cursor->data = d;
109212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = 0;
109312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
109412e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
109512e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala
109612e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	default:
109712e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		retval = -1;
109812e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		he_seterrev(ev, _HE_UNKNOWN);
109912e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala		break;
110012e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	}
110112e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	va_end(va);
110212e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala	return retval;
110312e21689bc88a77c7b5b9b220fec31e049e5ec0fTodd Fiala}
1104