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