Our libedit has been diverging from the mainstream version maintained in NetBSD. As a consequence it has been difficult to do an appropriate MFV and we have been bringing only partial updates. Here we update most of the files to at least match the version available in NetBSD's snapshot of 20091228. This version was chosen because it still doesn't include wide character support (UTF-8), which involves many changes and new files. From NetBSD's logs: Dec 15 22:13:33 2006 - editline.3 el.c el.h histedit.h add EL_GETFP, and EL_SETFP. Apr 5 15:53:28 2008 - editline.3 el.c histedit.h readline.c add EL_REFRESH for the benefit of readline Sep 10 15:45:37 2008 - common.c el.c read.c refresh.c sig.c term.c term.h tty.c Allow a single process to control multiple ttys (for pthreads using _REENTRANT) using multiple EditLine objects. Jan 18 12:17:24 2009 - el.c read.c readline.c fix -Wsign-compare issues Feb 6 14:40:32 2009 - history.c Plug memory leak, from MySQL. Feb 5 19:15:44 2009 - histedit.h read.c match documentation in el_push Feb 6 13:14:37 2009 - vi.c Portability fix. Feb 12 13:39:49 2009 - readline.c term.c More fixes for existing portability stuff. Feb 15 21:24:13 2009 - el.h read.c don't restart on EINTR, instead return NULL immediately. From Anon Ymous Feb 15 21:25:01 2009 - sig.c sig.h in order for read() to return EINTR we need to use sigaction, not signal, otherwise SA_RESTART is set. Feb 15 21:55:23 2009 - chared.c chared.h common.c emacs.c filecomplete.c filecomplete.h key.c key.h read.c readline.c refresh.c search.c term.c tokenizer.c tty.c vi.c pass lint on _LP64. Feb 17 21:34:26 2009 - el.c histedit.h prompt.c prompt.h allow for a prompt argument. Feb 18 15:04:40 2009 - sig.c SA_RESTART for all signals but SIGINT. From Anon Ymous. Feb 19 15:20:22 2009 - read.c sig.c sig.h reset and redraw on sigcont. From Anon Ymous. Feb 21 23:31:56 2009 - key.c key.h readline.c vi.c more size_t stuff. Mar 10 20:46:15 2009 - editline.3 read.c make el_gets set the count to -1 on error to distinguish between EOF and error. Mar 31 17:38:27 2009 - editline.3 el.c histedit.h prompt.c prompt.h refresh.c term.c term.h Implement literal prompt sequences. Now someone can implement RL_PROMPT_START_LITERAL/RL_PROMPT_END_LITERAL :-) Mar 31 21:33:17 2009 - term.c cast to size_t to avoid sign / unsigned comparison warning. Apr 23 02:03 2009 - term.c Apply patch (requested by msaitoh in ticket #2007): Coverity CID 1668: Plug memory leak when malloc() failed.:55 2009 May 11 18:33:30 2009 - editline.3 el.c histedit.h restore binary compatibility by providing new prompt functions that take an extra literal character. May 19 21:45:14 2009 - refresh.c always scroll when we advance past bottom. From Caleb Welton cwelton at greenplum dot com. Jul 17 12:27:57 2009 - term.c - off by one in the term.h case. - make code more similar to tcsh (if we want to handle wide chars, this is needed; for now it is a no-op) Jul 22 15:56:29 2009 - el.c Move filename to the scope it is being used. From Michael Cook mcook at bbn dot com Jul 22 15:57:00 2009 - read.c Always initialize nread since it is an out param. From Michael Cook mcook at bbn dot com Jul 22 18:25:26 2009 - el.c Only need path if we have issetugid... From Anon Ymous Jul 25 21:19:23 2009 - el.c Ignore comment lines in .editrc from Jess Thrysoee Sep 7 21:24:33 2009 histedit.h history.c readline.c apply apple patches from: http://opensource.apple.com/source/libedit/libedit-11/patches/ Dec 28 21:52:43 2009 - refresh.c Fix bug where tab completion on the second or > line that caused listing ended up corrupting the display by an extra space in the beginning. Reported by Mac Chan. Dec 28 22:15:36 2009 - refresh.c term.c reduce diff with tcsh Obtained from: NetBSD Tested by: bapt, jilles and current@ MFC after: 1 week
243 lines
6.9 KiB
C
243 lines
6.9 KiB
C
/*-
|
|
* Copyright (c) 1992, 1993
|
|
* The Regents of the University of California. All rights reserved.
|
|
*
|
|
* This code is derived from software contributed to Berkeley by
|
|
* Christos Zoulas of Cornell University.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. Neither the name of the University nor the names of its contributors
|
|
* may be used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*
|
|
* @(#)histedit.h 8.2 (Berkeley) 1/3/94
|
|
* $NetBSD: histedit.h,v 1.32 2007/06/10 20:20:28 christos Exp $
|
|
* $FreeBSD$
|
|
*/
|
|
|
|
/*
|
|
* histedit.h: Line editor and history interface.
|
|
*/
|
|
#ifndef _HISTEDIT_H_
|
|
#define _HISTEDIT_H_
|
|
|
|
#include <sys/types.h>
|
|
#include <stdio.h>
|
|
|
|
__BEGIN_DECLS
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*
|
|
* ==== Editing ====
|
|
*/
|
|
|
|
typedef struct editline EditLine;
|
|
|
|
/*
|
|
* For user-defined function interface
|
|
*/
|
|
typedef struct lineinfo {
|
|
const char *buffer;
|
|
const char *cursor;
|
|
const char *lastchar;
|
|
} LineInfo;
|
|
|
|
/*
|
|
* EditLine editor function return codes.
|
|
* For user-defined function interface
|
|
*/
|
|
#define CC_NORM 0
|
|
#define CC_NEWLINE 1
|
|
#define CC_EOF 2
|
|
#define CC_ARGHACK 3
|
|
#define CC_REFRESH 4
|
|
#define CC_CURSOR 5
|
|
#define CC_ERROR 6
|
|
#define CC_FATAL 7
|
|
#define CC_REDISPLAY 8
|
|
#define CC_REFRESH_BEEP 9
|
|
|
|
/*
|
|
* Initialization, cleanup, and resetting
|
|
*/
|
|
EditLine *el_init(const char *, FILE *, FILE *, FILE *);
|
|
void el_end(EditLine *);
|
|
void el_reset(EditLine *);
|
|
|
|
/*
|
|
* Get a line, a character or push a string back in the input queue
|
|
*/
|
|
const char *el_gets(EditLine *, int *);
|
|
int el_getc(EditLine *, char *);
|
|
void el_push(EditLine *, const char *);
|
|
|
|
/*
|
|
* Beep!
|
|
*/
|
|
void el_beep(EditLine *);
|
|
|
|
/*
|
|
* High level function internals control
|
|
* Parses argc, argv array and executes builtin editline commands
|
|
*/
|
|
int el_parse(EditLine *, int, const char **);
|
|
|
|
/*
|
|
* Low level editline access functions
|
|
*/
|
|
int el_set(EditLine *, int, ...);
|
|
int el_get(EditLine *, int, ...);
|
|
unsigned char _el_fn_complete(EditLine *, int);
|
|
unsigned char _el_fn_sh_complete(EditLine *, int);
|
|
|
|
/*
|
|
* el_set/el_get parameters
|
|
*/
|
|
#define EL_PROMPT 0 /* , el_pfunc_t); */
|
|
#define EL_TERMINAL 1 /* , const char *); */
|
|
#define EL_EDITOR 2 /* , const char *); */
|
|
#define EL_SIGNAL 3 /* , int); */
|
|
#define EL_BIND 4 /* , const char *, ..., NULL); */
|
|
#define EL_TELLTC 5 /* , const char *, ..., NULL); */
|
|
#define EL_SETTC 6 /* , const char *, ..., NULL); */
|
|
#define EL_ECHOTC 7 /* , const char *, ..., NULL); */
|
|
#define EL_SETTY 8 /* , const char *, ..., NULL); */
|
|
#define EL_ADDFN 9 /* , const char *, const char * */
|
|
/* , el_func_t); */
|
|
#define EL_HIST 10 /* , hist_fun_t, const char *); */
|
|
#define EL_EDITMODE 11 /* , int); */
|
|
#define EL_RPROMPT 12 /* , el_pfunc_t); */
|
|
#define EL_GETCFN 13 /* , el_rfunc_t); */
|
|
#define EL_CLIENTDATA 14 /* , void *); */
|
|
#define EL_UNBUFFERED 15 /* , int); */
|
|
#define EL_PREP_TERM 16 /* , int); */
|
|
#define EL_GETTC 17 /* , const char *, ..., NULL); */
|
|
#define EL_GETFP 18 /* , int, FILE **); */
|
|
#define EL_SETFP 19 /* , int, FILE *); */
|
|
#define EL_REFRESH 20 /* , void); set */
|
|
#define EL_PROMPT_ESC 21 /* , prompt_func, Char); set/get */
|
|
#define EL_RPROMPT_ESC 22 /* , prompt_func, Char); set/get */
|
|
#define EL_RESIZE 23 /* , el_zfunc_t, void *); set */
|
|
|
|
#define EL_BUILTIN_GETCFN (NULL)
|
|
|
|
/*
|
|
* Source named file or $PWD/.editrc or $HOME/.editrc
|
|
*/
|
|
int el_source(EditLine *, const char *);
|
|
|
|
/*
|
|
* Must be called when the terminal changes size; If EL_SIGNAL
|
|
* is set this is done automatically otherwise it is the responsibility
|
|
* of the application
|
|
*/
|
|
void el_resize(EditLine *);
|
|
|
|
|
|
/*
|
|
* Set user private data.
|
|
*/
|
|
void el_data_set(EditLine *, void *);
|
|
void * el_data_get(EditLine *);
|
|
|
|
/*
|
|
* User-defined function interface.
|
|
*/
|
|
const LineInfo *el_line(EditLine *);
|
|
int el_insertstr(EditLine *, const char *);
|
|
void el_deletestr(EditLine *, int);
|
|
|
|
|
|
/*
|
|
* ==== History ====
|
|
*/
|
|
|
|
typedef struct history History;
|
|
|
|
typedef struct HistEvent {
|
|
int num;
|
|
const char *str;
|
|
} HistEvent;
|
|
|
|
/*
|
|
* History access functions.
|
|
*/
|
|
History * history_init(void);
|
|
void history_end(History *);
|
|
|
|
int history(History *, HistEvent *, int, ...);
|
|
|
|
#define H_FUNC 0 /* , UTSL */
|
|
#define H_SETSIZE 1 /* , const int); */
|
|
#define H_EVENT 1 /* , const int); */
|
|
#define H_GETSIZE 2 /* , void); */
|
|
#define H_FIRST 3 /* , void); */
|
|
#define H_LAST 4 /* , void); */
|
|
#define H_PREV 5 /* , void); */
|
|
#define H_NEXT 6 /* , void); */
|
|
#define H_CURR 8 /* , const int); */
|
|
#define H_SET 7 /* , int); */
|
|
#define H_ADD 9 /* , const char *); */
|
|
#define H_ENTER 10 /* , const char *); */
|
|
#define H_APPEND 11 /* , const char *); */
|
|
#define H_END 12 /* , void); */
|
|
#define H_NEXT_STR 13 /* , const char *); */
|
|
#define H_PREV_STR 14 /* , const char *); */
|
|
#define H_NEXT_EVENT 15 /* , const int); */
|
|
#define H_PREV_EVENT 16 /* , const int); */
|
|
#define H_LOAD 17 /* , const char *); */
|
|
#define H_SAVE 18 /* , const char *); */
|
|
#define H_CLEAR 19 /* , void); */
|
|
#define H_SETUNIQUE 20 /* , int); */
|
|
#define H_GETUNIQUE 21 /* , void); */
|
|
#define H_DEL 22 /* , int); */
|
|
#define H_NEXT_EVDATA 23 /* , const int, histdata_t *); */
|
|
#define H_DELDATA 24 /* , int, histdata_t *);*/
|
|
#define H_REPLACE 25 /* , const char *, histdata_t); */
|
|
|
|
|
|
/*
|
|
* ==== Tokenization ====
|
|
*/
|
|
|
|
typedef struct tokenizer Tokenizer;
|
|
|
|
/*
|
|
* String tokenization functions, using simplified sh(1) quoting rules
|
|
*/
|
|
Tokenizer *tok_init(const char *);
|
|
void tok_end(Tokenizer *);
|
|
void tok_reset(Tokenizer *);
|
|
int tok_line(Tokenizer *, const LineInfo *,
|
|
int *, const char ***, int *, int *);
|
|
int tok_str(Tokenizer *, const char *,
|
|
int *, const char ***);
|
|
|
|
__END_DECLS
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _HISTEDIT_H_ */
|