1*baff8195SBaptiste Daroussin /* $NetBSD: histedit.h,v 1.62 2023/02/03 22:01:42 christos Exp $ */ 2d0ef721eSBaptiste Daroussin 3d0ef721eSBaptiste Daroussin /*- 4d0ef721eSBaptiste Daroussin * Copyright (c) 1992, 1993 5d0ef721eSBaptiste Daroussin * The Regents of the University of California. All rights reserved. 6d0ef721eSBaptiste Daroussin * 7d0ef721eSBaptiste Daroussin * This code is derived from software contributed to Berkeley by 8d0ef721eSBaptiste Daroussin * Christos Zoulas of Cornell University. 9d0ef721eSBaptiste Daroussin * 10d0ef721eSBaptiste Daroussin * Redistribution and use in source and binary forms, with or without 11d0ef721eSBaptiste Daroussin * modification, are permitted provided that the following conditions 12d0ef721eSBaptiste Daroussin * are met: 13d0ef721eSBaptiste Daroussin * 1. Redistributions of source code must retain the above copyright 14d0ef721eSBaptiste Daroussin * notice, this list of conditions and the following disclaimer. 15d0ef721eSBaptiste Daroussin * 2. Redistributions in binary form must reproduce the above copyright 16d0ef721eSBaptiste Daroussin * notice, this list of conditions and the following disclaimer in the 17d0ef721eSBaptiste Daroussin * documentation and/or other materials provided with the distribution. 18d0ef721eSBaptiste Daroussin * 3. Neither the name of the University nor the names of its contributors 19d0ef721eSBaptiste Daroussin * may be used to endorse or promote products derived from this software 20d0ef721eSBaptiste Daroussin * without specific prior written permission. 21d0ef721eSBaptiste Daroussin * 22d0ef721eSBaptiste Daroussin * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23d0ef721eSBaptiste Daroussin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24d0ef721eSBaptiste Daroussin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25d0ef721eSBaptiste Daroussin * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26d0ef721eSBaptiste Daroussin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27d0ef721eSBaptiste Daroussin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28d0ef721eSBaptiste Daroussin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29d0ef721eSBaptiste Daroussin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30d0ef721eSBaptiste Daroussin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31d0ef721eSBaptiste Daroussin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32d0ef721eSBaptiste Daroussin * SUCH DAMAGE. 33d0ef721eSBaptiste Daroussin * 34d0ef721eSBaptiste Daroussin * @(#)histedit.h 8.2 (Berkeley) 1/3/94 35d0ef721eSBaptiste Daroussin */ 36d0ef721eSBaptiste Daroussin 37d0ef721eSBaptiste Daroussin /* 38d0ef721eSBaptiste Daroussin * histedit.h: Line editor and history interface. 39d0ef721eSBaptiste Daroussin */ 40d0ef721eSBaptiste Daroussin #ifndef _HISTEDIT_H_ 41d0ef721eSBaptiste Daroussin #define _HISTEDIT_H_ 42d0ef721eSBaptiste Daroussin 43d0ef721eSBaptiste Daroussin #define LIBEDIT_MAJOR 2 44d0ef721eSBaptiste Daroussin #define LIBEDIT_MINOR 11 45d0ef721eSBaptiste Daroussin 46d0ef721eSBaptiste Daroussin #include <sys/types.h> 47d0ef721eSBaptiste Daroussin #include <stdio.h> 48d0ef721eSBaptiste Daroussin 49d0ef721eSBaptiste Daroussin #ifdef __cplusplus 50d0ef721eSBaptiste Daroussin extern "C" { 51d0ef721eSBaptiste Daroussin #endif 52d0ef721eSBaptiste Daroussin 53d0ef721eSBaptiste Daroussin /* 54d0ef721eSBaptiste Daroussin * ==== Editing ==== 55d0ef721eSBaptiste Daroussin */ 56d0ef721eSBaptiste Daroussin 57d0ef721eSBaptiste Daroussin typedef struct editline EditLine; 58d0ef721eSBaptiste Daroussin 59d0ef721eSBaptiste Daroussin /* 60d0ef721eSBaptiste Daroussin * For user-defined function interface 61d0ef721eSBaptiste Daroussin */ 62d0ef721eSBaptiste Daroussin typedef struct lineinfo { 63d0ef721eSBaptiste Daroussin const char *buffer; 64d0ef721eSBaptiste Daroussin const char *cursor; 65d0ef721eSBaptiste Daroussin const char *lastchar; 66d0ef721eSBaptiste Daroussin } LineInfo; 67d0ef721eSBaptiste Daroussin 68d0ef721eSBaptiste Daroussin /* 69d0ef721eSBaptiste Daroussin * EditLine editor function return codes. 70d0ef721eSBaptiste Daroussin * For user-defined function interface 71d0ef721eSBaptiste Daroussin */ 72d0ef721eSBaptiste Daroussin #define CC_NORM 0 73d0ef721eSBaptiste Daroussin #define CC_NEWLINE 1 74d0ef721eSBaptiste Daroussin #define CC_EOF 2 75d0ef721eSBaptiste Daroussin #define CC_ARGHACK 3 76d0ef721eSBaptiste Daroussin #define CC_REFRESH 4 77d0ef721eSBaptiste Daroussin #define CC_CURSOR 5 78d0ef721eSBaptiste Daroussin #define CC_ERROR 6 79d0ef721eSBaptiste Daroussin #define CC_FATAL 7 80d0ef721eSBaptiste Daroussin #define CC_REDISPLAY 8 81d0ef721eSBaptiste Daroussin #define CC_REFRESH_BEEP 9 82d0ef721eSBaptiste Daroussin 83d0ef721eSBaptiste Daroussin /* 84d0ef721eSBaptiste Daroussin * Initialization, cleanup, and resetting 85d0ef721eSBaptiste Daroussin */ 86d0ef721eSBaptiste Daroussin EditLine *el_init(const char *, FILE *, FILE *, FILE *); 87d0ef721eSBaptiste Daroussin EditLine *el_init_fd(const char *, FILE *, FILE *, FILE *, 88d0ef721eSBaptiste Daroussin int, int, int); 89d0ef721eSBaptiste Daroussin void el_end(EditLine *); 90d0ef721eSBaptiste Daroussin void el_reset(EditLine *); 91d0ef721eSBaptiste Daroussin 92d0ef721eSBaptiste Daroussin /* 93d0ef721eSBaptiste Daroussin * Get a line, a character or push a string back in the input queue 94d0ef721eSBaptiste Daroussin */ 95d0ef721eSBaptiste Daroussin const char *el_gets(EditLine *, int *); 96d0ef721eSBaptiste Daroussin int el_getc(EditLine *, char *); 97d0ef721eSBaptiste Daroussin void el_push(EditLine *, const char *); 98d0ef721eSBaptiste Daroussin 99d0ef721eSBaptiste Daroussin /* 100d0ef721eSBaptiste Daroussin * Beep! 101d0ef721eSBaptiste Daroussin */ 102d0ef721eSBaptiste Daroussin void el_beep(EditLine *); 103d0ef721eSBaptiste Daroussin 104d0ef721eSBaptiste Daroussin /* 105d0ef721eSBaptiste Daroussin * High level function internals control 106d0ef721eSBaptiste Daroussin * Parses argc, argv array and executes builtin editline commands 107d0ef721eSBaptiste Daroussin */ 108d0ef721eSBaptiste Daroussin int el_parse(EditLine *, int, const char **); 109d0ef721eSBaptiste Daroussin 110d0ef721eSBaptiste Daroussin /* 111d0ef721eSBaptiste Daroussin * Low level editline access functions 112d0ef721eSBaptiste Daroussin */ 113d0ef721eSBaptiste Daroussin int el_set(EditLine *, int, ...); 114d0ef721eSBaptiste Daroussin int el_get(EditLine *, int, ...); 115d0ef721eSBaptiste Daroussin unsigned char _el_fn_complete(EditLine *, int); 11696c81c97SBaptiste Daroussin unsigned char _el_fn_sh_complete(EditLine *, int); 117d0ef721eSBaptiste Daroussin 118d0ef721eSBaptiste Daroussin /* 119d0ef721eSBaptiste Daroussin * el_set/el_get parameters 120d0ef721eSBaptiste Daroussin * 121d0ef721eSBaptiste Daroussin * When using el_wset/el_wget (as opposed to el_set/el_get): 122d0ef721eSBaptiste Daroussin * Char is wchar_t, otherwise it is char. 123d0ef721eSBaptiste Daroussin * prompt_func is el_wpfunc_t, otherwise it is el_pfunc_t . 124d0ef721eSBaptiste Daroussin 125d0ef721eSBaptiste Daroussin * Prompt function prototypes are: 126d0ef721eSBaptiste Daroussin * typedef char *(*el_pfunct_t) (EditLine *); 127d0ef721eSBaptiste Daroussin * typedef wchar_t *(*el_wpfunct_t) (EditLine *); 128d0ef721eSBaptiste Daroussin * 129d0ef721eSBaptiste Daroussin * For operations that support set or set/get, the argument types listed are for 130d0ef721eSBaptiste Daroussin * the "set" operation. For "get", each listed type must be a pointer. 131d0ef721eSBaptiste Daroussin * E.g. EL_EDITMODE takes an int when set, but an int* when get. 132d0ef721eSBaptiste Daroussin * 133d0ef721eSBaptiste Daroussin * Operations that only support "get" have the correct argument types listed. 134d0ef721eSBaptiste Daroussin */ 135d0ef721eSBaptiste Daroussin #define EL_PROMPT 0 /* , prompt_func); set/get */ 136d0ef721eSBaptiste Daroussin #define EL_TERMINAL 1 /* , const char *); set/get */ 137d0ef721eSBaptiste Daroussin #define EL_EDITOR 2 /* , const Char *); set/get */ 138d0ef721eSBaptiste Daroussin #define EL_SIGNAL 3 /* , int); set/get */ 139d0ef721eSBaptiste Daroussin #define EL_BIND 4 /* , const Char *, ..., NULL); set */ 140d0ef721eSBaptiste Daroussin #define EL_TELLTC 5 /* , const Char *, ..., NULL); set */ 141d0ef721eSBaptiste Daroussin #define EL_SETTC 6 /* , const Char *, ..., NULL); set */ 142d0ef721eSBaptiste Daroussin #define EL_ECHOTC 7 /* , const Char *, ..., NULL); set */ 143d0ef721eSBaptiste Daroussin #define EL_SETTY 8 /* , const Char *, ..., NULL); set */ 144d0ef721eSBaptiste Daroussin #define EL_ADDFN 9 /* , const Char *, const Char, set */ 145d0ef721eSBaptiste Daroussin /* el_func_t); */ 146d0ef721eSBaptiste Daroussin #define EL_HIST 10 /* , hist_fun_t, const void *); set */ 147d0ef721eSBaptiste Daroussin #define EL_EDITMODE 11 /* , int); set/get */ 148d0ef721eSBaptiste Daroussin #define EL_RPROMPT 12 /* , prompt_func); set/get */ 149d0ef721eSBaptiste Daroussin #define EL_GETCFN 13 /* , el_rfunc_t); set/get */ 150d0ef721eSBaptiste Daroussin #define EL_CLIENTDATA 14 /* , void *); set/get */ 151d0ef721eSBaptiste Daroussin #define EL_UNBUFFERED 15 /* , int); set/get */ 152d0ef721eSBaptiste Daroussin #define EL_PREP_TERM 16 /* , int); set */ 153d0ef721eSBaptiste Daroussin #define EL_GETTC 17 /* , const Char *, ..., NULL); get */ 154d0ef721eSBaptiste Daroussin #define EL_GETFP 18 /* , int, FILE **); get */ 155d0ef721eSBaptiste Daroussin #define EL_SETFP 19 /* , int, FILE *); set */ 156d0ef721eSBaptiste Daroussin #define EL_REFRESH 20 /* , void); set */ 157d0ef721eSBaptiste Daroussin #define EL_PROMPT_ESC 21 /* , prompt_func, Char); set/get */ 158d0ef721eSBaptiste Daroussin #define EL_RPROMPT_ESC 22 /* , prompt_func, Char); set/get */ 159d0ef721eSBaptiste Daroussin #define EL_RESIZE 23 /* , el_zfunc_t, void *); set */ 160d0ef721eSBaptiste Daroussin #define EL_ALIAS_TEXT 24 /* , el_afunc_t, void *); set */ 16191f76417SBaptiste Daroussin #define EL_SAFEREAD 25 /* , int); set/get */ 162d0ef721eSBaptiste Daroussin 163d0ef721eSBaptiste Daroussin #define EL_BUILTIN_GETCFN (NULL) 164d0ef721eSBaptiste Daroussin 165d0ef721eSBaptiste Daroussin /* 166d0ef721eSBaptiste Daroussin * Source named file or $PWD/.editrc or $HOME/.editrc 167d0ef721eSBaptiste Daroussin */ 168d0ef721eSBaptiste Daroussin int el_source(EditLine *, const char *); 169d0ef721eSBaptiste Daroussin 170d0ef721eSBaptiste Daroussin /* 171d0ef721eSBaptiste Daroussin * Must be called when the terminal changes size; If EL_SIGNAL 172d0ef721eSBaptiste Daroussin * is set this is done automatically otherwise it is the responsibility 173d0ef721eSBaptiste Daroussin * of the application 174d0ef721eSBaptiste Daroussin */ 175d0ef721eSBaptiste Daroussin void el_resize(EditLine *); 176d0ef721eSBaptiste Daroussin 177d0ef721eSBaptiste Daroussin /* 178d0ef721eSBaptiste Daroussin * User-defined function interface. 179d0ef721eSBaptiste Daroussin */ 180d0ef721eSBaptiste Daroussin const LineInfo *el_line(EditLine *); 181d0ef721eSBaptiste Daroussin int el_insertstr(EditLine *, const char *); 182d0ef721eSBaptiste Daroussin void el_deletestr(EditLine *, int); 1837f399375SBaptiste Daroussin int el_replacestr(EditLine *, const char *); 1847f399375SBaptiste Daroussin int el_deletestr1(EditLine *, int, int); 185d0ef721eSBaptiste Daroussin 186d0ef721eSBaptiste Daroussin /* 187d0ef721eSBaptiste Daroussin * ==== History ==== 188d0ef721eSBaptiste Daroussin */ 189d0ef721eSBaptiste Daroussin 190d0ef721eSBaptiste Daroussin typedef struct history History; 191d0ef721eSBaptiste Daroussin 192d0ef721eSBaptiste Daroussin typedef struct HistEvent { 193d0ef721eSBaptiste Daroussin int num; 194d0ef721eSBaptiste Daroussin const char *str; 195d0ef721eSBaptiste Daroussin } HistEvent; 196d0ef721eSBaptiste Daroussin 197d0ef721eSBaptiste Daroussin /* 198d0ef721eSBaptiste Daroussin * History access functions. 199d0ef721eSBaptiste Daroussin */ 200d0ef721eSBaptiste Daroussin History * history_init(void); 201d0ef721eSBaptiste Daroussin void history_end(History *); 202d0ef721eSBaptiste Daroussin 203d0ef721eSBaptiste Daroussin int history(History *, HistEvent *, int, ...); 204d0ef721eSBaptiste Daroussin 205d0ef721eSBaptiste Daroussin #define H_FUNC 0 /* , UTSL */ 206d0ef721eSBaptiste Daroussin #define H_SETSIZE 1 /* , const int); */ 207d0ef721eSBaptiste Daroussin #define H_GETSIZE 2 /* , void); */ 208d0ef721eSBaptiste Daroussin #define H_FIRST 3 /* , void); */ 209d0ef721eSBaptiste Daroussin #define H_LAST 4 /* , void); */ 210d0ef721eSBaptiste Daroussin #define H_PREV 5 /* , void); */ 211d0ef721eSBaptiste Daroussin #define H_NEXT 6 /* , void); */ 212d0ef721eSBaptiste Daroussin #define H_CURR 8 /* , const int); */ 213d0ef721eSBaptiste Daroussin #define H_SET 7 /* , int); */ 214d0ef721eSBaptiste Daroussin #define H_ADD 9 /* , const wchar_t *); */ 215d0ef721eSBaptiste Daroussin #define H_ENTER 10 /* , const wchar_t *); */ 216d0ef721eSBaptiste Daroussin #define H_APPEND 11 /* , const wchar_t *); */ 217d0ef721eSBaptiste Daroussin #define H_END 12 /* , void); */ 218d0ef721eSBaptiste Daroussin #define H_NEXT_STR 13 /* , const wchar_t *); */ 219d0ef721eSBaptiste Daroussin #define H_PREV_STR 14 /* , const wchar_t *); */ 220d0ef721eSBaptiste Daroussin #define H_NEXT_EVENT 15 /* , const int); */ 221d0ef721eSBaptiste Daroussin #define H_PREV_EVENT 16 /* , const int); */ 222d0ef721eSBaptiste Daroussin #define H_LOAD 17 /* , const char *); */ 223d0ef721eSBaptiste Daroussin #define H_SAVE 18 /* , const char *); */ 224d0ef721eSBaptiste Daroussin #define H_CLEAR 19 /* , void); */ 225d0ef721eSBaptiste Daroussin #define H_SETUNIQUE 20 /* , int); */ 226d0ef721eSBaptiste Daroussin #define H_GETUNIQUE 21 /* , void); */ 227d0ef721eSBaptiste Daroussin #define H_DEL 22 /* , int); */ 228d0ef721eSBaptiste Daroussin #define H_NEXT_EVDATA 23 /* , const int, histdata_t *); */ 229d0ef721eSBaptiste Daroussin #define H_DELDATA 24 /* , int, histdata_t *);*/ 230d0ef721eSBaptiste Daroussin #define H_REPLACE 25 /* , const char *, histdata_t); */ 231d0ef721eSBaptiste Daroussin #define H_SAVE_FP 26 /* , FILE *); */ 232d0ef721eSBaptiste Daroussin #define H_NSAVE_FP 27 /* , size_t, FILE *); */ 233d0ef721eSBaptiste Daroussin 234d0ef721eSBaptiste Daroussin 235d0ef721eSBaptiste Daroussin 236d0ef721eSBaptiste Daroussin /* 237d0ef721eSBaptiste Daroussin * ==== Tokenization ==== 238d0ef721eSBaptiste Daroussin */ 239d0ef721eSBaptiste Daroussin 240d0ef721eSBaptiste Daroussin typedef struct tokenizer Tokenizer; 241d0ef721eSBaptiste Daroussin 242d0ef721eSBaptiste Daroussin /* 243d0ef721eSBaptiste Daroussin * String tokenization functions, using simplified sh(1) quoting rules 244d0ef721eSBaptiste Daroussin */ 245d0ef721eSBaptiste Daroussin Tokenizer *tok_init(const char *); 246d0ef721eSBaptiste Daroussin void tok_end(Tokenizer *); 247d0ef721eSBaptiste Daroussin void tok_reset(Tokenizer *); 248d0ef721eSBaptiste Daroussin int tok_line(Tokenizer *, const LineInfo *, 249d0ef721eSBaptiste Daroussin int *, const char ***, int *, int *); 250d0ef721eSBaptiste Daroussin int tok_str(Tokenizer *, const char *, 251d0ef721eSBaptiste Daroussin int *, const char ***); 252d0ef721eSBaptiste Daroussin 253d0ef721eSBaptiste Daroussin /* 254d0ef721eSBaptiste Daroussin * Begin Wide Character Support 255d0ef721eSBaptiste Daroussin */ 256d0ef721eSBaptiste Daroussin #include <wchar.h> 257d0ef721eSBaptiste Daroussin #include <wctype.h> 258d0ef721eSBaptiste Daroussin 259d0ef721eSBaptiste Daroussin /* 260d0ef721eSBaptiste Daroussin * ==== Editing ==== 261d0ef721eSBaptiste Daroussin */ 262d0ef721eSBaptiste Daroussin typedef struct lineinfow { 263d0ef721eSBaptiste Daroussin const wchar_t *buffer; 264d0ef721eSBaptiste Daroussin const wchar_t *cursor; 265d0ef721eSBaptiste Daroussin const wchar_t *lastchar; 266d0ef721eSBaptiste Daroussin } LineInfoW; 267d0ef721eSBaptiste Daroussin 268d0ef721eSBaptiste Daroussin typedef int (*el_rfunc_t)(EditLine *, wchar_t *); 269d0ef721eSBaptiste Daroussin 270d0ef721eSBaptiste Daroussin const wchar_t *el_wgets(EditLine *, int *); 271d0ef721eSBaptiste Daroussin int el_wgetc(EditLine *, wchar_t *); 272d0ef721eSBaptiste Daroussin void el_wpush(EditLine *, const wchar_t *); 273d0ef721eSBaptiste Daroussin 274d0ef721eSBaptiste Daroussin int el_wparse(EditLine *, int, const wchar_t **); 275d0ef721eSBaptiste Daroussin 276d0ef721eSBaptiste Daroussin int el_wset(EditLine *, int, ...); 277d0ef721eSBaptiste Daroussin int el_wget(EditLine *, int, ...); 278d0ef721eSBaptiste Daroussin 279d0ef721eSBaptiste Daroussin int el_cursor(EditLine *, int); 280d0ef721eSBaptiste Daroussin const LineInfoW *el_wline(EditLine *); 281d0ef721eSBaptiste Daroussin int el_winsertstr(EditLine *, const wchar_t *); 282d0ef721eSBaptiste Daroussin #define el_wdeletestr el_deletestr 2837f399375SBaptiste Daroussin int el_wreplacestr(EditLine *, const wchar_t *); 284d0ef721eSBaptiste Daroussin 285d0ef721eSBaptiste Daroussin /* 286d0ef721eSBaptiste Daroussin * ==== History ==== 287d0ef721eSBaptiste Daroussin */ 288d0ef721eSBaptiste Daroussin typedef struct histeventW { 289d0ef721eSBaptiste Daroussin int num; 290d0ef721eSBaptiste Daroussin const wchar_t *str; 291d0ef721eSBaptiste Daroussin } HistEventW; 292d0ef721eSBaptiste Daroussin 293d0ef721eSBaptiste Daroussin typedef struct historyW HistoryW; 294d0ef721eSBaptiste Daroussin 295d0ef721eSBaptiste Daroussin HistoryW * history_winit(void); 296d0ef721eSBaptiste Daroussin void history_wend(HistoryW *); 297d0ef721eSBaptiste Daroussin 298d0ef721eSBaptiste Daroussin int history_w(HistoryW *, HistEventW *, int, ...); 299d0ef721eSBaptiste Daroussin 300d0ef721eSBaptiste Daroussin /* 301d0ef721eSBaptiste Daroussin * ==== Tokenization ==== 302d0ef721eSBaptiste Daroussin */ 303d0ef721eSBaptiste Daroussin typedef struct tokenizerW TokenizerW; 304d0ef721eSBaptiste Daroussin 305d0ef721eSBaptiste Daroussin /* Wide character tokenizer support */ 306d0ef721eSBaptiste Daroussin TokenizerW *tok_winit(const wchar_t *); 307d0ef721eSBaptiste Daroussin void tok_wend(TokenizerW *); 308d0ef721eSBaptiste Daroussin void tok_wreset(TokenizerW *); 309d0ef721eSBaptiste Daroussin int tok_wline(TokenizerW *, const LineInfoW *, 310d0ef721eSBaptiste Daroussin int *, const wchar_t ***, int *, int *); 311d0ef721eSBaptiste Daroussin int tok_wstr(TokenizerW *, const wchar_t *, 312d0ef721eSBaptiste Daroussin int *, const wchar_t ***); 313d0ef721eSBaptiste Daroussin 314d0ef721eSBaptiste Daroussin #ifdef __cplusplus 315d0ef721eSBaptiste Daroussin } 316d0ef721eSBaptiste Daroussin #endif 317d0ef721eSBaptiste Daroussin 318d0ef721eSBaptiste Daroussin #endif /* _HISTEDIT_H_ */ 319