summaryrefslogtreecommitdiff
path: root/el.c
diff options
context:
space:
mode:
Diffstat (limited to 'el.c')
-rw-r--r--el.c141
1 files changed, 79 insertions, 62 deletions
diff --git a/el.c b/el.c
index d7932cba7f7b2..f0cb6941f0860 100644
--- a/el.c
+++ b/el.c
@@ -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;
}