diff options
Diffstat (limited to 'el.c')
| -rw-r--r-- | el.c | 141 | 
1 files changed, 79 insertions, 62 deletions
| @@ -1,4 +1,4 @@ -/*	$NetBSD: el.c,v 1.83 2016/02/24 17:13:22 christos Exp $	*/ +/*	$NetBSD: el.c,v 1.95 2017/09/05 18:07:59 christos Exp $	*/  /*-   * Copyright (c) 1992, 1993 @@ -37,7 +37,7 @@  #if 0  static char sccsid[] = "@(#)el.c	8.2 (Berkeley) 1/3/94";  #else -__RCSID("$NetBSD: el.c,v 1.83 2016/02/24 17:13:22 christos Exp $"); +__RCSID("$NetBSD: el.c,v 1.95 2017/09/05 18:07:59 christos Exp $");  #endif  #endif /* not lint && not SCCSID */ @@ -47,30 +47,29 @@ __RCSID("$NetBSD: el.c,v 1.83 2016/02/24 17:13:22 christos Exp $");  #include <sys/types.h>  #include <sys/param.h>  #include <ctype.h> +#include <langinfo.h> +#include <locale.h>  #include <stdarg.h>  #include <stdlib.h>  #include <string.h> -#ifdef WIDECHAR -#include <locale.h> -#include <langinfo.h> -#endif  #include "el.h"  #include "parse.h" +#include "read.h"  /* el_init():   *	Initialize editline and set default parameters.   */ -public EditLine * +EditLine *  el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr)  {      return el_init_fd(prog, fin, fout, ferr, fileno(fin), fileno(fout),  	fileno(ferr));  } -public EditLine * -el_init_fd(const char *prog, FILE *fin, FILE *fout, FILE *ferr, -    int fdin, int fdout, int fderr) +libedit_private EditLine * +el_init_internal(const char *prog, FILE *fin, FILE *fout, FILE *ferr, +    int fdin, int fdout, int fderr, int flags)  {  	EditLine *el = el_malloc(sizeof(*el)); @@ -87,7 +86,7 @@ el_init_fd(const char *prog, FILE *fin, FILE *fout, FILE *ferr,  	el->el_outfd = fdout;  	el->el_errfd = fderr; -	el->el_prog = Strdup(ct_decode_string(prog, &el->el_scratch)); +	el->el_prog = wcsdup(ct_decode_string(prog, &el->el_scratch));  	if (el->el_prog == NULL) {  		el_free(el);  		return NULL; @@ -96,7 +95,7 @@ el_init_fd(const char *prog, FILE *fin, FILE *fout, FILE *ferr,  	/*           * Initialize all the modules. Order is important!!!           */ -	el->el_flags = 0; +	el->el_flags = flags;  	if (setlocale(LC_CTYPE, NULL) != NULL){  		if (strcmp(nl_langinfo(CODESET), "UTF-8") == 0)  			el->el_flags |= CHARSET_IS_UTF8; @@ -116,16 +115,25 @@ el_init_fd(const char *prog, FILE *fin, FILE *fout, FILE *ferr,  	(void) hist_init(el);  	(void) prompt_init(el);  	(void) sig_init(el); -	(void) read_init(el); - +	(void) literal_init(el); +	if (read_init(el) == -1) { +		el_end(el); +		return NULL; +	}  	return el;  } +EditLine * +el_init_fd(const char *prog, FILE *fin, FILE *fout, FILE *ferr, +    int fdin, int fdout, int fderr) +{ +	return el_init_internal(prog, fin, fout, ferr, fdin, fdout, fderr, 0); +}  /* el_end():   *	Clean up.   */ -public void +void  el_end(EditLine *el)  { @@ -140,18 +148,20 @@ el_end(EditLine *el)  	if (!(el->el_flags & NO_TTY))  		tty_end(el);  	ch_end(el); +	read_end(el->el_read);  	search_end(el);  	hist_end(el);  	prompt_end(el);  	sig_end(el); +	literal_end(el);  	el_free(el->el_prog); -#ifdef WIDECHAR +	el_free(el->el_visual.cbuff); +	el_free(el->el_visual.wbuff);  	el_free(el->el_scratch.cbuff);  	el_free(el->el_scratch.wbuff);  	el_free(el->el_lgcyconv.cbuff);  	el_free(el->el_lgcyconv.wbuff); -#endif  	el_free(el);  } @@ -159,20 +169,20 @@ el_end(EditLine *el)  /* el_reset():   *	Reset the tty and the parser   */ -public void +void  el_reset(EditLine *el)  {  	tty_cookedmode(el); -	ch_reset(el, 0);		/* XXX: Do we want that? */ +	ch_reset(el);		/* XXX: Do we want that? */  }  /* el_set():   *	set the editline parameters   */ -public int -FUN(el,set)(EditLine *el, int op, ...) +int +el_wset(EditLine *el, int op, ...)  {  	va_list ap;  	int rv = 0; @@ -209,7 +219,7 @@ FUN(el,set)(EditLine *el, int op, ...)  		el_pfunc_t p = va_arg(ap, el_pfunc_t);  		int c = va_arg(ap, int); -		rv = prompt_set(el, p, (Char)c, op, 1); +		rv = prompt_set(el, p, (wchar_t)c, op, 1);  		break;  	} @@ -218,7 +228,7 @@ FUN(el,set)(EditLine *el, int op, ...)  		break;  	case EL_EDITOR: -		rv = map_set_editor(el, va_arg(ap, Char *)); +		rv = map_set_editor(el, va_arg(ap, wchar_t *));  		break;  	case EL_SIGNAL: @@ -234,36 +244,36 @@ FUN(el,set)(EditLine *el, int op, ...)  	case EL_ECHOTC:  	case EL_SETTY:  	{ -		const Char *argv[20]; +		const wchar_t *argv[20];  		int i;  		for (i = 1; i < (int)__arraycount(argv); i++) -			if ((argv[i] = va_arg(ap, Char *)) == NULL) +			if ((argv[i] = va_arg(ap, wchar_t *)) == NULL)  				break;  		switch (op) {  		case EL_BIND: -			argv[0] = STR("bind"); +			argv[0] = L"bind";  			rv = map_bind(el, i, argv);  			break;  		case EL_TELLTC: -			argv[0] = STR("telltc"); +			argv[0] = L"telltc";  			rv = terminal_telltc(el, i, argv);  			break;  		case EL_SETTC: -			argv[0] = STR("settc"); +			argv[0] = L"settc";  			rv = terminal_settc(el, i, argv);  			break;  		case EL_ECHOTC: -			argv[0] = STR("echotc"); +			argv[0] = L"echotc";  			rv = terminal_echotc(el, i, argv);  			break;  		case EL_SETTY: -			argv[0] = STR("setty"); +			argv[0] = L"setty";  			rv = tty_stty(el, i, argv);  			break; @@ -277,8 +287,8 @@ FUN(el,set)(EditLine *el, int op, ...)  	case EL_ADDFN:  	{ -		Char *name = va_arg(ap, Char *); -		Char *help = va_arg(ap, Char *); +		wchar_t *name = va_arg(ap, wchar_t *); +		wchar_t *help = va_arg(ap, wchar_t *);  		el_func_t func = va_arg(ap, el_func_t);  		rv = map_addfunc(el, name, help, func); @@ -307,7 +317,7 @@ FUN(el,set)(EditLine *el, int op, ...)  	case EL_GETCFN:  	{  		el_rfunc_t rc = va_arg(ap, el_rfunc_t); -		rv = el_read_setfn(el, rc); +		rv = el_read_setfn(el->el_read, rc);  		break;  	} @@ -384,8 +394,8 @@ FUN(el,set)(EditLine *el, int op, ...)  /* el_get():   *	retrieve the editline parameters   */ -public int -FUN(el,get)(EditLine *el, int op, ...) +int +el_wget(EditLine *el, int op, ...)  {  	va_list ap;  	int rv; @@ -405,14 +415,14 @@ FUN(el,get)(EditLine *el, int op, ...)  	case EL_PROMPT_ESC:  	case EL_RPROMPT_ESC: {  		el_pfunc_t *p = va_arg(ap, el_pfunc_t *); -		Char *c = va_arg(ap, Char *); +		wchar_t *c = va_arg(ap, wchar_t *);  		rv = prompt_get(el, p, c, op);  		break;  	}  	case EL_EDITOR: -		rv = map_get_editor(el, va_arg(ap, const Char **)); +		rv = map_get_editor(el, va_arg(ap, const wchar_t **));  		break;  	case EL_SIGNAL: @@ -446,7 +456,7 @@ FUN(el,get)(EditLine *el, int op, ...)  	}  	case EL_GETCFN: -		*va_arg(ap, el_rfunc_t *) = el_read_getfn(el); +		*va_arg(ap, el_rfunc_t *) = el_read_getfn(el->el_read);  		rv = 0;  		break; @@ -497,18 +507,18 @@ FUN(el,get)(EditLine *el, int op, ...)  /* el_line():   *	Return editing info   */ -public const TYPE(LineInfo) * -FUN(el,line)(EditLine *el) +const LineInfoW * +el_wline(EditLine *el)  { -	return (const TYPE(LineInfo) *)(void *)&el->el_line; +	return (const LineInfoW *)(void *)&el->el_line;  }  /* el_source():   *	Source a file   */ -public int +int  el_source(EditLine *el, const char *fname)  {  	FILE *fp; @@ -516,24 +526,28 @@ el_source(EditLine *el, const char *fname)  	ssize_t slen;  	char *ptr;  	char *path = NULL; -	const Char *dptr; +	const wchar_t *dptr;  	int error = 0;  	fp = NULL;  	if (fname == NULL) {  #ifdef HAVE_ISSETUGID -		static const char elpath[] = "/.editrc"; -		size_t plen = sizeof(elpath); -  		if (issetugid())  			return -1; -		if ((ptr = getenv("HOME")) == NULL) -			return -1; -		plen += strlen(ptr); -		if ((path = el_malloc(plen * sizeof(*path))) == NULL) -			return -1; -		(void)snprintf(path, plen, "%s%s", ptr, elpath); -		fname = path; + +		if ((fname = getenv("EDITRC")) == NULL) { +			static const char elpath[] = "/.editrc"; +			size_t plen = sizeof(elpath); + +			if ((ptr = getenv("HOME")) == NULL) +				return -1; +			plen += strlen(ptr); +			if ((path = el_malloc(plen * sizeof(*path))) == NULL) +				return -1; +			(void)snprintf(path, plen, "%s%s", ptr, +				elpath + (*ptr == '\0')); +			fname = path; +		}  #else  		/*  		 * If issetugid() is missing, always return an error, in order @@ -543,6 +557,9 @@ el_source(EditLine *el, const char *fname)  		return -1;  #endif  	} +	if (fname[0] == '\0') +		return -1; +  	if (fp == NULL)  		fp = fopen(fname, "r");  	if (fp == NULL) { @@ -562,7 +579,7 @@ el_source(EditLine *el, const char *fname)  		if (!dptr)  			continue;  		/* loop until first non-space char or EOL */ -		while (*dptr != '\0' && Isspace(*dptr)) +		while (*dptr != '\0' && iswspace(*dptr))  			dptr++;  		if (*dptr == '#')  			continue;   /* ignore, this is a comment line */ @@ -580,7 +597,7 @@ el_source(EditLine *el, const char *fname)  /* el_resize():   *	Called from program when terminal is resized   */ -public void +void  el_resize(EditLine *el)  {  	int lins, cols; @@ -601,7 +618,7 @@ el_resize(EditLine *el)  /* el_beep():   *	Called from the program to beep   */ -public void +void  el_beep(EditLine *el)  { @@ -612,25 +629,25 @@ el_beep(EditLine *el)  /* el_editmode()   *	Set the state of EDIT_DISABLED from the `edit' command.   */ -protected int +libedit_private int  /*ARGSUSED*/ -el_editmode(EditLine *el, int argc, const Char **argv) +el_editmode(EditLine *el, int argc, const wchar_t **argv)  { -	const Char *how; +	const wchar_t *how;  	if (argv == NULL || argc != 2 || argv[1] == NULL)  		return -1;  	how = argv[1]; -	if (Strcmp(how, STR("on")) == 0) { +	if (wcscmp(how, L"on") == 0) {  		el->el_flags &= ~EDIT_DISABLED;  		tty_rawmode(el); -	} else if (Strcmp(how, STR("off")) == 0) { +	} else if (wcscmp(how, L"off") == 0) {  		tty_cookedmode(el);  		el->el_flags |= EDIT_DISABLED;  	}  	else { -		(void) fprintf(el->el_errfile, "edit: Bad value `" FSTR "'.\n", +		(void) fprintf(el->el_errfile, "edit: Bad value `%ls'.\n",  		    how);  		return -1;  	} | 
