aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/libedit/Makefile115
-rw-r--r--lib/libedit/Makefile.depend18
-rw-r--r--lib/libedit/TEST/rl1.c53
-rw-r--r--lib/libedit/TEST/tc1.c305
-rw-r--r--lib/libedit/TEST/wtc1.c284
-rw-r--r--lib/libedit/chared.c777
-rw-r--r--lib/libedit/chared.h165
-rw-r--r--lib/libedit/chartype.c384
-rw-r--r--lib/libedit/chartype.h248
-rw-r--r--lib/libedit/common.c925
-rw-r--r--lib/libedit/config.h290
-rw-r--r--lib/libedit/edit/readline/Makefile.depend11
-rw-r--r--lib/libedit/edit/readline/readline.h227
-rw-r--r--lib/libedit/editline.3977
-rw-r--r--lib/libedit/editrc.5526
-rw-r--r--lib/libedit/el.c636
-rw-r--r--lib/libedit/el.h155
-rw-r--r--lib/libedit/eln.c394
-rw-r--r--lib/libedit/emacs.c513
-rw-r--r--lib/libedit/filecomplete.c697
-rw-r--r--lib/libedit/filecomplete.h49
-rw-r--r--lib/libedit/hist.c227
-rw-r--r--lib/libedit/hist.h87
-rw-r--r--lib/libedit/histedit.h313
-rw-r--r--lib/libedit/history.c1122
-rw-r--r--lib/libedit/keymacro.c675
-rw-r--r--lib/libedit/keymacro.h77
-rw-r--r--lib/libedit/makelist264
-rw-r--r--lib/libedit/map.c1429
-rw-r--r--lib/libedit/map.h78
-rw-r--r--lib/libedit/parse.c291
-rw-r--r--lib/libedit/parse.h49
-rw-r--r--lib/libedit/prompt.c201
-rw-r--r--lib/libedit/prompt.h59
-rw-r--r--lib/libedit/read.c733
-rw-r--r--lib/libedit/read.h52
-rw-r--r--lib/libedit/readline.c2336
-rw-r--r--lib/libedit/readline/Makefile (renamed from lib/libedit/edit/readline/Makefile)2
-rw-r--r--lib/libedit/readline/history.h (renamed from lib/libedit/edit/readline/history.h)0
-rw-r--r--lib/libedit/readline/tilde.h (renamed from lib/libedit/edit/readline/tilde.h)0
-rw-r--r--lib/libedit/refresh.c1187
-rw-r--r--lib/libedit/refresh.h58
-rw-r--r--lib/libedit/search.c647
-rw-r--r--lib/libedit/search.h65
-rw-r--r--lib/libedit/sig.c207
-rw-r--r--lib/libedit/sig.h71
-rw-r--r--lib/libedit/sys.h129
-rw-r--r--lib/libedit/terminal.c1689
-rw-r--r--lib/libedit/terminal.h125
-rw-r--r--lib/libedit/tokenizer.c455
-rw-r--r--lib/libedit/tty.c1340
-rw-r--r--lib/libedit/tty.h482
-rw-r--r--lib/libedit/vi.c1158
53 files changed, 64 insertions, 23293 deletions
diff --git a/lib/libedit/Makefile b/lib/libedit/Makefile
index 653476d892f8..f1dbad42db22 100644
--- a/lib/libedit/Makefile
+++ b/lib/libedit/Makefile
@@ -4,6 +4,9 @@
PACKAGE=clibs
+EDITDIR= ${SRCTOP}/contrib/libedit
+.PATH: ${EDITDIR}
+
SHLIB_MAJOR= 7
SHLIBDIR?= /lib
@@ -12,75 +15,83 @@ LIB= edit
LIBADD= ncursesw
-OSRCS= chared.c common.c el.c eln.c emacs.c fcns.c filecomplete.c help.c \
- hist.c keymacro.c map.c chartype.c \
- parse.c prompt.c read.c refresh.c search.c sig.c terminal.c tty.c vi.c
-
-MAN= editline.3 editrc.5
-
-MLINKS= editline.3 el_deletestr.3 editline.3 el_end.3 editline.3 el_init.3 \
- editline.3 el_get.3 editline.3 el_getc.3 editline.3 el_gets.3 \
- editline.3 history.3 editline.3 history_end.3 \
- editline.3 history_init.3 editline.3 el_insertstr.3 \
- editline.3 el_line.3 editline.3 el_parse.3 editline.3 el_push.3 \
- editline.3 el_reset.3 editline.3 el_resize.3 editline.3 el_set.3 \
+SRCS= chared.c chartype.c common.c el.c eln.c emacs.c filecomplete.c \
+ hist.c history.c historyn.c keymacro.c literal.c map.c \
+ parse.c prompt.c read.c readline.c refresh.c search.c sig.c \
+ terminal.c tokenizer.c tokenizern.c tty.c vi.c
+
+
+MAN= editline.3 editrc.5 editline.7
+
+MLINKS= \
+ editline.3 el_deletestr.3 \
+ editline.3 el_end.3 \
+ editline.3 el_get.3 \
+ editline.3 el_getc.3 \
+ editline.3 el_gets.3 \
+ editline.3 el_init.3 \
+ editline.3 el_init_fd.3 \
+ editline.3 el_insertstr.3 \
+ editline.3 el_line.3 \
+ editline.3 el_parse.3 \
+ editline.3 el_push.3 \
+ editline.3 el_reset.3 \
+ editline.3 el_resize.3 \
+ editline.3 el_set.3 \
editline.3 el_source.3 \
- editline.3 tok_init.3 editline.3 tok_end.3 editline.3 tok_reset.3 \
- editline.3 tok_line.3 editline.3 tok_str.3
-
-# For speed and debugging
-#SRCS= ${OSRCS} readline.c tokenizer.c history.c
-# For protection
-SRCS= editline.c readline.c tokenizer.c history.c
-SRCS+= common.h emacs.h fcns.h help.h vi.h
-
-# Widechar
-SRCS+= tokenizern.c historyn.c
-CLEANFILES+= tokenizern.c historyn.c
+ editline.3 history.3 \
+ editline.3 history_end.3 \
+ editline.3 history_init.3 \
+ editline.3 tok_end.3 \
+ editline.3 tok_init.3 \
+ editline.3 tok_line.3 \
+ editline.3 tok_reset.3 \
+ editline.3 tok_str.3 \
+ editline.3 el_wdeletestr.3 \
+ editline.3 el_wget.3 \
+ editline.3 el_wgetc.3 \
+ editline.3 el_wgets.3 \
+ editline.3 el_winsertstr.3 \
+ editline.3 el_wline.3 \
+ editline.3 el_wparse.3 \
+ editline.3 el_wpush.3 \
+ editline.3 el_wset.3 \
+ editline.3 history_w.3 \
+ editline.3 history_wend.3 \
+ editline.3 history_winit.3 \
+ editline.3 tok_wend.3 \
+ editline.3 tok_winit.3 \
+ editline.3 tok_wline.3 \
+ editline.3 tok_wreset.3 \
+ editline.3 tok_wstr.3
INCS= histedit.h
-CLEANFILES+= common.h editline.c emacs.h fcns.c fcns.h help.c help.h vi.h
-CFLAGS+= -I. -I${.CURDIR} -I${.CURDIR}/edit -DWIDECHAR
-#CFLAGS+= -DDEBUG_TTY -DDEBUG_KEY -DDEBUG_READ -DDEBUG -DDEBUG_REFRESH
-#CFLAGS+= -DDEBUG_PASTE -DDEBUG_EDIT
+SRCS+= common.h emacs.h fcns.h func.h help.h vi.h
+CLEANFILES+= common.h emacs.h fcns.h func.h help.h vi.h
+
+CFLAGS+= -I. -I${EDITDIR} -I${EDITDIR}/readline
AHDR= vi.h emacs.h common.h
-ASRC= ${.CURDIR}/vi.c ${.CURDIR}/emacs.c ${.CURDIR}/common.c
+ASRC= ${EDITDIR}/vi.c ${EDITDIR}/emacs.c ${EDITDIR}/common.c
-SUBDIR= edit/readline
+SUBDIR= readline
.for hdr in vi emacs common
${hdr}.h: ${hdr}.c makelist
- sh ${.CURDIR}/makelist -h ${.CURDIR}/${hdr}.c > ${.TARGET}
+ sh ${EDITDIR}/makelist -h ${EDITDIR}/${hdr}.c > ${.TARGET}
.endfor
fcns.h: ${AHDR} makelist
- sh ${.CURDIR}/makelist -fh ${AHDR} > ${.TARGET}
+ sh ${EDITDIR}/makelist -fh ${AHDR} > ${.TARGET}
-fcns.c: ${AHDR} fcns.h makelist
- sh ${.CURDIR}/makelist -fc ${AHDR} > ${.TARGET}
-
-help.c: ${ASRC} makelist
- sh ${.CURDIR}/makelist -bc ${ASRC} > ${.TARGET}
+func.h: ${AHDR} makelist
+ sh ${EDITDIR}/makelist -fc ${AHDR} > ${.TARGET}
help.h: ${ASRC} makelist
- sh ${.CURDIR}/makelist -bh ${ASRC} > ${.TARGET}
-
-editline.c: ${OSRCS}
- sh ${.CURDIR}/makelist -e ${.ALLSRC:T} > ${.TARGET}
-
-tokenizern.c: makelist Makefile
- sh ${.CURDIR}/makelist -n tokenizer.c > ${.TARGET}
-
-historyn.c: makelist Makefile
- sh ${.CURDIR}/makelist -n history.c > ${.TARGET}
-
-# minimal dependency to make "make depend" optional
-editline.o editline.po editline.pico editline.ln: \
- common.h emacs.h fcns.c fcns.h help.c help.h vi.h
+ sh ${EDITDIR}/makelist -bh ${ASRC} > ${.TARGET}
-tc1.o: ${.CURDIR}/TEST/tc1.c
+tc1.o: ${EDITDIR}/TEST/tc1.c
test: tc1.o libedit.a ${DPADD} ${LIBTERMCAP}
${CC} ${CFLAGS} ${.ALLSRC} -o ${.TARGET} libedit.a ${LDADD}
diff --git a/lib/libedit/Makefile.depend b/lib/libedit/Makefile.depend
deleted file mode 100644
index 9b2a343de2dc..000000000000
--- a/lib/libedit/Makefile.depend
+++ /dev/null
@@ -1,18 +0,0 @@
-# $FreeBSD$
-# Autogenerated - do NOT edit!
-
-DIRDEPS = \
- gnu/lib/csu \
- include \
- include/xlocale \
- lib/${CSU_DIR} \
- lib/libc \
- lib/libcompiler_rt \
- lib/ncurses/ncursesw \
-
-
-.include <dirdeps.mk>
-
-.if ${DEP_RELDIR} == ${_DEP_RELDIR}
-# local dependencies - needed for -jN in clean tree
-.endif
diff --git a/lib/libedit/TEST/rl1.c b/lib/libedit/TEST/rl1.c
deleted file mode 100644
index 34befbe0244f..000000000000
--- a/lib/libedit/TEST/rl1.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: rl1.c,v 1.2 2016/02/29 00:54:19 christos Exp $ */
-
-/*-
- * Copyright (c) 2010 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Christos Zoulas.
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
- */
-
-#include <sys/cdefs.h>
-#if !defined(lint)
-__RCSID("$NetBSD: rl1.c,v 1.2 2016/02/29 00:54:19 christos Exp $");
-#endif /* not lint */
-__FBSDID("$FreeBSD$");
-
-/*
- * test.c: A little test program
- */
-#include <stdio.h>
-#include <readline/readline.h>
-
-int
-main(int argc, char *argv[])
-{
- char *p;
- while ((p = readline("hi$")) != NULL) {
- add_history(p);
- printf("%d %s\n", history_length, p);
- }
- return 0;
-}
diff --git a/lib/libedit/TEST/tc1.c b/lib/libedit/TEST/tc1.c
deleted file mode 100644
index 1dca81392755..000000000000
--- a/lib/libedit/TEST/tc1.c
+++ /dev/null
@@ -1,305 +0,0 @@
-/* $NetBSD: tc1.c,v 1.7 2016/02/17 19:47:49 christos Exp $ */
-
-/*-
- * 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.
- */
-
-#include "config.h"
-#ifndef lint
-__COPYRIGHT("@(#) Copyright (c) 1992, 1993\n\
- The Regents of the University of California. All rights reserved.\n");
-#endif /* not lint */
-
-#if !defined(lint) && !defined(SCCSID)
-#if 0
-static char sccsid[] = "@(#)test.c 8.1 (Berkeley) 6/4/93";
-#else
-__RCSID("$NetBSD: tc1.c,v 1.7 2016/02/17 19:47:49 christos Exp $");
-#endif
-#endif /* not lint && not SCCSID */
-__FBSDID("$FreeBSD$");
-
-/*
- * test.c: A little test program
- */
-#include <sys/wait.h>
-#include <ctype.h>
-#include <dirent.h>
-#include <locale.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "histedit.h"
-
-static int continuation = 0;
-volatile sig_atomic_t gotsig = 0;
-
-static unsigned char complete(EditLine *, int);
- int main(int, char **);
-static char *prompt(EditLine *);
-static void sig(int);
-
-static char *
-prompt(EditLine *el)
-{
- static char a[] = "\1\033[7m\1Edit$\1\033[0m\1 ";
- static char b[] = "Edit> ";
-
- return (continuation ? b : a);
-}
-
-static void
-sig(int i)
-{
- gotsig = i;
-}
-
-static unsigned char
-complete(EditLine *el, int ch)
-{
- DIR *dd = opendir(".");
- struct dirent *dp;
- const char* ptr;
- const LineInfo *lf = el_line(el);
- int len;
- int res = CC_ERROR;
-
- /*
- * Find the last word
- */
- for (ptr = lf->cursor - 1;
- !isspace((unsigned char)*ptr) && ptr > lf->buffer; ptr--)
- continue;
- len = lf->cursor - ++ptr;
-
- for (dp = readdir(dd); dp != NULL; dp = readdir(dd)) {
- if (len > strlen(dp->d_name))
- continue;
- if (strncmp(dp->d_name, ptr, len) == 0) {
- if (el_insertstr(el, &dp->d_name[len]) == -1)
- res = CC_ERROR;
- else
- res = CC_REFRESH;
- break;
- }
- }
-
- closedir(dd);
- return res;
-}
-
-int
-main(int argc, char *argv[])
-{
- EditLine *el = NULL;
- int num;
- const char *buf;
- Tokenizer *tok;
-#if 0
- int lastevent = 0;
-#endif
- int ncontinuation;
- History *hist;
- HistEvent ev;
-
- (void) setlocale(LC_CTYPE, "");
- (void) signal(SIGINT, sig);
- (void) signal(SIGQUIT, sig);
- (void) signal(SIGHUP, sig);
- (void) signal(SIGTERM, sig);
-
- hist = history_init(); /* Init the builtin history */
- /* Remember 100 events */
- history(hist, &ev, H_SETSIZE, 100);
-
- tok = tok_init(NULL); /* Initialize the tokenizer */
-
- /* Initialize editline */
- el = el_init(*argv, stdin, stdout, stderr);
-
- el_set(el, EL_EDITOR, "vi"); /* Default editor is vi */
- el_set(el, EL_SIGNAL, 1); /* Handle signals gracefully */
- el_set(el, EL_PROMPT_ESC, prompt, '\1');/* Set the prompt function */
-
- /* Tell editline to use this history interface */
- el_set(el, EL_HIST, history, hist);
-
- /* Add a user-defined function */
- el_set(el, EL_ADDFN, "ed-complete", "Complete argument", complete);
-
- /* Bind tab to it */
- el_set(el, EL_BIND, "^I", "ed-complete", NULL);
-
- /*
- * Bind j, k in vi command mode to previous and next line, instead
- * of previous and next history.
- */
- el_set(el, EL_BIND, "-a", "k", "ed-prev-line", NULL);
- el_set(el, EL_BIND, "-a", "j", "ed-next-line", NULL);
-
- /*
- * Source the user's defaults file.
- */
- el_source(el, NULL);
-
- while ((buf = el_gets(el, &num)) != NULL && num != 0) {
- int ac, cc, co;
-#ifdef DEBUG
- int i;
-#endif
- const char **av;
- const LineInfo *li;
- li = el_line(el);
-#ifdef DEBUG
- (void) fprintf(stderr, "==> got %d %s", num, buf);
- (void) fprintf(stderr, " > li `%.*s_%.*s'\n",
- (li->cursor - li->buffer), li->buffer,
- (li->lastchar - 1 - li->cursor),
- (li->cursor >= li->lastchar) ? "" : li->cursor);
-
-#endif
- if (gotsig) {
- (void) fprintf(stderr, "Got signal %d.\n", (int)gotsig);
- gotsig = 0;
- el_reset(el);
- }
-
- if (!continuation && num == 1)
- continue;
-
- ac = cc = co = 0;
- ncontinuation = tok_line(tok, li, &ac, &av, &cc, &co);
- if (ncontinuation < 0) {
- (void) fprintf(stderr, "Internal error\n");
- continuation = 0;
- continue;
- }
-#ifdef DEBUG
- (void) fprintf(stderr, " > nc %d ac %d cc %d co %d\n",
- ncontinuation, ac, cc, co);
-#endif
-#if 0
- if (continuation) {
- /*
- * Append to the right event in case the user
- * moved around in history.
- */
- if (history(hist, &ev, H_SET, lastevent) == -1)
- err(1, "%d: %s", lastevent, ev.str);
- history(hist, &ev, H_ADD , buf);
- } else {
- history(hist, &ev, H_ENTER, buf);
- lastevent = ev.num;
- }
-#else
- /* Simpler */
- history(hist, &ev, continuation ? H_APPEND : H_ENTER, buf);
-#endif
-
- continuation = ncontinuation;
- ncontinuation = 0;
- if (continuation)
- continue;
-#ifdef DEBUG
- for (i = 0; i < ac; i++) {
- (void) fprintf(stderr, " > arg# %2d ", i);
- if (i != cc)
- (void) fprintf(stderr, "`%s'\n", av[i]);
- else
- (void) fprintf(stderr, "`%.*s_%s'\n",
- co, av[i], av[i] + co);
- }
-#endif
-
- if (strcmp(av[0], "history") == 0) {
- int rv;
-
- switch (ac) {
- case 1:
- for (rv = history(hist, &ev, H_LAST); rv != -1;
- rv = history(hist, &ev, H_PREV))
- (void) fprintf(stdout, "%4d %s",
- ev.num, ev.str);
- break;
-
- case 2:
- if (strcmp(av[1], "clear") == 0)
- history(hist, &ev, H_CLEAR);
- else
- goto badhist;
- break;
-
- case 3:
- if (strcmp(av[1], "load") == 0)
- history(hist, &ev, H_LOAD, av[2]);
- else if (strcmp(av[1], "save") == 0)
- history(hist, &ev, H_SAVE, av[2]);
- break;
-
- badhist:
- default:
- (void) fprintf(stderr,
- "Bad history arguments\n");
- break;
- }
- } else if (el_parse(el, ac, av) == -1) {
- switch (fork()) {
- case 0:
- execvp(av[0], __DECONST(char **, av));
- perror(av[0]);
- _exit(1);
- /*NOTREACHED*/
- break;
-
- case -1:
- perror("fork");
- break;
-
- default:
- if (wait(&num) == -1)
- perror("wait");
- (void) fprintf(stderr, "Exit %x\n", num);
- break;
- }
- }
-
- tok_reset(tok);
- }
-
- el_end(el);
- tok_end(tok);
- history_end(hist);
-
- return (0);
-}
diff --git a/lib/libedit/TEST/wtc1.c b/lib/libedit/TEST/wtc1.c
deleted file mode 100644
index c4a237680866..000000000000
--- a/lib/libedit/TEST/wtc1.c
+++ /dev/null
@@ -1,284 +0,0 @@
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <stdio.h>
-#include <string.h>
-#include <signal.h>
-#include <sys/wait.h>
-#include <ctype.h>
-#include <dirent.h>
-#include <err.h>
-#include <limits.h>
-#include <locale.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "../histedit.h"
-
-
-static int continuation;
-volatile sig_atomic_t gotsig;
-static const char hfile[] = ".whistory";
-
-static wchar_t *
-prompt(EditLine *el)
-{
- static wchar_t a[] = L"\1\033[7m\1Edit$\1\033[0m\1 ";
- static wchar_t b[] = L"Edit> ";
-
- return continuation ? b : a;
-}
-
-
-static void
-sig(int i)
-{
- gotsig = i;
-}
-
-const char *
-my_wcstombs(const wchar_t *wstr)
-{
- static struct {
- char *str;
- int len;
- } buf;
-
- int needed = wcstombs(0, wstr, 0) + 1;
- if (needed > buf.len) {
- buf.str = malloc(needed);
- buf.len = needed;
- }
- wcstombs(buf.str, wstr, needed);
- buf.str[needed - 1] = 0;
-
- return buf.str;
-}
-
-
-static unsigned char
-complete(EditLine *el, int ch)
-{
- DIR *dd = opendir(".");
- struct dirent *dp;
- const wchar_t *ptr;
- char *buf, *bptr;
- const LineInfoW *lf = el_wline(el);
- int len, mblen, i;
- unsigned char res = 0;
- wchar_t dir[1024];
-
- /* Find the last word */
- for (ptr = lf->cursor -1; !iswspace(*ptr) && ptr > lf->buffer; --ptr)
- continue;
- len = lf->cursor - ++ptr;
-
- /* Convert last word to multibyte encoding, so we can compare to it */
- wctomb(NULL, 0); /* Reset shift state */
- mblen = MB_LEN_MAX * len + 1;
- buf = bptr = malloc(mblen);
- if (buf == NULL)
- err(1, "malloc");
- for (i = 0; i < len; ++i) {
- /* Note: really should test for -1 return from wctomb */
- bptr += wctomb(bptr, ptr[i]);
- }
- *bptr = 0; /* Terminate multibyte string */
- mblen = bptr - buf;
-
- /* Scan directory for matching name */
- for (dp = readdir(dd); dp != NULL; dp = readdir(dd)) {
- if (mblen > strlen(dp->d_name))
- continue;
- if (strncmp(dp->d_name, buf, mblen) == 0) {
- mbstowcs(dir, &dp->d_name[mblen],
- sizeof(dir) / sizeof(*dir));
- if (el_winsertstr(el, dir) == -1)
- res = CC_ERROR;
- else
- res = CC_REFRESH;
- break;
- }
- }
-
- closedir(dd);
- free(buf);
- return res;
-}
-
-
-int
-main(int argc, char *argv[])
-{
- EditLine *el = NULL;
- int numc, ncontinuation;
- const wchar_t *line;
- TokenizerW *tok;
- HistoryW *hist;
- HistEventW ev;
-#ifdef DEBUG
- int i;
-#endif
-
- setlocale(LC_ALL, "");
-
- (void)signal(SIGINT, sig);
- (void)signal(SIGQUIT, sig);
- (void)signal(SIGHUP, sig);
- (void)signal(SIGTERM, sig);
-
- hist = history_winit(); /* Init built-in history */
- history_w(hist, &ev, H_SETSIZE, 100); /* Remember 100 events */
- history_w(hist, &ev, H_LOAD, hfile);
-
- tok = tok_winit(NULL); /* Init the tokenizer */
-
- el = el_init(argv[0], stdin, stdout, stderr);
-
- el_wset(el, EL_EDITOR, L"vi"); /* Default editor is vi */
- el_wset(el, EL_SIGNAL, 1); /* Handle signals gracefully */
- el_wset(el, EL_PROMPT_ESC, prompt, '\1'); /* Set the prompt function */
-
- el_wset(el, EL_HIST, history_w, hist); /* FIXME - history_w? */
-
- /* Add a user-defined function */
- el_wset(el, EL_ADDFN, L"ed-complete", L"Complete argument", complete);
-
- /* Bind <tab> to it */
- el_wset(el, EL_BIND, L"^I", L"ed-complete", NULL);
-
- /*
- * Bind j, k in vi command mode to previous and next line, instead
- * of previous and next history.
- */
- el_wset(el, EL_BIND, L"-a", L"k", L"ed-prev-line", NULL);
- el_wset(el, EL_BIND, L"-a", L"j", L"ed-next-line", NULL);
-
- /* Source the user's defaults file. */
- el_source(el, NULL);
-
- while((line = el_wgets(el, &numc)) != NULL && numc != 0) {
- int ac, cc, co, rc;
- const wchar_t **av;
-
- const LineInfoW *li;
- li = el_wline(el);
-
-#ifdef DEBUG
- (void)fwprintf(stderr, L"==> got %d %ls", numc, line);
- (void)fwprintf(stderr, L" > li `%.*ls_%.*ls'\n",
- (li->cursor - li->buffer), li->buffer,
- (li->lastchar - 1 - li->cursor),
- (li->cursor >= li->lastchar) ? L"" : li->cursor);
-#endif
-
- if (gotsig) {
- (void)fprintf(stderr, "Got signal %d.\n", (int)gotsig);
- gotsig = 0;
- el_reset(el);
- }
-
- if(!continuation && numc == 1)
- continue; /* Only got a linefeed */
-
- ac = cc = co = 0;
- ncontinuation = tok_wline(tok, li, &ac, &av, &cc, &co);
- if (ncontinuation < 0) {
- (void) fprintf(stderr, "Internal error\n");
- continuation = 0;
- continue;
- }
-
-#ifdef DEBUG
- (void)fprintf(stderr, " > nc %d ac %d cc %d co %d\n",
- ncontinuation, ac, cc, co);
-#endif
- history_w(hist, &ev, continuation ? H_APPEND : H_ENTER, line);
-
- continuation = ncontinuation;
- ncontinuation = 0;
- if(continuation)
- continue;
-
-#ifdef DEBUG
- for (i = 0; i < ac; ++i) {
- (void)fwprintf(stderr, L" > arg# %2d ", i);
- if (i != cc)
- (void)fwprintf(stderr, L"`%ls'\n", av[i]);
- else
- (void)fwprintf(stderr, L"`%.*ls_%ls'\n",
- co, av[i], av[i] + co);
- }
-#endif
-
- if (wcscmp (av[0], L"history") == 0) {
- switch(ac) {
- case 1:
- for(rc = history_w(hist, &ev, H_LAST);
- rc != -1;
- rc = history_w(hist, &ev, H_PREV))
- (void)fwprintf(stdout, L"%4d %ls",
- ev.num, ev.str);
- break;
- case 2:
- if (wcscmp(av[1], L"clear") == 0)
- history_w(hist, &ev, H_CLEAR);
- else
- goto badhist;
- break;
- case 3:
- if (wcscmp(av[1], L"load") == 0)
- history_w(hist, &ev, H_LOAD,
- my_wcstombs(av[2]));
- else if (wcscmp(av[1], L"save") == 0)
- history_w(hist, &ev, H_SAVE,
- my_wcstombs(av[2]));
- else
- goto badhist;
- break;
- badhist:
- default:
- (void)fprintf(stderr,
- "Bad history arguments\n");
- break;
- }
- } else if (el_wparse(el, ac, av) == -1) {
- switch (fork()) {
- case 0: {
- Tokenizer *ntok = tok_init(NULL);
- int nargc;
- const char **nav;
- tok_str(ntok, my_wcstombs(line), &nargc, &nav);
- execvp(nav[0],(char **)nav);
- perror(nav[0]);
- _exit(1);
- /* NOTREACHED */
- break;
- }
- case -1:
- perror("fork");
- break;
- default:
- if (wait(&rc) == -1)
- perror("wait");
- (void)fprintf(stderr, "Exit %x\n", rc);
- break;
- }
- }
-
- tok_wreset(tok);
- }
-
- el_end(el);
- tok_wend(tok);
- history_w(hist, &ev, H_SAVE, hfile);
- history_wend(hist);
-
- fprintf(stdout, "\n");
- return 0;
-}
-
-
diff --git a/lib/libedit/chared.c b/lib/libedit/chared.c
deleted file mode 100644
index 9ec618e60cb5..000000000000
--- a/lib/libedit/chared.c
+++ /dev/null
@@ -1,777 +0,0 @@
-/* $NetBSD: chared.c,v 1.49 2016/02/24 14:29:21 christos Exp $ */
-
-/*-
- * 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.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-#if 0
-static char sccsid[] = "@(#)chared.c 8.1 (Berkeley) 6/4/93";
-#else
-__RCSID("$NetBSD: chared.c,v 1.49 2016/02/24 14:29:21 christos Exp $");
-#endif
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * chared.c: Character editor utilities
- */
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "el.h"
-#include "common.h"
-
-private void ch__clearmacro (EditLine *);
-
-/* value to leave unused in line buffer */
-#define EL_LEAVE 2
-
-/* cv_undo():
- * Handle state for the vi undo command
- */
-protected void
-cv_undo(EditLine *el)
-{
- c_undo_t *vu = &el->el_chared.c_undo;
- c_redo_t *r = &el->el_chared.c_redo;
- size_t size;
-
- /* Save entire line for undo */
- size = (size_t)(el->el_line.lastchar - el->el_line.buffer);
- vu->len = (ssize_t)size;
- vu->cursor = (int)(el->el_line.cursor - el->el_line.buffer);
- (void)memcpy(vu->buf, el->el_line.buffer, size * sizeof(*vu->buf));
-
- /* save command info for redo */
- r->count = el->el_state.doingarg ? el->el_state.argument : 0;
- r->action = el->el_chared.c_vcmd.action;
- r->pos = r->buf;
- r->cmd = el->el_state.thiscmd;
- r->ch = el->el_state.thisch;
-}
-
-/* cv_yank():
- * Save yank/delete data for paste
- */
-protected void
-cv_yank(EditLine *el, const Char *ptr, int size)
-{
- c_kill_t *k = &el->el_chared.c_kill;
-
- (void)memcpy(k->buf, ptr, (size_t)size * sizeof(*k->buf));
- k->last = k->buf + size;
-}
-
-
-/* c_insert():
- * Insert num characters
- */
-protected void
-c_insert(EditLine *el, int num)
-{
- Char *cp;
-
- if (el->el_line.lastchar + num >= el->el_line.limit) {
- if (!ch_enlargebufs(el, (size_t)num))
- return; /* can't go past end of buffer */
- }
-
- if (el->el_line.cursor < el->el_line.lastchar) {
- /* if I must move chars */
- for (cp = el->el_line.lastchar; cp >= el->el_line.cursor; cp--)
- cp[num] = *cp;
- }
- el->el_line.lastchar += num;
-}
-
-
-/* c_delafter():
- * Delete num characters after the cursor
- */
-protected void
-c_delafter(EditLine *el, int num)
-{
-
- if (el->el_line.cursor + num > el->el_line.lastchar)
- num = (int)(el->el_line.lastchar - el->el_line.cursor);
-
- if (el->el_map.current != el->el_map.emacs) {
- cv_undo(el);
- cv_yank(el, el->el_line.cursor, num);
- }
-
- if (num > 0) {
- Char *cp;
-
- for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++)
- *cp = cp[num];
-
- el->el_line.lastchar -= num;
- }
-}
-
-
-/* c_delafter1():
- * Delete the character after the cursor, do not yank
- */
-protected void
-c_delafter1(EditLine *el)
-{
- Char *cp;
-
- for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++)
- *cp = cp[1];
-
- el->el_line.lastchar--;
-}
-
-
-/* c_delbefore():
- * Delete num characters before the cursor
- */
-protected void
-c_delbefore(EditLine *el, int num)
-{
-
- if (el->el_line.cursor - num < el->el_line.buffer)
- num = (int)(el->el_line.cursor - el->el_line.buffer);
-
- if (el->el_map.current != el->el_map.emacs) {
- cv_undo(el);
- cv_yank(el, el->el_line.cursor - num, num);
- }
-
- if (num > 0) {
- Char *cp;
-
- for (cp = el->el_line.cursor - num;
- cp <= el->el_line.lastchar;
- cp++)
- *cp = cp[num];
-
- el->el_line.lastchar -= num;
- }
-}
-
-
-/* c_delbefore1():
- * Delete the character before the cursor, do not yank
- */
-protected void
-c_delbefore1(EditLine *el)
-{
- Char *cp;
-
- for (cp = el->el_line.cursor - 1; cp <= el->el_line.lastchar; cp++)
- *cp = cp[1];
-
- el->el_line.lastchar--;
-}
-
-
-/* ce__isword():
- * Return if p is part of a word according to emacs
- */
-protected int
-ce__isword(wint_t p)
-{
- return Isalnum(p) || Strchr(STR("*?_-.[]~="), p) != NULL;
-}
-
-
-/* cv__isword():
- * Return if p is part of a word according to vi
- */
-protected int
-cv__isword(wint_t p)
-{
- if (Isalnum(p) || p == '_')
- return 1;
- if (Isgraph(p))
- return 2;
- return 0;
-}
-
-
-/* cv__isWord():
- * Return if p is part of a big word according to vi
- */
-protected int
-cv__isWord(wint_t p)
-{
- return !Isspace(p);
-}
-
-
-/* c__prev_word():
- * Find the previous word
- */
-protected Char *
-c__prev_word(Char *p, Char *low, int n, int (*wtest)(wint_t))
-{
- p--;
-
- while (n--) {
- while ((p >= low) && !(*wtest)(*p))
- p--;
- while ((p >= low) && (*wtest)(*p))
- p--;
- }
-
- /* cp now points to one character before the word */
- p++;
- if (p < low)
- p = low;
- /* cp now points where we want it */
- return p;
-}
-
-
-/* c__next_word():
- * Find the next word
- */
-protected Char *
-c__next_word(Char *p, Char *high, int n, int (*wtest)(wint_t))
-{
- while (n--) {
- while ((p < high) && !(*wtest)(*p))
- p++;
- while ((p < high) && (*wtest)(*p))
- p++;
- }
- if (p > high)
- p = high;
- /* p now points where we want it */
- return p;
-}
-
-/* cv_next_word():
- * Find the next word vi style
- */
-protected Char *
-cv_next_word(EditLine *el, Char *p, Char *high, int n, int (*wtest)(wint_t))
-{
- int test;
-
- while (n--) {
- test = (*wtest)(*p);
- while ((p < high) && (*wtest)(*p) == test)
- p++;
- /*
- * vi historically deletes with cw only the word preserving the
- * trailing whitespace! This is not what 'w' does..
- */
- if (n || el->el_chared.c_vcmd.action != (DELETE|INSERT))
- while ((p < high) && Isspace(*p))
- p++;
- }
-
- /* p now points where we want it */
- if (p > high)
- return high;
- else
- return p;
-}
-
-
-/* cv_prev_word():
- * Find the previous word vi style
- */
-protected Char *
-cv_prev_word(Char *p, Char *low, int n, int (*wtest)(wint_t))
-{
- int test;
-
- p--;
- while (n--) {
- while ((p > low) && Isspace(*p))
- p--;
- test = (*wtest)(*p);
- while ((p >= low) && (*wtest)(*p) == test)
- p--;
- }
- p++;
-
- /* p now points where we want it */
- if (p < low)
- return low;
- else
- return p;
-}
-
-
-/* cv_delfini():
- * Finish vi delete action
- */
-protected void
-cv_delfini(EditLine *el)
-{
- int size;
- int action = el->el_chared.c_vcmd.action;
-
- if (action & INSERT)
- el->el_map.current = el->el_map.key;
-
- if (el->el_chared.c_vcmd.pos == 0)
- /* sanity */
- return;
-
- size = (int)(el->el_line.cursor - el->el_chared.c_vcmd.pos);
- if (size == 0)
- size = 1;
- el->el_line.cursor = el->el_chared.c_vcmd.pos;
- if (action & YANK) {
- if (size > 0)
- cv_yank(el, el->el_line.cursor, size);
- else
- cv_yank(el, el->el_line.cursor + size, -size);
- } else {
- if (size > 0) {
- c_delafter(el, size);
- re_refresh_cursor(el);
- } else {
- c_delbefore(el, -size);
- el->el_line.cursor += size;
- }
- }
- el->el_chared.c_vcmd.action = NOP;
-}
-
-
-/* cv__endword():
- * Go to the end of this word according to vi
- */
-protected Char *
-cv__endword(Char *p, Char *high, int n, int (*wtest)(wint_t))
-{
- int test;
-
- p++;
-
- while (n--) {
- while ((p < high) && Isspace(*p))
- p++;
-
- test = (*wtest)(*p);
- while ((p < high) && (*wtest)(*p) == test)
- p++;
- }
- p--;
- return p;
-}
-
-/* ch_init():
- * Initialize the character editor
- */
-protected int
-ch_init(EditLine *el)
-{
- c_macro_t *ma = &el->el_chared.c_macro;
-
- el->el_line.buffer = el_malloc(EL_BUFSIZ *
- sizeof(*el->el_line.buffer));
- if (el->el_line.buffer == NULL)
- return -1;
-
- (void) memset(el->el_line.buffer, 0, EL_BUFSIZ *
- sizeof(*el->el_line.buffer));
- el->el_line.cursor = el->el_line.buffer;
- el->el_line.lastchar = el->el_line.buffer;
- el->el_line.limit = &el->el_line.buffer[EL_BUFSIZ - EL_LEAVE];
-
- el->el_chared.c_undo.buf = el_malloc(EL_BUFSIZ *
- sizeof(*el->el_chared.c_undo.buf));
- if (el->el_chared.c_undo.buf == NULL)
- return -1;
- (void) memset(el->el_chared.c_undo.buf, 0, EL_BUFSIZ *
- sizeof(*el->el_chared.c_undo.buf));
- el->el_chared.c_undo.len = -1;
- el->el_chared.c_undo.cursor = 0;
- el->el_chared.c_redo.buf = el_malloc(EL_BUFSIZ *
- sizeof(*el->el_chared.c_redo.buf));
- if (el->el_chared.c_redo.buf == NULL)
- return -1;
- el->el_chared.c_redo.pos = el->el_chared.c_redo.buf;
- el->el_chared.c_redo.lim = el->el_chared.c_redo.buf + EL_BUFSIZ;
- el->el_chared.c_redo.cmd = ED_UNASSIGNED;
-
- el->el_chared.c_vcmd.action = NOP;
- el->el_chared.c_vcmd.pos = el->el_line.buffer;
-
- el->el_chared.c_kill.buf = el_malloc(EL_BUFSIZ *
- sizeof(*el->el_chared.c_kill.buf));
- if (el->el_chared.c_kill.buf == NULL)
- return -1;
- (void) memset(el->el_chared.c_kill.buf, 0, EL_BUFSIZ *
- sizeof(*el->el_chared.c_kill.buf));
- el->el_chared.c_kill.mark = el->el_line.buffer;
- el->el_chared.c_kill.last = el->el_chared.c_kill.buf;
- el->el_chared.c_resizefun = NULL;
- el->el_chared.c_resizearg = NULL;
- el->el_chared.c_aliasfun = NULL;
- el->el_chared.c_aliasarg = NULL;
-
- el->el_map.current = el->el_map.key;
-
- el->el_state.inputmode = MODE_INSERT; /* XXX: save a default */
- el->el_state.doingarg = 0;
- el->el_state.metanext = 0;
- el->el_state.argument = 1;
- el->el_state.lastcmd = ED_UNASSIGNED;
-
- ma->level = -1;
- ma->offset = 0;
- ma->macro = el_malloc(EL_MAXMACRO * sizeof(*ma->macro));
- if (ma->macro == NULL)
- return -1;
- return 0;
-}
-
-/* ch_reset():
- * Reset the character editor
- */
-protected void
-ch_reset(EditLine *el, int mclear)
-{
- el->el_line.cursor = el->el_line.buffer;
- el->el_line.lastchar = el->el_line.buffer;
-
- el->el_chared.c_undo.len = -1;
- el->el_chared.c_undo.cursor = 0;
-
- el->el_chared.c_vcmd.action = NOP;
- el->el_chared.c_vcmd.pos = el->el_line.buffer;
-
- el->el_chared.c_kill.mark = el->el_line.buffer;
-
- el->el_map.current = el->el_map.key;
-
- el->el_state.inputmode = MODE_INSERT; /* XXX: save a default */
- el->el_state.doingarg = 0;
- el->el_state.metanext = 0;
- el->el_state.argument = 1;
- el->el_state.lastcmd = ED_UNASSIGNED;
-
- el->el_history.eventno = 0;
-
- if (mclear)
- ch__clearmacro(el);
-}
-
-private void
-ch__clearmacro(EditLine *el)
-{
- c_macro_t *ma = &el->el_chared.c_macro;
- while (ma->level >= 0)
- el_free(ma->macro[ma->level--]);
-}
-
-/* ch_enlargebufs():
- * Enlarge line buffer to be able to hold twice as much characters.
- * Returns 1 if successful, 0 if not.
- */
-protected int
-ch_enlargebufs(EditLine *el, size_t addlen)
-{
- size_t sz, newsz;
- Char *newbuffer, *oldbuf, *oldkbuf;
-
- sz = (size_t)(el->el_line.limit - el->el_line.buffer + EL_LEAVE);
- newsz = sz * 2;
- /*
- * If newly required length is longer than current buffer, we need
- * to make the buffer big enough to hold both old and new stuff.
- */
- if (addlen > sz) {
- while(newsz - sz < addlen)
- newsz *= 2;
- }
-
- /*
- * Reallocate line buffer.
- */
- newbuffer = el_realloc(el->el_line.buffer, newsz * sizeof(*newbuffer));
- if (!newbuffer)
- return 0;
-
- /* zero the newly added memory, leave old data in */
- (void) memset(&newbuffer[sz], 0, (newsz - sz) * sizeof(*newbuffer));
-
- oldbuf = el->el_line.buffer;
-
- el->el_line.buffer = newbuffer;
- el->el_line.cursor = newbuffer + (el->el_line.cursor - oldbuf);
- el->el_line.lastchar = newbuffer + (el->el_line.lastchar - oldbuf);
- /* don't set new size until all buffers are enlarged */
- el->el_line.limit = &newbuffer[sz - EL_LEAVE];
-
- /*
- * Reallocate kill buffer.
- */
- newbuffer = el_realloc(el->el_chared.c_kill.buf, newsz *
- sizeof(*newbuffer));
- if (!newbuffer)
- return 0;
-
- /* zero the newly added memory, leave old data in */
- (void) memset(&newbuffer[sz], 0, (newsz - sz) * sizeof(*newbuffer));
-
- oldkbuf = el->el_chared.c_kill.buf;
-
- el->el_chared.c_kill.buf = newbuffer;
- el->el_chared.c_kill.last = newbuffer +
- (el->el_chared.c_kill.last - oldkbuf);
- el->el_chared.c_kill.mark = el->el_line.buffer +
- (el->el_chared.c_kill.mark - oldbuf);
-
- /*
- * Reallocate undo buffer.
- */
- newbuffer = el_realloc(el->el_chared.c_undo.buf,
- newsz * sizeof(*newbuffer));
- if (!newbuffer)
- return 0;
-
- /* zero the newly added memory, leave old data in */
- (void) memset(&newbuffer[sz], 0, (newsz - sz) * sizeof(*newbuffer));
- el->el_chared.c_undo.buf = newbuffer;
-
- newbuffer = el_realloc(el->el_chared.c_redo.buf,
- newsz * sizeof(*newbuffer));
- if (!newbuffer)
- return 0;
- el->el_chared.c_redo.pos = newbuffer +
- (el->el_chared.c_redo.pos - el->el_chared.c_redo.buf);
- el->el_chared.c_redo.lim = newbuffer +
- (el->el_chared.c_redo.lim - el->el_chared.c_redo.buf);
- el->el_chared.c_redo.buf = newbuffer;
-
- if (!hist_enlargebuf(el, sz, newsz))
- return 0;
-
- /* Safe to set enlarged buffer size */
- el->el_line.limit = &el->el_line.buffer[newsz - EL_LEAVE];
- if (el->el_chared.c_resizefun)
- (*el->el_chared.c_resizefun)(el, el->el_chared.c_resizearg);
- return 1;
-}
-
-/* ch_end():
- * Free the data structures used by the editor
- */
-protected void
-ch_end(EditLine *el)
-{
- el_free(el->el_line.buffer);
- el->el_line.buffer = NULL;
- el->el_line.limit = NULL;
- el_free(el->el_chared.c_undo.buf);
- el->el_chared.c_undo.buf = NULL;
- el_free(el->el_chared.c_redo.buf);
- el->el_chared.c_redo.buf = NULL;
- el->el_chared.c_redo.pos = NULL;
- el->el_chared.c_redo.lim = NULL;
- el->el_chared.c_redo.cmd = ED_UNASSIGNED;
- el_free(el->el_chared.c_kill.buf);
- el->el_chared.c_kill.buf = NULL;
- ch_reset(el, 1);
- el_free(el->el_chared.c_macro.macro);
- el->el_chared.c_macro.macro = NULL;
-}
-
-
-/* el_insertstr():
- * Insert string at cursorI
- */
-public int
-FUN(el,insertstr)(EditLine *el, const Char *s)
-{
- size_t len;
-
- if (s == NULL || (len = Strlen(s)) == 0)
- return -1;
- if (el->el_line.lastchar + len >= el->el_line.limit) {
- if (!ch_enlargebufs(el, len))
- return -1;
- }
-
- c_insert(el, (int)len);
- while (*s)
- *el->el_line.cursor++ = *s++;
- return 0;
-}
-
-
-/* el_deletestr():
- * Delete num characters before the cursor
- */
-public void
-el_deletestr(EditLine *el, int n)
-{
- if (n <= 0)
- return;
-
- if (el->el_line.cursor < &el->el_line.buffer[n])
- return;
-
- c_delbefore(el, n); /* delete before dot */
- el->el_line.cursor -= n;
- if (el->el_line.cursor < el->el_line.buffer)
- el->el_line.cursor = el->el_line.buffer;
-}
-
-/* el_cursor():
- * Move the cursor to the left or the right of the current position
- */
-public int
-el_cursor(EditLine *el, int n)
-{
- if (n == 0)
- goto out;
-
- el->el_line.cursor += n;
-
- if (el->el_line.cursor < el->el_line.buffer)
- el->el_line.cursor = el->el_line.buffer;
- if (el->el_line.cursor > el->el_line.lastchar)
- el->el_line.cursor = el->el_line.lastchar;
-out:
- return (int)(el->el_line.cursor - el->el_line.buffer);
-}
-
-/* c_gets():
- * Get a string
- */
-protected int
-c_gets(EditLine *el, Char *buf, const Char *prompt)
-{
- wchar_t wch;
- ssize_t len;
- Char *cp = el->el_line.buffer, ch;
-
- if (prompt) {
- len = (ssize_t)Strlen(prompt);
- (void)memcpy(cp, prompt, (size_t)len * sizeof(*cp));
- cp += len;
- }
- len = 0;
-
- for (;;) {
- el->el_line.cursor = cp;
- *cp = ' ';
- el->el_line.lastchar = cp + 1;
- re_refresh(el);
-
- if (el_wgetc(el, &wch) != 1) {
- ed_end_of_file(el, 0);
- len = -1;
- break;
- }
- ch = (Char)wch;
-
- switch (ch) {
-
- case L'\b': /* Delete and backspace */
- case 0177:
- if (len == 0) {
- len = -1;
- break;
- }
- len--;
- cp--;
- continue;
-
- case 0033: /* ESC */
- case L'\r': /* Newline */
- case L'\n':
- buf[len] = ch;
- break;
-
- default:
- if (len >= (ssize_t)(EL_BUFSIZ - 16))
- terminal_beep(el);
- else {
- buf[len++] = ch;
- *cp++ = ch;
- }
- continue;
- }
- break;
- }
-
- el->el_line.buffer[0] = '\0';
- el->el_line.lastchar = el->el_line.buffer;
- el->el_line.cursor = el->el_line.buffer;
- return (int)len;
-}
-
-
-/* c_hpos():
- * Return the current horizontal position of the cursor
- */
-protected int
-c_hpos(EditLine *el)
-{
- Char *ptr;
-
- /*
- * Find how many characters till the beginning of this line.
- */
- if (el->el_line.cursor == el->el_line.buffer)
- return 0;
- else {
- for (ptr = el->el_line.cursor - 1;
- ptr >= el->el_line.buffer && *ptr != '\n';
- ptr--)
- continue;
- return (int)(el->el_line.cursor - ptr - 1);
- }
-}
-
-protected int
-ch_resizefun(EditLine *el, el_zfunc_t f, void *a)
-{
- el->el_chared.c_resizefun = f;
- el->el_chared.c_resizearg = a;
- return 0;
-}
-
-protected int
-ch_aliasfun(EditLine *el, el_afunc_t f, void *a)
-{
- el->el_chared.c_aliasfun = f;
- el->el_chared.c_aliasarg = a;
- return 0;
-}
diff --git a/lib/libedit/chared.h b/lib/libedit/chared.h
deleted file mode 100644
index 458e67194bf8..000000000000
--- a/lib/libedit/chared.h
+++ /dev/null
@@ -1,165 +0,0 @@
-/* $NetBSD: chared.h,v 1.27 2016/02/16 22:53:14 christos Exp $ */
-
-/*-
- * 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.
- *
- * @(#)chared.h 8.1 (Berkeley) 6/4/93
- * $FreeBSD$
- */
-
-/*
- * el.chared.h: Character editor interface
- */
-#ifndef _h_el_chared
-#define _h_el_chared
-
-#define EL_MAXMACRO 10
-
-/*
- * This is an issue of basic "vi" look-and-feel. Defining VI_MOVE works
- * like real vi: i.e. the transition from command<->insert modes moves
- * the cursor.
- *
- * On the other hand we really don't want to move the cursor, because
- * all the editing commands don't include the character under the cursor.
- * Probably the best fix is to make all the editing commands aware of
- * this fact.
- */
-#define VI_MOVE
-
-
-typedef struct c_macro_t {
- int level;
- int offset;
- Char **macro;
-} c_macro_t;
-
-/*
- * Undo information for vi - no undo in emacs (yet)
- */
-typedef struct c_undo_t {
- ssize_t len; /* length of saved line */
- int cursor; /* position of saved cursor */
- Char *buf; /* full saved text */
-} c_undo_t;
-
-/* redo for vi */
-typedef struct c_redo_t {
- Char *buf; /* redo insert key sequence */
- Char *pos;
- Char *lim;
- el_action_t cmd; /* command to redo */
- Char ch; /* char that invoked it */
- int count;
- int action; /* from cv_action() */
-} c_redo_t;
-
-/*
- * Current action information for vi
- */
-typedef struct c_vcmd_t {
- int action;
- Char *pos;
-} c_vcmd_t;
-
-/*
- * Kill buffer for emacs
- */
-typedef struct c_kill_t {
- Char *buf;
- Char *last;
- Char *mark;
-} c_kill_t;
-
-typedef void (*el_zfunc_t)(EditLine *, void *);
-typedef const char *(*el_afunc_t)(void *, const char *);
-
-/*
- * Note that we use both data structures because the user can bind
- * commands from both editors!
- */
-typedef struct el_chared_t {
- c_undo_t c_undo;
- c_kill_t c_kill;
- c_redo_t c_redo;
- c_vcmd_t c_vcmd;
- c_macro_t c_macro;
- el_zfunc_t c_resizefun;
- el_afunc_t c_aliasfun;
- void * c_resizearg;
- void * c_aliasarg;
-} el_chared_t;
-
-
-#define STRQQ "\"\""
-
-#define isglob(a) (strchr("*[]?", (a)) != NULL)
-
-#define NOP 0x00
-#define DELETE 0x01
-#define INSERT 0x02
-#define YANK 0x04
-
-#define CHAR_FWD (+1)
-#define CHAR_BACK (-1)
-
-#define MODE_INSERT 0
-#define MODE_REPLACE 1
-#define MODE_REPLACE_1 2
-
-
-protected int cv__isword(wint_t);
-protected int cv__isWord(wint_t);
-protected void cv_delfini(EditLine *);
-protected Char *cv__endword(Char *, Char *, int, int (*)(wint_t));
-protected int ce__isword(wint_t);
-protected void cv_undo(EditLine *);
-protected void cv_yank(EditLine *, const Char *, int);
-protected Char *cv_next_word(EditLine*, Char *, Char *, int, int (*)(wint_t));
-protected Char *cv_prev_word(Char *, Char *, int, int (*)(wint_t));
-protected Char *c__next_word(Char *, Char *, int, int (*)(wint_t));
-protected Char *c__prev_word(Char *, Char *, int, int (*)(wint_t));
-protected void c_insert(EditLine *, int);
-protected void c_delbefore(EditLine *, int);
-protected void c_delbefore1(EditLine *);
-protected void c_delafter(EditLine *, int);
-protected void c_delafter1(EditLine *);
-protected int c_gets(EditLine *, Char *, const Char *);
-protected int c_hpos(EditLine *);
-
-protected int ch_init(EditLine *);
-protected void ch_reset(EditLine *, int);
-protected int ch_resizefun(EditLine *, el_zfunc_t, void *);
-protected int ch_aliasfun(EditLine *, el_afunc_t, void *);
-protected int ch_enlargebufs(EditLine *, size_t);
-protected void ch_end(EditLine *);
-
-#endif /* _h_el_chared */
diff --git a/lib/libedit/chartype.c b/lib/libedit/chartype.c
deleted file mode 100644
index 068a66a2b5cf..000000000000
--- a/lib/libedit/chartype.c
+++ /dev/null
@@ -1,384 +0,0 @@
-/* $NetBSD: chartype.c,v 1.23 2016/02/28 23:02:24 christos Exp $ */
-
-/*-
- * Copyright (c) 2009 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
- */
-
-/*
- * chartype.c: character classification and meta information
- */
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-__RCSID("$NetBSD: chartype.c,v 1.23 2016/02/28 23:02:24 christos Exp $");
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <ctype.h>
-#include <limits.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "el.h"
-
-#define CT_BUFSIZ ((size_t)1024)
-
-#ifdef WIDECHAR
-protected int
-ct_conv_cbuff_resize(ct_buffer_t *conv, size_t csize)
-{
- void *p;
-
- if (csize <= conv->csize)
- return 0;
-
- conv->csize = csize;
-
- p = el_realloc(conv->cbuff, conv->csize * sizeof(*conv->cbuff));
- if (p == NULL) {
- conv->csize = 0;
- el_free(conv->cbuff);
- conv->cbuff = NULL;
- return -1;
- }
- conv->cbuff = p;
- return 0;
-}
-
-protected int
-ct_conv_wbuff_resize(ct_buffer_t *conv, size_t wsize)
-{
- void *p;
-
- if (wsize <= conv->wsize)
- return 0;
-
- conv->wsize = wsize;
-
- p = el_realloc(conv->wbuff, conv->wsize * sizeof(*conv->wbuff));
- if (p == NULL) {
- conv->wsize = 0;
- el_free(conv->wbuff);
- conv->wbuff = NULL;
- return -1;
- }
- conv->wbuff = p;
- return 0;
-}
-
-
-public char *
-ct_encode_string(const Char *s, ct_buffer_t *conv)
-{
- char *dst;
- ssize_t used;
-
- if (!s)
- return NULL;
-
- dst = conv->cbuff;
- for (;;) {
- used = (ssize_t)(dst - conv->cbuff);
- if ((conv->csize - (size_t)used) < 5) {
- if (ct_conv_cbuff_resize(conv,
- conv->csize + CT_BUFSIZ) == -1)
- return NULL;
- dst = conv->cbuff + used;
- }
- if (!*s)
- break;
- used = ct_encode_char(dst, (size_t)5, *s);
- if (used == -1) /* failed to encode, need more buffer space */
- abort();
- ++s;
- dst += used;
- }
- *dst = '\0';
- return conv->cbuff;
-}
-
-public Char *
-ct_decode_string(const char *s, ct_buffer_t *conv)
-{
- size_t len;
-
- if (!s)
- return NULL;
-
- len = ct_mbstowcs(NULL, s, (size_t)0);
- if (len == (size_t)-1)
- return NULL;
-
- if (conv->wsize < ++len)
- if (ct_conv_wbuff_resize(conv, len + CT_BUFSIZ) == -1)
- return NULL;
-
- ct_mbstowcs(conv->wbuff, s, conv->wsize);
- return conv->wbuff;
-}
-
-
-protected Char **
-ct_decode_argv(int argc, const char *argv[], ct_buffer_t *conv)
-{
- size_t bufspace;
- int i;
- Char *p;
- Char **wargv;
- ssize_t bytes;
-
- /* Make sure we have enough space in the conversion buffer to store all
- * the argv strings. */
- for (i = 0, bufspace = 0; i < argc; ++i)
- bufspace += argv[i] ? strlen(argv[i]) + 1 : 0;
- if (conv->wsize < ++bufspace)
- if (ct_conv_wbuff_resize(conv, bufspace + CT_BUFSIZ) == -1)
- return NULL;
-
- wargv = el_malloc((size_t)(argc + 1) * sizeof(*wargv));
-
- for (i = 0, p = conv->wbuff; i < argc; ++i) {
- if (!argv[i]) { /* don't pass null pointers to mbstowcs */
- wargv[i] = NULL;
- continue;
- } else {
- wargv[i] = p;
- bytes = (ssize_t)mbstowcs(p, argv[i], bufspace);
- }
- if (bytes == -1) {
- el_free(wargv);
- return NULL;
- } else
- bytes++; /* include '\0' in the count */
- bufspace -= (size_t)bytes;
- p += bytes;
- }
- wargv[i] = NULL;
-
- return wargv;
-}
-
-
-protected size_t
-ct_enc_width(Char c)
-{
- mbstate_t ps = (mbstate_t){{0}};
- size_t len;
- char cbuf[MB_LEN_MAX];
- len = ct_wcrtomb(cbuf, c, &ps);
- if (len == (size_t)-1)
- return (0);
- return (len);
-}
-
-protected ssize_t
-ct_encode_char(char *dst, size_t len, Char c)
-{
- ssize_t l = 0;
- if (len < ct_enc_width(c))
- return -1;
- l = ct_wctomb(dst, c);
-
- if (l < 0) {
- ct_wctomb_reset;
- l = 0;
- }
- return l;
-}
-
-size_t
-ct_mbrtowc(wchar_t *wc, const char *s, size_t n)
-{
- mbstate_t mbs;
- /* This only works because UTF-8 is stateless */
- memset(&mbs, 0, sizeof(mbs));
- return mbrtowc(wc, s, n, &mbs);
-}
-
-#else
-
-size_t
-ct_mbrtowc(wchar_t *wc, const char *s, size_t n)
-{
- if (s == NULL)
- return 0;
- if (n == 0)
- return (size_t)-2;
- if (wc != NULL)
- *wc = *s;
- return *s != '\0';
-}
-#endif
-
-protected const Char *
-ct_visual_string(const Char *s)
-{
- static Char *buff = NULL;
- static size_t buffsize = 0;
- void *p;
- Char *dst;
- ssize_t used = 0;
-
- if (!s)
- return NULL;
- if (!buff) {
- buffsize = CT_BUFSIZ;
- buff = el_malloc(buffsize * sizeof(*buff));
- }
- dst = buff;
- while (*s) {
- used = ct_visual_char(dst, buffsize - (size_t)(dst - buff), *s);
- if (used == -1) { /* failed to encode, need more buffer space */
- used = dst - buff;
- buffsize += CT_BUFSIZ;
- p = el_realloc(buff, buffsize * sizeof(*buff));
- if (p == NULL)
- goto out;
- buff = p;
- dst = buff + used;
- /* don't increment s here - we want to retry it! */
- }
- else
- ++s;
- dst += used;
- }
- if (dst >= (buff + buffsize)) { /* sigh */
- buffsize += 1;
- p = el_realloc(buff, buffsize * sizeof(*buff));
- if (p == NULL)
- goto out;
- buff = p;
- dst = buff + buffsize - 1;
- }
- *dst = 0;
- return buff;
-out:
- el_free(buff);
- buffsize = 0;
- return NULL;
-}
-
-
-
-protected int
-ct_visual_width(Char c)
-{
- int t = ct_chr_class(c);
- switch (t) {
- case CHTYPE_ASCIICTL:
- return 2; /* ^@ ^? etc. */
- case CHTYPE_TAB:
- return 1; /* Hmm, this really need to be handled outside! */
- case CHTYPE_NL:
- return 0; /* Should this be 1 instead? */
-#ifdef WIDECHAR
- case CHTYPE_PRINT:
- return wcwidth(c);
- case CHTYPE_NONPRINT:
- if (c > 0xffff) /* prefer standard 4-byte display over 5-byte */
- return 8; /* \U+12345 */
- else
- return 7; /* \U+1234 */
-#else
- case CHTYPE_PRINT:
- return 1;
- case CHTYPE_NONPRINT:
- return 4; /* \123 */
-#endif
- default:
- return 0; /* should not happen */
- }
-}
-
-
-protected ssize_t
-ct_visual_char(Char *dst, size_t len, Char c)
-{
- int t = ct_chr_class(c);
- switch (t) {
- case CHTYPE_TAB:
- case CHTYPE_NL:
- case CHTYPE_ASCIICTL:
- if (len < 2)
- return -1; /* insufficient space */
- *dst++ = '^';
- if (c == '\177')
- *dst = '?'; /* DEL -> ^? */
- else
- *dst = c | 0100; /* uncontrolify it */
- return 2;
- case CHTYPE_PRINT:
- if (len < 1)
- return -1; /* insufficient space */
- *dst = c;
- return 1;
- case CHTYPE_NONPRINT:
- /* we only use single-width glyphs for display,
- * so this is right */
- if ((ssize_t)len < ct_visual_width(c))
- return -1; /* insufficient space */
-#ifdef WIDECHAR
- *dst++ = '\\';
- *dst++ = 'U';
- *dst++ = '+';
-#define tohexdigit(v) "0123456789ABCDEF"[v]
- if (c > 0xffff) /* prefer standard 4-byte display over 5-byte */
- *dst++ = tohexdigit(((unsigned int) c >> 16) & 0xf);
- *dst++ = tohexdigit(((unsigned int) c >> 12) & 0xf);
- *dst++ = tohexdigit(((unsigned int) c >> 8) & 0xf);
- *dst++ = tohexdigit(((unsigned int) c >> 4) & 0xf);
- *dst = tohexdigit(((unsigned int) c ) & 0xf);
- return c > 0xffff ? 8 : 7;
-#else
- *dst++ = '\\';
-#define tooctaldigit(v) (Char)((v) + '0')
- *dst++ = tooctaldigit(((unsigned int) c >> 6) & 0x7);
- *dst++ = tooctaldigit(((unsigned int) c >> 3) & 0x7);
- *dst++ = tooctaldigit(((unsigned int) c ) & 0x7);
-#endif
- /*FALLTHROUGH*/
- /* these two should be handled outside this function */
- default: /* we should never hit the default */
- return 0;
- }
-}
-
-
-
-
-protected int
-ct_chr_class(Char c)
-{
- if (c == '\t')
- return CHTYPE_TAB;
- else if (c == '\n')
- return CHTYPE_NL;
- else if (IsASCII(c) && Iscntrl(c))
- return CHTYPE_ASCIICTL;
- else if (Isprint(c))
- return CHTYPE_PRINT;
- else
- return CHTYPE_NONPRINT;
-}
diff --git a/lib/libedit/chartype.h b/lib/libedit/chartype.h
deleted file mode 100644
index 317740f0d404..000000000000
--- a/lib/libedit/chartype.h
+++ /dev/null
@@ -1,248 +0,0 @@
-/* $NetBSD: chartype.h,v 1.25 2016/03/07 00:05:20 christos Exp $ */
-
-/*-
- * Copyright (c) 2009 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
- *
- * $FreeBSD$
- */
-
-#ifndef _h_chartype_f
-#define _h_chartype_f
-
-
-#ifdef WIDECHAR
-
-/* Ideally we should also test the value of the define to see if it
- * supports non-BMP code points without requiring UTF-16, but nothing
- * seems to actually advertise this properly, despite Unicode 3.1 having
- * been around since 2001... */
-#if !defined(__NetBSD__) && !defined(__sun) && !(defined(__APPLE__) && defined(__MACH__)) && !defined(__OpenBSD__) && !defined(__FreeBSD__)
-#ifndef __STDC_ISO_10646__
-/* In many places it is assumed that the first 127 code points are ASCII
- * compatible, so ensure wchar_t indeed does ISO 10646 and not some other
- * funky encoding that could break us in weird and wonderful ways. */
- #error wchar_t must store ISO 10646 characters
-#endif
-#endif
-
-/* Oh for a <uchar.h> with char32_t and __STDC_UTF_32__ in it...
- * ref: ISO/IEC DTR 19769
- */
-#if WCHAR_MAX < INT32_MAX
-#warning Build environment does not support non-BMP characters
-#endif
-
-#define ct_wctob wctob
-#define ct_wctomb wctomb
-#define ct_wcrtomb wcrtomb
-#define ct_wctomb_reset wctomb(0,0)
-#define ct_wcstombs wcstombs
-#define ct_mbstowcs mbstowcs
-
-#define Char wchar_t
-#define FUN(prefix,rest) prefix ## _w ## rest
-#define FUNW(type) type ## _w
-#define TYPE(type) type ## W
-#define FSTR "%ls"
-#define FSTARSTR "%.*ls"
-#define STR(x) L ## x
-#define UC(c) c
-#define Isalpha(x) iswalpha(x)
-#define Isalnum(x) iswalnum(x)
-#define Isgraph(x) iswgraph(x)
-#define Isspace(x) iswspace(x)
-#define Isdigit(x) iswdigit(x)
-#define Iscntrl(x) iswcntrl(x)
-#define Isprint(x) iswprint(x)
-
-#define Isupper(x) iswupper(x)
-#define Islower(x) iswlower(x)
-#define Toupper(x) towupper(x)
-#define Tolower(x) towlower(x)
-
-#define IsASCII(x) (x < 0x100)
-
-#define Strlen(x) wcslen(x)
-#define Strchr(s,c) wcschr(s,c)
-#define Strrchr(s,c) wcsrchr(s,c)
-#define Strstr(s,v) wcsstr(s,v)
-#define Strdup(x) wcsdup(x)
-#define Strcpy(d,s) wcscpy(d,s)
-#define Strncpy(d,s,n) wcsncpy(d,s,n)
-#define Strncat(d,s,n) wcsncat(d,s,n)
-
-#define Strcmp(s,v) wcscmp(s,v)
-#define Strncmp(s,v,n) wcsncmp(s,v,n)
-#define Strcspn(s,r) wcscspn(s,r)
-
-#define Strtol(p,e,b) wcstol(p,e,b)
-
-static inline int
-Width(wchar_t c)
-{
- int w = wcwidth(c);
- return w < 0 ? 0 : w;
-}
-
-#else /* NARROW */
-
-#define ct_wctob(w) ((int)(w))
-#define ct_wctomb error
-#define ct_wcrtomb error
-#define ct_wctomb_reset
-#define ct_wcstombs(a, b, c) (strncpy(a, b, c), strlen(a))
-#define ct_mbstowcs(a, b, c) (strncpy(a, b, c), strlen(a))
-
-#define Char char
-#define FUN(prefix,rest) prefix ## _ ## rest
-#define FUNW(type) type
-#define TYPE(type) type
-#define FSTR "%s"
-#define FSTARSTR "%.*s"
-#define STR(x) x
-#define UC(c) (unsigned char)(c)
-
-#define Isalpha(x) isalpha((unsigned char)x)
-#define Isalnum(x) isalnum((unsigned char)x)
-#define Isgraph(x) isgraph((unsigned char)x)
-#define Isspace(x) isspace((unsigned char)x)
-#define Isdigit(x) isdigit((unsigned char)x)
-#define Iscntrl(x) iscntrl((unsigned char)x)
-#define Isprint(x) isprint((unsigned char)x)
-
-#define Isupper(x) isupper((unsigned char)x)
-#define Islower(x) islower((unsigned char)x)
-#define Toupper(x) toupper((unsigned char)x)
-#define Tolower(x) tolower((unsigned char)x)
-
-#define IsASCII(x) isascii((unsigned char)x)
-
-#define Strlen(x) strlen(x)
-#define Strchr(s,c) strchr(s,c)
-#define Strrchr(s,c) strrchr(s,c)
-#define Strstr(s,v) strstr(s,v)
-#define Strdup(x) strdup(x)
-#define Strcpy(d,s) strcpy(d,s)
-#define Strncpy(d,s,n) strncpy(d,s,n)
-#define Strncat(d,s,n) strncat(d,s,n)
-
-#define Strcmp(s,v) strcmp(s,v)
-#define Strncmp(s,v,n) strncmp(s,v,n)
-#define Strcspn(s,r) strcspn(s,r)
-
-#define Strtol(p,e,b) strtol(p,e,b)
-
-#define Width(c) 1
-
-#endif
-
-
-#ifdef WIDECHAR
-/*
- * Conversion buffer
- */
-typedef struct ct_buffer_t {
- char *cbuff;
- size_t csize;
- Char *wbuff;
- size_t wsize;
-} ct_buffer_t;
-
-#define ct_encode_string __ct_encode_string
-/* Encode a wide-character string and return the UTF-8 encoded result. */
-public char *ct_encode_string(const Char *, ct_buffer_t *);
-
-#define ct_decode_string __ct_decode_string
-/* Decode a (multi)?byte string and return the wide-character string result. */
-public Char *ct_decode_string(const char *, ct_buffer_t *);
-
-/* Decode a (multi)?byte argv string array.
- * The pointer returned must be free()d when done. */
-protected Char **ct_decode_argv(int, const char *[], ct_buffer_t *);
-
-/* Resizes the conversion buffer(s) if needed. */
-protected int ct_conv_cbuff_resize(ct_buffer_t *, size_t);
-protected int ct_conv_wbuff_resize(ct_buffer_t *, size_t);
-protected ssize_t ct_encode_char(char *, size_t, Char);
-protected size_t ct_enc_width(Char);
-
-#define ct_free_argv(s) el_free(s)
-
-#else
-#define ct_encode_string(s, b) (s)
-#define ct_decode_string(s, b) (s)
-#define ct_decode_argv(l, s, b) (s)
-#define ct_conv_cbuff_resize(b, s) ((s) == (0))
-#define ct_conv_wbuff_resize(b, s) ((s) == (0))
-#define ct_encode_char(d, l, s) (*d = s, 1)
-#define ct_free_argv(s)
-#endif
-
-#ifndef NARROWCHAR
-/* Encode a characted into the destination buffer, provided there is sufficient
- * buffer space available. Returns the number of bytes used up (zero if the
- * character cannot be encoded, -1 if there was not enough space available). */
-
-/* The maximum buffer size to hold the most unwieldy visual representation,
- * in this case \U+nnnnn. */
-#define VISUAL_WIDTH_MAX ((size_t)8)
-
-/* The terminal is thought of in terms of X columns by Y lines. In the cases
- * where a wide character takes up more than one column, the adjacent
- * occupied column entries will contain this faux character. */
-#define MB_FILL_CHAR ((Char)-1)
-
-/* Visual width of character c, taking into account ^? , \0177 and \U+nnnnn
- * style visual expansions. */
-protected int ct_visual_width(Char);
-
-/* Turn the given character into the appropriate visual format, matching
- * the width given by ct_visual_width(). Returns the number of characters used
- * up, or -1 if insufficient space. Buffer length is in count of Char's. */
-protected ssize_t ct_visual_char(Char *, size_t, Char);
-
-/* Convert the given string into visual format, using the ct_visual_char()
- * function. Uses a static buffer, so not threadsafe. */
-protected const Char *ct_visual_string(const Char *);
-
-
-/* printable character, use ct_visual_width() to find out display width */
-#define CHTYPE_PRINT ( 0)
-/* control character found inside the ASCII portion of the charset */
-#define CHTYPE_ASCIICTL (-1)
-/* a \t */
-#define CHTYPE_TAB (-2)
-/* a \n */
-#define CHTYPE_NL (-3)
-/* non-printable character */
-#define CHTYPE_NONPRINT (-4)
-/* classification of character c, as one of the above defines */
-protected int ct_chr_class(Char c);
-#endif
-
-size_t ct_mbrtowc(wchar_t *, const char *, size_t);
-
-
-#endif /* _chartype_f */
diff --git a/lib/libedit/common.c b/lib/libedit/common.c
deleted file mode 100644
index a2a971233c05..000000000000
--- a/lib/libedit/common.c
+++ /dev/null
@@ -1,925 +0,0 @@
-/* $NetBSD: common.c,v 1.40 2016/03/02 19:24:20 christos Exp $ */
-
-/*-
- * 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.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-#if 0
-static char sccsid[] = "@(#)common.c 8.1 (Berkeley) 6/4/93";
-#else
-__RCSID("$NetBSD: common.c,v 1.40 2016/03/02 19:24:20 christos Exp $");
-#endif
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * common.c: Common Editor functions
- */
-#include <ctype.h>
-#include <string.h>
-
-#include "el.h"
-#include "common.h"
-#include "parse.h"
-#include "vi.h"
-
-/* ed_end_of_file():
- * Indicate end of file
- * [^D]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_end_of_file(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- re_goto_bottom(el);
- *el->el_line.lastchar = '\0';
- return CC_EOF;
-}
-
-
-/* ed_insert():
- * Add character to the line
- * Insert a character [bound to all insert keys]
- */
-protected el_action_t
-ed_insert(EditLine *el, wint_t c)
-{
- int count = el->el_state.argument;
-
- if (c == '\0')
- return CC_ERROR;
-
- if (el->el_line.lastchar + el->el_state.argument >=
- el->el_line.limit) {
- /* end of buffer space, try to allocate more */
- if (!ch_enlargebufs(el, (size_t) count))
- return CC_ERROR; /* error allocating more */
- }
-
- if (count == 1) {
- if (el->el_state.inputmode == MODE_INSERT
- || el->el_line.cursor >= el->el_line.lastchar)
- c_insert(el, 1);
-
- *el->el_line.cursor++ = (Char)c;
- re_fastaddc(el); /* fast refresh for one char. */
- } else {
- if (el->el_state.inputmode != MODE_REPLACE_1)
- c_insert(el, el->el_state.argument);
-
- while (count-- && el->el_line.cursor < el->el_line.lastchar)
- *el->el_line.cursor++ = (Char)c;
- re_refresh(el);
- }
-
- if (el->el_state.inputmode == MODE_REPLACE_1)
- return vi_command_mode(el, 0);
-
- return CC_NORM;
-}
-
-
-/* ed_delete_prev_word():
- * Delete from beginning of current word to cursor
- * [M-^?] [^W]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_delete_prev_word(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- Char *cp, *p, *kp;
-
- if (el->el_line.cursor == el->el_line.buffer)
- return CC_ERROR;
-
- cp = c__prev_word(el->el_line.cursor, el->el_line.buffer,
- el->el_state.argument, ce__isword);
-
- for (p = cp, kp = el->el_chared.c_kill.buf; p < el->el_line.cursor; p++)
- *kp++ = *p;
- el->el_chared.c_kill.last = kp;
-
- c_delbefore(el, (int)(el->el_line.cursor - cp));/* delete before dot */
- el->el_line.cursor = cp;
- if (el->el_line.cursor < el->el_line.buffer)
- el->el_line.cursor = el->el_line.buffer; /* bounds check */
- return CC_REFRESH;
-}
-
-
-/* ed_delete_next_char():
- * Delete character under cursor
- * [^D] [x]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_delete_next_char(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-#ifdef DEBUG_EDIT
-#define EL el->el_line
- (void) fprintf(el->el_errfile,
- "\nD(b: %p(" FSTR ") c: %p(" FSTR ") last: %p(" FSTR
- ") limit: %p(" FSTR ")\n",
- EL.buffer, EL.buffer, EL.cursor, EL.cursor, EL.lastchar,
- EL.lastchar, EL.limit, EL.limit);
-#endif
- if (el->el_line.cursor == el->el_line.lastchar) {
- /* if I'm at the end */
- if (el->el_map.type == MAP_VI) {
- if (el->el_line.cursor == el->el_line.buffer) {
- /* if I'm also at the beginning */
-#ifdef KSHVI
- return CC_ERROR;
-#else
- /* then do an EOF */
- terminal_writec(el, c);
- return CC_EOF;
-#endif
- } else {
-#ifdef KSHVI
- el->el_line.cursor--;
-#else
- return CC_ERROR;
-#endif
- }
- } else
- return CC_ERROR;
- }
- c_delafter(el, el->el_state.argument); /* delete after dot */
- if (el->el_map.type == MAP_VI &&
- el->el_line.cursor >= el->el_line.lastchar &&
- el->el_line.cursor > el->el_line.buffer)
- /* bounds check */
- el->el_line.cursor = el->el_line.lastchar - 1;
- return CC_REFRESH;
-}
-
-
-/* ed_kill_line():
- * Cut to the end of line
- * [^K] [^K]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_kill_line(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- Char *kp, *cp;
-
- cp = el->el_line.cursor;
- kp = el->el_chared.c_kill.buf;
- while (cp < el->el_line.lastchar)
- *kp++ = *cp++; /* copy it */
- el->el_chared.c_kill.last = kp;
- /* zap! -- delete to end */
- el->el_line.lastchar = el->el_line.cursor;
- return CC_REFRESH;
-}
-
-
-/* ed_move_to_end():
- * Move cursor to the end of line
- * [^E] [^E]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_move_to_end(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- el->el_line.cursor = el->el_line.lastchar;
- if (el->el_map.type == MAP_VI) {
- if (el->el_chared.c_vcmd.action != NOP) {
- cv_delfini(el);
- return CC_REFRESH;
- }
-#ifdef VI_MOVE
- el->el_line.cursor--;
-#endif
- }
- return CC_CURSOR;
-}
-
-
-/* ed_move_to_beg():
- * Move cursor to the beginning of line
- * [^A] [^A]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_move_to_beg(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- el->el_line.cursor = el->el_line.buffer;
-
- if (el->el_map.type == MAP_VI) {
- /* We want FIRST non space character */
- while (Isspace(*el->el_line.cursor))
- el->el_line.cursor++;
- if (el->el_chared.c_vcmd.action != NOP) {
- cv_delfini(el);
- return CC_REFRESH;
- }
- }
- return CC_CURSOR;
-}
-
-
-/* ed_transpose_chars():
- * Exchange the character to the left of the cursor with the one under it
- * [^T] [^T]
- */
-protected el_action_t
-ed_transpose_chars(EditLine *el, wint_t c)
-{
-
- if (el->el_line.cursor < el->el_line.lastchar) {
- if (el->el_line.lastchar <= &el->el_line.buffer[1])
- return CC_ERROR;
- else
- el->el_line.cursor++;
- }
- if (el->el_line.cursor > &el->el_line.buffer[1]) {
- /* must have at least two chars entered */
- c = el->el_line.cursor[-2];
- el->el_line.cursor[-2] = el->el_line.cursor[-1];
- el->el_line.cursor[-1] = (Char)c;
- return CC_REFRESH;
- } else
- return CC_ERROR;
-}
-
-
-/* ed_next_char():
- * Move to the right one character
- * [^F] [^F]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_next_char(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- Char *lim = el->el_line.lastchar;
-
- if (el->el_line.cursor >= lim ||
- (el->el_line.cursor == lim - 1 &&
- el->el_map.type == MAP_VI &&
- el->el_chared.c_vcmd.action == NOP))
- return CC_ERROR;
-
- el->el_line.cursor += el->el_state.argument;
- if (el->el_line.cursor > lim)
- el->el_line.cursor = lim;
-
- if (el->el_map.type == MAP_VI)
- if (el->el_chared.c_vcmd.action != NOP) {
- cv_delfini(el);
- return CC_REFRESH;
- }
- return CC_CURSOR;
-}
-
-
-/* ed_prev_word():
- * Move to the beginning of the current word
- * [M-b] [b]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_prev_word(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- if (el->el_line.cursor == el->el_line.buffer)
- return CC_ERROR;
-
- el->el_line.cursor = c__prev_word(el->el_line.cursor,
- el->el_line.buffer,
- el->el_state.argument,
- ce__isword);
-
- if (el->el_map.type == MAP_VI)
- if (el->el_chared.c_vcmd.action != NOP) {
- cv_delfini(el);
- return CC_REFRESH;
- }
- return CC_CURSOR;
-}
-
-
-/* ed_prev_char():
- * Move to the left one character
- * [^B] [^B]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_prev_char(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- if (el->el_line.cursor > el->el_line.buffer) {
- el->el_line.cursor -= el->el_state.argument;
- if (el->el_line.cursor < el->el_line.buffer)
- el->el_line.cursor = el->el_line.buffer;
-
- if (el->el_map.type == MAP_VI)
- if (el->el_chared.c_vcmd.action != NOP) {
- cv_delfini(el);
- return CC_REFRESH;
- }
- return CC_CURSOR;
- } else
- return CC_ERROR;
-}
-
-
-/* ed_quoted_insert():
- * Add the next character typed verbatim
- * [^V] [^V]
- */
-protected el_action_t
-ed_quoted_insert(EditLine *el, wint_t c)
-{
- int num;
-
- tty_quotemode(el);
- num = el_wgetc(el, &c);
- tty_noquotemode(el);
- if (num == 1)
- return ed_insert(el, c);
- else
- return ed_end_of_file(el, 0);
-}
-
-
-/* ed_digit():
- * Adds to argument or enters a digit
- */
-protected el_action_t
-ed_digit(EditLine *el, wint_t c)
-{
-
- if (!Isdigit(c))
- return CC_ERROR;
-
- if (el->el_state.doingarg) {
- /* if doing an arg, add this in... */
- if (el->el_state.lastcmd == EM_UNIVERSAL_ARGUMENT)
- el->el_state.argument = c - '0';
- else {
- if (el->el_state.argument > 1000000)
- return CC_ERROR;
- el->el_state.argument =
- (el->el_state.argument * 10) + (c - '0');
- }
- return CC_ARGHACK;
- }
-
- return ed_insert(el, c);
-}
-
-
-/* ed_argument_digit():
- * Digit that starts argument
- * For ESC-n
- */
-protected el_action_t
-ed_argument_digit(EditLine *el, wint_t c)
-{
-
- if (!Isdigit(c))
- return CC_ERROR;
-
- if (el->el_state.doingarg) {
- if (el->el_state.argument > 1000000)
- return CC_ERROR;
- el->el_state.argument = (el->el_state.argument * 10) +
- (c - '0');
- } else { /* else starting an argument */
- el->el_state.argument = c - '0';
- el->el_state.doingarg = 1;
- }
- return CC_ARGHACK;
-}
-
-
-/* ed_unassigned():
- * Indicates unbound character
- * Bound to keys that are not assigned
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_unassigned(EditLine *el __attribute__((__unused__)),
- wint_t c __attribute__((__unused__)))
-{
-
- return CC_ERROR;
-}
-
-
-/**
- ** TTY key handling.
- **/
-
-/* ed_tty_sigint():
- * Tty interrupt character
- * [^C]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_tty_sigint(EditLine *el __attribute__((__unused__)),
- wint_t c __attribute__((__unused__)))
-{
-
- return CC_NORM;
-}
-
-
-/* ed_tty_dsusp():
- * Tty delayed suspend character
- * [^Y]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_tty_dsusp(EditLine *el __attribute__((__unused__)),
- wint_t c __attribute__((__unused__)))
-{
-
- return CC_NORM;
-}
-
-
-/* ed_tty_flush_output():
- * Tty flush output characters
- * [^O]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_tty_flush_output(EditLine *el __attribute__((__unused__)),
- wint_t c __attribute__((__unused__)))
-{
-
- return CC_NORM;
-}
-
-
-/* ed_tty_sigquit():
- * Tty quit character
- * [^\]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_tty_sigquit(EditLine *el __attribute__((__unused__)),
- wint_t c __attribute__((__unused__)))
-{
-
- return CC_NORM;
-}
-
-
-/* ed_tty_sigtstp():
- * Tty suspend character
- * [^Z]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_tty_sigtstp(EditLine *el __attribute__((__unused__)),
- wint_t c __attribute__((__unused__)))
-{
-
- return CC_NORM;
-}
-
-
-/* ed_tty_stop_output():
- * Tty disallow output characters
- * [^S]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_tty_stop_output(EditLine *el __attribute__((__unused__)),
- wint_t c __attribute__((__unused__)))
-{
-
- return CC_NORM;
-}
-
-
-/* ed_tty_start_output():
- * Tty allow output characters
- * [^Q]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_tty_start_output(EditLine *el __attribute__((__unused__)),
- wint_t c __attribute__((__unused__)))
-{
-
- return CC_NORM;
-}
-
-
-/* ed_newline():
- * Execute command
- * [^J]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_newline(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- re_goto_bottom(el);
- *el->el_line.lastchar++ = '\n';
- *el->el_line.lastchar = '\0';
- return CC_NEWLINE;
-}
-
-
-/* ed_delete_prev_char():
- * Delete the character to the left of the cursor
- * [^?]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_delete_prev_char(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- if (el->el_line.cursor <= el->el_line.buffer)
- return CC_ERROR;
-
- c_delbefore(el, el->el_state.argument);
- el->el_line.cursor -= el->el_state.argument;
- if (el->el_line.cursor < el->el_line.buffer)
- el->el_line.cursor = el->el_line.buffer;
- return CC_REFRESH;
-}
-
-
-/* ed_clear_screen():
- * Clear screen leaving current line at the top
- * [^L]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_clear_screen(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- terminal_clear_screen(el); /* clear the whole real screen */
- re_clear_display(el); /* reset everything */
- return CC_REFRESH;
-}
-
-
-/* ed_redisplay():
- * Redisplay everything
- * ^R
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_redisplay(EditLine *el __attribute__((__unused__)),
- wint_t c __attribute__((__unused__)))
-{
-
- return CC_REDISPLAY;
-}
-
-
-/* ed_start_over():
- * Erase current line and start from scratch
- * [^G]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_start_over(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- ch_reset(el, 0);
- return CC_REFRESH;
-}
-
-
-/* ed_sequence_lead_in():
- * First character in a bound sequence
- * Placeholder for external keys
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_sequence_lead_in(EditLine *el __attribute__((__unused__)),
- wint_t c __attribute__((__unused__)))
-{
-
- return CC_NORM;
-}
-
-
-/* ed_prev_history():
- * Move to the previous history line
- * [^P] [k]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_prev_history(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- char beep = 0;
- int sv_event = el->el_history.eventno;
-
- el->el_chared.c_undo.len = -1;
- *el->el_line.lastchar = '\0'; /* just in case */
-
- if (el->el_history.eventno == 0) { /* save the current buffer
- * away */
- (void) Strncpy(el->el_history.buf, el->el_line.buffer,
- EL_BUFSIZ);
- el->el_history.last = el->el_history.buf +
- (el->el_line.lastchar - el->el_line.buffer);
- }
- el->el_history.eventno += el->el_state.argument;
-
- if (hist_get(el) == CC_ERROR) {
- if (el->el_map.type == MAP_VI) {
- el->el_history.eventno = sv_event;
- }
- beep = 1;
- /* el->el_history.eventno was fixed by first call */
- (void) hist_get(el);
- }
- if (beep)
- return CC_REFRESH_BEEP;
- return CC_REFRESH;
-}
-
-
-/* ed_next_history():
- * Move to the next history line
- * [^N] [j]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_next_history(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- el_action_t beep = CC_REFRESH, rval;
-
- el->el_chared.c_undo.len = -1;
- *el->el_line.lastchar = '\0'; /* just in case */
-
- el->el_history.eventno -= el->el_state.argument;
-
- if (el->el_history.eventno < 0) {
- el->el_history.eventno = 0;
- beep = CC_REFRESH_BEEP;
- }
- rval = hist_get(el);
- if (rval == CC_REFRESH)
- return beep;
- return rval;
-
-}
-
-
-/* ed_search_prev_history():
- * Search previous in history for a line matching the current
- * next search history [M-P] [K]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_search_prev_history(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- const Char *hp;
- int h;
- int found = 0;
-
- el->el_chared.c_vcmd.action = NOP;
- el->el_chared.c_undo.len = -1;
- *el->el_line.lastchar = '\0'; /* just in case */
- if (el->el_history.eventno < 0) {
-#ifdef DEBUG_EDIT
- (void) fprintf(el->el_errfile,
- "e_prev_search_hist(): eventno < 0;\n");
-#endif
- el->el_history.eventno = 0;
- return CC_ERROR;
- }
- if (el->el_history.eventno == 0) {
- (void) Strncpy(el->el_history.buf, el->el_line.buffer,
- EL_BUFSIZ);
- el->el_history.last = el->el_history.buf +
- (el->el_line.lastchar - el->el_line.buffer);
- }
- if (el->el_history.ref == NULL)
- return CC_ERROR;
-
- hp = HIST_FIRST(el);
- if (hp == NULL)
- return CC_ERROR;
-
- c_setpat(el); /* Set search pattern !! */
-
- for (h = 1; h <= el->el_history.eventno; h++)
- hp = HIST_NEXT(el);
-
- while (hp != NULL) {
-#ifdef SDEBUG
- (void) fprintf(el->el_errfile, "Comparing with \"%s\"\n", hp);
-#endif
- if ((Strncmp(hp, el->el_line.buffer, (size_t)
- (el->el_line.lastchar - el->el_line.buffer)) ||
- hp[el->el_line.lastchar - el->el_line.buffer]) &&
- c_hmatch(el, hp)) {
- found = 1;
- break;
- }
- h++;
- hp = HIST_NEXT(el);
- }
-
- if (!found) {
-#ifdef SDEBUG
- (void) fprintf(el->el_errfile, "not found\n");
-#endif
- return CC_ERROR;
- }
- el->el_history.eventno = h;
-
- return hist_get(el);
-}
-
-
-/* ed_search_next_history():
- * Search next in history for a line matching the current
- * [M-N] [J]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_search_next_history(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- const Char *hp;
- int h;
- int found = 0;
-
- el->el_chared.c_vcmd.action = NOP;
- el->el_chared.c_undo.len = -1;
- *el->el_line.lastchar = '\0'; /* just in case */
-
- if (el->el_history.eventno == 0)
- return CC_ERROR;
-
- if (el->el_history.ref == NULL)
- return CC_ERROR;
-
- hp = HIST_FIRST(el);
- if (hp == NULL)
- return CC_ERROR;
-
- c_setpat(el); /* Set search pattern !! */
-
- for (h = 1; h < el->el_history.eventno && hp; h++) {
-#ifdef SDEBUG
- (void) fprintf(el->el_errfile, "Comparing with \"%s\"\n", hp);
-#endif
- if ((Strncmp(hp, el->el_line.buffer, (size_t)
- (el->el_line.lastchar - el->el_line.buffer)) ||
- hp[el->el_line.lastchar - el->el_line.buffer]) &&
- c_hmatch(el, hp))
- found = h;
- hp = HIST_NEXT(el);
- }
-
- if (!found) { /* is it the current history number? */
- if (!c_hmatch(el, el->el_history.buf)) {
-#ifdef SDEBUG
- (void) fprintf(el->el_errfile, "not found\n");
-#endif
- return CC_ERROR;
- }
- }
- el->el_history.eventno = found;
-
- return hist_get(el);
-}
-
-
-/* ed_prev_line():
- * Move up one line
- * Could be [k] [^p]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_prev_line(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- Char *ptr;
- int nchars = c_hpos(el);
-
- /*
- * Move to the line requested
- */
- if (*(ptr = el->el_line.cursor) == '\n')
- ptr--;
-
- for (; ptr >= el->el_line.buffer; ptr--)
- if (*ptr == '\n' && --el->el_state.argument <= 0)
- break;
-
- if (el->el_state.argument > 0)
- return CC_ERROR;
-
- /*
- * Move to the beginning of the line
- */
- for (ptr--; ptr >= el->el_line.buffer && *ptr != '\n'; ptr--)
- continue;
-
- /*
- * Move to the character requested
- */
- for (ptr++;
- nchars-- > 0 && ptr < el->el_line.lastchar && *ptr != '\n';
- ptr++)
- continue;
-
- el->el_line.cursor = ptr;
- return CC_CURSOR;
-}
-
-
-/* ed_next_line():
- * Move down one line
- * Could be [j] [^n]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_next_line(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- Char *ptr;
- int nchars = c_hpos(el);
-
- /*
- * Move to the line requested
- */
- for (ptr = el->el_line.cursor; ptr < el->el_line.lastchar; ptr++)
- if (*ptr == '\n' && --el->el_state.argument <= 0)
- break;
-
- if (el->el_state.argument > 0)
- return CC_ERROR;
-
- /*
- * Move to the character requested
- */
- for (ptr++;
- nchars-- > 0 && ptr < el->el_line.lastchar && *ptr != '\n';
- ptr++)
- continue;
-
- el->el_line.cursor = ptr;
- return CC_CURSOR;
-}
-
-
-/* ed_command():
- * Editline extended command
- * [M-X] [:]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_command(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- Char tmpbuf[EL_BUFSIZ];
- int tmplen;
-
- tmplen = c_gets(el, tmpbuf, STR("\n: "));
- terminal__putc(el, '\n');
-
- if (tmplen < 0 || (tmpbuf[tmplen] = 0, parse_line(el, tmpbuf)) == -1)
- terminal_beep(el);
-
- el->el_map.current = el->el_map.key;
- re_clear_display(el);
- return CC_REFRESH;
-}
diff --git a/lib/libedit/config.h b/lib/libedit/config.h
deleted file mode 100644
index ccc2855a90e6..000000000000
--- a/lib/libedit/config.h
+++ /dev/null
@@ -1,290 +0,0 @@
-/* $FreeBSD$ */
-/* config.h. Generated from config.h.in by configure. */
-/* config.h.in. Generated from configure.ac by autoheader. */
-
-/* Define to 1 if the `closedir' function returns void instead of `int'. */
-/* #undef CLOSEDIR_VOID */
-
-/* Define to 1 if you have the <curses.h> header file. */
-#define HAVE_CURSES_H 1
-
-/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
- */
-#define HAVE_DIRENT_H 1
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#define HAVE_DLFCN_H 1
-
-/* Define to 1 if you have the `endpwent' function. */
-#define HAVE_ENDPWENT 1
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#define HAVE_FCNTL_H 1
-
-/* Define to 1 if you have the `getline' function. */
-#define HAVE_GETLINE 1
-
-/* Define to 1 if you have the `fork' function. */
-#define HAVE_FORK 1
-
-/* Define to 1 if you have getpwnam_r and getpwuid_r that are draft POSIX.1
- versions. */
-/* #undef HAVE_GETPW_R_DRAFT */
-
-/* Define to 1 if you have getpwnam_r and getpwuid_r that are POSIX.1
- compatible. */
-#define HAVE_GETPW_R_POSIX 1
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
-/* Define to 1 if you have the `isascii' function. */
-#define HAVE_ISASCII 1
-
-/* Define to 1 if you have the `issetugid' function. */
-#define HAVE_ISSETUGID 1
-
-/* Define to 1 if you have the `curses' library (-lcurses). */
-/* #undef HAVE_LIBCURSES */
-
-/* Define to 1 if you have the `ncurses' library (-lncurses). */
-#define HAVE_LIBNCURSES 1
-
-/* Define to 1 if you have the `termcap' library (-ltermcap). */
-/* #undef HAVE_LIBTERMCAP */
-
-/* Define to 1 if you have the `terminfo' library (-lterminfo). */
-/* #undef HAVE_LIBTERMINFO */
-
-/* Define to 1 if you have the `termlib' library (-ltermlib). */
-/* #undef HAVE_LIBTERMLIB */
-
-/* Define to 1 if you have the <limits.h> header file. */
-#define HAVE_LIMITS_H 1
-
-/* Define to 1 if you have the <malloc.h> header file. */
-#define HAVE_MALLOC_H 1
-
-/* Define to 1 if you have the `memchr' function. */
-#define HAVE_MEMCHR 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the `memset' function. */
-#define HAVE_MEMSET 1
-
-/* Define to 1 if you have the <ncurses.h> header file. */
-#define HAVE_NCURSES_H 1
-
-/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
-/* #undef HAVE_NDIR_H */
-
-/* Define to 1 if you have the `regcomp' function. */
-#define HAVE_REGCOMP 1
-
-/* Define to 1 if you have the `re_comp' function. */
-/* #undef HAVE_RE_COMP */
-
-/* Define to 1 if `stat' has the bug that it succeeds when given the
- zero-length file name argument. */
-/* #undef HAVE_STAT_EMPTY_STRING_BUG */
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the `strcasecmp' function. */
-#define HAVE_STRCASECMP 1
-
-/* Define to 1 if you have the `strchr' function. */
-#define HAVE_STRCHR 1
-
-/* Define to 1 if you have the `strcspn' function. */
-#define HAVE_STRCSPN 1
-
-/* Define to 1 if you have the `strdup' function. */
-#define HAVE_STRDUP 1
-
-/* Define to 1 if you have the `strerror' function. */
-#define HAVE_STRERROR 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the `strlcat' function. */
-#define HAVE_STRLCAT 1
-
-/* Define to 1 if you have the `strlcpy' function. */
-#define HAVE_STRLCPY 1
-
-/* Define to 1 if you have the `strrchr' function. */
-#define HAVE_STRRCHR 1
-
-/* Define to 1 if you have the `strstr' function. */
-#define HAVE_STRSTR 1
-
-/* Define to 1 if you have the `strtol' function. */
-#define HAVE_STRTOL 1
-
-/* Define to 1 if struct dirent has member d_namlen */
-#define HAVE_STRUCT_DIRENT_D_NAMLEN 1
-
-/* Define to 1 if you have the `strunvis' function. */
-#define HAVE_STRUNVIS 1
-
-/* Define to 1 if you have the `strvis' function. */
-#define HAVE_STRVIS 1
-
-/* Define to 1 if you have the <sys/cdefs.h> header file. */
-#define HAVE_SYS_CDEFS_H 1
-
-/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
- */
-/* #undef HAVE_SYS_DIR_H */
-
-/* Define to 1 if you have the <sys/ioctl.h> header file. */
-#define HAVE_SYS_IOCTL_H 1
-
-/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
- */
-/* #undef HAVE_SYS_NDIR_H */
-
-/* Define to 1 if you have the <sys/param.h> header file. */
-#define HAVE_SYS_PARAM_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
-#define HAVE_SYS_WAIT_H 1
-
-/* Define to 1 if you have the <termcap.h> header file. */
-#define HAVE_TERMCAP_H 1
-
-/* Define to 1 if you have the <term.h> header file. */
-#define HAVE_TERM_H 1
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
-
-/* Define to 1 if the system has the type `u_int32_t'. */
-#define HAVE_U_INT32_T 1
-
-/* Define to 1 if you have the `vfork' function. */
-#define HAVE_VFORK 1
-
-/* Define to 1 if you have the <vfork.h> header file. */
-/* #undef HAVE_VFORK_H */
-
-/* Define to 1 if you have the `vis' function. */
-#define HAVE_VIS 1
-
-/* Define to 1 if `fork' works. */
-#define HAVE_WORKING_FORK 1
-
-/* Define to 1 if `vfork' works. */
-#define HAVE_WORKING_VFORK 1
-
-/* Define to 1 if `lstat' dereferences a symlink specified with a trailing
- slash. */
-#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
- */
-#define LT_OBJDIR ".libs/"
-
-/* Name of package */
-#define PACKAGE "libedit-20110729"
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT ""
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "libedit"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "libedit 3.0"
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "libedit-20110729"
-
-/* Define to the home page for this package. */
-#define PACKAGE_URL ""
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "3.0"
-
-/* Define as the return type of signal handlers (`int' or `void'). */
-#define RETSIGTYPE void
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Enable extensions on AIX 3, Interix. */
-#ifndef _ALL_SOURCE
-# define _ALL_SOURCE 1
-#endif
-/* Enable GNU extensions on systems that have them. */
-#ifndef _GNU_SOURCE
-# define _GNU_SOURCE 1
-#endif
-/* Enable threading extensions on Solaris. */
-#ifndef _POSIX_PTHREAD_SEMANTICS
-# define _POSIX_PTHREAD_SEMANTICS 1
-#endif
-/* Enable extensions on HP NonStop. */
-#ifndef _TANDEM_SOURCE
-# define _TANDEM_SOURCE 1
-#endif
-/* Enable general extensions on Solaris. */
-#ifndef __EXTENSIONS__
-# define __EXTENSIONS__ 1
-#endif
-
-
-/* Version number of package */
-#define VERSION "3.0"
-
-/* Define to 1 if the system provides the SIZE_MAX constant */
-#define HAVE_SIZE_MAX 1
-
-/* Define to 1 if you want wide-character code */
-/* #undef WIDECHAR */
-
-/* Define to 1 if on MINIX. */
-/* #undef _MINIX */
-
-/* Define to 2 if the system does not provide POSIX.1 features except with
- this defined. */
-/* #undef _POSIX_1_SOURCE */
-
-/* Define to 1 if you need to in order for `stat' and other things to work. */
-/* #undef _POSIX_SOURCE */
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #undef const */
-
-/* Define to `int' if <sys/types.h> does not define. */
-/* #undef pid_t */
-
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-/* #undef size_t */
-
-/* Define as `fork' if `vfork' does not work. */
-/* #undef vfork */
-
-
-#include "sys.h"
-#undef SCCSID
-#undef LIBC_SCCS
-#undef lint
-#undef SIZE_T_MAX
diff --git a/lib/libedit/edit/readline/Makefile.depend b/lib/libedit/edit/readline/Makefile.depend
deleted file mode 100644
index f80275d86ab1..000000000000
--- a/lib/libedit/edit/readline/Makefile.depend
+++ /dev/null
@@ -1,11 +0,0 @@
-# $FreeBSD$
-# Autogenerated - do NOT edit!
-
-DIRDEPS = \
-
-
-.include <dirdeps.mk>
-
-.if ${DEP_RELDIR} == ${_DEP_RELDIR}
-# local dependencies - needed for -jN in clean tree
-.endif
diff --git a/lib/libedit/edit/readline/readline.h b/lib/libedit/edit/readline/readline.h
deleted file mode 100644
index 34ded0f9428e..000000000000
--- a/lib/libedit/edit/readline/readline.h
+++ /dev/null
@@ -1,227 +0,0 @@
-/* $NetBSD: readline.h,v 1.39 2016/02/17 19:47:49 christos Exp $ */
-
-/*-
- * Copyright (c) 1997 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Jaromir Dolecek.
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
- *
- * $FreeBSD$
- */
-#ifndef _READLINE_H_
-#define _READLINE_H_
-
-#include <sys/types.h>
-#include <stdio.h>
-
-/* list of readline stuff supported by editline library's readline wrapper */
-
-/* typedefs */
-typedef int Function(const char *, int);
-typedef void VFunction(void);
-typedef void rl_vcpfunc_t(char *);
-typedef char **rl_completion_func_t(const char *, int, int);
-typedef char *rl_compentry_func_t(const char *, int);
-typedef int rl_command_func_t(int, int);
-
-/* only supports length */
-typedef struct {
- int length;
-} HISTORY_STATE;
-
-typedef void *histdata_t;
-
-typedef struct _hist_entry {
- const char *line;
- histdata_t data;
-} HIST_ENTRY;
-
-typedef struct _keymap_entry {
- char type;
-#define ISFUNC 0
-#define ISKMAP 1
-#define ISMACR 2
- Function *function;
-} KEYMAP_ENTRY;
-
-#define KEYMAP_SIZE 256
-
-typedef KEYMAP_ENTRY KEYMAP_ENTRY_ARRAY[KEYMAP_SIZE];
-typedef KEYMAP_ENTRY *Keymap;
-
-#define control_character_threshold 0x20
-#define control_character_bit 0x40
-
-#ifndef CTRL
-#include <sys/ioctl.h>
-#if !defined(__sun) && !defined(__hpux) && !defined(_AIX)
-#include <sys/ttydefaults.h>
-#endif
-#ifndef CTRL
-#define CTRL(c) ((c) & 037)
-#endif
-#endif
-#ifndef UNCTRL
-#define UNCTRL(c) (((c) - 'a' + 'A')|control_character_bit)
-#endif
-
-#define RUBOUT 0x7f
-#define ABORT_CHAR CTRL('G')
-#define RL_READLINE_VERSION 0x0402
-#define RL_PROMPT_START_IGNORE '\1'
-#define RL_PROMPT_END_IGNORE '\2'
-
-/* global variables used by readline enabled applications */
-#ifdef __cplusplus
-extern "C" {
-#endif
-extern const char *rl_library_version;
-extern int rl_readline_version;
-extern char *rl_readline_name;
-extern FILE *rl_instream;
-extern FILE *rl_outstream;
-extern char *rl_line_buffer;
-extern int rl_point, rl_end;
-extern int history_base, history_length;
-extern int max_input_history;
-extern char *rl_basic_word_break_characters;
-extern char *rl_completer_word_break_characters;
-extern char *rl_completer_quote_characters;
-extern rl_compentry_func_t *rl_completion_entry_function;
-extern char *(*rl_completion_word_break_hook)(void);
-extern rl_completion_func_t *rl_attempted_completion_function;
-extern int rl_attempted_completion_over;
-extern int rl_completion_type;
-extern int rl_completion_query_items;
-extern char *rl_special_prefixes;
-extern int rl_completion_append_character;
-extern int rl_inhibit_completion;
-extern Function *rl_pre_input_hook;
-extern Function *rl_startup_hook;
-extern char *rl_terminal_name;
-extern int rl_already_prompted;
-extern char *rl_prompt;
-/*
- * The following is not implemented
- */
-extern int rl_catch_signals;
-extern int rl_catch_sigwinch;
-extern KEYMAP_ENTRY_ARRAY emacs_standard_keymap,
- emacs_meta_keymap,
- emacs_ctlx_keymap;
-extern int rl_filename_completion_desired;
-extern int rl_ignore_completion_duplicates;
-extern int (*rl_getc_function)(FILE *);
-extern VFunction *rl_redisplay_function;
-extern VFunction *rl_completion_display_matches_hook;
-extern VFunction *rl_prep_term_function;
-extern VFunction *rl_deprep_term_function;
-extern int readline_echoing_p;
-extern int _rl_print_completions_horizontally;
-
-/* supported functions */
-char *readline(const char *);
-int rl_initialize(void);
-
-void using_history(void);
-int add_history(const char *);
-void clear_history(void);
-void stifle_history(int);
-int unstifle_history(void);
-int history_is_stifled(void);
-int where_history(void);
-HIST_ENTRY *current_history(void);
-HIST_ENTRY *history_get(int);
-HIST_ENTRY *remove_history(int);
-HIST_ENTRY *replace_history_entry(int, const char *, histdata_t);
-int history_total_bytes(void);
-int history_set_pos(int);
-HIST_ENTRY *previous_history(void);
-HIST_ENTRY *next_history(void);
-int history_search(const char *, int);
-int history_search_prefix(const char *, int);
-int history_search_pos(const char *, int, int);
-int read_history(const char *);
-int write_history(const char *);
-int history_truncate_file (const char *, int);
-int history_expand(char *, char **);
-char **history_tokenize(const char *);
-const char *get_history_event(const char *, int *, int);
-char *history_arg_extract(int, int, const char *);
-
-char *tilde_expand(char *);
-char *filename_completion_function(const char *, int);
-char *username_completion_function(const char *, int);
-int rl_complete(int, int);
-int rl_read_key(void);
-char **completion_matches(const char *, rl_compentry_func_t *);
-void rl_display_match_list(char **, int, int);
-
-int rl_insert(int, int);
-int rl_insert_text(const char *);
-void rl_reset_terminal(const char *);
-int rl_bind_key(int, rl_command_func_t *);
-int rl_newline(int, int);
-void rl_callback_read_char(void);
-void rl_callback_handler_install(const char *, rl_vcpfunc_t *);
-void rl_callback_handler_remove(void);
-void rl_redisplay(void);
-int rl_get_previous_history(int, int);
-void rl_prep_terminal(int);
-void rl_deprep_terminal(void);
-int rl_read_init_file(const char *);
-int rl_parse_and_bind(const char *);
-int rl_variable_bind(const char *, const char *);
-void rl_stuff_char(int);
-int rl_add_defun(const char *, rl_command_func_t *, int);
-HISTORY_STATE *history_get_history_state(void);
-void rl_get_screen_size(int *, int *);
-void rl_set_screen_size(int, int);
-char *rl_filename_completion_function (const char *, int);
-int _rl_abort_internal(void);
-int _rl_qsort_string_compare(char **, char **);
-char **rl_completion_matches(const char *, rl_compentry_func_t *);
-void rl_forced_update_display(void);
-int rl_set_prompt(const char *);
-int rl_on_new_line(void);
-
-/*
- * The following are not implemented
- */
-int rl_kill_text(int, int);
-Keymap rl_get_keymap(void);
-void rl_set_keymap(Keymap);
-Keymap rl_make_bare_keymap(void);
-int rl_generic_bind(int, const char *, const char *, Keymap);
-int rl_bind_key_in_map(int, rl_command_func_t *, Keymap);
-void rl_cleanup_after_signal(void);
-void rl_free_line_state(void);
-int rl_set_keyboard_input_timeout(int);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _READLINE_H_ */
diff --git a/lib/libedit/editline.3 b/lib/libedit/editline.3
deleted file mode 100644
index c09ffeb2e012..000000000000
--- a/lib/libedit/editline.3
+++ /dev/null
@@ -1,977 +0,0 @@
-.\" $NetBSD: editline.3,v 1.88 2016/02/25 14:59:22 wiz Exp $
-.\"
-.\" Copyright (c) 1997-2014 The NetBSD Foundation, Inc.
-.\" All rights reserved.
-.\"
-.\" This file was contributed to The NetBSD Foundation by Luke Mewburn.
-.\"
-.\" 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.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd April 28, 2017
-.Dt EDITLINE 3
-.Os
-.Sh NAME
-.Nm editline ,
-.Nm el_init ,
-.Nm el_init_fd ,
-.Nm el_end ,
-.Nm el_reset ,
-.Nm el_gets ,
-.Nm el_wgets ,
-.Nm el_getc ,
-.Nm el_wgetc ,
-.Nm el_push ,
-.Nm el_wpush ,
-.Nm el_parse ,
-.Nm el_wparse ,
-.Nm el_set ,
-.Nm el_wset ,
-.Nm el_get ,
-.Nm el_wget ,
-.Nm el_source ,
-.Nm el_resize ,
-.Nm el_cursor ,
-.Nm el_line ,
-.Nm el_wline ,
-.Nm el_insertstr ,
-.Nm el_winsertstr ,
-.Nm el_deletestr ,
-.Nm el_wdeletestr ,
-.Nm history_init ,
-.Nm history_winit ,
-.Nm history_end ,
-.Nm history_wend ,
-.Nm history ,
-.Nm history_w ,
-.Nm tok_init ,
-.Nm tok_winit ,
-.Nm tok_end ,
-.Nm tok_wend ,
-.Nm tok_reset ,
-.Nm tok_wreset ,
-.Nm tok_line ,
-.Nm tok_wline ,
-.Nm tok_str ,
-.Nm tok_wstr
-.Nd line editor, history and tokenization functions
-.Sh LIBRARY
-.Lb libedit
-.Sh SYNOPSIS
-.In histedit.h
-.Ft EditLine *
-.Fn el_init "const char *prog" "FILE *fin" "FILE *fout" "FILE *ferr"
-.Ft EditLine *
-.Fn el_init_fd "const char *prog" "FILE *fin" "FILE *fout" "FILE *ferr" "int fdin" "int fdout" "int fderr"
-.Ft void
-.Fn el_end "EditLine *e"
-.Ft void
-.Fn el_reset "EditLine *e"
-.Ft const char *
-.Fn el_gets "EditLine *e" "int *count"
-.Ft const wchar_t *
-.Fn el_wgets "EditLine *e" "int *count"
-.Ft int
-.Fn el_getc "EditLine *e" "char *ch"
-.Ft int
-.Fn el_wgetc "EditLine *e" "wchar_t *ch"
-.Ft void
-.Fn el_push "EditLine *e" "const char *str"
-.Ft void
-.Fn el_wpush "EditLine *e" "const wchar_t *str"
-.Ft int
-.Fn el_parse "EditLine *e" "int argc" "const char *argv[]"
-.Ft int
-.Fn el_wparse "EditLine *e" "int argc" "const wchar_t *argv[]"
-.Ft int
-.Fn el_set "EditLine *e" "int op" "..."
-.Ft int
-.Fn el_wset "EditLine *e" "int op" "..."
-.Ft int
-.Fn el_get "EditLine *e" "int op" "..."
-.Ft int
-.Fn el_wget "EditLine *e" "int op" "..."
-.Ft int
-.Fn el_source "EditLine *e" "const char *file"
-.Ft void
-.Fn el_resize "EditLine *e"
-.Fn int
-.Fn el_cursor "EditLine *e" "int count"
-.Ft const LineInfo *
-.Fn el_line "EditLine *e"
-.Ft const LineInfoW *
-.Fn el_wline "EditLine *e"
-.Ft int
-.Fn el_insertstr "EditLine *e" "const char *str"
-.Ft int
-.Fn el_winsertstr "EditLine *e" "const wchar_t *str"
-.Ft void
-.Fn el_deletestr "EditLine *e" "int count"
-.Ft void
-.Fn el_wdeletestr "EditLine *e" "int count"
-.Ft History *
-.Fn history_init void
-.Ft HistoryW *
-.Fn history_winit void
-.Ft void
-.Fn history_end "History *h"
-.Ft void
-.Fn history_wend "HistoryW *h"
-.Ft int
-.Fn history "History *h" "HistEvent *ev" "int op" "..."
-.Ft int
-.Fn history_w "HistoryW *h" "HistEventW *ev" "int op" "..."
-.Ft Tokenizer *
-.Fn tok_init "const char *IFS"
-.Ft TokenizerW *
-.Fn tok_winit "const wchar_t *IFS"
-.Ft void
-.Fn tok_end "Tokenizer *t"
-.Ft void
-.Fn tok_wend "TokenizerW *t"
-.Ft void
-.Fn tok_reset "Tokenizer *t"
-.Ft void
-.Fn tok_wreset "TokenizerW *t"
-.Ft int
-.Fn tok_line "Tokenizer *t" "const LineInfo *li" "int *argc" "const char **argv[]" "int *cursorc" "int *cursoro"
-.Ft int
-.Fn tok_wline "TokenizerW *t" "const LineInfoW *li" "int *argc" "const wchar_t **argv[]" "int *cursorc" "int *cursoro"
-.Ft int
-.Fn tok_str "Tokenizer *t" "const char *str" "int *argc" "const char **argv[]"
-.Ft int
-.Fn tok_wstr "TokenizerW *t" "const wchar_t *str" "int *argc" "const wchar_t **argv[]"
-.Sh DESCRIPTION
-The
-.Nm
-library provides generic line editing, history and tokenization functions,
-similar to those found in
-.Xr sh 1 .
-.Pp
-These functions are available in the
-.Nm libedit
-library (which needs the
-.Nm libtermcap
-library).
-Programs should be linked with
-.Fl ledit ltermcap .
-.Pp
-The
-.Nm
-library respects the
-.Ev LC_CTYPE
-locale set by the application program and never uses
-.Xr setlocale 3
-to change the locale.
-The only locales supported are UTF-8 and the default C or POSIX locale.
-If any other locale is set, behaviour is undefined.
-.Sh LINE EDITING FUNCTIONS
-The line editing functions use a common data structure,
-.Fa EditLine ,
-which is created by
-.Fn el_init
-or
-.Fn el_init_fd
-and freed by
-.Fn el_end .
-.Pp
-The wide-character functions behave the same way as their narrow
-counterparts.
-.Pp
-The following functions are available:
-.Bl -tag -width 4n
-.It Fn el_init
-Initialize the line editor, and return a data structure
-to be used by all other line editing functions, or
-.Dv NULL
-on failure.
-.Fa prog
-is the name of the invoking program, used when reading the
-.Xr editrc 5
-file to determine which settings to use.
-.Fa fin ,
-.Fa fout
-and
-.Fa ferr
-are the input, output, and error streams (respectively) to use.
-In this documentation, references to
-.Dq the tty
-are actually to this input/output stream combination.
-.It Fn el_init_fd
-Like
-.Fn el_init
-but allows specifying file descriptors for the
-.Xr stdio 3
-corresponding streams, in case those were created with
-.Xr funopen 3 .
-.It Fn el_end
-Clean up and finish with
-.Fa e ,
-assumed to have been created with
-.Fn el_init
-or
-.Fn el_init_fd .
-.It Fn el_reset
-Reset the tty and the parser.
-This should be called after an error which may have upset the tty's
-state.
-.It Fn el_gets
-Read a line from the tty.
-.Fa count
-is modified to contain the number of characters read.
-Returns the line read if successful, or
-.Dv NULL
-if no characters were read or if an error occurred.
-If an error occurred,
-.Fa count
-is set to \-1 and
-.Dv errno
-contains the error code that caused it.
-The return value may not remain valid across calls to
-.Fn el_gets
-and must be copied if the data is to be retained.
-.It Fn el_wgetc
-Read a wide character from the tty, respecting the current locale,
-or from the input stream written by
-.Fn el_wpush
-and
-.Fn el_push
-if that is not empty, and store it in
-.Fa ch .
-If an invalid or incomplete character is found, it is discarded,
-.Va errno
-is set to
-.Er EILSEQ ,
-and the next character is read and stored in
-.Fa ch .
-Returns 1 if a valid character was read, 0 on end of file, or \-1 on
-.Xr read 2
-failure.
-In the latter case,
-.Va errno
-is set to indicate the error.
-.It Fn el_getc
-Read a wide character as described for
-.Fn el_wgetc
-and return 0 on end of file or \-1 on failure.
-If the wide character can be represented as a single-byte character,
-convert it with
-.Xr wctob 3 ,
-store the result in
-.Fa ch ,
-and return 1; otherwise, set
-.Va errno
-to
-.Er ERANGE
-and return \-1.
-In the C or POSIX locale, this simply reads a byte, but for any other
-locale, including UTF-8, this is rarely useful.
-.It Fn el_push
-Pushes
-.Fa str
-back onto the input stream.
-This is used by the macro expansion mechanism.
-Refer to the description of
-.Ic bind
-.Fl s
-in
-.Xr editrc 5
-for more information.
-.It Fn el_parse
-Parses the
-.Fa argv
-array (which is
-.Fa argc
-elements in size)
-to execute builtin
-.Nm
-commands.
-If the command is prefixed with
-.Dq prog :
-then
-.Fn el_parse
-will only execute the command if
-.Dq prog
-matches the
-.Fa prog
-argument supplied to
-.Fn el_init .
-The return value is
-\-1 if the command is unknown,
-0 if there was no error or
-.Dq prog
-didn't match, or
-1 if the command returned an error.
-Refer to
-.Xr editrc 5
-for more information.
-.It Fn el_set
-Set
-.Nm
-parameters.
-.Fa op
-determines which parameter to set, and each operation has its
-own parameter list.
-Returns 0 on success, \-1 on failure.
-.Pp
-The following values for
-.Fa op
-are supported, along with the required argument list:
-.Bl -tag -width 4n
-.It Dv EL_PROMPT , Fa "char *(*f)(EditLine *)"
-Define prompt printing function as
-.Fa f ,
-which is to return a string that contains the prompt.
-.It Dv EL_PROMPT_ESC , Fa "char *(*f)(EditLine *)" , Fa "char c"
-Same as
-.Dv EL_PROMPT ,
-but the
-.Fa c
-argument indicates the start/stop literal prompt character.
-.Pp
-If a start/stop literal character is found in the prompt, the
-character itself
-is not printed, but characters after it are printed directly to the
-terminal without affecting the state of the current line.
-A subsequent second start/stop literal character ends this behavior.
-This is typically used to embed literal escape sequences that change the
-color/style of the terminal in the prompt.
-.Dv 0
-unsets it.
-.It Dv EL_REFRESH
-Re-display the current line on the next terminal line.
-.It Dv EL_RPROMPT , Fa "char *(*f)(EditLine *)"
-Define right side prompt printing function as
-.Fa f ,
-which is to return a string that contains the prompt.
-.It Dv EL_RPROMPT_ESC , Fa "char *(*f)(EditLine *)" , Fa "char c"
-Define the right prompt printing function but with a literal escape character.
-.It Dv EL_TERMINAL , Fa "const char *type"
-Define terminal type of the tty to be
-.Fa type ,
-or to
-.Ev TERM
-if
-.Fa type
-is
-.Dv NULL .
-.It Dv EL_EDITOR , Fa "const char *mode"
-Set editing mode to
-.Fa mode ,
-which must be one of
-.Dq emacs
-or
-.Dq vi .
-.It Dv EL_SIGNAL , Fa "int flag"
-If
-.Fa flag
-is non-zero,
-.Nm
-will install its own signal handler for the following signals when
-reading command input:
-.Dv SIGCONT ,
-.Dv SIGHUP ,
-.Dv SIGINT ,
-.Dv SIGQUIT ,
-.Dv SIGSTOP ,
-.Dv SIGTERM ,
-.Dv SIGTSTP ,
-and
-.Dv SIGWINCH .
-Otherwise, the current signal handlers will be used.
-.It Dv EL_BIND , Fa "const char *" , Fa "..." , Dv NULL
-Perform the
-.Ic bind
-builtin command.
-Refer to
-.Xr editrc 5
-for more information.
-.It Dv EL_ECHOTC , Fa "const char *" , Fa "..." , Dv NULL
-Perform the
-.Ic echotc
-builtin command.
-Refer to
-.Xr editrc 5
-for more information.
-.It Dv EL_SETTC , Fa "const char *" , Fa "..." , Dv NULL
-Perform the
-.Ic settc
-builtin command.
-Refer to
-.Xr editrc 5
-for more information.
-.It Dv EL_SETTY , Fa "const char *" , Fa "..." , Dv NULL
-Perform the
-.Ic setty
-builtin command.
-Refer to
-.Xr editrc 5
-for more information.
-.It Dv EL_TELLTC , Fa "const char *" , Fa "..." , Dv NULL
-Perform the
-.Ic telltc
-builtin command.
-Refer to
-.Xr editrc 5
-for more information.
-.It Dv EL_ADDFN , Fa "const char *name" , Fa "const char *help" , \
-Fa "unsigned char (*func)(EditLine *e, int ch)"
-Add a user defined function,
-.Fn func ,
-referred to as
-.Fa name
-which is invoked when a key which is bound to
-.Fa name
-is entered.
-.Fa help
-is a description of
-.Fa name .
-At invocation time,
-.Fa ch
-is the key which caused the invocation.
-The return value of
-.Fn func
-should be one of:
-.Bl -tag -width "CC_REDISPLAY"
-.It Dv CC_NORM
-Add a normal character.
-.It Dv CC_NEWLINE
-End of line was entered.
-.It Dv CC_EOF
-EOF was entered.
-.It Dv CC_ARGHACK
-Expecting further command input as arguments, do nothing visually.
-.It Dv CC_REFRESH
-Refresh display.
-.It Dv CC_REFRESH_BEEP
-Refresh display, and beep.
-.It Dv CC_CURSOR
-Cursor moved, so update and perform
-.Dv CC_REFRESH .
-.It Dv CC_REDISPLAY
-Redisplay entire input line.
-This is useful if a key binding outputs extra information.
-.It Dv CC_ERROR
-An error occurred.
-Beep, and flush tty.
-.It Dv CC_FATAL
-Fatal error, reset tty to known state.
-.El
-.It Dv EL_HIST , Fa "History *(*func)(History *, int op, ...)" , \
-Fa "const char *ptr"
-Defines which history function to use, which is usually
-.Fn history .
-.Fa ptr
-should be the value returned by
-.Fn history_init .
-.It Dv EL_EDITMODE , Fa "int flag"
-If
-.Fa flag
-is non-zero,
-editing is enabled (the default).
-Note that this is only an indication, and does not
-affect the operation of
-.Nm .
-At this time, it is the caller's responsibility to
-check this
-(using
-.Fn el_get )
-to determine if editing should be enabled or not.
-.It Dv EL_UNBUFFERED , Fa "int flag"
-If
-.Fa flag
-is zero,
-unbuffered mode is disabled (the default).
-In unbuffered mode,
-.Fn el_gets
-will return immediately after processing a single character.
-.It Dv EL_GETCFN , Fa "int (*f)(EditLine *, char *c)"
-Define the character reading function as
-.Fa f ,
-which is to return the number of characters read and store them in
-.Fa c .
-This function is called internally by
-.Fn el_gets
-and
-.Fn el_getc .
-The builtin function can be set or restored with the special function
-name
-.Dq Dv EL_BUILTIN_GETCFN .
-.It Dv EL_CLIENTDATA , Fa "void *data"
-Register
-.Fa data
-to be associated with this EditLine structure.
-It can be retrieved with the corresponding
-.Fn el_get
-call.
-.It Dv EL_SETFP , Fa "int fd" , Fa "FILE *fp"
-Set the current
-.Nm editline
-file pointer for
-.Dq input
-.Fa fd
-=
-.Dv 0 ,
-.Dq output
-.Fa fd
-=
-.Dv 1 ,
-or
-.Dq error
-.Fa fd
-=
-.Dv 2
-from
-.Fa fp .
-.El
-.It Fn el_get
-Get
-.Nm
-parameters.
-.Fa op
-determines which parameter to retrieve into
-.Fa result .
-Returns 0 if successful, \-1 otherwise.
-.Pp
-The following values for
-.Fa op
-are supported, along with actual type of
-.Fa result :
-.Bl -tag -width 4n
-.It Dv EL_PROMPT , Fa "char *(*f)(EditLine *)" , Fa "char *c"
-Set
-.Fa f .
-to a pointer to the function that displays the prompt.
-If
-.Fa c
-is not
-.Dv NULL ,
-set it to the start/stop literal prompt character.
-.It Dv EL_RPROMPT , Fa "char *(*f)(EditLine *)" , Fa "char *c"
-Set
-.Fa f .
-to a pointer to the function that displays the prompt.
-If
-.Fa c
-is not
-.Dv NULL ,
-set it to the start/stop literal prompt character.
-.It Dv EL_EDITOR , Fa "const char **n"
-Set the name of the editor in
-.Fa n ,
-which will be one of
-.Dq emacs
-or
-.Dq vi .
-.It Dv EL_GETTC , Fa "const char *name" , Fa "void *value"
-If
-.Fa name
-is a valid
-.Xr termcap 5
-capability set
-.Fa value
-to the current value of that capability.
-.It Dv EL_SIGNAL , Fa "int *s"
-Set
-.Fa s
-to non zero if
-.Nm
-has installed private signal handlers (see
-.Fn el_get
-above).
-.It Dv EL_EDITMODE , Fa "int *c"
-Set
-.Fa c
-to non-zero if editing is enabled.
-.It Dv EL_GETCFN , Fa "int (**f)(EditLine *, char *)"
-Return a pointer to the function that read characters, which is equal to
-.Dq Dv EL_BUILTIN_GETCFN
-in the case of the default builtin function.
-.It Dv EL_CLIENTDATA , Fa "void **data"
-Set
-.Fa data
-to the previously registered client data set by an
-.Fn el_set
-call.
-.It Dv EL_UNBUFFERED , Fa "int *c"
-Set
-.Fa c
-to non-zero if unbuffered mode is enabled.
-.It Dv EL_GETFP , Fa "int fd", Fa "FILE **fp"
-Set
-.Fa fp
-to the current
-.Nm editline
-file pointer for
-.Dq input
-.Fa fd
-=
-.Dv 0 ,
-.Dq output
-.Fa fd
-=
-.Dv 1 ,
-or
-.Dq error
-.Fa fd
-=
-.Dv 2 .
-.El
-.It Fn el_source
-Initialize
-.Nm
-by reading the contents of
-.Fa file .
-.Fn el_parse
-is called for each line in
-.Fa file .
-If
-.Fa file
-is
-.Dv NULL ,
-try
-.Pa $HOME/.editrc .
-Refer to
-.Xr editrc 5
-for details on the format of
-.Fa file .
-.Fn el_source
-returns 0 on success and \-1 on error.
-.It Fn el_resize
-Must be called if the terminal size changes.
-If
-.Dv EL_SIGNAL
-has been set with
-.Fn el_set ,
-then this is done automatically.
-Otherwise, it's the responsibility of the application to call
-.Fn el_resize
-on the appropriate occasions.
-.It Fn el_cursor
-Move the cursor to the right (if positive) or to the left (if negative)
-.Fa count
-characters.
-Returns the resulting offset of the cursor from the beginning of the line.
-.It Fn el_line
-Return the editing information for the current line in a
-.Fa LineInfo
-structure, which is defined as follows:
-.Bd -literal
-typedef struct lineinfo {
- const char *buffer; /* address of buffer */
- const char *cursor; /* address of cursor */
- const char *lastchar; /* address of last character */
-} LineInfo;
-.Ed
-.Pp
-.Fa buffer
-is not NUL terminated.
-This function may be called after
-.Fn el_gets
-to obtain the
-.Fa LineInfo
-structure pertaining to line returned by that function,
-and from within user defined functions added with
-.Dv EL_ADDFN .
-.It Fn el_insertstr
-Insert
-.Fa str
-into the line at the cursor.
-Returns \-1 if
-.Fa str
-is empty or won't fit, and 0 otherwise.
-.It Fn el_deletestr
-Delete
-.Fa count
-characters before the cursor.
-.El
-.Sh HISTORY LIST FUNCTIONS
-The history functions use a common data structure,
-.Fa History ,
-which is created by
-.Fn history_init
-and freed by
-.Fn history_end .
-.Pp
-The following functions are available:
-.Bl -tag -width 4n
-.It Fn history_init
-Initialize the history list, and return a data structure
-to be used by all other history list functions, or
-.Dv NULL
-on failure.
-.It Fn history_end
-Clean up and finish with
-.Fa h ,
-assumed to have been created with
-.Fn history_init .
-.It Fn history
-Perform operation
-.Fa op
-on the history list, with optional arguments as needed by the
-operation.
-.Fa ev
-is changed accordingly to operation.
-The following values for
-.Fa op
-are supported, along with the required argument list:
-.Bl -tag -width 4n
-.It Dv H_SETSIZE , Fa "int size"
-Set size of history to
-.Fa size
-elements.
-.It Dv H_GETSIZE
-Get number of events currently in history.
-.It Dv H_END
-Cleans up and finishes with
-.Fa h ,
-assumed to be created with
-.Fn history_init .
-.It Dv H_CLEAR
-Clear the history.
-.It Dv H_FUNC , Fa "void *ptr" , Fa "history_gfun_t first" , \
-Fa "history_gfun_t next" , Fa "history_gfun_t last" , \
-Fa "history_gfun_t prev" , Fa "history_gfun_t curr" , \
-Fa "history_sfun_t set" , Fa "history_vfun_t clear" , \
-Fa "history_efun_t enter" , Fa "history_efun_t add"
-Define functions to perform various history operations.
-.Fa ptr
-is the argument given to a function when it's invoked.
-.It Dv H_FIRST
-Return the first element in the history.
-.It Dv H_LAST
-Return the last element in the history.
-.It Dv H_PREV
-Return the previous element in the history.
-.It Dv H_NEXT
-Return the next element in the history.
-.It Dv H_CURR
-Return the current element in the history.
-.It Dv H_SET , Fa "int position"
-Set the cursor to point to the requested element.
-.It Dv H_ADD , Fa "const char *str"
-Append
-.Fa str
-to the current element of the history, or perform the
-.Dv H_ENTER
-operation with argument
-.Fa str
-if there is no current element.
-.It Dv H_APPEND , Fa "const char *str"
-Append
-.Fa str
-to the last new element of the history.
-.It Dv H_ENTER , Fa "const char *str"
-Add
-.Fa str
-as a new element to the history and, if necessary,
-removing the oldest entry to keep the list to the created size.
-If
-.Dv H_SETUNIQUE
-has been called with a non-zero argument, the element
-will not be entered into the history if its contents match
-the ones of the current history element.
-If the element is entered
-.Fn history
-returns 1; if it is ignored as a duplicate returns 0.
-Finally
-.Fn history
-returns \-1 if an error occurred.
-.It Dv H_PREV_STR , Fa "const char *str"
-Return the closest previous event that starts with
-.Fa str .
-.It Dv H_NEXT_STR , Fa "const char *str"
-Return the closest next event that starts with
-.Fa str .
-.It Dv H_PREV_EVENT , Fa "int e"
-Return the previous event numbered
-.Fa e .
-.It Dv H_NEXT_EVENT , Fa "int e"
-Return the next event numbered
-.Fa e .
-.It Dv H_LOAD , Fa "const char *file"
-Load the history list stored in
-.Fa file .
-.It Dv H_SAVE , Fa "const char *file"
-Save the history list to
-.Fa file .
-.It Dv H_SAVE_FP , Fa "FILE *fp"
-Save the history list to the opened
-.Ft FILE
-pointer
-.Fa fp .
-.It Dv H_SETUNIQUE , Fa "int unique"
-Set flag that adjacent identical event strings should not be entered
-into the history.
-.It Dv H_GETUNIQUE
-Retrieve the current setting if adjacent identical elements should
-be entered into the history.
-.It Dv H_DEL , Fa "int e"
-Delete the event numbered
-.Fa e .
-This function is only provided for
-.Xr readline 3
-compatibility.
-The caller is responsible for free'ing the string in the returned
-.Fa HistEvent .
-.El
-.Pp
-.Fn history
-returns \*[Gt]= 0 if the operation
-.Fa op
-succeeds.
-Otherwise, \-1 is returned and
-.Fa ev
-is updated to contain more details about the error.
-.El
-.Sh TOKENIZATION FUNCTIONS
-The tokenization functions use a common data structure,
-.Fa Tokenizer ,
-which is created by
-.Fn tok_init
-and freed by
-.Fn tok_end .
-.Pp
-The following functions are available:
-.Bl -tag -width 4n
-.It Fn tok_init
-Initialize the tokenizer, and return a data structure
-to be used by all other tokenizer functions.
-.Fa IFS
-contains the Input Field Separators, which defaults to
-.Aq space ,
-.Aq tab ,
-and
-.Aq newline
-if
-.Dv NULL .
-.It Fn tok_end
-Clean up and finish with
-.Fa t ,
-assumed to have been created with
-.Fn tok_init .
-.It Fn tok_reset
-Reset the tokenizer state.
-Use after a line has been successfully tokenized
-by
-.Fn tok_line
-or
-.Fn tok_str
-and before a new line is to be tokenized.
-.It Fn tok_line
-Tokenize
-.Fa li ,
-If successful, modify:
-.Fa argv
-to contain the words,
-.Fa argc
-to contain the number of words,
-.Fa cursorc
-(if not
-.Dv NULL )
-to contain the index of the word containing the cursor,
-and
-.Fa cursoro
-(if not
-.Dv NULL )
-to contain the offset within
-.Fa argv[cursorc]
-of the cursor.
-.Pp
-Returns
-0 if successful,
-\-1 for an internal error,
-1 for an unmatched single quote,
-2 for an unmatched double quote,
-and
-3 for a backslash quoted
-.Aq newline .
-A positive exit code indicates that another line should be read
-and tokenization attempted again.
-.
-.It Fn tok_str
-A simpler form of
-.Fn tok_line ;
-.Fa str
-is a NUL terminated string to tokenize.
-.El
-.
-.\"XXX.Sh EXAMPLES
-.\"XXX: provide some examples
-.Sh SEE ALSO
-.Xr sh 1 ,
-.Xr signal 3 ,
-.Xr termcap 3 ,
-.Xr editrc 5 ,
-.Xr termcap 5
-.Sh HISTORY
-The
-.Nm
-library first appeared in
-.Bx 4.4 .
-.Dv CC_REDISPLAY
-appeared in
-.Nx 1.3 .
-.Dv CC_REFRESH_BEEP ,
-.Dv EL_EDITMODE
-and the readline emulation appeared in
-.Nx 1.4 .
-.Dv EL_RPROMPT
-appeared in
-.Nx 1.5 .
-.Sh AUTHORS
-.An -nosplit
-The
-.Nm
-library was written by
-.An Christos Zoulas .
-.An Luke Mewburn
-wrote this manual and implemented
-.Dv CC_REDISPLAY ,
-.Dv CC_REFRESH_BEEP ,
-.Dv EL_EDITMODE ,
-and
-.Dv EL_RPROMPT .
-.An Jaromir Dolecek
-implemented the readline emulation.
-.An Johny Mattsson
-implemented wide-character support.
-.Sh BUGS
-At this time, it is the responsibility of the caller to
-check the result of the
-.Dv EL_EDITMODE
-operation of
-.Fn el_get
-(after an
-.Fn el_source
-or
-.Fn el_parse )
-to determine if
-.Nm
-should be used for further input.
-I.e.,
-.Dv EL_EDITMODE
-is purely an indication of the result of the most recent
-.Xr editrc 5
-.Ic edit
-command.
diff --git a/lib/libedit/editrc.5 b/lib/libedit/editrc.5
deleted file mode 100644
index 139f57372ab4..000000000000
--- a/lib/libedit/editrc.5
+++ /dev/null
@@ -1,526 +0,0 @@
-.\" $NetBSD: editrc.5,v 1.29 2014/12/25 13:39:41 wiz Exp $
-.\"
-.\" Copyright (c) 1997-2000 The NetBSD Foundation, Inc.
-.\" All rights reserved.
-.\"
-.\" This file was contributed to The NetBSD Foundation by Luke Mewburn.
-.\"
-.\" 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.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd December 25, 2014
-.Dt EDITRC 5
-.Os
-.Sh NAME
-.Nm editrc
-.Nd configuration file for editline library
-.Sh SYNOPSIS
-.Nm
-.Sh DESCRIPTION
-The
-.Nm
-file defines various settings to be used by the
-.Xr editline 3
-library.
-.Pp
-The format of each line is:
-.Pp
-.Dl [prog:]command [arg ...]
-.Pp
-.Ar command
-is one of the
-.Xr editline 3
-builtin commands.
-Refer to
-.Sx BUILTIN COMMANDS
-for more information.
-.Pp
-.Ar prog
-is the program name string that a program defines when it calls
-.Xr el_init 3
-to set up
-.Xr editline 3 ,
-which is usually
-.Va argv[0] .
-.Ar command
-will be executed for any program which matches
-.Ar prog .
-.Pp
-.Ar prog
-may also be a
-.Xr regex 3
-style
-regular expression, in which case
-.Ar command
-will be executed for any program that matches the regular expression.
-.Pp
-If
-.Ar prog
-is absent,
-.Ar command
-is executed for all programs.
-.Sh BUILTIN COMMANDS
-The
-.Nm editline
-library has some builtin commands, which affect the way
-that the line editing and history functions operate.
-These are based on similar named builtins present in the
-.Xr tcsh 1
-shell.
-.Pp
-The following builtin commands are available:
-.Bl -tag -width 4n
-.It Ic bind Oo Fl a Oc Oo Fl e Oc Oo Fl k Oc Oo Fl l Oc Oo Fl r Oc \
-Oo Fl s Oc Oo Fl v Oc Oo Ar key Oo Ar command Oc Oc
-Without options, list all bound keys, and the editor command to which
-each is bound.
-If
-.Ar key
-is supplied, show the bindings for
-.Ar key .
-If
-.Ar key command
-is supplied, bind
-.Ar command
-to
-.Ar key .
-Options include:
-.Bl -tag -width 4n
-.It Fl a
-List or change key bindings in the
-.Xr vi 1
-mode alternate (command mode) key map.
-.It Fl e
-Bind all keys to the standard GNU Emacs-like bindings.
-.It Fl k
-.Ar key
-is interpreted as a symbolic arrow key name, which may be one of
-.Sq up ,
-.Sq down ,
-.Sq left
-or
-.Sq right .
-.It Fl l
-List all editor commands and a short description of each.
-.It Fl r
-Remove a key's binding.
-.It Fl s
-.Ar command
-is taken as a literal string and treated as terminal input when
-.Ar key
-is typed.
-Bound keys in
-.Ar command
-are themselves reinterpreted, and this continues for ten levels of
-interpretation.
-.It Fl v
-Bind all keys to the standard
-.Xr vi 1 Ns -like
-bindings.
-.El
-.Pp
-.Ar command
-may be one of the commands documented in
-.Sx "EDITOR COMMANDS"
-below, or another key.
-.Pp
-.Ar key
-and
-.Ar command
-can contain control characters of the form
-.Sm off
-.Sq No ^ Ar character
-.Sm on
-.Po
-e.g.\&
-.Sq ^A
-.Pc ,
-and the following backslashed escape sequences:
-.Pp
-.Bl -tag -compact -offset indent -width 4n
-.It Ic \ea
-Bell
-.It Ic \eb
-Backspace
-.It Ic \ee
-Escape
-.It Ic \ef
-Formfeed
-.It Ic \en
-Newline
-.It Ic \er
-Carriage return
-.It Ic \et
-Horizontal tab
-.It Ic \ev
-Vertical tab
-.Sm off
-.It Sy \e Ar nnn
-.Sm on
-The ASCII character corresponding to the octal number
-.Ar nnn .
-.El
-.Pp
-.Sq \e
-nullifies the special meaning of the following character,
-if it has any, notably
-.Sq \e
-and
-.Sq ^ .
-.It Ic echotc Oo Fl sv Oc Ar arg Ar ...
-Exercise terminal capabilities given in
-.Ar arg ... .
-If
-.Ar arg
-is
-.Sq baud ,
-.Sq cols ,
-.Sq lines ,
-.Sq rows ,
-.Sq meta ,
-or
-.Sq tabs ,
-the value of that capability is printed, with
-.Dq yes
-or
-.Dq no
-indicating that the terminal does or does not have that capability.
-.Pp
-.Fl s
-returns an empty string for non-existent capabilities, rather than
-causing an error.
-.Fl v
-causes messages to be verbose.
-.It Ic edit Op Li on | Li off
-Enable or disable the
-.Nm editline
-functionality in a program.
-.It Ic history Ar list | Ar size Dv n | Ar unique Dv n
-The
-.Ar list
-command lists all entries in the history.
-The
-.Ar size
-command sets the history size to
-.Dv n
-entries.
-The
-.Ar unique
-command controls if history should keep duplicate entries.
-If
-.Dv n
-is non zero, only keep unique history entries.
-If
-.Dv n
-is zero, then keep all entries (the default).
-.It Ic settc Ar cap Ar val
-Set the terminal capability
-.Ar cap
-to
-.Ar val ,
-as defined in
-.Xr termcap 5 .
-No sanity checking is done.
-.It Ic setty Oo Fl a Oc Oo Fl d Oc Oo Fl q Oc Oo Fl x Oc Oo Ar +mode Oc \
-Oo Ar -mode Oc Oo Ar mode Oc Oo Ar char=c Oc
-Control which tty modes that
-.Nm
-will not allow the user to change.
-.Fl d ,
-.Fl q
-or
-.Fl x
-tells
-.Ic setty
-to act on the
-.Sq edit ,
-.Sq quote
-or
-.Sq execute
-set of tty modes respectively; defaulting to
-.Fl x .
-.Pp
-Without other arguments,
-.Ic setty
-lists the modes in the chosen set which are fixed on
-.Po
-.Sq +mode
-.Pc
-or off
-.Po
-.Sq -mode
-.Pc .
-.Fl a
-lists all tty modes in the chosen set regardless of the setting.
-With
-.Ar +mode ,
-.Ar -mode
-or
-.Ar mode ,
-fixes
-.Ar mode
-on or off or removes control of
-.Ar mode
-in the chosen set.
-.Pp
-.Ic Setty
-can also be used to set tty characters to particular values using
-.Ar char=value .
-If
-.Ar value
-is empty
-then the character is set to
-.Dv _POSIX_VDISABLE .
-.It Ic telltc
-List the values of all the terminal capabilities (see
-.Xr termcap 5 ) .
-.El
-.Sh EDITOR COMMANDS
-The following editor commands are available for use in key bindings:
-.\" Section automatically generated with makelist
-.Bl -tag -width 4n
-.It Ic vi-paste-next
-Vi paste previous deletion to the right of the cursor.
-.It Ic vi-paste-prev
-Vi paste previous deletion to the left of the cursor.
-.It Ic vi-prev-big-word
-Vi move to the previous space delimited word.
-.It Ic vi-prev-word
-Vi move to the previous word.
-.It Ic vi-next-big-word
-Vi move to the next space delimited word.
-.It Ic vi-next-word
-Vi move to the next word.
-.It Ic vi-change-case
-Vi change case of character under the cursor and advance one character.
-.It Ic vi-change-meta
-Vi change prefix command.
-.It Ic vi-insert-at-bol
-Vi enter insert mode at the beginning of line.
-.It Ic vi-replace-char
-Vi replace character under the cursor with the next character typed.
-.It Ic vi-replace-mode
-Vi enter replace mode.
-.It Ic vi-substitute-char
-Vi replace character under the cursor and enter insert mode.
-.It Ic vi-substitute-line
-Vi substitute entire line.
-.It Ic vi-change-to-eol
-Vi change to end of line.
-.It Ic vi-insert
-Vi enter insert mode.
-.It Ic vi-add
-Vi enter insert mode after the cursor.
-.It Ic vi-add-at-eol
-Vi enter insert mode at end of line.
-.It Ic vi-delete-meta
-Vi delete prefix command.
-.It Ic vi-end-big-word
-Vi move to the end of the current space delimited word.
-.It Ic vi-end-word
-Vi move to the end of the current word.
-.It Ic vi-undo
-Vi undo last change.
-.It Ic vi-command-mode
-Vi enter command mode (use alternative key bindings).
-.It Ic vi-zero
-Vi move to the beginning of line.
-.It Ic vi-delete-prev-char
-Vi move to previous character (backspace).
-.It Ic vi-list-or-eof
-Vi list choices for completion or indicate end of file if empty line.
-.It Ic vi-kill-line-prev
-Vi cut from beginning of line to cursor.
-.It Ic vi-search-prev
-Vi search history previous.
-.It Ic vi-search-next
-Vi search history next.
-.It Ic vi-repeat-search-next
-Vi repeat current search in the same search direction.
-.It Ic vi-repeat-search-prev
-Vi repeat current search in the opposite search direction.
-.It Ic vi-next-char
-Vi move to the character specified next.
-.It Ic vi-prev-char
-Vi move to the character specified previous.
-.It Ic vi-to-next-char
-Vi move up to the character specified next.
-.It Ic vi-to-prev-char
-Vi move up to the character specified previous.
-.It Ic vi-repeat-next-char
-Vi repeat current character search in the same search direction.
-.It Ic vi-repeat-prev-char
-Vi repeat current character search in the opposite search direction.
-.It Ic vi-match
-Vi go to matching () {} or [].
-.It Ic vi-undo-line
-Vi undo all changes to line.
-.It Ic vi-to-column
-Vi go to specified column.
-.It Ic vi-yank-end
-Vi yank to end of line.
-.It Ic vi-yank
-Vi yank.
-.It Ic vi-comment-out
-Vi comment out current command.
-.It Ic vi-alias
-Vi include shell alias.
-.It Ic vi-to-history-line
-Vi go to specified history file line..
-.It Ic vi-histedit
-Vi edit history line with vi.
-.It Ic vi-history-word
-Vi append word from previous input line.
-.It Ic vi-redo
-Vi redo last non-motion command.
-.It Ic em-delete-or-list
-Delete character under cursor or list completions if at end of line.
-.It Ic em-delete-next-word
-Cut from cursor to end of current word.
-.It Ic em-yank
-Paste cut buffer at cursor position.
-.It Ic em-kill-line
-Cut the entire line and save in cut buffer.
-.It Ic em-kill-region
-Cut area between mark and cursor and save in cut buffer.
-.It Ic em-copy-region
-Copy area between mark and cursor to cut buffer.
-.It Ic em-gosmacs-transpose
-Exchange the two characters before the cursor.
-.It Ic em-next-word
-Move next to end of current word.
-.It Ic em-upper-case
-Uppercase the characters from cursor to end of current word.
-.It Ic em-capitol-case
-Capitalize the characters from cursor to end of current word.
-.It Ic em-lower-case
-Lowercase the characters from cursor to end of current word.
-.It Ic em-set-mark
-Set the mark at cursor.
-.It Ic em-exchange-mark
-Exchange the cursor and mark.
-.It Ic em-universal-argument
-Universal argument (argument times 4).
-.It Ic em-meta-next
-Add 8th bit to next character typed.
-.It Ic em-toggle-overwrite
-Switch from insert to overwrite mode or vice versa.
-.It Ic em-copy-prev-word
-Copy current word to cursor.
-.It Ic em-inc-search-next
-Emacs incremental next search.
-.It Ic em-inc-search-prev
-Emacs incremental reverse search.
-.It Ic ed-end-of-file
-Indicate end of file.
-.It Ic ed-insert
-Add character to the line.
-.It Ic ed-delete-prev-word
-Delete from beginning of current word to cursor.
-.It Ic ed-delete-next-char
-Delete character under cursor.
-.It Ic ed-kill-line
-Cut to the end of line.
-.It Ic ed-move-to-end
-Move cursor to the end of line.
-.It Ic ed-move-to-beg
-Move cursor to the beginning of line.
-.It Ic ed-transpose-chars
-Exchange the character to the left of the cursor with the one under it.
-.It Ic ed-next-char
-Move to the right one character.
-.It Ic ed-prev-word
-Move to the beginning of the current word.
-.It Ic ed-prev-char
-Move to the left one character.
-.It Ic ed-quoted-insert
-Add the next character typed verbatim.
-.It Ic ed-digit
-Adds to argument or enters a digit.
-.It Ic ed-argument-digit
-Digit that starts argument.
-.It Ic ed-unassigned
-Indicates unbound character.
-.It Ic ed-tty-sigint
-Tty interrupt character.
-.It Ic ed-tty-dsusp
-Tty delayed suspend character.
-.It Ic ed-tty-flush-output
-Tty flush output characters.
-.It Ic ed-tty-sigquit
-Tty quit character.
-.It Ic ed-tty-sigtstp
-Tty suspend character.
-.It Ic ed-tty-stop-output
-Tty disallow output characters.
-.It Ic ed-tty-start-output
-Tty allow output characters.
-.It Ic ed-newline
-Execute command.
-.It Ic ed-delete-prev-char
-Delete the character to the left of the cursor.
-.It Ic ed-clear-screen
-Clear screen leaving current line at the top.
-.It Ic ed-redisplay
-Redisplay everything.
-.It Ic ed-start-over
-Erase current line and start from scratch.
-.It Ic ed-sequence-lead-in
-First character in a bound sequence.
-.It Ic ed-prev-history
-Move to the previous history line.
-.It Ic ed-next-history
-Move to the next history line.
-.It Ic ed-search-prev-history
-Search previous in history for a line matching the current.
-.It Ic ed-search-next-history
-Search next in history for a line matching the current.
-.It Ic ed-prev-line
-Move up one line.
-.It Ic ed-next-line
-Move down one line.
-.It Ic ed-command
-Editline extended command.
-.El
-.\" End of section automatically generated with makelist
-.Sh FILES
-.Bl -tag -width "~/.editrcXXX"
-.It Pa ~/.editrc
-User configuration file for the
-.Xr editline 3
-library.
-.El
-.Sh SEE ALSO
-.Xr editline 3 ,
-.Xr regex 3 ,
-.Xr termcap 5
-.Sh AUTHORS
-.An -nosplit
-The
-.Nm editline
-library was written by
-.An Christos Zoulas ,
-and this manual was written by
-.An Luke Mewburn ,
-with some sections inspired by
-.Xr tcsh 1 .
diff --git a/lib/libedit/el.c b/lib/libedit/el.c
deleted file mode 100644
index ea5b9b78d2f3..000000000000
--- a/lib/libedit/el.c
+++ /dev/null
@@ -1,636 +0,0 @@
-/* $NetBSD: el.c,v 1.83 2016/02/24 17:13:22 christos Exp $ */
-
-/*-
- * 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.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-#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 $");
-#endif
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * el.c: EditLine interface functions
- */
-#include <sys/types.h>
-#include <sys/param.h>
-#include <ctype.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"
-
-/* el_init():
- * Initialize editline and set default parameters.
- */
-public 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)
-{
- EditLine *el = el_malloc(sizeof(*el));
-
- if (el == NULL)
- return NULL;
-
- memset(el, 0, sizeof(EditLine));
-
- el->el_infile = fin;
- el->el_outfile = fout;
- el->el_errfile = ferr;
-
- el->el_infd = fdin;
- el->el_outfd = fdout;
- el->el_errfd = fderr;
-
- el->el_prog = Strdup(ct_decode_string(prog, &el->el_scratch));
- if (el->el_prog == NULL) {
- el_free(el);
- return NULL;
- }
-
- /*
- * Initialize all the modules. Order is important!!!
- */
- el->el_flags = 0;
-
- if (terminal_init(el) == -1) {
- el_free(el->el_prog);
- el_free(el);
- return NULL;
- }
- (void) keymacro_init(el);
- (void) map_init(el);
- if (tty_init(el) == -1)
- el->el_flags |= NO_TTY;
- (void) ch_init(el);
- (void) search_init(el);
- (void) hist_init(el);
- (void) prompt_init(el);
- (void) sig_init(el);
- (void) read_init(el);
-
- return el;
-}
-
-
-/* el_end():
- * Clean up.
- */
-public void
-el_end(EditLine *el)
-{
-
- if (el == NULL)
- return;
-
- el_reset(el);
-
- terminal_end(el);
- keymacro_end(el);
- map_end(el);
- if (!(el->el_flags & NO_TTY))
- tty_end(el);
- ch_end(el);
- search_end(el);
- hist_end(el);
- prompt_end(el);
- sig_end(el);
-
- el_free(el->el_prog);
-#ifdef WIDECHAR
- 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);
-}
-
-
-/* el_reset():
- * Reset the tty and the parser
- */
-public void
-el_reset(EditLine *el)
-{
-
- tty_cookedmode(el);
- ch_reset(el, 0); /* XXX: Do we want that? */
-}
-
-
-/* el_set():
- * set the editline parameters
- */
-public int
-FUN(el,set)(EditLine *el, int op, ...)
-{
- va_list ap;
- int rv = 0;
-
- if (el == NULL)
- return -1;
- va_start(ap, op);
-
- switch (op) {
- case EL_PROMPT:
- case EL_RPROMPT: {
- el_pfunc_t p = va_arg(ap, el_pfunc_t);
-
- rv = prompt_set(el, p, 0, op, 1);
- break;
- }
-
- case EL_RESIZE: {
- el_zfunc_t p = va_arg(ap, el_zfunc_t);
- void *arg = va_arg(ap, void *);
- rv = ch_resizefun(el, p, arg);
- break;
- }
-
- case EL_ALIAS_TEXT: {
- el_afunc_t p = va_arg(ap, el_afunc_t);
- void *arg = va_arg(ap, void *);
- rv = ch_aliasfun(el, p, arg);
- break;
- }
-
- case EL_PROMPT_ESC:
- case EL_RPROMPT_ESC: {
- 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);
- break;
- }
-
- case EL_TERMINAL:
- rv = terminal_set(el, va_arg(ap, char *));
- break;
-
- case EL_EDITOR:
- rv = map_set_editor(el, va_arg(ap, Char *));
- break;
-
- case EL_SIGNAL:
- if (va_arg(ap, int))
- el->el_flags |= HANDLE_SIGNALS;
- else
- el->el_flags &= ~HANDLE_SIGNALS;
- break;
-
- case EL_BIND:
- case EL_TELLTC:
- case EL_SETTC:
- case EL_ECHOTC:
- case EL_SETTY:
- {
- const Char *argv[20];
- int i;
-
- for (i = 1; i < (int)__arraycount(argv); i++)
- if ((argv[i] = va_arg(ap, Char *)) == NULL)
- break;
-
- switch (op) {
- case EL_BIND:
- argv[0] = STR("bind");
- rv = map_bind(el, i, argv);
- break;
-
- case EL_TELLTC:
- argv[0] = STR("telltc");
- rv = terminal_telltc(el, i, argv);
- break;
-
- case EL_SETTC:
- argv[0] = STR("settc");
- rv = terminal_settc(el, i, argv);
- break;
-
- case EL_ECHOTC:
- argv[0] = STR("echotc");
- rv = terminal_echotc(el, i, argv);
- break;
-
- case EL_SETTY:
- argv[0] = STR("setty");
- rv = tty_stty(el, i, argv);
- break;
-
- default:
- rv = -1;
- EL_ABORT((el->el_errfile, "Bad op %d\n", op));
- break;
- }
- break;
- }
-
- case EL_ADDFN:
- {
- Char *name = va_arg(ap, Char *);
- Char *help = va_arg(ap, Char *);
- el_func_t func = va_arg(ap, el_func_t);
-
- rv = map_addfunc(el, name, help, func);
- break;
- }
-
- case EL_HIST:
- {
- hist_fun_t func = va_arg(ap, hist_fun_t);
- void *ptr = va_arg(ap, void *);
-
- rv = hist_set(el, func, ptr);
- if (MB_CUR_MAX == 1)
- el->el_flags &= ~NARROW_HISTORY;
- break;
- }
-
- case EL_EDITMODE:
- if (va_arg(ap, int))
- el->el_flags &= ~EDIT_DISABLED;
- else
- el->el_flags |= EDIT_DISABLED;
- rv = 0;
- break;
-
- case EL_GETCFN:
- {
- el_rfunc_t rc = va_arg(ap, el_rfunc_t);
- rv = el_read_setfn(el, rc);
- break;
- }
-
- case EL_CLIENTDATA:
- el->el_data = va_arg(ap, void *);
- break;
-
- case EL_UNBUFFERED:
- rv = va_arg(ap, int);
- if (rv && !(el->el_flags & UNBUFFERED)) {
- el->el_flags |= UNBUFFERED;
- read_prepare(el);
- } else if (!rv && (el->el_flags & UNBUFFERED)) {
- el->el_flags &= ~UNBUFFERED;
- read_finish(el);
- }
- rv = 0;
- break;
-
- case EL_PREP_TERM:
- rv = va_arg(ap, int);
- if (rv)
- (void) tty_rawmode(el);
- else
- (void) tty_cookedmode(el);
- rv = 0;
- break;
-
- case EL_SETFP:
- {
- FILE *fp;
- int what;
-
- what = va_arg(ap, int);
- fp = va_arg(ap, FILE *);
-
- rv = 0;
- switch (what) {
- case 0:
- el->el_infile = fp;
- el->el_infd = fileno(fp);
- break;
- case 1:
- el->el_outfile = fp;
- el->el_outfd = fileno(fp);
- break;
- case 2:
- el->el_errfile = fp;
- el->el_errfd = fileno(fp);
- break;
- default:
- rv = -1;
- break;
- }
- break;
- }
-
- case EL_REFRESH:
- re_clear_display(el);
- re_refresh(el);
- terminal__flush(el);
- break;
-
- default:
- rv = -1;
- break;
- }
-
- va_end(ap);
- return rv;
-}
-
-
-/* el_get():
- * retrieve the editline parameters
- */
-public int
-FUN(el,get)(EditLine *el, int op, ...)
-{
- va_list ap;
- int rv;
-
- if (el == NULL)
- return -1;
-
- va_start(ap, op);
-
- switch (op) {
- case EL_PROMPT:
- case EL_RPROMPT: {
- el_pfunc_t *p = va_arg(ap, el_pfunc_t *);
- rv = prompt_get(el, p, 0, op);
- break;
- }
- case EL_PROMPT_ESC:
- case EL_RPROMPT_ESC: {
- el_pfunc_t *p = va_arg(ap, el_pfunc_t *);
- Char *c = va_arg(ap, Char *);
-
- rv = prompt_get(el, p, c, op);
- break;
- }
-
- case EL_EDITOR:
- rv = map_get_editor(el, va_arg(ap, const Char **));
- break;
-
- case EL_SIGNAL:
- *va_arg(ap, int *) = (el->el_flags & HANDLE_SIGNALS);
- rv = 0;
- break;
-
- case EL_EDITMODE:
- *va_arg(ap, int *) = !(el->el_flags & EDIT_DISABLED);
- rv = 0;
- break;
-
- case EL_TERMINAL:
- terminal_get(el, va_arg(ap, const char **));
- rv = 0;
- break;
-
- case EL_GETTC:
- {
- static char name[] = "gettc";
- char *argv[20];
- int i;
-
- for (i = 1; i < (int)__arraycount(argv); i++)
- if ((argv[i] = va_arg(ap, char *)) == NULL)
- break;
-
- argv[0] = name;
- rv = terminal_gettc(el, i, argv);
- break;
- }
-
- case EL_GETCFN:
- *va_arg(ap, el_rfunc_t *) = el_read_getfn(el);
- rv = 0;
- break;
-
- case EL_CLIENTDATA:
- *va_arg(ap, void **) = el->el_data;
- rv = 0;
- break;
-
- case EL_UNBUFFERED:
- *va_arg(ap, int *) = (el->el_flags & UNBUFFERED) != 0;
- rv = 0;
- break;
-
- case EL_GETFP:
- {
- int what;
- FILE **fpp;
-
- what = va_arg(ap, int);
- fpp = va_arg(ap, FILE **);
- rv = 0;
- switch (what) {
- case 0:
- *fpp = el->el_infile;
- break;
- case 1:
- *fpp = el->el_outfile;
- break;
- case 2:
- *fpp = el->el_errfile;
- break;
- default:
- rv = -1;
- break;
- }
- break;
- }
- default:
- rv = -1;
- break;
- }
- va_end(ap);
-
- return rv;
-}
-
-
-/* el_line():
- * Return editing info
- */
-public const TYPE(LineInfo) *
-FUN(el,line)(EditLine *el)
-{
-
- return (const TYPE(LineInfo) *)(void *)&el->el_line;
-}
-
-
-/* el_source():
- * Source a file
- */
-public int
-el_source(EditLine *el, const char *fname)
-{
- FILE *fp;
- size_t len;
- ssize_t slen;
- char *ptr;
- char *path = NULL;
- const Char *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;
-#else
- /*
- * If issetugid() is missing, always return an error, in order
- * to keep from inadvertently opening up the user to a security
- * hole.
- */
- return -1;
-#endif
- }
- if (fp == NULL)
- fp = fopen(fname, "r");
- if (fp == NULL) {
- el_free(path);
- return -1;
- }
-
- ptr = NULL;
- len = 0;
- while ((slen = getline(&ptr, &len, fp)) != -1) {
- if (*ptr == '\n')
- continue; /* Empty line. */
- if (slen > 0 && ptr[--slen] == '\n')
- ptr[slen] = '\0';
-
- dptr = ct_decode_string(ptr, &el->el_scratch);
- if (!dptr)
- continue;
- /* loop until first non-space char or EOL */
- while (*dptr != '\0' && Isspace(*dptr))
- dptr++;
- if (*dptr == '#')
- continue; /* ignore, this is a comment line */
- if ((error = parse_line(el, dptr)) == -1)
- break;
- }
- free(ptr);
-
- el_free(path);
- (void) fclose(fp);
- return error;
-}
-
-
-/* el_resize():
- * Called from program when terminal is resized
- */
-public void
-el_resize(EditLine *el)
-{
- int lins, cols;
- sigset_t oset, nset;
-
- (void) sigemptyset(&nset);
- (void) sigaddset(&nset, SIGWINCH);
- (void) sigprocmask(SIG_BLOCK, &nset, &oset);
-
- /* get the correct window size */
- if (terminal_get_size(el, &lins, &cols))
- terminal_change_size(el, lins, cols);
-
- (void) sigprocmask(SIG_SETMASK, &oset, NULL);
-}
-
-
-/* el_beep():
- * Called from the program to beep
- */
-public void
-el_beep(EditLine *el)
-{
-
- terminal_beep(el);
-}
-
-
-/* el_editmode()
- * Set the state of EDIT_DISABLED from the `edit' command.
- */
-protected int
-/*ARGSUSED*/
-el_editmode(EditLine *el, int argc, const Char **argv)
-{
- const Char *how;
-
- if (argv == NULL || argc != 2 || argv[1] == NULL)
- return -1;
-
- how = argv[1];
- if (Strcmp(how, STR("on")) == 0) {
- el->el_flags &= ~EDIT_DISABLED;
- tty_rawmode(el);
- } else if (Strcmp(how, STR("off")) == 0) {
- tty_cookedmode(el);
- el->el_flags |= EDIT_DISABLED;
- }
- else {
- (void) fprintf(el->el_errfile, "edit: Bad value `" FSTR "'.\n",
- how);
- return -1;
- }
- return 0;
-}
diff --git a/lib/libedit/el.h b/lib/libedit/el.h
deleted file mode 100644
index 8b728742911a..000000000000
--- a/lib/libedit/el.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/* $NetBSD: el.h,v 1.34 2016/02/24 17:13:22 christos Exp $ */
-
-/*-
- * 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.
- *
- * @(#)el.h 8.1 (Berkeley) 6/4/93
- * $FreeBSD$
- */
-
-/*
- * el.h: Internal structures.
- */
-#ifndef _h_el
-#define _h_el
-/*
- * Local defaults
- */
-#define KSHVI
-#define VIDEFAULT
-#define ANCHOR
-
-#include "histedit.h"
-#include "chartype.h"
-
-#define EL_BUFSIZ ((size_t)1024) /* Maximum line size */
-
-#define HANDLE_SIGNALS 0x01
-#define NO_TTY 0x02
-#define EDIT_DISABLED 0x04
-#define UNBUFFERED 0x08
-#define NARROW_HISTORY 0x40
-
-typedef unsigned char el_action_t; /* Index to command array */
-
-typedef struct coord_t { /* Position on the screen */
- int h;
- int v;
-} coord_t;
-
-typedef struct el_line_t {
- Char *buffer; /* Input line */
- Char *cursor; /* Cursor position */
- Char *lastchar; /* Last character */
- const Char *limit; /* Max position */
-} el_line_t;
-
-/*
- * Editor state
- */
-typedef struct el_state_t {
- int inputmode; /* What mode are we in? */
- int doingarg; /* Are we getting an argument? */
- int argument; /* Numeric argument */
- int metanext; /* Is the next char a meta char */
- el_action_t lastcmd; /* Previous command */
- el_action_t thiscmd; /* this command */
- Char thisch; /* char that generated it */
-} el_state_t;
-
-/*
- * Until we come up with something better...
- */
-#define el_malloc(a) malloc(a)
-#define el_realloc(a,b) realloc(a, b)
-#define el_free(a) free(a)
-
-#include "tty.h"
-#include "prompt.h"
-#include "keymacro.h"
-#include "terminal.h"
-#include "refresh.h"
-#include "chared.h"
-#include "search.h"
-#include "hist.h"
-#include "fcns.h" /* el_func_t is needed for map.h */
-#include "map.h"
-#include "sig.h"
-#include "read.h"
-
-struct editline {
- Char *el_prog; /* the program name */
- FILE *el_infile; /* Stdio stuff */
- FILE *el_outfile; /* Stdio stuff */
- FILE *el_errfile; /* Stdio stuff */
- int el_infd; /* Input file descriptor */
- int el_outfd; /* Output file descriptor */
- int el_errfd; /* Error file descriptor */
- int el_flags; /* Various flags. */
- int el_errno; /* Local copy of errno */
- coord_t el_cursor; /* Cursor location */
- Char **el_display; /* Real screen image = what is there */
- Char **el_vdisplay; /* Virtual screen image = what we see */
- void *el_data; /* Client data */
- el_line_t el_line; /* The current line information */
- el_state_t el_state; /* Current editor state */
- el_terminal_t el_terminal; /* Terminal dependent stuff */
- el_tty_t el_tty; /* Tty dependent stuff */
- el_refresh_t el_refresh; /* Refresh stuff */
- el_prompt_t el_prompt; /* Prompt stuff */
- el_prompt_t el_rprompt; /* Prompt stuff */
- el_chared_t el_chared; /* Characted editor stuff */
- el_map_t el_map; /* Key mapping stuff */
- el_keymacro_t el_keymacro; /* Key binding stuff */
- el_history_t el_history; /* History stuff */
- el_search_t el_search; /* Search stuff */
- el_signal_t el_signal; /* Signal handling stuff */
- el_read_t el_read; /* Character reading stuff */
-#ifdef WIDECHAR
- ct_buffer_t el_scratch; /* Scratch conversion buffer */
- ct_buffer_t el_lgcyconv; /* Buffer for legacy wrappers */
- LineInfo el_lgcylinfo; /* Legacy LineInfo buffer */
-#endif
-};
-
-protected int el_editmode(EditLine *, int, const Char **);
-
-#ifdef DEBUG
-#define EL_ABORT(a) do { \
- fprintf(el->el_errfile, "%s, %d: ", \
- __FILE__, __LINE__); \
- fprintf a; \
- abort(); \
- } while( /*CONSTCOND*/0);
-#else
-#define EL_ABORT(a) abort()
-#endif
-#endif /* _h_el */
diff --git a/lib/libedit/eln.c b/lib/libedit/eln.c
deleted file mode 100644
index d35e742cd822..000000000000
--- a/lib/libedit/eln.c
+++ /dev/null
@@ -1,394 +0,0 @@
-/* $NetBSD: eln.c,v 1.28 2016/02/28 23:02:24 christos Exp $ */
-
-/*-
- * Copyright (c) 2009 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
- */
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-__RCSID("$NetBSD: eln.c,v 1.28 2016/02/28 23:02:24 christos Exp $");
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <errno.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "el.h"
-
-public int
-el_getc(EditLine *el, char *cp)
-{
- int num_read;
- wchar_t wc = 0;
-
- num_read = el_wgetc(el, &wc);
- *cp = '\0';
- if (num_read <= 0)
- return num_read;
- num_read = ct_wctob(wc);
- if (num_read == EOF) {
- errno = ERANGE;
- return -1;
- } else {
- *cp = (char)num_read;
- return 1;
- }
-}
-
-
-#ifdef WIDECHAR
-public void
-el_push(EditLine *el, const char *str)
-{
- /* Using multibyte->wide string decoding works fine under single-byte
- * character sets too, and Does The Right Thing. */
- el_wpush(el, ct_decode_string(str, &el->el_lgcyconv));
-}
-
-
-public const char *
-el_gets(EditLine *el, int *nread)
-{
- const wchar_t *tmp;
-
- tmp = el_wgets(el, nread);
- if (tmp != NULL) {
- int i;
- size_t nwread = 0;
-
- for (i = 0; i < *nread; i++)
- nwread += ct_enc_width(tmp[i]);
- *nread = (int)nwread;
- }
- return ct_encode_string(tmp, &el->el_lgcyconv);
-}
-
-
-public int
-el_parse(EditLine *el, int argc, const char *argv[])
-{
- int ret;
- const wchar_t **wargv;
-
- wargv = (const wchar_t **)
- ct_decode_argv(argc, argv, &el->el_lgcyconv);
- if (!wargv)
- return -1;
- ret = el_wparse(el, argc, wargv);
- ct_free_argv(wargv);
-
- return ret;
-}
-
-
-public int
-el_set(EditLine *el, int op, ...)
-{
- va_list ap;
- int ret;
-
- if (!el)
- return -1;
- va_start(ap, op);
-
- switch (op) {
- case EL_PROMPT: /* el_pfunc_t */
- case EL_RPROMPT: {
- el_pfunc_t p = va_arg(ap, el_pfunc_t);
- ret = prompt_set(el, p, 0, op, 0);
- break;
- }
-
- case EL_RESIZE: {
- el_zfunc_t p = va_arg(ap, el_zfunc_t);
- void *arg = va_arg(ap, void *);
- ret = ch_resizefun(el, p, arg);
- break;
- }
-
- case EL_ALIAS_TEXT: {
- el_afunc_t p = va_arg(ap, el_afunc_t);
- void *arg = va_arg(ap, void *);
- ret = ch_aliasfun(el, p, arg);
- break;
- }
-
- case EL_PROMPT_ESC:
- case EL_RPROMPT_ESC: {
- el_pfunc_t p = va_arg(ap, el_pfunc_t);
- int c = va_arg(ap, int);
-
- ret = prompt_set(el, p, c, op, 0);
- break;
- }
-
- case EL_TERMINAL: /* const char * */
- ret = el_wset(el, op, va_arg(ap, char *));
- break;
-
- case EL_EDITOR: /* const wchar_t * */
- ret = el_wset(el, op, ct_decode_string(va_arg(ap, char *),
- &el->el_lgcyconv));
- break;
-
- case EL_SIGNAL: /* int */
- case EL_EDITMODE:
- case EL_UNBUFFERED:
- case EL_PREP_TERM:
- ret = el_wset(el, op, va_arg(ap, int));
- break;
-
- case EL_BIND: /* const char * list -> const wchar_t * list */
- case EL_TELLTC:
- case EL_SETTC:
- case EL_ECHOTC:
- case EL_SETTY: {
- const char *argv[20];
- int i;
- const wchar_t **wargv;
- for (i = 1; i < (int)__arraycount(argv) - 1; ++i)
- if ((argv[i] = va_arg(ap, const char *)) == NULL)
- break;
- argv[0] = argv[i] = NULL;
- wargv = (const wchar_t **)
- ct_decode_argv(i + 1, argv, &el->el_lgcyconv);
- if (!wargv) {
- ret = -1;
- goto out;
- }
- /*
- * AFAIK we can't portably pass through our new wargv to
- * el_wset(), so we have to reimplement the body of
- * el_wset() for these ops.
- */
- switch (op) {
- case EL_BIND:
- wargv[0] = STR("bind");
- ret = map_bind(el, i, wargv);
- break;
- case EL_TELLTC:
- wargv[0] = STR("telltc");
- ret = terminal_telltc(el, i, wargv);
- break;
- case EL_SETTC:
- wargv[0] = STR("settc");
- ret = terminal_settc(el, i, wargv);
- break;
- case EL_ECHOTC:
- wargv[0] = STR("echotc");
- ret = terminal_echotc(el, i, wargv);
- break;
- case EL_SETTY:
- wargv[0] = STR("setty");
- ret = tty_stty(el, i, wargv);
- break;
- default:
- ret = -1;
- }
- ct_free_argv(wargv);
- break;
- }
-
- /* XXX: do we need to change el_func_t too? */
- case EL_ADDFN: { /* const char *, const char *, el_func_t */
- const char *args[2];
- el_func_t func;
- wchar_t **wargv;
-
- args[0] = va_arg(ap, const char *);
- args[1] = va_arg(ap, const char *);
- func = va_arg(ap, el_func_t);
-
- wargv = ct_decode_argv(2, args, &el->el_lgcyconv);
- if (!wargv) {
- ret = -1;
- goto out;
- }
- /* XXX: The two strdup's leak */
- ret = map_addfunc(el, Strdup(wargv[0]), Strdup(wargv[1]),
- func);
- ct_free_argv(wargv);
- break;
- }
- case EL_HIST: { /* hist_fun_t, const char * */
- hist_fun_t fun = va_arg(ap, hist_fun_t);
- void *ptr = va_arg(ap, void *);
- ret = hist_set(el, fun, ptr);
- el->el_flags |= NARROW_HISTORY;
- break;
- }
-
- case EL_GETCFN: /* el_rfunc_t */
- ret = el_wset(el, op, va_arg(ap, el_rfunc_t));
- break;
-
- case EL_CLIENTDATA: /* void * */
- ret = el_wset(el, op, va_arg(ap, void *));
- break;
-
- case EL_SETFP: { /* int, FILE * */
- int what = va_arg(ap, int);
- FILE *fp = va_arg(ap, FILE *);
- ret = el_wset(el, op, what, fp);
- break;
- }
-
- case EL_REFRESH:
- re_clear_display(el);
- re_refresh(el);
- terminal__flush(el);
- ret = 0;
- break;
-
- default:
- ret = -1;
- break;
- }
-
-out:
- va_end(ap);
- return ret;
-}
-
-
-public int
-el_get(EditLine *el, int op, ...)
-{
- va_list ap;
- int ret;
-
- if (!el)
- return -1;
-
- va_start(ap, op);
-
- switch (op) {
- case EL_PROMPT: /* el_pfunc_t * */
- case EL_RPROMPT: {
- el_pfunc_t *p = va_arg(ap, el_pfunc_t *);
- ret = prompt_get(el, p, 0, op);
- break;
- }
-
- case EL_PROMPT_ESC: /* el_pfunc_t *, char **/
- case EL_RPROMPT_ESC: {
- el_pfunc_t *p = va_arg(ap, el_pfunc_t *);
- char *c = va_arg(ap, char *);
- wchar_t wc = 0;
- ret = prompt_get(el, p, &wc, op);
- *c = (char)wc;
- break;
- }
-
- case EL_EDITOR: {
- const char **p = va_arg(ap, const char **);
- const wchar_t *pw;
- ret = el_wget(el, op, &pw);
- *p = ct_encode_string(pw, &el->el_lgcyconv);
- if (!el->el_lgcyconv.csize)
- ret = -1;
- break;
- }
-
- case EL_TERMINAL: /* const char ** */
- ret = el_wget(el, op, va_arg(ap, const char **));
- break;
-
- case EL_SIGNAL: /* int * */
- case EL_EDITMODE:
- case EL_UNBUFFERED:
- case EL_PREP_TERM:
- ret = el_wget(el, op, va_arg(ap, int *));
- break;
-
- case EL_GETTC: {
- char *argv[20];
- static char gettc[] = "gettc";
- int i;
- for (i = 1; i < (int)__arraycount(argv); ++i)
- if ((argv[i] = va_arg(ap, char *)) == NULL)
- break;
- argv[0] = gettc;
- ret = terminal_gettc(el, i, argv);
- break;
- }
-
- case EL_GETCFN: /* el_rfunc_t */
- ret = el_wget(el, op, va_arg(ap, el_rfunc_t *));
- break;
-
- case EL_CLIENTDATA: /* void ** */
- ret = el_wget(el, op, va_arg(ap, void **));
- break;
-
- case EL_GETFP: { /* int, FILE ** */
- int what = va_arg(ap, int);
- FILE **fpp = va_arg(ap, FILE **);
- ret = el_wget(el, op, what, fpp);
- break;
- }
-
- default:
- ret = -1;
- break;
- }
-
- va_end(ap);
- return ret;
-}
-
-
-const LineInfo *
-el_line(EditLine *el)
-{
- const LineInfoW *winfo = el_wline(el);
- LineInfo *info = &el->el_lgcylinfo;
- size_t offset;
- const Char *p;
-
- info->buffer = ct_encode_string(winfo->buffer, &el->el_lgcyconv);
-
- offset = 0;
- for (p = winfo->buffer; p < winfo->cursor; p++)
- offset += ct_enc_width(*p);
- info->cursor = info->buffer + offset;
-
- offset = 0;
- for (p = winfo->buffer; p < winfo->lastchar; p++)
- offset += ct_enc_width(*p);
- info->lastchar = info->buffer + offset;
-
- return info;
-}
-
-
-int
-el_insertstr(EditLine *el, const char *str)
-{
- return el_winsertstr(el, ct_decode_string(str, &el->el_lgcyconv));
-}
-#endif /* WIDECHAR */
diff --git a/lib/libedit/emacs.c b/lib/libedit/emacs.c
deleted file mode 100644
index 6c86b9e0d788..000000000000
--- a/lib/libedit/emacs.c
+++ /dev/null
@@ -1,513 +0,0 @@
-/* $NetBSD: emacs.c,v 1.32 2016/02/16 22:53:14 christos Exp $ */
-
-/*-
- * 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.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-#if 0
-static char sccsid[] = "@(#)emacs.c 8.1 (Berkeley) 6/4/93";
-#else
-__RCSID("$NetBSD: emacs.c,v 1.32 2016/02/16 22:53:14 christos Exp $");
-#endif
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * emacs.c: Emacs functions
- */
-#include <ctype.h>
-
-#include "el.h"
-#include "emacs.h"
-
-/* em_delete_or_list():
- * Delete character under cursor or list completions if at end of line
- * [^D]
- */
-protected el_action_t
-/*ARGSUSED*/
-em_delete_or_list(EditLine *el, wint_t c)
-{
-
- if (el->el_line.cursor == el->el_line.lastchar) {
- /* if I'm at the end */
- if (el->el_line.cursor == el->el_line.buffer) {
- /* and the beginning */
- terminal_writec(el, c); /* then do an EOF */
- return CC_EOF;
- } else {
- /*
- * Here we could list completions, but it is an
- * error right now
- */
- terminal_beep(el);
- return CC_ERROR;
- }
- } else {
- if (el->el_state.doingarg)
- c_delafter(el, el->el_state.argument);
- else
- c_delafter1(el);
- if (el->el_line.cursor > el->el_line.lastchar)
- el->el_line.cursor = el->el_line.lastchar;
- /* bounds check */
- return CC_REFRESH;
- }
-}
-
-
-/* em_delete_next_word():
- * Cut from cursor to end of current word
- * [M-d]
- */
-protected el_action_t
-/*ARGSUSED*/
-em_delete_next_word(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- Char *cp, *p, *kp;
-
- if (el->el_line.cursor == el->el_line.lastchar)
- return CC_ERROR;
-
- cp = c__next_word(el->el_line.cursor, el->el_line.lastchar,
- el->el_state.argument, ce__isword);
-
- for (p = el->el_line.cursor, kp = el->el_chared.c_kill.buf; p < cp; p++)
- /* save the text */
- *kp++ = *p;
- el->el_chared.c_kill.last = kp;
-
- c_delafter(el, (int)(cp - el->el_line.cursor)); /* delete after dot */
- if (el->el_line.cursor > el->el_line.lastchar)
- el->el_line.cursor = el->el_line.lastchar;
- /* bounds check */
- return CC_REFRESH;
-}
-
-
-/* em_yank():
- * Paste cut buffer at cursor position
- * [^Y]
- */
-protected el_action_t
-/*ARGSUSED*/
-em_yank(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- Char *kp, *cp;
-
- if (el->el_chared.c_kill.last == el->el_chared.c_kill.buf)
- return CC_NORM;
-
- if (el->el_line.lastchar +
- (el->el_chared.c_kill.last - el->el_chared.c_kill.buf) >=
- el->el_line.limit)
- return CC_ERROR;
-
- el->el_chared.c_kill.mark = el->el_line.cursor;
- cp = el->el_line.cursor;
-
- /* open the space, */
- c_insert(el,
- (int)(el->el_chared.c_kill.last - el->el_chared.c_kill.buf));
- /* copy the chars */
- for (kp = el->el_chared.c_kill.buf; kp < el->el_chared.c_kill.last; kp++)
- *cp++ = *kp;
-
- /* if an arg, cursor at beginning else cursor at end */
- if (el->el_state.argument == 1)
- el->el_line.cursor = cp;
-
- return CC_REFRESH;
-}
-
-
-/* em_kill_line():
- * Cut the entire line and save in cut buffer
- * [^U]
- */
-protected el_action_t
-/*ARGSUSED*/
-em_kill_line(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- Char *kp, *cp;
-
- cp = el->el_line.buffer;
- kp = el->el_chared.c_kill.buf;
- while (cp < el->el_line.lastchar)
- *kp++ = *cp++; /* copy it */
- el->el_chared.c_kill.last = kp;
- /* zap! -- delete all of it */
- el->el_line.lastchar = el->el_line.buffer;
- el->el_line.cursor = el->el_line.buffer;
- return CC_REFRESH;
-}
-
-
-/* em_kill_region():
- * Cut area between mark and cursor and save in cut buffer
- * [^W]
- */
-protected el_action_t
-/*ARGSUSED*/
-em_kill_region(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- Char *kp, *cp;
-
- if (!el->el_chared.c_kill.mark)
- return CC_ERROR;
-
- if (el->el_chared.c_kill.mark > el->el_line.cursor) {
- cp = el->el_line.cursor;
- kp = el->el_chared.c_kill.buf;
- while (cp < el->el_chared.c_kill.mark)
- *kp++ = *cp++; /* copy it */
- el->el_chared.c_kill.last = kp;
- c_delafter(el, (int)(cp - el->el_line.cursor));
- } else { /* mark is before cursor */
- cp = el->el_chared.c_kill.mark;
- kp = el->el_chared.c_kill.buf;
- while (cp < el->el_line.cursor)
- *kp++ = *cp++; /* copy it */
- el->el_chared.c_kill.last = kp;
- c_delbefore(el, (int)(cp - el->el_chared.c_kill.mark));
- el->el_line.cursor = el->el_chared.c_kill.mark;
- }
- return CC_REFRESH;
-}
-
-
-/* em_copy_region():
- * Copy area between mark and cursor to cut buffer
- * [M-W]
- */
-protected el_action_t
-/*ARGSUSED*/
-em_copy_region(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- Char *kp, *cp;
-
- if (!el->el_chared.c_kill.mark)
- return CC_ERROR;
-
- if (el->el_chared.c_kill.mark > el->el_line.cursor) {
- cp = el->el_line.cursor;
- kp = el->el_chared.c_kill.buf;
- while (cp < el->el_chared.c_kill.mark)
- *kp++ = *cp++; /* copy it */
- el->el_chared.c_kill.last = kp;
- } else {
- cp = el->el_chared.c_kill.mark;
- kp = el->el_chared.c_kill.buf;
- while (cp < el->el_line.cursor)
- *kp++ = *cp++; /* copy it */
- el->el_chared.c_kill.last = kp;
- }
- return CC_NORM;
-}
-
-
-/* em_gosmacs_transpose():
- * Exchange the two characters before the cursor
- * Gosling emacs transpose chars [^T]
- */
-protected el_action_t
-em_gosmacs_transpose(EditLine *el, wint_t c)
-{
-
- if (el->el_line.cursor > &el->el_line.buffer[1]) {
- /* must have at least two chars entered */
- c = el->el_line.cursor[-2];
- el->el_line.cursor[-2] = el->el_line.cursor[-1];
- el->el_line.cursor[-1] = (Char)c;
- return CC_REFRESH;
- } else
- return CC_ERROR;
-}
-
-
-/* em_next_word():
- * Move next to end of current word
- * [M-f]
- */
-protected el_action_t
-/*ARGSUSED*/
-em_next_word(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- if (el->el_line.cursor == el->el_line.lastchar)
- return CC_ERROR;
-
- el->el_line.cursor = c__next_word(el->el_line.cursor,
- el->el_line.lastchar,
- el->el_state.argument,
- ce__isword);
-
- if (el->el_map.type == MAP_VI)
- if (el->el_chared.c_vcmd.action != NOP) {
- cv_delfini(el);
- return CC_REFRESH;
- }
- return CC_CURSOR;
-}
-
-
-/* em_upper_case():
- * Uppercase the characters from cursor to end of current word
- * [M-u]
- */
-protected el_action_t
-/*ARGSUSED*/
-em_upper_case(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- Char *cp, *ep;
-
- ep = c__next_word(el->el_line.cursor, el->el_line.lastchar,
- el->el_state.argument, ce__isword);
-
- for (cp = el->el_line.cursor; cp < ep; cp++)
- if (Islower(*cp))
- *cp = Toupper(*cp);
-
- el->el_line.cursor = ep;
- if (el->el_line.cursor > el->el_line.lastchar)
- el->el_line.cursor = el->el_line.lastchar;
- return CC_REFRESH;
-}
-
-
-/* em_capitol_case():
- * Capitalize the characters from cursor to end of current word
- * [M-c]
- */
-protected el_action_t
-/*ARGSUSED*/
-em_capitol_case(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- Char *cp, *ep;
-
- ep = c__next_word(el->el_line.cursor, el->el_line.lastchar,
- el->el_state.argument, ce__isword);
-
- for (cp = el->el_line.cursor; cp < ep; cp++) {
- if (Isalpha(*cp)) {
- if (Islower(*cp))
- *cp = Toupper(*cp);
- cp++;
- break;
- }
- }
- for (; cp < ep; cp++)
- if (Isupper(*cp))
- *cp = Tolower(*cp);
-
- el->el_line.cursor = ep;
- if (el->el_line.cursor > el->el_line.lastchar)
- el->el_line.cursor = el->el_line.lastchar;
- return CC_REFRESH;
-}
-
-
-/* em_lower_case():
- * Lowercase the characters from cursor to end of current word
- * [M-l]
- */
-protected el_action_t
-/*ARGSUSED*/
-em_lower_case(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- Char *cp, *ep;
-
- ep = c__next_word(el->el_line.cursor, el->el_line.lastchar,
- el->el_state.argument, ce__isword);
-
- for (cp = el->el_line.cursor; cp < ep; cp++)
- if (Isupper(*cp))
- *cp = Tolower(*cp);
-
- el->el_line.cursor = ep;
- if (el->el_line.cursor > el->el_line.lastchar)
- el->el_line.cursor = el->el_line.lastchar;
- return CC_REFRESH;
-}
-
-
-/* em_set_mark():
- * Set the mark at cursor
- * [^@]
- */
-protected el_action_t
-/*ARGSUSED*/
-em_set_mark(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- el->el_chared.c_kill.mark = el->el_line.cursor;
- return CC_NORM;
-}
-
-
-/* em_exchange_mark():
- * Exchange the cursor and mark
- * [^X^X]
- */
-protected el_action_t
-/*ARGSUSED*/
-em_exchange_mark(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- Char *cp;
-
- cp = el->el_line.cursor;
- el->el_line.cursor = el->el_chared.c_kill.mark;
- el->el_chared.c_kill.mark = cp;
- return CC_CURSOR;
-}
-
-
-/* em_universal_argument():
- * Universal argument (argument times 4)
- * [^U]
- */
-protected el_action_t
-/*ARGSUSED*/
-em_universal_argument(EditLine *el, wint_t c __attribute__((__unused__)))
-{ /* multiply current argument by 4 */
-
- if (el->el_state.argument > 1000000)
- return CC_ERROR;
- el->el_state.doingarg = 1;
- el->el_state.argument *= 4;
- return CC_ARGHACK;
-}
-
-
-/* em_meta_next():
- * Add 8th bit to next character typed
- * [<ESC>]
- */
-protected el_action_t
-/*ARGSUSED*/
-em_meta_next(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- el->el_state.metanext = 1;
- return CC_ARGHACK;
-}
-
-
-/* em_toggle_overwrite():
- * Switch from insert to overwrite mode or vice versa
- */
-protected el_action_t
-/*ARGSUSED*/
-em_toggle_overwrite(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- el->el_state.inputmode = (el->el_state.inputmode == MODE_INSERT) ?
- MODE_REPLACE : MODE_INSERT;
- return CC_NORM;
-}
-
-
-/* em_copy_prev_word():
- * Copy current word to cursor
- */
-protected el_action_t
-/*ARGSUSED*/
-em_copy_prev_word(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- Char *cp, *oldc, *dp;
-
- if (el->el_line.cursor == el->el_line.buffer)
- return CC_ERROR;
-
- oldc = el->el_line.cursor;
- /* does a bounds check */
- cp = c__prev_word(el->el_line.cursor, el->el_line.buffer,
- el->el_state.argument, ce__isword);
-
- c_insert(el, (int)(oldc - cp));
- for (dp = oldc; cp < oldc && dp < el->el_line.lastchar; cp++)
- *dp++ = *cp;
-
- el->el_line.cursor = dp;/* put cursor at end */
-
- return CC_REFRESH;
-}
-
-
-/* em_inc_search_next():
- * Emacs incremental next search
- */
-protected el_action_t
-/*ARGSUSED*/
-em_inc_search_next(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- el->el_search.patlen = 0;
- return ce_inc_search(el, ED_SEARCH_NEXT_HISTORY);
-}
-
-
-/* em_inc_search_prev():
- * Emacs incremental reverse search
- */
-protected el_action_t
-/*ARGSUSED*/
-em_inc_search_prev(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- el->el_search.patlen = 0;
- return ce_inc_search(el, ED_SEARCH_PREV_HISTORY);
-}
-
-
-/* em_delete_prev_char():
- * Delete the character to the left of the cursor
- * [^?]
- */
-protected el_action_t
-/*ARGSUSED*/
-em_delete_prev_char(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- if (el->el_line.cursor <= el->el_line.buffer)
- return CC_ERROR;
-
- if (el->el_state.doingarg)
- c_delbefore(el, el->el_state.argument);
- else
- c_delbefore1(el);
- el->el_line.cursor -= el->el_state.argument;
- if (el->el_line.cursor < el->el_line.buffer)
- el->el_line.cursor = el->el_line.buffer;
- return CC_REFRESH;
-}
diff --git a/lib/libedit/filecomplete.c b/lib/libedit/filecomplete.c
deleted file mode 100644
index 54bf7d99ddfe..000000000000
--- a/lib/libedit/filecomplete.c
+++ /dev/null
@@ -1,697 +0,0 @@
-/* $NetBSD: filecomplete.c,v 1.40 2016/02/17 19:47:49 christos Exp $ */
-
-/*-
- * Copyright (c) 1997 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Jaromir Dolecek.
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-__RCSID("$NetBSD: filecomplete.c,v 1.40 2016/02/17 19:47:49 christos Exp $");
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <dirent.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "el.h"
-#include "filecomplete.h"
-
-static const Char break_chars[] = { ' ', '\t', '\n', '"', '\\', '\'', '`', '@',
- '$', '>', '<', '=', ';', '|', '&', '{', '(', '\0' };
-/* Tilde is deliberately omitted here, we treat it specially. */
-static const Char extra_quote_chars[] = { ')', '}', '*', '?', '[', '$', '\0' };
-
-
-/********************************/
-/* completion functions */
-
-/*
- * does tilde expansion of strings of type ``~user/foo''
- * if ``user'' isn't valid user name or ``txt'' doesn't start
- * w/ '~', returns pointer to strdup()ed copy of ``txt''
- *
- * it's the caller's responsibility to free() the returned string
- */
-char *
-fn_tilde_expand(const char *txt)
-{
-#if defined(HAVE_GETPW_R_POSIX) || defined(HAVE_GETPW_R_DRAFT)
- struct passwd pwres;
- char pwbuf[1024];
-#endif
- struct passwd *pass;
- char *temp;
- size_t len = 0;
-
- if (txt[0] != '~')
- return strdup(txt);
-
- temp = strchr(txt + 1, '/');
- if (temp == NULL) {
- temp = strdup(txt + 1);
- if (temp == NULL)
- return NULL;
- } else {
- /* text until string after slash */
- len = (size_t)(temp - txt + 1);
- temp = el_malloc(len * sizeof(*temp));
- if (temp == NULL)
- return NULL;
- (void)strncpy(temp, txt + 1, len - 2);
- temp[len - 2] = '\0';
- }
- if (temp[0] == 0) {
-#ifdef HAVE_GETPW_R_POSIX
- if (getpwuid_r(getuid(), &pwres, pwbuf, sizeof(pwbuf),
- &pass) != 0)
- pass = NULL;
-#elif HAVE_GETPW_R_DRAFT
- pass = getpwuid_r(getuid(), &pwres, pwbuf, sizeof(pwbuf));
-#else
- pass = getpwuid(getuid());
-#endif
- } else {
-#ifdef HAVE_GETPW_R_POSIX
- if (getpwnam_r(temp, &pwres, pwbuf, sizeof(pwbuf), &pass) != 0)
- pass = NULL;
-#elif HAVE_GETPW_R_DRAFT
- pass = getpwnam_r(temp, &pwres, pwbuf, sizeof(pwbuf));
-#else
- pass = getpwnam(temp);
-#endif
- }
- el_free(temp); /* value no more needed */
- if (pass == NULL)
- return strdup(txt);
-
- /* update pointer txt to point at string immedially following */
- /* first slash */
- txt += len;
-
- len = strlen(pass->pw_dir) + 1 + strlen(txt) + 1;
- temp = el_malloc(len * sizeof(*temp));
- if (temp == NULL)
- return NULL;
- (void)snprintf(temp, len, "%s/%s", pass->pw_dir, txt);
-
- return temp;
-}
-
-
-/*
- * return first found file name starting by the ``text'' or NULL if no
- * such file can be found
- * value of ``state'' is ignored
- *
- * it's the caller's responsibility to free the returned string
- */
-char *
-fn_filename_completion_function(const char *text, int state)
-{
- static DIR *dir = NULL;
- static char *filename = NULL, *dirname = NULL, *dirpath = NULL;
- static size_t filename_len = 0;
- struct dirent *entry;
- char *temp;
- size_t len;
-
- if (state == 0 || dir == NULL) {
- temp = strrchr(text, '/');
- if (temp) {
- char *nptr;
- temp++;
- nptr = el_realloc(filename, (strlen(temp) + 1) *
- sizeof(*nptr));
- if (nptr == NULL) {
- el_free(filename);
- filename = NULL;
- return NULL;
- }
- filename = nptr;
- (void)strcpy(filename, temp);
- len = (size_t)(temp - text); /* including last slash */
-
- nptr = el_realloc(dirname, (len + 1) *
- sizeof(*nptr));
- if (nptr == NULL) {
- el_free(dirname);
- dirname = NULL;
- return NULL;
- }
- dirname = nptr;
- (void)strncpy(dirname, text, len);
- dirname[len] = '\0';
- } else {
- el_free(filename);
- if (*text == 0)
- filename = NULL;
- else {
- filename = strdup(text);
- if (filename == NULL)
- return NULL;
- }
- el_free(dirname);
- dirname = NULL;
- }
-
- if (dir != NULL) {
- (void)closedir(dir);
- dir = NULL;
- }
-
- /* support for ``~user'' syntax */
-
- el_free(dirpath);
- dirpath = NULL;
- if (dirname == NULL) {
- if ((dirname = strdup("")) == NULL)
- return NULL;
- dirpath = strdup("./");
- } else if (*dirname == '~')
- dirpath = fn_tilde_expand(dirname);
- else
- dirpath = strdup(dirname);
-
- if (dirpath == NULL)
- return NULL;
-
- dir = opendir(dirpath);
- if (!dir)
- return NULL; /* cannot open the directory */
-
- /* will be used in cycle */
- filename_len = filename ? strlen(filename) : 0;
- }
-
- /* find the match */
- while ((entry = readdir(dir)) != NULL) {
- /* skip . and .. */
- if (entry->d_name[0] == '.' && (!entry->d_name[1]
- || (entry->d_name[1] == '.' && !entry->d_name[2])))
- continue;
- if (filename_len == 0)
- break;
- /* otherwise, get first entry where first */
- /* filename_len characters are equal */
- if (entry->d_name[0] == filename[0]
-#if HAVE_STRUCT_DIRENT_D_NAMLEN
- && entry->d_namlen >= filename_len
-#else
- && strlen(entry->d_name) >= filename_len
-#endif
- && strncmp(entry->d_name, filename,
- filename_len) == 0)
- break;
- }
-
- if (entry) { /* match found */
-
-#if HAVE_STRUCT_DIRENT_D_NAMLEN
- len = entry->d_namlen;
-#else
- len = strlen(entry->d_name);
-#endif
-
- len = strlen(dirname) + len + 1;
- temp = el_malloc(len * sizeof(*temp));
- if (temp == NULL)
- return NULL;
- (void)snprintf(temp, len, "%s%s", dirname, entry->d_name);
- } else {
- (void)closedir(dir);
- dir = NULL;
- temp = NULL;
- }
-
- return temp;
-}
-
-
-static const char *
-append_char_function(const char *name)
-{
- struct stat stbuf;
- char *expname = *name == '~' ? fn_tilde_expand(name) : NULL;
- const char *rs = " ";
-
- if (stat(expname ? expname : name, &stbuf) == -1)
- goto out;
- if (S_ISDIR(stbuf.st_mode))
- rs = "/";
-out:
- if (expname)
- el_free(expname);
- return rs;
-}
-/*
- * returns list of completions for text given
- * non-static for readline.
- */
-char ** completion_matches(const char *, char *(*)(const char *, int));
-char **
-completion_matches(const char *text, char *(*genfunc)(const char *, int))
-{
- char **match_list = NULL, *retstr, *prevstr;
- size_t match_list_len, max_equal, which, i;
- size_t matches;
-
- matches = 0;
- match_list_len = 1;
- while ((retstr = (*genfunc) (text, (int)matches)) != NULL) {
- /* allow for list terminator here */
- if (matches + 3 >= match_list_len) {
- char **nmatch_list;
- while (matches + 3 >= match_list_len)
- match_list_len <<= 1;
- nmatch_list = el_realloc(match_list,
- match_list_len * sizeof(*nmatch_list));
- if (nmatch_list == NULL) {
- el_free(match_list);
- return NULL;
- }
- match_list = nmatch_list;
-
- }
- match_list[++matches] = retstr;
- }
-
- if (!match_list)
- return NULL; /* nothing found */
-
- /* find least denominator and insert it to match_list[0] */
- which = 2;
- prevstr = match_list[1];
- max_equal = strlen(prevstr);
- for (; which <= matches; which++) {
- for (i = 0; i < max_equal &&
- prevstr[i] == match_list[which][i]; i++)
- continue;
- max_equal = i;
- }
-
- retstr = el_malloc((max_equal + 1) * sizeof(*retstr));
- if (retstr == NULL) {
- el_free(match_list);
- return NULL;
- }
- (void)strncpy(retstr, match_list[1], max_equal);
- retstr[max_equal] = '\0';
- match_list[0] = retstr;
-
- /* add NULL as last pointer to the array */
- match_list[matches + 1] = NULL;
-
- return match_list;
-}
-
-/*
- * Sort function for qsort(). Just wrapper around strcasecmp().
- */
-static int
-_fn_qsort_string_compare(const void *i1, const void *i2)
-{
- const char *s1 = ((const char * const *)i1)[0];
- const char *s2 = ((const char * const *)i2)[0];
-
- return strcasecmp(s1, s2);
-}
-
-/*
- * Display list of strings in columnar format on readline's output stream.
- * 'matches' is list of strings, 'num' is number of strings in 'matches',
- * 'width' is maximum length of string in 'matches'.
- *
- * matches[0] is not one of the match strings, but it is counted in
- * num, so the strings are matches[1] *through* matches[num-1].
- */
-void
-fn_display_match_list (EditLine *el, char **matches, size_t num, size_t width)
-{
- size_t line, lines, col, cols, thisguy;
- int screenwidth = el->el_terminal.t_size.h;
-
- /* Ignore matches[0]. Avoid 1-based array logic below. */
- matches++;
- num--;
-
- /*
- * Find out how many entries can be put on one line; count
- * with one space between strings the same way it's printed.
- */
- cols = (size_t)screenwidth / (width + 1);
- if (cols == 0)
- cols = 1;
-
- /* how many lines of output, rounded up */
- lines = (num + cols - 1) / cols;
-
- /* Sort the items. */
- qsort(matches, num, sizeof(char *), _fn_qsort_string_compare);
-
- /*
- * On the ith line print elements i, i+lines, i+lines*2, etc.
- */
- for (line = 0; line < lines; line++) {
- for (col = 0; col < cols; col++) {
- thisguy = line + col * lines;
- if (thisguy >= num)
- break;
- (void)fprintf(el->el_outfile, "%s%-*s",
- col == 0 ? "" : " ", (int)width, matches[thisguy]);
- }
- (void)fprintf(el->el_outfile, "\n");
- }
-}
-
-/*
- * Complete the word at or before point,
- * 'what_to_do' says what to do with the completion.
- * \t means do standard completion.
- * `?' means list the possible completions.
- * `*' means insert all of the possible completions.
- * `!' means to do standard completion, and list all possible completions if
- * there is more than one.
- *
- * Note: '*' support is not implemented
- * '!' could never be invoked
- */
-int
-fn_complete(EditLine *el,
- char *(*complet_func)(const char *, int),
- char **(*attempted_completion_function)(const char *, int, int),
- const Char *word_break, const Char *special_prefixes,
- const char *(*app_func)(const char *), size_t query_items,
- int *completion_type, int *over, int *point, int *end,
- const Char *(*find_word_start_func)(const Char *, const Char *),
- Char *(*dequoting_func)(const Char *),
- char *(*quoting_func)(const char *))
-{
- const TYPE(LineInfo) *li;
- Char *temp;
- Char *dequoted_temp;
- char **matches;
- const Char *ctemp;
- size_t len;
- int what_to_do = '\t';
- int retval = CC_NORM;
-
- if (el->el_state.lastcmd == el->el_state.thiscmd)
- what_to_do = '?';
-
- /* readline's rl_complete() has to be told what we did... */
- if (completion_type != NULL)
- *completion_type = what_to_do;
-
- if (!complet_func)
- complet_func = fn_filename_completion_function;
- if (!app_func)
- app_func = append_char_function;
-
- /* We now look backwards for the start of a filename/variable word */
- li = FUN(el,line)(el);
- if (find_word_start_func)
- ctemp = find_word_start_func(li->buffer, li->cursor);
- else {
- ctemp = li->cursor;
- while (ctemp > li->buffer
- && !Strchr(word_break, ctemp[-1])
- && (!special_prefixes || !Strchr(special_prefixes, ctemp[-1]) ) )
- ctemp--;
- }
-
- len = (size_t)(li->cursor - ctemp);
- temp = el_malloc((len + 1) * sizeof(*temp));
- (void)Strncpy(temp, ctemp, len);
- temp[len] = '\0';
-
- if (dequoting_func) {
- dequoted_temp = dequoting_func(temp);
- if (dequoted_temp == NULL)
- return retval;
- } else
- dequoted_temp = NULL;
-
- /* these can be used by function called in completion_matches() */
- /* or (*attempted_completion_function)() */
- if (point != NULL)
- *point = (int)(li->cursor - li->buffer);
- if (end != NULL)
- *end = (int)(li->lastchar - li->buffer);
-
- if (attempted_completion_function) {
- int cur_off = (int)(li->cursor - li->buffer);
- matches = (*attempted_completion_function)(
- ct_encode_string(dequoted_temp ? dequoted_temp : temp,
- &el->el_scratch),
- cur_off - (int)len, cur_off);
- } else
- matches = NULL;
- if (!attempted_completion_function ||
- (over != NULL && !*over && !matches))
- matches = completion_matches(
- ct_encode_string(dequoted_temp ? dequoted_temp : temp,
- &el->el_scratch), complet_func);
-
- if (over != NULL)
- *over = 0;
-
- if (matches) {
- int i;
- size_t matches_num, maxlen, match_len, match_display=1;
-
- retval = CC_REFRESH;
- /*
- * Only replace the completed string with common part of
- * possible matches if there is possible completion.
- */
- if (matches[0][0] != '\0') {
- char *quoted_match;
- if (quoting_func) {
- quoted_match = quoting_func(matches[0]);
- if (quoted_match == NULL)
- goto free_matches;
- } else
- quoted_match = NULL;
- el_deletestr(el, (int) len);
- FUN(el,insertstr)(el,
- ct_decode_string(quoted_match ? quoted_match :
- matches[0] , &el->el_scratch));
- }
-
- if (what_to_do == '?')
- goto display_matches;
-
- if (matches[2] == NULL &&
- (matches[1] == NULL || strcmp(matches[0], matches[1]) == 0)) {
- /*
- * We found exact match. Add a space after
- * it, unless we do filename completion and the
- * object is a directory.
- */
- FUN(el,insertstr)(el,
- ct_decode_string((*app_func)(matches[0]),
- &el->el_scratch));
- } else if (what_to_do == '!') {
- display_matches:
- /*
- * More than one match and requested to list possible
- * matches.
- */
-
- for(i = 1, maxlen = 0; matches[i]; i++) {
- match_len = strlen(matches[i]);
- if (match_len > maxlen)
- maxlen = match_len;
- }
- /* matches[1] through matches[i-1] are available */
- matches_num = (size_t)(i - 1);
-
- /* newline to get on next line from command line */
- (void)fprintf(el->el_outfile, "\n");
-
- /*
- * If there are too many items, ask user for display
- * confirmation.
- */
- if (matches_num > query_items) {
- (void)fprintf(el->el_outfile,
- "Display all %zu possibilities? (y or n) ",
- matches_num);
- (void)fflush(el->el_outfile);
- if (getc(stdin) != 'y')
- match_display = 0;
- (void)fprintf(el->el_outfile, "\n");
- }
-
- if (match_display) {
- /*
- * Interface of this function requires the
- * strings be matches[1..num-1] for compat.
- * We have matches_num strings not counting
- * the prefix in matches[0], so we need to
- * add 1 to matches_num for the call.
- */
- fn_display_match_list(el, matches,
- matches_num+1, maxlen);
- }
- retval = CC_REDISPLAY;
- } else if (matches[0][0]) {
- /*
- * There was some common match, but the name was
- * not complete enough. Next tab will print possible
- * completions.
- */
- el_beep(el);
- } else {
- /* lcd is not a valid object - further specification */
- /* is needed */
- el_beep(el);
- retval = CC_NORM;
- }
-
-free_matches:
- /* free elements of array and the array itself */
- for (i = 0; matches[i]; i++)
- el_free(matches[i]);
- el_free(matches);
- matches = NULL;
- }
- free(dequoted_temp);
- el_free(temp);
- return retval;
-}
-
-/*
- * el-compatible wrapper around rl_complete; needed for key binding
- */
-/* ARGSUSED */
-unsigned char
-_el_fn_complete(EditLine *el, int ch __attribute__((__unused__)))
-{
- return (unsigned char)fn_complete(el, NULL, NULL,
- break_chars, NULL, NULL, (size_t)100,
- NULL, NULL, NULL, NULL,
- NULL, NULL, NULL);
-}
-
-static const Char *
-sh_find_word_start(const Char *buffer, const Char *cursor)
-{
- const Char *word_start = buffer;
-
- while (buffer < cursor) {
- if (*buffer == '\\')
- buffer++;
- else if (Strchr(break_chars, *buffer))
- word_start = buffer + 1;
- buffer++;
- }
- return word_start;
-}
-
-static char *
-sh_quote(const char *str)
-{
- const char *src;
- int extra_len = 0;
- char *quoted_str, *dst;
-
- for (src = str; *src != '\0'; src++)
- if (Strchr(break_chars, *src) ||
- Strchr(extra_quote_chars, *src))
- extra_len++;
-
- quoted_str = malloc(sizeof(*quoted_str) *
- (strlen(str) + extra_len + 1));
- if (quoted_str == NULL)
- return NULL;
-
- dst = quoted_str;
- for (src = str; *src != '\0'; src++) {
- if (Strchr(break_chars, *src) ||
- Strchr(extra_quote_chars, *src))
- *dst++ = '\\';
- *dst++ = *src;
- }
- *dst = '\0';
-
- return quoted_str;
-}
-
-static Char *
-sh_dequote(const Char *str)
-{
- Char *dequoted_str, *dst;
-
- /* save extra space to replace \~ with ./~ */
- dequoted_str = malloc(sizeof(*dequoted_str) * (Strlen(str) + 1 + 1));
- if (dequoted_str == NULL)
- return NULL;
-
- dst = dequoted_str;
-
- /* dequote \~ at start as ./~ */
- if (*str == '\\' && str[1] == '~') {
- str++;
- *dst++ = '.';
- *dst++ = '/';
- }
-
- while (*str) {
- if (*str == '\\')
- str++;
- if (*str)
- *dst++ = *str++;
- }
- *dst = '\0';
-
- return dequoted_str;
-}
-
-/*
- * completion function using sh quoting rules; for key binding
- */
-/* ARGSUSED */
-unsigned char
-_el_fn_sh_complete(EditLine *el, int ch __attribute__((__unused__)))
-{
- return (unsigned char)fn_complete(el, NULL, NULL,
- break_chars, NULL, NULL, 100,
- NULL, NULL, NULL, NULL,
- sh_find_word_start, sh_dequote, sh_quote);
-}
diff --git a/lib/libedit/filecomplete.h b/lib/libedit/filecomplete.h
deleted file mode 100644
index 36666860ca9a..000000000000
--- a/lib/libedit/filecomplete.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* $NetBSD: filecomplete.h,v 1.9 2009/12/30 22:37:40 christos Exp $ */
-
-/*-
- * Copyright (c) 1997 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Jaromir Dolecek.
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
- *
- * $FreeBSD$
- */
-#ifndef _FILECOMPLETE_H_
-#define _FILECOMPLETE_H_
-
-int fn_complete(EditLine *,
- char *(*)(const char *, int),
- char **(*)(const char *, int, int),
- const Char *, const Char *, const char *(*)(const char *), size_t,
- int *, int *, int *, int *,
- const Char *(*)(const Char *, const Char *),
- Char *(*)(const Char *),
- char *(*)(const char *));
-
-void fn_display_match_list(EditLine *, char **, size_t, size_t);
-char *fn_tilde_expand(const char *);
-char *fn_filename_completion_function(const char *, int);
-
-#endif
diff --git a/lib/libedit/hist.c b/lib/libedit/hist.c
deleted file mode 100644
index bcabe68cba1f..000000000000
--- a/lib/libedit/hist.c
+++ /dev/null
@@ -1,227 +0,0 @@
-/* $NetBSD: hist.c,v 1.24 2016/02/16 22:53:14 christos Exp $ */
-
-/*-
- * 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.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-#if 0
-static char sccsid[] = "@(#)hist.c 8.1 (Berkeley) 6/4/93";
-#else
-__RCSID("$NetBSD: hist.c,v 1.24 2016/02/16 22:53:14 christos Exp $");
-#endif
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * hist.c: History access functions
- */
-#include <stdlib.h>
-#include <string.h>
-
-#include "el.h"
-
-/* hist_init():
- * Initialization function.
- */
-protected int
-hist_init(EditLine *el)
-{
-
- el->el_history.fun = NULL;
- el->el_history.ref = NULL;
- el->el_history.buf = el_malloc(EL_BUFSIZ * sizeof(*el->el_history.buf));
- el->el_history.sz = EL_BUFSIZ;
- if (el->el_history.buf == NULL)
- return -1;
- el->el_history.last = el->el_history.buf;
- return 0;
-}
-
-
-/* hist_end():
- * clean up history;
- */
-protected void
-hist_end(EditLine *el)
-{
-
- el_free(el->el_history.buf);
- el->el_history.buf = NULL;
-}
-
-
-/* hist_set():
- * Set new history interface
- */
-protected int
-hist_set(EditLine *el, hist_fun_t fun, void *ptr)
-{
-
- el->el_history.ref = ptr;
- el->el_history.fun = fun;
- return 0;
-}
-
-
-/* hist_get():
- * Get a history line and update it in the buffer.
- * eventno tells us the event to get.
- */
-protected el_action_t
-hist_get(EditLine *el)
-{
- const Char *hp;
- int h;
-
- if (el->el_history.eventno == 0) { /* if really the current line */
- (void) Strncpy(el->el_line.buffer, el->el_history.buf,
- el->el_history.sz);
- el->el_line.lastchar = el->el_line.buffer +
- (el->el_history.last - el->el_history.buf);
-
-#ifdef KSHVI
- if (el->el_map.type == MAP_VI)
- el->el_line.cursor = el->el_line.buffer;
- else
-#endif /* KSHVI */
- el->el_line.cursor = el->el_line.lastchar;
-
- return CC_REFRESH;
- }
- if (el->el_history.ref == NULL)
- return CC_ERROR;
-
- hp = HIST_FIRST(el);
-
- if (hp == NULL)
- return CC_ERROR;
-
- for (h = 1; h < el->el_history.eventno; h++)
- if ((hp = HIST_NEXT(el)) == NULL) {
- el->el_history.eventno = h;
- return CC_ERROR;
- }
- (void) Strncpy(el->el_line.buffer, hp,
- (size_t)(el->el_line.limit - el->el_line.buffer));
- el->el_line.buffer[el->el_line.limit - el->el_line.buffer - 1] = '\0';
- el->el_line.lastchar = el->el_line.buffer + Strlen(el->el_line.buffer);
-
- if (el->el_line.lastchar > el->el_line.buffer
- && el->el_line.lastchar[-1] == '\n')
- el->el_line.lastchar--;
- if (el->el_line.lastchar > el->el_line.buffer
- && el->el_line.lastchar[-1] == ' ')
- el->el_line.lastchar--;
-#ifdef KSHVI
- if (el->el_map.type == MAP_VI)
- el->el_line.cursor = el->el_line.buffer;
- else
-#endif /* KSHVI */
- el->el_line.cursor = el->el_line.lastchar;
-
- return CC_REFRESH;
-}
-
-
-/* hist_command()
- * process a history command
- */
-protected int
-hist_command(EditLine *el, int argc, const Char **argv)
-{
- const Char *str;
- int num;
- TYPE(HistEvent) ev;
-
- if (el->el_history.ref == NULL)
- return -1;
-
- if (argc == 1 || Strcmp(argv[1], STR("list")) == 0) {
- /* List history entries */
-
- for (str = HIST_LAST(el); str != NULL; str = HIST_PREV(el))
- (void) fprintf(el->el_outfile, "%d %s",
- el->el_history.ev.num, ct_encode_string(str, &el->el_scratch));
- return 0;
- }
-
- if (argc != 3)
- return -1;
-
- num = (int)Strtol(argv[2], NULL, 0);
-
- if (Strcmp(argv[1], STR("size")) == 0)
- return FUNW(history)(el->el_history.ref, &ev, H_SETSIZE, num);
-
- if (Strcmp(argv[1], STR("unique")) == 0)
- return FUNW(history)(el->el_history.ref, &ev, H_SETUNIQUE, num);
-
- return -1;
-}
-
-/* hist_enlargebuf()
- * Enlarge history buffer to specified value. Called from el_enlargebufs().
- * Return 0 for failure, 1 for success.
- */
-protected int
-/*ARGSUSED*/
-hist_enlargebuf(EditLine *el, size_t oldsz, size_t newsz)
-{
- Char *newbuf;
-
- newbuf = el_realloc(el->el_history.buf, newsz * sizeof(*newbuf));
- if (!newbuf)
- return 0;
-
- (void) memset(&newbuf[oldsz], '\0', (newsz - oldsz) * sizeof(*newbuf));
-
- el->el_history.last = newbuf +
- (el->el_history.last - el->el_history.buf);
- el->el_history.buf = newbuf;
- el->el_history.sz = newsz;
-
- return 1;
-}
-
-#ifdef WIDECHAR
-protected wchar_t *
-hist_convert(EditLine *el, int fn, void *arg)
-{
- HistEventW ev;
- if ((*(el)->el_history.fun)((el)->el_history.ref, &ev, fn, arg) == -1)
- return NULL;
- return ct_decode_string((const char *)(const void *)ev.str,
- &el->el_scratch);
-}
-#endif
diff --git a/lib/libedit/hist.h b/lib/libedit/hist.h
deleted file mode 100644
index 23b1e0366b70..000000000000
--- a/lib/libedit/hist.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/* $NetBSD: hist.h,v 1.18 2016/02/17 19:47:49 christos Exp $ */
-
-/*-
- * 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.
- *
- * @(#)hist.h 8.1 (Berkeley) 6/4/93
- * $FreeBSD$
- */
-
-/*
- * el.hist.c: History functions
- */
-#ifndef _h_el_hist
-#define _h_el_hist
-
-typedef int (*hist_fun_t)(void *, TYPE(HistEvent) *, int, ...);
-
-typedef struct el_history_t {
- Char *buf; /* The history buffer */
- size_t sz; /* Size of history buffer */
- Char *last; /* The last character */
- int eventno; /* Event we are looking for */
- void *ref; /* Argument for history fcns */
- hist_fun_t fun; /* Event access */
- TYPE(HistEvent) ev; /* Event cookie */
-} el_history_t;
-
-#define HIST_FUN_INTERNAL(el, fn, arg) \
- ((((*(el)->el_history.fun) ((el)->el_history.ref, &(el)->el_history.ev, \
- fn, arg)) == -1) ? NULL : (el)->el_history.ev.str)
-#ifdef WIDECHAR
-#define HIST_FUN(el, fn, arg) \
- (((el)->el_flags & NARROW_HISTORY) ? hist_convert(el, fn, arg) : \
- HIST_FUN_INTERNAL(el, fn, arg))
-#else
-#define HIST_FUN(el, fn, arg) HIST_FUN_INTERNAL(el, fn, arg)
-#endif
-
-
-#define HIST_NEXT(el) HIST_FUN(el, H_NEXT, NULL)
-#define HIST_FIRST(el) HIST_FUN(el, H_FIRST, NULL)
-#define HIST_LAST(el) HIST_FUN(el, H_LAST, NULL)
-#define HIST_PREV(el) HIST_FUN(el, H_PREV, NULL)
-#define HIST_SET(el, num) HIST_FUN(el, H_SET, num)
-#define HIST_LOAD(el, fname) HIST_FUN(el, H_LOAD fname)
-#define HIST_SAVE(el, fname) HIST_FUN(el, H_SAVE fname)
-#define HIST_SAVE_FP(el, fp) HIST_FUN(el, H_SAVE_FP fp)
-
-protected int hist_init(EditLine *);
-protected void hist_end(EditLine *);
-protected el_action_t hist_get(EditLine *);
-protected int hist_set(EditLine *, hist_fun_t, void *);
-protected int hist_command(EditLine *, int, const Char **);
-protected int hist_enlargebuf(EditLine *, size_t, size_t);
-#ifdef WIDECHAR
-protected wchar_t *hist_convert(EditLine *, int, void *);
-#endif
-
-#endif /* _h_el_hist */
diff --git a/lib/libedit/histedit.h b/lib/libedit/histedit.h
deleted file mode 100644
index e5449eddbf6d..000000000000
--- a/lib/libedit/histedit.h
+++ /dev/null
@@ -1,313 +0,0 @@
-/* $NetBSD: histedit.h,v 1.55 2016/02/17 19:47:49 christos Exp $ */
-
-/*-
- * 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
- * $FreeBSD$
- */
-
-/*
- * histedit.h: Line editor and history interface.
- */
-#ifndef _HISTEDIT_H_
-#define _HISTEDIT_H_
-
-#define LIBEDIT_MAJOR 2
-#define LIBEDIT_MINOR 11
-
-#include <sys/types.h>
-#include <stdio.h>
-
-#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 *);
-EditLine *el_init_fd(const char *, FILE *, FILE *, FILE *,
- int, int, int);
-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
- *
- * When using el_wset/el_wget (as opposed to el_set/el_get):
- * Char is wchar_t, otherwise it is char.
- * prompt_func is el_wpfunc_t, otherwise it is el_pfunc_t .
-
- * Prompt function prototypes are:
- * typedef char *(*el_pfunct_t) (EditLine *);
- * typedef wchar_t *(*el_wpfunct_t) (EditLine *);
- *
- * For operations that support set or set/get, the argument types listed are for
- * the "set" operation. For "get", each listed type must be a pointer.
- * E.g. EL_EDITMODE takes an int when set, but an int* when get.
- *
- * Operations that only support "get" have the correct argument types listed.
- */
-#define EL_PROMPT 0 /* , prompt_func); set/get */
-#define EL_TERMINAL 1 /* , const char *); set/get */
-#define EL_EDITOR 2 /* , const Char *); set/get */
-#define EL_SIGNAL 3 /* , int); set/get */
-#define EL_BIND 4 /* , const Char *, ..., NULL); set */
-#define EL_TELLTC 5 /* , const Char *, ..., NULL); set */
-#define EL_SETTC 6 /* , const Char *, ..., NULL); set */
-#define EL_ECHOTC 7 /* , const Char *, ..., NULL); set */
-#define EL_SETTY 8 /* , const Char *, ..., NULL); set */
-#define EL_ADDFN 9 /* , const Char *, const Char, set */
- /* el_func_t); */
-#define EL_HIST 10 /* , hist_fun_t, const void *); set */
-#define EL_EDITMODE 11 /* , int); set/get */
-#define EL_RPROMPT 12 /* , prompt_func); set/get */
-#define EL_GETCFN 13 /* , el_rfunc_t); set/get */
-#define EL_CLIENTDATA 14 /* , void *); set/get */
-#define EL_UNBUFFERED 15 /* , int); set/get */
-#define EL_PREP_TERM 16 /* , int); set */
-#define EL_GETTC 17 /* , const Char *, ..., NULL); get */
-#define EL_GETFP 18 /* , int, FILE **); get */
-#define EL_SETFP 19 /* , int, FILE *); set */
-#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_ALIAS_TEXT 24 /* , el_afunc_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 *);
-
-/*
- * 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_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 wchar_t *); */
-#define H_ENTER 10 /* , const wchar_t *); */
-#define H_APPEND 11 /* , const wchar_t *); */
-#define H_END 12 /* , void); */
-#define H_NEXT_STR 13 /* , const wchar_t *); */
-#define H_PREV_STR 14 /* , const wchar_t *); */
-#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); */
-#define H_SAVE_FP 26 /* , FILE *); */
-
-
-
-/*
- * ==== 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 ***);
-
-/*
- * Begin Wide Character Support
- */
-#include <wchar.h>
-#include <wctype.h>
-
-/*
- * ==== Editing ====
- */
-typedef struct lineinfow {
- const wchar_t *buffer;
- const wchar_t *cursor;
- const wchar_t *lastchar;
-} LineInfoW;
-
-const wchar_t *el_wgets(EditLine *, int *);
-int el_wgetc(EditLine *, wchar_t *);
-void el_wpush(EditLine *, const wchar_t *);
-
-int el_wparse(EditLine *, int, const wchar_t **);
-
-int el_wset(EditLine *, int, ...);
-int el_wget(EditLine *, int, ...);
-
-int el_cursor(EditLine *, int);
-const LineInfoW *el_wline(EditLine *);
-int el_winsertstr(EditLine *, const wchar_t *);
-#define el_wdeletestr el_deletestr
-
-/*
- * ==== History ====
- */
-typedef struct histeventW {
- int num;
- const wchar_t *str;
-} HistEventW;
-
-typedef struct historyW HistoryW;
-
-HistoryW * history_winit(void);
-void history_wend(HistoryW *);
-
-int history_w(HistoryW *, HistEventW *, int, ...);
-
-/*
- * ==== Tokenization ====
- */
-typedef struct tokenizerW TokenizerW;
-
-/* Wide character tokenizer support */
-TokenizerW *tok_winit(const wchar_t *);
-void tok_wend(TokenizerW *);
-void tok_wreset(TokenizerW *);
-int tok_wline(TokenizerW *, const LineInfoW *,
- int *, const wchar_t ***, int *, int *);
-int tok_wstr(TokenizerW *, const wchar_t *,
- int *, const wchar_t ***);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _HISTEDIT_H_ */
diff --git a/lib/libedit/history.c b/lib/libedit/history.c
deleted file mode 100644
index d97a797fef6b..000000000000
--- a/lib/libedit/history.c
+++ /dev/null
@@ -1,1122 +0,0 @@
-/* $NetBSD: history.c,v 1.52 2016/02/17 19:47:49 christos Exp $ */
-
-/*-
- * 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.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-#if 0
-static char sccsid[] = "@(#)history.c 8.1 (Berkeley) 6/4/93";
-#else
-__RCSID("$NetBSD: history.c,v 1.52 2016/02/17 19:47:49 christos Exp $");
-#endif
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * hist.c: TYPE(History) access functions
- */
-#include <sys/stat.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-#include <vis.h>
-
-static const char hist_cookie[] = "_HiStOrY_V2_\n";
-
-#include "histedit.h"
-#include "chartype.h"
-
-typedef int (*history_gfun_t)(void *, TYPE(HistEvent) *);
-typedef int (*history_efun_t)(void *, TYPE(HistEvent) *, const Char *);
-typedef void (*history_vfun_t)(void *, TYPE(HistEvent) *);
-typedef int (*history_sfun_t)(void *, TYPE(HistEvent) *, const int);
-
-struct TYPE(history) {
- void *h_ref; /* Argument for history fcns */
- int h_ent; /* Last entry point for history */
- history_gfun_t h_first; /* Get the first element */
- history_gfun_t h_next; /* Get the next element */
- history_gfun_t h_last; /* Get the last element */
- history_gfun_t h_prev; /* Get the previous element */
- history_gfun_t h_curr; /* Get the current element */
- history_sfun_t h_set; /* Set the current element */
- history_sfun_t h_del; /* Set the given element */
- history_vfun_t h_clear; /* Clear the history list */
- history_efun_t h_enter; /* Add an element */
- history_efun_t h_add; /* Append to an element */
-};
-
-#define HNEXT(h, ev) (*(h)->h_next)((h)->h_ref, ev)
-#define HFIRST(h, ev) (*(h)->h_first)((h)->h_ref, ev)
-#define HPREV(h, ev) (*(h)->h_prev)((h)->h_ref, ev)
-#define HLAST(h, ev) (*(h)->h_last)((h)->h_ref, ev)
-#define HCURR(h, ev) (*(h)->h_curr)((h)->h_ref, ev)
-#define HSET(h, ev, n) (*(h)->h_set)((h)->h_ref, ev, n)
-#define HCLEAR(h, ev) (*(h)->h_clear)((h)->h_ref, ev)
-#define HENTER(h, ev, str) (*(h)->h_enter)((h)->h_ref, ev, str)
-#define HADD(h, ev, str) (*(h)->h_add)((h)->h_ref, ev, str)
-#define HDEL(h, ev, n) (*(h)->h_del)((h)->h_ref, ev, n)
-
-#define h_strdup(a) Strdup(a)
-#define h_malloc(a) malloc(a)
-#define h_realloc(a, b) realloc((a), (b))
-#define h_free(a) free(a)
-
-typedef struct {
- int num;
- Char *str;
-} HistEventPrivate;
-
-
-
-private int history_setsize(TYPE(History) *, TYPE(HistEvent) *, int);
-private int history_getsize(TYPE(History) *, TYPE(HistEvent) *);
-private int history_setunique(TYPE(History) *, TYPE(HistEvent) *, int);
-private int history_getunique(TYPE(History) *, TYPE(HistEvent) *);
-private int history_set_fun(TYPE(History) *, TYPE(History) *);
-private int history_load(TYPE(History) *, const char *);
-private int history_save(TYPE(History) *, const char *);
-private int history_save_fp(TYPE(History) *, FILE *);
-private int history_prev_event(TYPE(History) *, TYPE(HistEvent) *, int);
-private int history_next_event(TYPE(History) *, TYPE(HistEvent) *, int);
-private int history_next_string(TYPE(History) *, TYPE(HistEvent) *, const Char *);
-private int history_prev_string(TYPE(History) *, TYPE(HistEvent) *, const Char *);
-
-
-/***********************************************************************/
-
-/*
- * Builtin- history implementation
- */
-typedef struct hentry_t {
- TYPE(HistEvent) ev; /* What we return */
- void *data; /* data */
- struct hentry_t *next; /* Next entry */
- struct hentry_t *prev; /* Previous entry */
-} hentry_t;
-
-typedef struct history_t {
- hentry_t list; /* Fake list header element */
- hentry_t *cursor; /* Current element in the list */
- int max; /* Maximum number of events */
- int cur; /* Current number of events */
- int eventid; /* For generation of unique event id */
- int flags; /* TYPE(History) flags */
-#define H_UNIQUE 1 /* Store only unique elements */
-} history_t;
-
-private int history_def_next(void *, TYPE(HistEvent) *);
-private int history_def_first(void *, TYPE(HistEvent) *);
-private int history_def_prev(void *, TYPE(HistEvent) *);
-private int history_def_last(void *, TYPE(HistEvent) *);
-private int history_def_curr(void *, TYPE(HistEvent) *);
-private int history_def_set(void *, TYPE(HistEvent) *, const int);
-private void history_def_clear(void *, TYPE(HistEvent) *);
-private int history_def_enter(void *, TYPE(HistEvent) *, const Char *);
-private int history_def_add(void *, TYPE(HistEvent) *, const Char *);
-private int history_def_del(void *, TYPE(HistEvent) *, const int);
-
-private int history_def_init(void **, TYPE(HistEvent) *, int);
-private int history_def_insert(history_t *, TYPE(HistEvent) *, const Char *);
-private void history_def_delete(history_t *, TYPE(HistEvent) *, hentry_t *);
-
-private int history_deldata_nth(history_t *, TYPE(HistEvent) *, int, void **);
-private int history_set_nth(void *, TYPE(HistEvent) *, int);
-
-#define history_def_setsize(p, num)(void) (((history_t *)p)->max = (num))
-#define history_def_getsize(p) (((history_t *)p)->cur)
-#define history_def_getunique(p) (((((history_t *)p)->flags) & H_UNIQUE) != 0)
-#define history_def_setunique(p, uni) \
- if (uni) \
- (((history_t *)p)->flags) |= H_UNIQUE; \
- else \
- (((history_t *)p)->flags) &= ~H_UNIQUE
-
-#define he_strerror(code) he_errlist[code]
-#define he_seterrev(evp, code) {\
- evp->num = code;\
- evp->str = he_strerror(code);\
- }
-
-/* error messages */
-static const Char *const he_errlist[] = {
- STR("OK"),
- STR("unknown error"),
- STR("malloc() failed"),
- STR("first event not found"),
- STR("last event not found"),
- STR("empty list"),
- STR("no next event"),
- STR("no previous event"),
- STR("current event is invalid"),
- STR("event not found"),
- STR("can't read history from file"),
- STR("can't write history"),
- STR("required parameter(s) not supplied"),
- STR("history size negative"),
- STR("function not allowed with other history-functions-set the default"),
- STR("bad parameters")
-};
-/* error codes */
-#define _HE_OK 0
-#define _HE_UNKNOWN 1
-#define _HE_MALLOC_FAILED 2
-#define _HE_FIRST_NOTFOUND 3
-#define _HE_LAST_NOTFOUND 4
-#define _HE_EMPTY_LIST 5
-#define _HE_END_REACHED 6
-#define _HE_START_REACHED 7
-#define _HE_CURR_INVALID 8
-#define _HE_NOT_FOUND 9
-#define _HE_HIST_READ 10
-#define _HE_HIST_WRITE 11
-#define _HE_PARAM_MISSING 12
-#define _HE_SIZE_NEGATIVE 13
-#define _HE_NOT_ALLOWED 14
-#define _HE_BAD_PARAM 15
-
-/* history_def_first():
- * Default function to return the first event in the history.
- */
-private int
-history_def_first(void *p, TYPE(HistEvent) *ev)
-{
- history_t *h = (history_t *) p;
-
- h->cursor = h->list.next;
- if (h->cursor != &h->list)
- *ev = h->cursor->ev;
- else {
- he_seterrev(ev, _HE_FIRST_NOTFOUND);
- return -1;
- }
-
- return 0;
-}
-
-
-/* history_def_last():
- * Default function to return the last event in the history.
- */
-private int
-history_def_last(void *p, TYPE(HistEvent) *ev)
-{
- history_t *h = (history_t *) p;
-
- h->cursor = h->list.prev;
- if (h->cursor != &h->list)
- *ev = h->cursor->ev;
- else {
- he_seterrev(ev, _HE_LAST_NOTFOUND);
- return -1;
- }
-
- return 0;
-}
-
-
-/* history_def_next():
- * Default function to return the next event in the history.
- */
-private int
-history_def_next(void *p, TYPE(HistEvent) *ev)
-{
- history_t *h = (history_t *) p;
-
- if (h->cursor == &h->list) {
- he_seterrev(ev, _HE_EMPTY_LIST);
- return -1;
- }
-
- if (h->cursor->next == &h->list) {
- he_seterrev(ev, _HE_END_REACHED);
- return -1;
- }
-
- h->cursor = h->cursor->next;
- *ev = h->cursor->ev;
-
- return 0;
-}
-
-
-/* history_def_prev():
- * Default function to return the previous event in the history.
- */
-private int
-history_def_prev(void *p, TYPE(HistEvent) *ev)
-{
- history_t *h = (history_t *) p;
-
- if (h->cursor == &h->list) {
- he_seterrev(ev,
- (h->cur > 0) ? _HE_END_REACHED : _HE_EMPTY_LIST);
- return -1;
- }
-
- if (h->cursor->prev == &h->list) {
- he_seterrev(ev, _HE_START_REACHED);
- return -1;
- }
-
- h->cursor = h->cursor->prev;
- *ev = h->cursor->ev;
-
- return 0;
-}
-
-
-/* history_def_curr():
- * Default function to return the current event in the history.
- */
-private int
-history_def_curr(void *p, TYPE(HistEvent) *ev)
-{
- history_t *h = (history_t *) p;
-
- if (h->cursor != &h->list)
- *ev = h->cursor->ev;
- else {
- he_seterrev(ev,
- (h->cur > 0) ? _HE_CURR_INVALID : _HE_EMPTY_LIST);
- return -1;
- }
-
- return 0;
-}
-
-
-/* history_def_set():
- * Default function to set the current event in the history to the
- * given one.
- */
-private int
-history_def_set(void *p, TYPE(HistEvent) *ev, const int n)
-{
- history_t *h = (history_t *) p;
-
- if (h->cur == 0) {
- he_seterrev(ev, _HE_EMPTY_LIST);
- return -1;
- }
- if (h->cursor == &h->list || h->cursor->ev.num != n) {
- for (h->cursor = h->list.next; h->cursor != &h->list;
- h->cursor = h->cursor->next)
- if (h->cursor->ev.num == n)
- break;
- }
- if (h->cursor == &h->list) {
- he_seterrev(ev, _HE_NOT_FOUND);
- return -1;
- }
- return 0;
-}
-
-
-/* history_set_nth():
- * Default function to set the current event in the history to the
- * n-th one.
- */
-private int
-history_set_nth(void *p, TYPE(HistEvent) *ev, int n)
-{
- history_t *h = (history_t *) p;
-
- if (h->cur == 0) {
- he_seterrev(ev, _HE_EMPTY_LIST);
- return -1;
- }
- for (h->cursor = h->list.prev; h->cursor != &h->list;
- h->cursor = h->cursor->prev)
- if (n-- <= 0)
- break;
- if (h->cursor == &h->list) {
- he_seterrev(ev, _HE_NOT_FOUND);
- return -1;
- }
- return 0;
-}
-
-
-/* history_def_add():
- * Append string to element
- */
-private int
-history_def_add(void *p, TYPE(HistEvent) *ev, const Char *str)
-{
- history_t *h = (history_t *) p;
- size_t len;
- Char *s;
- HistEventPrivate *evp = (void *)&h->cursor->ev;
-
- if (h->cursor == &h->list)
- return history_def_enter(p, ev, str);
- len = Strlen(evp->str) + Strlen(str) + 1;
- s = h_malloc(len * sizeof(*s));
- if (s == NULL) {
- he_seterrev(ev, _HE_MALLOC_FAILED);
- return -1;
- }
- (void) Strncpy(s, h->cursor->ev.str, len);
- s[len - 1] = '\0';
- (void) Strncat(s, str, len - Strlen(s) - 1);
- h_free(evp->str);
- evp->str = s;
- *ev = h->cursor->ev;
- return 0;
-}
-
-
-private int
-history_deldata_nth(history_t *h, TYPE(HistEvent) *ev,
- int num, void **data)
-{
- if (history_set_nth(h, ev, num) != 0)
- return -1;
- /* magic value to skip delete (just set to n-th history) */
- if (data == (void **)-1)
- return 0;
- ev->str = Strdup(h->cursor->ev.str);
- ev->num = h->cursor->ev.num;
- if (data)
- *data = h->cursor->data;
- history_def_delete(h, ev, h->cursor);
- return 0;
-}
-
-
-/* history_def_del():
- * Delete element hp of the h list
- */
-/* ARGSUSED */
-private int
-history_def_del(void *p, TYPE(HistEvent) *ev __attribute__((__unused__)),
- const int num)
-{
- history_t *h = (history_t *) p;
- if (history_def_set(h, ev, num) != 0)
- return -1;
- ev->str = Strdup(h->cursor->ev.str);
- ev->num = h->cursor->ev.num;
- history_def_delete(h, ev, h->cursor);
- return 0;
-}
-
-
-/* history_def_delete():
- * Delete element hp of the h list
- */
-/* ARGSUSED */
-private void
-history_def_delete(history_t *h,
- TYPE(HistEvent) *ev __attribute__((__unused__)), hentry_t *hp)
-{
- HistEventPrivate *evp = (void *)&hp->ev;
- if (hp == &h->list)
- abort();
- if (h->cursor == hp) {
- h->cursor = hp->prev;
- if (h->cursor == &h->list)
- h->cursor = hp->next;
- }
- hp->prev->next = hp->next;
- hp->next->prev = hp->prev;
- h_free(evp->str);
- h_free(hp);
- h->cur--;
-}
-
-
-/* history_def_insert():
- * Insert element with string str in the h list
- */
-private int
-history_def_insert(history_t *h, TYPE(HistEvent) *ev, const Char *str)
-{
- hentry_t *c;
-
- c = h_malloc(sizeof(*c));
- if (c == NULL)
- goto oomem;
- if ((c->ev.str = h_strdup(str)) == NULL) {
- h_free(c);
- goto oomem;
- }
- c->data = NULL;
- c->ev.num = ++h->eventid;
- c->next = h->list.next;
- c->prev = &h->list;
- h->list.next->prev = c;
- h->list.next = c;
- h->cur++;
- h->cursor = c;
-
- *ev = c->ev;
- return 0;
-oomem:
- he_seterrev(ev, _HE_MALLOC_FAILED);
- return -1;
-}
-
-
-/* history_def_enter():
- * Default function to enter an item in the history
- */
-private int
-history_def_enter(void *p, TYPE(HistEvent) *ev, const Char *str)
-{
- history_t *h = (history_t *) p;
-
- if ((h->flags & H_UNIQUE) != 0 && h->list.next != &h->list &&
- Strcmp(h->list.next->ev.str, str) == 0)
- return 0;
-
- if (history_def_insert(h, ev, str) == -1)
- return -1; /* error, keep error message */
-
- /*
- * Always keep at least one entry.
- * This way we don't have to check for the empty list.
- */
- while (h->cur > h->max && h->cur > 0)
- history_def_delete(h, ev, h->list.prev);
-
- return 1;
-}
-
-
-/* history_def_init():
- * Default history initialization function
- */
-/* ARGSUSED */
-private int
-history_def_init(void **p, TYPE(HistEvent) *ev __attribute__((__unused__)), int n)
-{
- history_t *h = (history_t *) h_malloc(sizeof(*h));
- if (h == NULL)
- return -1;
-
- if (n <= 0)
- n = 0;
- h->eventid = 0;
- h->cur = 0;
- h->max = n;
- h->list.next = h->list.prev = &h->list;
- h->list.ev.str = NULL;
- h->list.ev.num = 0;
- h->cursor = &h->list;
- h->flags = 0;
- *p = h;
- return 0;
-}
-
-
-/* history_def_clear():
- * Default history cleanup function
- */
-private void
-history_def_clear(void *p, TYPE(HistEvent) *ev)
-{
- history_t *h = (history_t *) p;
-
- while (h->list.prev != &h->list)
- history_def_delete(h, ev, h->list.prev);
- h->cursor = &h->list;
- h->eventid = 0;
- h->cur = 0;
-}
-
-
-
-
-/************************************************************************/
-
-/* history_init():
- * Initialization function.
- */
-public TYPE(History) *
-FUN(history,init)(void)
-{
- TYPE(HistEvent) ev;
- TYPE(History) *h = (TYPE(History) *) h_malloc(sizeof(*h));
- if (h == NULL)
- return NULL;
-
- if (history_def_init(&h->h_ref, &ev, 0) == -1) {
- h_free(h);
- return NULL;
- }
- h->h_ent = -1;
- h->h_next = history_def_next;
- h->h_first = history_def_first;
- h->h_last = history_def_last;
- h->h_prev = history_def_prev;
- h->h_curr = history_def_curr;
- h->h_set = history_def_set;
- h->h_clear = history_def_clear;
- h->h_enter = history_def_enter;
- h->h_add = history_def_add;
- h->h_del = history_def_del;
-
- return h;
-}
-
-
-/* history_end():
- * clean up history;
- */
-public void
-FUN(history,end)(TYPE(History) *h)
-{
- TYPE(HistEvent) ev;
-
- if (h->h_next == history_def_next)
- history_def_clear(h->h_ref, &ev);
- h_free(h->h_ref);
- h_free(h);
-}
-
-
-
-/* history_setsize():
- * Set history number of events
- */
-private int
-history_setsize(TYPE(History) *h, TYPE(HistEvent) *ev, int num)
-{
-
- if (h->h_next != history_def_next) {
- he_seterrev(ev, _HE_NOT_ALLOWED);
- return -1;
- }
- if (num < 0) {
- he_seterrev(ev, _HE_BAD_PARAM);
- return -1;
- }
- history_def_setsize(h->h_ref, num);
- return 0;
-}
-
-
-/* history_getsize():
- * Get number of events currently in history
- */
-private int
-history_getsize(TYPE(History) *h, TYPE(HistEvent) *ev)
-{
- if (h->h_next != history_def_next) {
- he_seterrev(ev, _HE_NOT_ALLOWED);
- return -1;
- }
- ev->num = history_def_getsize(h->h_ref);
- if (ev->num < -1) {
- he_seterrev(ev, _HE_SIZE_NEGATIVE);
- return -1;
- }
- return 0;
-}
-
-
-/* history_setunique():
- * Set if adjacent equal events should not be entered in history.
- */
-private int
-history_setunique(TYPE(History) *h, TYPE(HistEvent) *ev, int uni)
-{
-
- if (h->h_next != history_def_next) {
- he_seterrev(ev, _HE_NOT_ALLOWED);
- return -1;
- }
- history_def_setunique(h->h_ref, uni);
- return 0;
-}
-
-
-/* history_getunique():
- * Get if adjacent equal events should not be entered in history.
- */
-private int
-history_getunique(TYPE(History) *h, TYPE(HistEvent) *ev)
-{
- if (h->h_next != history_def_next) {
- he_seterrev(ev, _HE_NOT_ALLOWED);
- return -1;
- }
- ev->num = history_def_getunique(h->h_ref);
- return 0;
-}
-
-
-/* history_set_fun():
- * Set history functions
- */
-private int
-history_set_fun(TYPE(History) *h, TYPE(History) *nh)
-{
- TYPE(HistEvent) ev;
-
- if (nh->h_first == NULL || nh->h_next == NULL || nh->h_last == NULL ||
- nh->h_prev == NULL || nh->h_curr == NULL || nh->h_set == NULL ||
- nh->h_enter == NULL || nh->h_add == NULL || nh->h_clear == NULL ||
- nh->h_del == NULL || nh->h_ref == NULL) {
- if (h->h_next != history_def_next) {
- if (history_def_init(&h->h_ref, &ev, 0) == -1)
- return -1;
- h->h_first = history_def_first;
- h->h_next = history_def_next;
- h->h_last = history_def_last;
- h->h_prev = history_def_prev;
- h->h_curr = history_def_curr;
- h->h_set = history_def_set;
- h->h_clear = history_def_clear;
- h->h_enter = history_def_enter;
- h->h_add = history_def_add;
- h->h_del = history_def_del;
- }
- return -1;
- }
- if (h->h_next == history_def_next)
- history_def_clear(h->h_ref, &ev);
-
- h->h_ent = -1;
- h->h_first = nh->h_first;
- h->h_next = nh->h_next;
- h->h_last = nh->h_last;
- h->h_prev = nh->h_prev;
- h->h_curr = nh->h_curr;
- h->h_set = nh->h_set;
- h->h_clear = nh->h_clear;
- h->h_enter = nh->h_enter;
- h->h_add = nh->h_add;
- h->h_del = nh->h_del;
-
- return 0;
-}
-
-
-/* history_load():
- * TYPE(History) load function
- */
-private int
-history_load(TYPE(History) *h, const char *fname)
-{
- FILE *fp;
- char *line;
- size_t llen;
- ssize_t sz;
- size_t max_size;
- char *ptr;
- int i = -1;
- TYPE(HistEvent) ev;
-#ifdef WIDECHAR
- static ct_buffer_t conv;
-#endif
-
- if ((fp = fopen(fname, "r")) == NULL)
- return i;
-
- line = NULL;
- llen = 0;
- if ((sz = getline(&line, &llen, fp)) == -1)
- goto done;
-
- if (strncmp(line, hist_cookie, (size_t)sz) != 0)
- goto done;
-
- ptr = h_malloc((max_size = 1024) * sizeof(*ptr));
- if (ptr == NULL)
- goto done;
- for (i = 0; (sz = getline(&line, &llen, fp)) != -1; i++) {
- if (sz > 0 && line[sz - 1] == '\n')
- line[--sz] = '\0';
- if (max_size < (size_t)sz) {
- char *nptr;
- max_size = ((size_t)sz + 1024) & (size_t)~1023;
- nptr = h_realloc(ptr, max_size * sizeof(*ptr));
- if (nptr == NULL) {
- i = -1;
- goto oomem;
- }
- ptr = nptr;
- }
- (void) strunvis(ptr, line);
- if (HENTER(h, &ev, ct_decode_string(ptr, &conv)) == -1) {
- i = -1;
- goto oomem;
- }
- }
-oomem:
- h_free(ptr);
-done:
- free(line);
- (void) fclose(fp);
- return i;
-}
-
-
-/* history_save_fp():
- * TYPE(History) save function
- */
-private int
-history_save_fp(TYPE(History) *h, FILE *fp)
-{
- TYPE(HistEvent) ev;
- int i = -1, retval;
- size_t len, max_size;
- char *ptr;
- const char *str;
-#ifdef WIDECHAR
- static ct_buffer_t conv;
-#endif
-
- if (fchmod(fileno(fp), S_IRUSR|S_IWUSR) == -1)
- goto done;
- if (fputs(hist_cookie, fp) == EOF)
- goto done;
- ptr = h_malloc((max_size = 1024) * sizeof(*ptr));
- if (ptr == NULL)
- goto done;
- for (i = 0, retval = HLAST(h, &ev);
- retval != -1;
- retval = HPREV(h, &ev), i++) {
- str = ct_encode_string(ev.str, &conv);
- len = strlen(str) * 4 + 1;
- if (len > max_size) {
- char *nptr;
- max_size = (len + 1024) & (size_t)~1023;
- nptr = h_realloc(ptr, max_size * sizeof(*ptr));
- if (nptr == NULL) {
- i = -1;
- goto oomem;
- }
- ptr = nptr;
- }
- (void) strvis(ptr, str, VIS_WHITE);
- (void) fprintf(fp, "%s\n", ptr);
- }
-oomem:
- h_free(ptr);
-done:
- return i;
-}
-
-
-/* history_save():
- * History save function
- */
-private int
-history_save(TYPE(History) *h, const char *fname)
-{
- FILE *fp;
- int i;
-
- if ((fp = fopen(fname, "w")) == NULL)
- return -1;
-
- i = history_save_fp(h, fp);
-
- (void) fclose(fp);
- return i;
-}
-
-
-/* history_prev_event():
- * Find the previous event, with number given
- */
-private int
-history_prev_event(TYPE(History) *h, TYPE(HistEvent) *ev, int num)
-{
- int retval;
-
- for (retval = HCURR(h, ev); retval != -1; retval = HPREV(h, ev))
- if (ev->num == num)
- return 0;
-
- he_seterrev(ev, _HE_NOT_FOUND);
- return -1;
-}
-
-
-private int
-history_next_evdata(TYPE(History) *h, TYPE(HistEvent) *ev, int num, void **d)
-{
- int retval;
-
- for (retval = HCURR(h, ev); retval != -1; retval = HPREV(h, ev))
- if (ev->num == num) {
- if (d)
- *d = ((history_t *)h->h_ref)->cursor->data;
- return 0;
- }
-
- he_seterrev(ev, _HE_NOT_FOUND);
- return -1;
-}
-
-
-/* history_next_event():
- * Find the next event, with number given
- */
-private int
-history_next_event(TYPE(History) *h, TYPE(HistEvent) *ev, int num)
-{
- int retval;
-
- for (retval = HCURR(h, ev); retval != -1; retval = HNEXT(h, ev))
- if (ev->num == num)
- return 0;
-
- he_seterrev(ev, _HE_NOT_FOUND);
- return -1;
-}
-
-
-/* history_prev_string():
- * Find the previous event beginning with string
- */
-private int
-history_prev_string(TYPE(History) *h, TYPE(HistEvent) *ev, const Char *str)
-{
- size_t len = Strlen(str);
- int retval;
-
- for (retval = HCURR(h, ev); retval != -1; retval = HNEXT(h, ev))
- if (Strncmp(str, ev->str, len) == 0)
- return 0;
-
- he_seterrev(ev, _HE_NOT_FOUND);
- return -1;
-}
-
-
-/* history_next_string():
- * Find the next event beginning with string
- */
-private int
-history_next_string(TYPE(History) *h, TYPE(HistEvent) *ev, const Char *str)
-{
- size_t len = Strlen(str);
- int retval;
-
- for (retval = HCURR(h, ev); retval != -1; retval = HPREV(h, ev))
- if (Strncmp(str, ev->str, len) == 0)
- return 0;
-
- he_seterrev(ev, _HE_NOT_FOUND);
- return -1;
-}
-
-
-/* history():
- * User interface to history functions.
- */
-int
-FUNW(history)(TYPE(History) *h, TYPE(HistEvent) *ev, int fun, ...)
-{
- va_list va;
- const Char *str;
- int retval;
-
- va_start(va, fun);
-
- he_seterrev(ev, _HE_OK);
-
- switch (fun) {
- case H_GETSIZE:
- retval = history_getsize(h, ev);
- break;
-
- case H_SETSIZE:
- retval = history_setsize(h, ev, va_arg(va, int));
- break;
-
- case H_GETUNIQUE:
- retval = history_getunique(h, ev);
- break;
-
- case H_SETUNIQUE:
- retval = history_setunique(h, ev, va_arg(va, int));
- break;
-
- case H_ADD:
- str = va_arg(va, const Char *);
- retval = HADD(h, ev, str);
- break;
-
- case H_DEL:
- retval = HDEL(h, ev, va_arg(va, const int));
- break;
-
- case H_ENTER:
- str = va_arg(va, const Char *);
- if ((retval = HENTER(h, ev, str)) != -1)
- h->h_ent = ev->num;
- break;
-
- case H_APPEND:
- str = va_arg(va, const Char *);
- if ((retval = HSET(h, ev, h->h_ent)) != -1)
- retval = HADD(h, ev, str);
- break;
-
- case H_FIRST:
- retval = HFIRST(h, ev);
- break;
-
- case H_NEXT:
- retval = HNEXT(h, ev);
- break;
-
- case H_LAST:
- retval = HLAST(h, ev);
- break;
-
- case H_PREV:
- retval = HPREV(h, ev);
- break;
-
- case H_CURR:
- retval = HCURR(h, ev);
- break;
-
- case H_SET:
- retval = HSET(h, ev, va_arg(va, const int));
- break;
-
- case H_CLEAR:
- HCLEAR(h, ev);
- retval = 0;
- break;
-
- case H_LOAD:
- retval = history_load(h, va_arg(va, const char *));
- if (retval == -1)
- he_seterrev(ev, _HE_HIST_READ);
- break;
-
- case H_SAVE:
- retval = history_save(h, va_arg(va, const char *));
- if (retval == -1)
- he_seterrev(ev, _HE_HIST_WRITE);
- break;
-
- case H_SAVE_FP:
- retval = history_save_fp(h, va_arg(va, FILE *));
- if (retval == -1)
- he_seterrev(ev, _HE_HIST_WRITE);
- break;
-
- case H_PREV_EVENT:
- retval = history_prev_event(h, ev, va_arg(va, int));
- break;
-
- case H_NEXT_EVENT:
- retval = history_next_event(h, ev, va_arg(va, int));
- break;
-
- case H_PREV_STR:
- retval = history_prev_string(h, ev, va_arg(va, const Char *));
- break;
-
- case H_NEXT_STR:
- retval = history_next_string(h, ev, va_arg(va, const Char *));
- break;
-
- case H_FUNC:
- {
- TYPE(History) hf;
-
- hf.h_ref = va_arg(va, void *);
- h->h_ent = -1;
- hf.h_first = va_arg(va, history_gfun_t);
- hf.h_next = va_arg(va, history_gfun_t);
- hf.h_last = va_arg(va, history_gfun_t);
- hf.h_prev = va_arg(va, history_gfun_t);
- hf.h_curr = va_arg(va, history_gfun_t);
- hf.h_set = va_arg(va, history_sfun_t);
- hf.h_clear = va_arg(va, history_vfun_t);
- hf.h_enter = va_arg(va, history_efun_t);
- hf.h_add = va_arg(va, history_efun_t);
- hf.h_del = va_arg(va, history_sfun_t);
-
- if ((retval = history_set_fun(h, &hf)) == -1)
- he_seterrev(ev, _HE_PARAM_MISSING);
- break;
- }
-
- case H_END:
- FUN(history,end)(h);
- retval = 0;
- break;
-
- case H_NEXT_EVDATA:
- {
- int num = va_arg(va, int);
- void **d = va_arg(va, void **);
- retval = history_next_evdata(h, ev, num, d);
- break;
- }
-
- case H_DELDATA:
- {
- int num = va_arg(va, int);
- void **d = va_arg(va, void **);
- retval = history_deldata_nth((history_t *)h->h_ref, ev, num, d);
- break;
- }
-
- case H_REPLACE: /* only use after H_NEXT_EVDATA */
- {
- const Char *line = va_arg(va, const Char *);
- void *d = va_arg(va, void *);
- const Char *s;
- if(!line || !(s = Strdup(line))) {
- retval = -1;
- break;
- }
- ((history_t *)h->h_ref)->cursor->ev.str = s;
- ((history_t *)h->h_ref)->cursor->data = d;
- retval = 0;
- break;
- }
-
- default:
- retval = -1;
- he_seterrev(ev, _HE_UNKNOWN);
- break;
- }
- va_end(va);
- return retval;
-}
diff --git a/lib/libedit/keymacro.c b/lib/libedit/keymacro.c
deleted file mode 100644
index e10ed7f63cb2..000000000000
--- a/lib/libedit/keymacro.c
+++ /dev/null
@@ -1,675 +0,0 @@
-/* $NetBSD: keymacro.c,v 1.14 2016/02/24 14:25:38 christos Exp $ */
-
-/*-
- * 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.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-#if 0
-static char sccsid[] = "@(#)key.c 8.1 (Berkeley) 6/4/93";
-#else
-__RCSID("$NetBSD: keymacro.c,v 1.14 2016/02/24 14:25:38 christos Exp $");
-#endif
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * keymacro.c: This module contains the procedures for maintaining
- * the extended-key map.
- *
- * An extended-key (key) is a sequence of keystrokes introduced
- * with a sequence introducer and consisting of an arbitrary
- * number of characters. This module maintains a map (the
- * el->el_keymacro.map)
- * to convert these extended-key sequences into input strs
- * (XK_STR), editor functions (XK_CMD), or unix commands (XK_EXE).
- *
- * Warning:
- * If key is a substr of some other keys, then the longer
- * keys are lost!! That is, if the keys "abcd" and "abcef"
- * are in el->el_keymacro.map, adding the key "abc" will cause
- * the first two definitions to be lost.
- *
- * Restrictions:
- * -------------
- * 1) It is not possible to have one key that is a
- * substr of another.
- */
-#include <stdlib.h>
-#include <string.h>
-
-#include "el.h"
-
-/*
- * The Nodes of the el->el_keymacro.map. The el->el_keymacro.map is a
- * linked list of these node elements
- */
-struct keymacro_node_t {
- Char ch; /* single character of key */
- int type; /* node type */
- keymacro_value_t val; /* command code or pointer to str, */
- /* if this is a leaf */
- struct keymacro_node_t *next; /* ptr to next char of this key */
- struct keymacro_node_t *sibling;/* ptr to another key with same prefix*/
-};
-
-private int node_trav(EditLine *, keymacro_node_t *, Char *,
- keymacro_value_t *);
-private int node__try(EditLine *, keymacro_node_t *, const Char *,
- keymacro_value_t *, int);
-private keymacro_node_t *node__get(wint_t);
-private void node__free(keymacro_node_t *);
-private void node__put(EditLine *, keymacro_node_t *);
-private int node__delete(EditLine *, keymacro_node_t **,
- const Char *);
-private int node_lookup(EditLine *, const Char *,
- keymacro_node_t *, size_t);
-private int node_enum(EditLine *, keymacro_node_t *, size_t);
-
-#define KEY_BUFSIZ EL_BUFSIZ
-
-
-/* keymacro_init():
- * Initialize the key maps
- */
-protected int
-keymacro_init(EditLine *el)
-{
-
- el->el_keymacro.buf = el_malloc(KEY_BUFSIZ *
- sizeof(*el->el_keymacro.buf));
- if (el->el_keymacro.buf == NULL)
- return -1;
- el->el_keymacro.map = NULL;
- keymacro_reset(el);
- return 0;
-}
-
-/* keymacro_end():
- * Free the key maps
- */
-protected void
-keymacro_end(EditLine *el)
-{
-
- el_free(el->el_keymacro.buf);
- el->el_keymacro.buf = NULL;
- node__free(el->el_keymacro.map);
-}
-
-
-/* keymacro_map_cmd():
- * Associate cmd with a key value
- */
-protected keymacro_value_t *
-keymacro_map_cmd(EditLine *el, int cmd)
-{
-
- el->el_keymacro.val.cmd = (el_action_t) cmd;
- return &el->el_keymacro.val;
-}
-
-
-/* keymacro_map_str():
- * Associate str with a key value
- */
-protected keymacro_value_t *
-keymacro_map_str(EditLine *el, Char *str)
-{
-
- el->el_keymacro.val.str = str;
- return &el->el_keymacro.val;
-}
-
-
-/* keymacro_reset():
- * Takes all nodes on el->el_keymacro.map and puts them on free list.
- * Then initializes el->el_keymacro.map with arrow keys
- * [Always bind the ansi arrow keys?]
- */
-protected void
-keymacro_reset(EditLine *el)
-{
-
- node__put(el, el->el_keymacro.map);
- el->el_keymacro.map = NULL;
- return;
-}
-
-
-/* keymacro_get():
- * Calls the recursive function with entry point el->el_keymacro.map
- * Looks up *ch in map and then reads characters until a
- * complete match is found or a mismatch occurs. Returns the
- * type of the match found (XK_STR, XK_CMD, or XK_EXE).
- * Returns NULL in val.str and XK_STR for no match.
- * The last character read is returned in *ch.
- */
-protected int
-keymacro_get(EditLine *el, Char *ch, keymacro_value_t *val)
-{
-
- return node_trav(el, el->el_keymacro.map, ch, val);
-}
-
-
-/* keymacro_add():
- * Adds key to the el->el_keymacro.map and associates the value in
- * val with it. If key is already is in el->el_keymacro.map, the new
- * code is applied to the existing key. Ntype specifies if code is a
- * command, an out str or a unix command.
- */
-protected void
-keymacro_add(EditLine *el, const Char *key, keymacro_value_t *val, int ntype)
-{
-
- if (key[0] == '\0') {
- (void) fprintf(el->el_errfile,
- "keymacro_add: Null extended-key not allowed.\n");
- return;
- }
- if (ntype == XK_CMD && val->cmd == ED_SEQUENCE_LEAD_IN) {
- (void) fprintf(el->el_errfile,
- "keymacro_add: sequence-lead-in command not allowed\n");
- return;
- }
- if (el->el_keymacro.map == NULL)
- /* tree is initially empty. Set up new node to match key[0] */
- el->el_keymacro.map = node__get(key[0]);
- /* it is properly initialized */
-
- /* Now recurse through el->el_keymacro.map */
- (void) node__try(el, el->el_keymacro.map, key, val, ntype);
- return;
-}
-
-
-/* keymacro_clear():
- *
- */
-protected void
-keymacro_clear(EditLine *el, el_action_t *map, const Char *in)
-{
-#ifdef WIDECHAR
- if (*in > N_KEYS) /* can't be in the map */
- return;
-#endif
- if ((map[(unsigned char)*in] == ED_SEQUENCE_LEAD_IN) &&
- ((map == el->el_map.key &&
- el->el_map.alt[(unsigned char)*in] != ED_SEQUENCE_LEAD_IN) ||
- (map == el->el_map.alt &&
- el->el_map.key[(unsigned char)*in] != ED_SEQUENCE_LEAD_IN)))
- (void) keymacro_delete(el, in);
-}
-
-
-/* keymacro_delete():
- * Delete the key and all longer keys staring with key, if
- * they exists.
- */
-protected int
-keymacro_delete(EditLine *el, const Char *key)
-{
-
- if (key[0] == '\0') {
- (void) fprintf(el->el_errfile,
- "keymacro_delete: Null extended-key not allowed.\n");
- return -1;
- }
- if (el->el_keymacro.map == NULL)
- return 0;
-
- (void) node__delete(el, &el->el_keymacro.map, key);
- return 0;
-}
-
-
-/* keymacro_print():
- * Print the binding associated with key key.
- * Print entire el->el_keymacro.map if null
- */
-protected void
-keymacro_print(EditLine *el, const Char *key)
-{
-
- /* do nothing if el->el_keymacro.map is empty and null key specified */
- if (el->el_keymacro.map == NULL && *key == 0)
- return;
-
- el->el_keymacro.buf[0] = '"';
- if (node_lookup(el, key, el->el_keymacro.map, (size_t)1) <= -1)
- /* key is not bound */
- (void) fprintf(el->el_errfile, "Unbound extended key \"" FSTR
- "\"\n", key);
- return;
-}
-
-
-/* node_trav():
- * recursively traverses node in tree until match or mismatch is
- * found. May read in more characters.
- */
-private int
-node_trav(EditLine *el, keymacro_node_t *ptr, Char *ch, keymacro_value_t *val)
-{
- wchar_t wc;
-
- if (ptr->ch == *ch) {
- /* match found */
- if (ptr->next) {
- /* key not complete so get next char */
- if (el_wgetc(el, &wc) != 1) {/* if EOF or error */
- val->cmd = ED_END_OF_FILE;
- return XK_CMD;
- /* PWP: Pretend we just read an end-of-file */
- }
- *ch = (Char)wc;
- return node_trav(el, ptr->next, ch, val);
- } else {
- *val = ptr->val;
- if (ptr->type != XK_CMD)
- *ch = '\0';
- return ptr->type;
- }
- } else {
- /* no match found here */
- if (ptr->sibling) {
- /* try next sibling */
- return node_trav(el, ptr->sibling, ch, val);
- } else {
- /* no next sibling -- mismatch */
- val->str = NULL;
- return XK_STR;
- }
- }
-}
-
-
-/* node__try():
- * Find a node that matches *str or allocate a new one
- */
-private int
-node__try(EditLine *el, keymacro_node_t *ptr, const Char *str,
- keymacro_value_t *val, int ntype)
-{
-
- if (ptr->ch != *str) {
- keymacro_node_t *xm;
-
- for (xm = ptr; xm->sibling != NULL; xm = xm->sibling)
- if (xm->sibling->ch == *str)
- break;
- if (xm->sibling == NULL)
- xm->sibling = node__get(*str); /* setup new node */
- ptr = xm->sibling;
- }
- if (*++str == '\0') {
- /* we're there */
- if (ptr->next != NULL) {
- node__put(el, ptr->next);
- /* lose longer keys with this prefix */
- ptr->next = NULL;
- }
- switch (ptr->type) {
- case XK_CMD:
- case XK_NOD:
- break;
- case XK_STR:
- case XK_EXE:
- if (ptr->val.str)
- el_free(ptr->val.str);
- break;
- default:
- EL_ABORT((el->el_errfile, "Bad XK_ type %d\n",
- ptr->type));
- break;
- }
-
- switch (ptr->type = ntype) {
- case XK_CMD:
- ptr->val = *val;
- break;
- case XK_STR:
- case XK_EXE:
- if ((ptr->val.str = Strdup(val->str)) == NULL)
- return -1;
- break;
- default:
- EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype));
- break;
- }
- } else {
- /* still more chars to go */
- if (ptr->next == NULL)
- ptr->next = node__get(*str); /* setup new node */
- (void) node__try(el, ptr->next, str, val, ntype);
- }
- return 0;
-}
-
-
-/* node__delete():
- * Delete node that matches str
- */
-private int
-node__delete(EditLine *el, keymacro_node_t **inptr, const Char *str)
-{
- keymacro_node_t *ptr;
- keymacro_node_t *prev_ptr = NULL;
-
- ptr = *inptr;
-
- if (ptr->ch != *str) {
- keymacro_node_t *xm;
-
- for (xm = ptr; xm->sibling != NULL; xm = xm->sibling)
- if (xm->sibling->ch == *str)
- break;
- if (xm->sibling == NULL)
- return 0;
- prev_ptr = xm;
- ptr = xm->sibling;
- }
- if (*++str == '\0') {
- /* we're there */
- if (prev_ptr == NULL)
- *inptr = ptr->sibling;
- else
- prev_ptr->sibling = ptr->sibling;
- ptr->sibling = NULL;
- node__put(el, ptr);
- return 1;
- } else if (ptr->next != NULL &&
- node__delete(el, &ptr->next, str) == 1) {
- if (ptr->next != NULL)
- return 0;
- if (prev_ptr == NULL)
- *inptr = ptr->sibling;
- else
- prev_ptr->sibling = ptr->sibling;
- ptr->sibling = NULL;
- node__put(el, ptr);
- return 1;
- } else {
- return 0;
- }
-}
-
-
-/* node__put():
- * Puts a tree of nodes onto free list using free(3).
- */
-private void
-node__put(EditLine *el, keymacro_node_t *ptr)
-{
- if (ptr == NULL)
- return;
-
- if (ptr->next != NULL) {
- node__put(el, ptr->next);
- ptr->next = NULL;
- }
- node__put(el, ptr->sibling);
-
- switch (ptr->type) {
- case XK_CMD:
- case XK_NOD:
- break;
- case XK_EXE:
- case XK_STR:
- if (ptr->val.str != NULL)
- el_free(ptr->val.str);
- break;
- default:
- EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ptr->type));
- break;
- }
- el_free(ptr);
-}
-
-
-/* node__get():
- * Returns pointer to a keymacro_node_t for ch.
- */
-private keymacro_node_t *
-node__get(wint_t ch)
-{
- keymacro_node_t *ptr;
-
- ptr = el_malloc(sizeof(*ptr));
- if (ptr == NULL)
- return NULL;
- ptr->ch = (Char)ch;
- ptr->type = XK_NOD;
- ptr->val.str = NULL;
- ptr->next = NULL;
- ptr->sibling = NULL;
- return ptr;
-}
-
-private void
-node__free(keymacro_node_t *k)
-{
- if (k == NULL)
- return;
- node__free(k->sibling);
- node__free(k->next);
- el_free(k);
-}
-
-/* node_lookup():
- * look for the str starting at node ptr.
- * Print if last node
- */
-private int
-node_lookup(EditLine *el, const Char *str, keymacro_node_t *ptr, size_t cnt)
-{
- ssize_t used;
-
- if (ptr == NULL)
- return -1; /* cannot have null ptr */
-
- if (!str || *str == 0) {
- /* no more chars in str. node_enum from here. */
- (void) node_enum(el, ptr, cnt);
- return 0;
- } else {
- /* If match put this char into el->el_keymacro.buf. Recurse */
- if (ptr->ch == *str) {
- /* match found */
- used = ct_visual_char(el->el_keymacro.buf + cnt,
- KEY_BUFSIZ - cnt, ptr->ch);
- if (used == -1)
- return -1; /* ran out of buffer space */
- if (ptr->next != NULL)
- /* not yet at leaf */
- return (node_lookup(el, str + 1, ptr->next,
- (size_t)used + cnt));
- else {
- /* next node is null so key should be complete */
- if (str[1] == 0) {
- size_t px = cnt + (size_t)used;
- el->el_keymacro.buf[px] = '"';
- el->el_keymacro.buf[px + 1] = '\0';
- keymacro_kprint(el, el->el_keymacro.buf,
- &ptr->val, ptr->type);
- return 0;
- } else
- return -1;
- /* mismatch -- str still has chars */
- }
- } else {
- /* no match found try sibling */
- if (ptr->sibling)
- return (node_lookup(el, str, ptr->sibling,
- cnt));
- else
- return -1;
- }
- }
-}
-
-
-/* node_enum():
- * Traverse the node printing the characters it is bound in buffer
- */
-private int
-node_enum(EditLine *el, keymacro_node_t *ptr, size_t cnt)
-{
- ssize_t used;
-
- if (cnt >= KEY_BUFSIZ - 5) { /* buffer too small */
- el->el_keymacro.buf[++cnt] = '"';
- el->el_keymacro.buf[++cnt] = '\0';
- (void) fprintf(el->el_errfile,
- "Some extended keys too long for internal print buffer");
- (void) fprintf(el->el_errfile, " \"" FSTR "...\"\n",
- el->el_keymacro.buf);
- return 0;
- }
- if (ptr == NULL) {
-#ifdef DEBUG_EDIT
- (void) fprintf(el->el_errfile,
- "node_enum: BUG!! Null ptr passed\n!");
-#endif
- return -1;
- }
- /* put this char at end of str */
- used = ct_visual_char(el->el_keymacro.buf + cnt, KEY_BUFSIZ - cnt,
- ptr->ch);
- if (ptr->next == NULL) {
- /* print this key and function */
- el->el_keymacro.buf[cnt + (size_t)used ] = '"';
- el->el_keymacro.buf[cnt + (size_t)used + 1] = '\0';
- keymacro_kprint(el, el->el_keymacro.buf, &ptr->val, ptr->type);
- } else
- (void) node_enum(el, ptr->next, cnt + (size_t)used);
-
- /* go to sibling if there is one */
- if (ptr->sibling)
- (void) node_enum(el, ptr->sibling, cnt);
- return 0;
-}
-
-
-/* keymacro_kprint():
- * Print the specified key and its associated
- * function specified by val
- */
-protected void
-keymacro_kprint(EditLine *el, const Char *key, keymacro_value_t *val, int ntype)
-{
- el_bindings_t *fp;
- char unparsbuf[EL_BUFSIZ];
- static const char fmt[] = "%-15s-> %s\n";
-
- if (val != NULL)
- switch (ntype) {
- case XK_STR:
- case XK_EXE:
- (void) keymacro__decode_str(val->str, unparsbuf,
- sizeof(unparsbuf),
- ntype == XK_STR ? "\"\"" : "[]");
- (void) fprintf(el->el_outfile, fmt,
- ct_encode_string(key, &el->el_scratch), unparsbuf);
- break;
- case XK_CMD:
- for (fp = el->el_map.help; fp->name; fp++)
- if (val->cmd == fp->func) {
- ct_wcstombs(unparsbuf, fp->name, sizeof(unparsbuf));
- unparsbuf[sizeof(unparsbuf) -1] = '\0';
- (void) fprintf(el->el_outfile, fmt,
- ct_encode_string(key, &el->el_scratch), unparsbuf);
- break;
- }
-#ifdef DEBUG_KEY
- if (fp->name == NULL)
- (void) fprintf(el->el_outfile,
- "BUG! Command not found.\n");
-#endif
-
- break;
- default:
- EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype));
- break;
- }
- else
- (void) fprintf(el->el_outfile, fmt, ct_encode_string(key,
- &el->el_scratch), "no input");
-}
-
-
-#define ADDC(c) \
- if (b < eb) \
- *b++ = c; \
- else \
- b++
-/* keymacro__decode_str():
- * Make a printable version of the ey
- */
-protected size_t
-keymacro__decode_str(const Char *str, char *buf, size_t len, const char *sep)
-{
- char *b = buf, *eb = b + len;
- const Char *p;
-
- b = buf;
- if (sep[0] != '\0') {
- ADDC(sep[0]);
- }
- if (*str == '\0') {
- ADDC('^');
- ADDC('@');
- goto add_endsep;
- }
- for (p = str; *p != 0; p++) {
- Char dbuf[VISUAL_WIDTH_MAX];
- Char *p2 = dbuf;
- ssize_t l = ct_visual_char(dbuf, VISUAL_WIDTH_MAX, *p);
- while (l-- > 0) {
- ssize_t n = ct_encode_char(b, (size_t)(eb - b), *p2++);
- if (n == -1) /* ran out of space */
- goto add_endsep;
- else
- b += n;
- }
- }
-add_endsep:
- if (sep[0] != '\0' && sep[1] != '\0') {
- ADDC(sep[1]);
- }
- ADDC('\0');
- if ((size_t)(b - buf) >= len)
- buf[len - 1] = '\0';
- return (size_t)(b - buf);
-}
diff --git a/lib/libedit/keymacro.h b/lib/libedit/keymacro.h
deleted file mode 100644
index 139cda2722e7..000000000000
--- a/lib/libedit/keymacro.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/* $NetBSD: keymacro.h,v 1.3 2016/01/29 19:59:11 christos Exp $ */
-
-/*-
- * 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.
- *
- * @(#)key.h 8.1 (Berkeley) 6/4/93
- * $FreeBSD$
- */
-
-/*
- * el.keymacro.h: Key macro header
- */
-#ifndef _h_el_keymacro
-#define _h_el_keymacro
-
-typedef union keymacro_value_t {
- el_action_t cmd; /* If it is a command the # */
- Char *str; /* If it is a string... */
-} keymacro_value_t;
-
-typedef struct keymacro_node_t keymacro_node_t;
-
-typedef struct el_keymacro_t {
- Char *buf; /* Key print buffer */
- keymacro_node_t *map; /* Key map */
- keymacro_value_t val; /* Local conversion buffer */
-} el_keymacro_t;
-
-#define XK_CMD 0
-#define XK_STR 1
-#define XK_NOD 2
-#define XK_EXE 3
-
-protected int keymacro_init(EditLine *);
-protected void keymacro_end(EditLine *);
-protected keymacro_value_t *keymacro_map_cmd(EditLine *, int);
-protected keymacro_value_t *keymacro_map_str(EditLine *, Char *);
-protected void keymacro_reset(EditLine *);
-protected int keymacro_get(EditLine *, Char *, keymacro_value_t *);
-protected void keymacro_add(EditLine *, const Char *, keymacro_value_t *, int);
-protected void keymacro_clear(EditLine *, el_action_t *, const Char *);
-protected int keymacro_delete(EditLine *, const Char *);
-protected void keymacro_print(EditLine *, const Char *);
-protected void keymacro_kprint(EditLine *, const Char *, keymacro_value_t *,
- int);
-protected size_t keymacro__decode_str(const Char *, char *, size_t,
- const char *);
-
-#endif /* _h_el_keymacro */
diff --git a/lib/libedit/makelist b/lib/libedit/makelist
deleted file mode 100644
index 4cb65bc3f099..000000000000
--- a/lib/libedit/makelist
+++ /dev/null
@@ -1,264 +0,0 @@
-#!/bin/sh -
-# $FreeBSD$
-# $NetBSD: makelist,v 1.18 2012/03/21 05:34:54 matt Exp $
-#
-# 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.
-#
-# @(#)makelist 5.3 (Berkeley) 6/4/93
-
-# makelist.sh: Automatically generate header files...
-
-AWK=awk
-USAGE="Usage: $0 -n|-h|-e|-fc|-fh|-bc|-bh|-m <filenames>"
-
-if [ "x$1" = "x" ]
-then
- echo $USAGE 1>&2
- exit 1
-fi
-
-FLAG="$1"
-shift
-
-FILES="$@"
-
-case $FLAG in
-
-# generate foo.h file from foo.c
-#
--n)
- cat << _EOF
-#include "config.h"
-#undef WIDECHAR
-#define NARROWCHAR
-#include "${FILES}"
-_EOF
- ;;
-
--h)
- set - `echo $FILES | sed -e 's/\\./_/g'`
- hdr="_h_`basename $1`"
- cat $FILES | $AWK '
- BEGIN {
- printf("/* Automatically generated file, do not edit */\n");
- printf("#ifndef %s\n#define %s\n", "'$hdr'", "'$hdr'");
- }
- /\(\):/ {
- pr = substr($2, 1, 2);
- if (pr == "vi" || pr == "em" || pr == "ed") {
- name = substr($2, 1, length($2) - 3);
-#
-# XXX: need a space between name and prototype so that -fc and -fh
-# parsing is much easier
-#
- printf("protected el_action_t\t%s (EditLine *, wint_t);\n",
- name);
- }
- }
- END {
- printf("#endif /* %s */\n", "'$hdr'");
- }'
- ;;
-
-# generate help.c from various .c files
-#
--bc)
- cat $FILES | $AWK '
- BEGIN {
- printf("/* Automatically generated file, do not edit */\n");
- printf("#include \"config.h\"\n#include \"el.h\"\n");
- printf("#include \"help.h\"\n");
- printf("private const struct el_bindings_t el_func_help[] = {\n");
- low = "abcdefghijklmnopqrstuvwxyz_";
- high = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_";
- for (i = 1; i <= length(low); i++)
- tr[substr(low, i, 1)] = substr(high, i, 1);
- }
- /\(\):/ {
- pr = substr($2, 1, 2);
- if (pr == "vi" || pr == "em" || pr == "ed") {
- name = substr($2, 1, length($2) - 3);
- uname = "";
- fname = "";
- for (i = 1; i <= length(name); i++) {
- s = substr(name, i, 1);
- uname = uname tr[s];
- if (s == "_")
- s = "-";
- fname = fname s;
- }
-
- printf(" { %-30.30s %-30.30s\n","STR(\"" fname "\"),", uname ",");
- ok = 1;
- }
- }
- /^ \*/ {
- if (ok) {
- printf(" STR(\"");
- for (i = 2; i < NF; i++)
- printf("%s ", $i);
- printf("%s\") },\n", $i);
- ok = 0;
- }
- }
- END {
- printf("};\n");
- printf("\nprotected const el_bindings_t* help__get(void)");
- printf("{ return el_func_help; }\n");
- }'
- ;;
-
-# generate help.h from various .c files
-#
--bh)
- $AWK '
- BEGIN {
- printf("/* Automatically generated file, do not edit */\n");
- printf("#ifndef _h_help_c\n#define _h_help_c\n");
- printf("protected const el_bindings_t *help__get(void);\n");
- printf("#endif /* _h_help_c */\n");
- }' /dev/null
- ;;
-
-# generate fcns.h from various .h files
-#
--fh)
- cat $FILES | $AWK '/el_action_t/ { print $3 }' | \
- sort | tr '[:lower:]' '[:upper:]' | $AWK '
- BEGIN {
- printf("/* Automatically generated file, do not edit */\n");
- printf("#ifndef _h_fcns_c\n#define _h_fcns_c\n");
- count = 0;
- }
- {
- printf("#define\t%-30.30s\t%3d\n", $1, count++);
- }
- END {
- printf("#define\t%-30.30s\t%3d\n", "EL_NUM_FCNS", count);
-
- printf("typedef el_action_t (*el_func_t)(EditLine *, wint_t);");
- printf("\nprotected const el_func_t* func__get(void);\n");
- printf("#endif /* _h_fcns_c */\n");
- }'
- ;;
-
-# generate fcns.c from various .h files
-#
--fc)
- cat $FILES | $AWK '/el_action_t/ { print $3 }' | sort | $AWK '
- BEGIN {
- printf("/* Automatically generated file, do not edit */\n");
- printf("#include \"config.h\"\n#include \"el.h\"\n");
- printf("#include \"common.h\"\n");
- printf("#include \"emacs.h\"\n");
- printf("#include \"vi.h\"\n");
- printf("private const el_func_t el_func[] = {");
- maxlen = 80;
- needn = 1;
- len = 0;
- }
- {
- clen = 25 + 2;
- len += clen;
- if (len >= maxlen)
- needn = 1;
- if (needn) {
- printf("\n ");
- needn = 0;
- len = 4 + clen;
- }
- s = $1 ",";
- printf("%-26.26s ", s);
- }
- END {
- printf("\n};\n");
- printf("\nprotected const el_func_t* func__get(void) { return el_func; }\n");
- }'
- ;;
-
-# generate editline.c from various .c files
-#
--e)
- echo "$FILES" | tr ' ' '\012' | $AWK '
- BEGIN {
- printf("/* Automatically generated file, do not edit */\n");
- printf("#define protected static\n");
- printf("#define SCCSID\n");
- }
- {
- printf("#include \"%s\"\n", $1);
- }'
- ;;
-
-# generate man page fragment from various .c files
-#
--m)
- cat $FILES | $AWK '
- BEGIN {
- printf(".\\\" Section automatically generated with makelist\n");
- printf(".Bl -tag -width 4n\n");
- }
- /\(\):/ {
- pr = substr($2, 1, 2);
- if (pr == "vi" || pr == "em" || pr == "ed") {
- name = substr($2, 1, length($2) - 3);
- fname = "";
- for (i = 1; i <= length(name); i++) {
- s = substr(name, i, 1);
- if (s == "_")
- s = "-";
- fname = fname s;
- }
-
- printf(".It Ic %s\n", fname);
- ok = 1;
- }
- }
- /^ \*/ {
- if (ok) {
- for (i = 2; i < NF; i++)
- printf("%s ", $i);
- printf("%s.\n", $i);
- ok = 0;
- }
- }
- END {
- printf(".El\n");
- printf(".\\\" End of section automatically generated with makelist\n");
- }'
- ;;
-
-*)
- echo $USAGE 1>&2
- exit 1
- ;;
-
-esac
diff --git a/lib/libedit/map.c b/lib/libedit/map.c
deleted file mode 100644
index 00b42e17fed2..000000000000
--- a/lib/libedit/map.c
+++ /dev/null
@@ -1,1429 +0,0 @@
-/* $NetBSD: map.c,v 1.43 2016/02/17 19:47:49 christos Exp $ */
-
-/*-
- * 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.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-#if 0
-static char sccsid[] = "@(#)map.c 8.1 (Berkeley) 6/4/93";
-#else
-__RCSID("$NetBSD: map.c,v 1.43 2016/02/17 19:47:49 christos Exp $");
-#endif
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * map.c: Editor function definitions
- */
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "el.h"
-#include "help.h"
-#include "parse.h"
-
-private void map_print_key(EditLine *, el_action_t *, const Char *);
-private void map_print_some_keys(EditLine *, el_action_t *, wint_t, wint_t);
-private void map_print_all_keys(EditLine *);
-private void map_init_nls(EditLine *);
-private void map_init_meta(EditLine *);
-
-/* keymap tables ; should be N_KEYS*sizeof(KEYCMD) bytes long */
-
-
-private const el_action_t el_map_emacs[] = {
- /* 0 */ EM_SET_MARK, /* ^@ */
- /* 1 */ ED_MOVE_TO_BEG, /* ^A */
- /* 2 */ ED_PREV_CHAR, /* ^B */
- /* 3 */ ED_TTY_SIGINT, /* ^C */
- /* 4 */ EM_DELETE_OR_LIST, /* ^D */
- /* 5 */ ED_MOVE_TO_END, /* ^E */
- /* 6 */ ED_NEXT_CHAR, /* ^F */
- /* 7 */ ED_UNASSIGNED, /* ^G */
- /* 8 */ EM_DELETE_PREV_CHAR, /* ^H */
- /* 9 */ ED_UNASSIGNED, /* ^I */
- /* 10 */ ED_NEWLINE, /* ^J */
- /* 11 */ ED_KILL_LINE, /* ^K */
- /* 12 */ ED_CLEAR_SCREEN, /* ^L */
- /* 13 */ ED_NEWLINE, /* ^M */
- /* 14 */ ED_NEXT_HISTORY, /* ^N */
- /* 15 */ ED_TTY_FLUSH_OUTPUT, /* ^O */
- /* 16 */ ED_PREV_HISTORY, /* ^P */
- /* 17 */ ED_TTY_START_OUTPUT, /* ^Q */
- /* 18 */ ED_REDISPLAY, /* ^R */
- /* 19 */ ED_TTY_STOP_OUTPUT, /* ^S */
- /* 20 */ ED_TRANSPOSE_CHARS, /* ^T */
- /* 21 */ EM_KILL_LINE, /* ^U */
- /* 22 */ ED_QUOTED_INSERT, /* ^V */
- /* 23 */ EM_KILL_REGION, /* ^W */
- /* 24 */ ED_SEQUENCE_LEAD_IN, /* ^X */
- /* 25 */ EM_YANK, /* ^Y */
- /* 26 */ ED_TTY_SIGTSTP, /* ^Z */
- /* 27 */ EM_META_NEXT, /* ^[ */
- /* 28 */ ED_TTY_SIGQUIT, /* ^\ */
- /* 29 */ ED_TTY_DSUSP, /* ^] */
- /* 30 */ ED_UNASSIGNED, /* ^^ */
- /* 31 */ ED_UNASSIGNED, /* ^_ */
- /* 32 */ ED_INSERT, /* SPACE */
- /* 33 */ ED_INSERT, /* ! */
- /* 34 */ ED_INSERT, /* " */
- /* 35 */ ED_INSERT, /* # */
- /* 36 */ ED_INSERT, /* $ */
- /* 37 */ ED_INSERT, /* % */
- /* 38 */ ED_INSERT, /* & */
- /* 39 */ ED_INSERT, /* ' */
- /* 40 */ ED_INSERT, /* ( */
- /* 41 */ ED_INSERT, /* ) */
- /* 42 */ ED_INSERT, /* * */
- /* 43 */ ED_INSERT, /* + */
- /* 44 */ ED_INSERT, /* , */
- /* 45 */ ED_INSERT, /* - */
- /* 46 */ ED_INSERT, /* . */
- /* 47 */ ED_INSERT, /* / */
- /* 48 */ ED_DIGIT, /* 0 */
- /* 49 */ ED_DIGIT, /* 1 */
- /* 50 */ ED_DIGIT, /* 2 */
- /* 51 */ ED_DIGIT, /* 3 */
- /* 52 */ ED_DIGIT, /* 4 */
- /* 53 */ ED_DIGIT, /* 5 */
- /* 54 */ ED_DIGIT, /* 6 */
- /* 55 */ ED_DIGIT, /* 7 */
- /* 56 */ ED_DIGIT, /* 8 */
- /* 57 */ ED_DIGIT, /* 9 */
- /* 58 */ ED_INSERT, /* : */
- /* 59 */ ED_INSERT, /* ; */
- /* 60 */ ED_INSERT, /* < */
- /* 61 */ ED_INSERT, /* = */
- /* 62 */ ED_INSERT, /* > */
- /* 63 */ ED_INSERT, /* ? */
- /* 64 */ ED_INSERT, /* @ */
- /* 65 */ ED_INSERT, /* A */
- /* 66 */ ED_INSERT, /* B */
- /* 67 */ ED_INSERT, /* C */
- /* 68 */ ED_INSERT, /* D */
- /* 69 */ ED_INSERT, /* E */
- /* 70 */ ED_INSERT, /* F */
- /* 71 */ ED_INSERT, /* G */
- /* 72 */ ED_INSERT, /* H */
- /* 73 */ ED_INSERT, /* I */
- /* 74 */ ED_INSERT, /* J */
- /* 75 */ ED_INSERT, /* K */
- /* 76 */ ED_INSERT, /* L */
- /* 77 */ ED_INSERT, /* M */
- /* 78 */ ED_INSERT, /* N */
- /* 79 */ ED_INSERT, /* O */
- /* 80 */ ED_INSERT, /* P */
- /* 81 */ ED_INSERT, /* Q */
- /* 82 */ ED_INSERT, /* R */
- /* 83 */ ED_INSERT, /* S */
- /* 84 */ ED_INSERT, /* T */
- /* 85 */ ED_INSERT, /* U */
- /* 86 */ ED_INSERT, /* V */
- /* 87 */ ED_INSERT, /* W */
- /* 88 */ ED_INSERT, /* X */
- /* 89 */ ED_INSERT, /* Y */
- /* 90 */ ED_INSERT, /* Z */
- /* 91 */ ED_INSERT, /* [ */
- /* 92 */ ED_INSERT, /* \ */
- /* 93 */ ED_INSERT, /* ] */
- /* 94 */ ED_INSERT, /* ^ */
- /* 95 */ ED_INSERT, /* _ */
- /* 96 */ ED_INSERT, /* ` */
- /* 97 */ ED_INSERT, /* a */
- /* 98 */ ED_INSERT, /* b */
- /* 99 */ ED_INSERT, /* c */
- /* 100 */ ED_INSERT, /* d */
- /* 101 */ ED_INSERT, /* e */
- /* 102 */ ED_INSERT, /* f */
- /* 103 */ ED_INSERT, /* g */
- /* 104 */ ED_INSERT, /* h */
- /* 105 */ ED_INSERT, /* i */
- /* 106 */ ED_INSERT, /* j */
- /* 107 */ ED_INSERT, /* k */
- /* 108 */ ED_INSERT, /* l */
- /* 109 */ ED_INSERT, /* m */
- /* 110 */ ED_INSERT, /* n */
- /* 111 */ ED_INSERT, /* o */
- /* 112 */ ED_INSERT, /* p */
- /* 113 */ ED_INSERT, /* q */
- /* 114 */ ED_INSERT, /* r */
- /* 115 */ ED_INSERT, /* s */
- /* 116 */ ED_INSERT, /* t */
- /* 117 */ ED_INSERT, /* u */
- /* 118 */ ED_INSERT, /* v */
- /* 119 */ ED_INSERT, /* w */
- /* 120 */ ED_INSERT, /* x */
- /* 121 */ ED_INSERT, /* y */
- /* 122 */ ED_INSERT, /* z */
- /* 123 */ ED_INSERT, /* { */
- /* 124 */ ED_INSERT, /* | */
- /* 125 */ ED_INSERT, /* } */
- /* 126 */ ED_INSERT, /* ~ */
- /* 127 */ EM_DELETE_PREV_CHAR, /* ^? */
- /* 128 */ ED_UNASSIGNED, /* M-^@ */
- /* 129 */ ED_UNASSIGNED, /* M-^A */
- /* 130 */ ED_UNASSIGNED, /* M-^B */
- /* 131 */ ED_UNASSIGNED, /* M-^C */
- /* 132 */ ED_UNASSIGNED, /* M-^D */
- /* 133 */ ED_UNASSIGNED, /* M-^E */
- /* 134 */ ED_UNASSIGNED, /* M-^F */
- /* 135 */ ED_UNASSIGNED, /* M-^G */
- /* 136 */ ED_DELETE_PREV_WORD, /* M-^H */
- /* 137 */ ED_UNASSIGNED, /* M-^I */
- /* 138 */ ED_UNASSIGNED, /* M-^J */
- /* 139 */ ED_UNASSIGNED, /* M-^K */
- /* 140 */ ED_CLEAR_SCREEN, /* M-^L */
- /* 141 */ ED_UNASSIGNED, /* M-^M */
- /* 142 */ ED_UNASSIGNED, /* M-^N */
- /* 143 */ ED_UNASSIGNED, /* M-^O */
- /* 144 */ ED_UNASSIGNED, /* M-^P */
- /* 145 */ ED_UNASSIGNED, /* M-^Q */
- /* 146 */ ED_UNASSIGNED, /* M-^R */
- /* 147 */ ED_UNASSIGNED, /* M-^S */
- /* 148 */ ED_UNASSIGNED, /* M-^T */
- /* 149 */ ED_UNASSIGNED, /* M-^U */
- /* 150 */ ED_UNASSIGNED, /* M-^V */
- /* 151 */ ED_UNASSIGNED, /* M-^W */
- /* 152 */ ED_UNASSIGNED, /* M-^X */
- /* 153 */ ED_UNASSIGNED, /* M-^Y */
- /* 154 */ ED_UNASSIGNED, /* M-^Z */
- /* 155 */ ED_UNASSIGNED, /* M-^[ */
- /* 156 */ ED_UNASSIGNED, /* M-^\ */
- /* 157 */ ED_UNASSIGNED, /* M-^] */
- /* 158 */ ED_UNASSIGNED, /* M-^^ */
- /* 159 */ EM_COPY_PREV_WORD, /* M-^_ */
- /* 160 */ ED_UNASSIGNED, /* M-SPACE */
- /* 161 */ ED_UNASSIGNED, /* M-! */
- /* 162 */ ED_UNASSIGNED, /* M-" */
- /* 163 */ ED_UNASSIGNED, /* M-# */
- /* 164 */ ED_UNASSIGNED, /* M-$ */
- /* 165 */ ED_UNASSIGNED, /* M-% */
- /* 166 */ ED_UNASSIGNED, /* M-& */
- /* 167 */ ED_UNASSIGNED, /* M-' */
- /* 168 */ ED_UNASSIGNED, /* M-( */
- /* 169 */ ED_UNASSIGNED, /* M-) */
- /* 170 */ ED_UNASSIGNED, /* M-* */
- /* 171 */ ED_UNASSIGNED, /* M-+ */
- /* 172 */ ED_UNASSIGNED, /* M-, */
- /* 173 */ ED_UNASSIGNED, /* M-- */
- /* 174 */ ED_UNASSIGNED, /* M-. */
- /* 175 */ ED_UNASSIGNED, /* M-/ */
- /* 176 */ ED_ARGUMENT_DIGIT, /* M-0 */
- /* 177 */ ED_ARGUMENT_DIGIT, /* M-1 */
- /* 178 */ ED_ARGUMENT_DIGIT, /* M-2 */
- /* 179 */ ED_ARGUMENT_DIGIT, /* M-3 */
- /* 180 */ ED_ARGUMENT_DIGIT, /* M-4 */
- /* 181 */ ED_ARGUMENT_DIGIT, /* M-5 */
- /* 182 */ ED_ARGUMENT_DIGIT, /* M-6 */
- /* 183 */ ED_ARGUMENT_DIGIT, /* M-7 */
- /* 184 */ ED_ARGUMENT_DIGIT, /* M-8 */
- /* 185 */ ED_ARGUMENT_DIGIT, /* M-9 */
- /* 186 */ ED_UNASSIGNED, /* M-: */
- /* 187 */ ED_UNASSIGNED, /* M-; */
- /* 188 */ ED_UNASSIGNED, /* M-< */
- /* 189 */ ED_UNASSIGNED, /* M-= */
- /* 190 */ ED_UNASSIGNED, /* M-> */
- /* 191 */ ED_UNASSIGNED, /* M-? */
- /* 192 */ ED_UNASSIGNED, /* M-@ */
- /* 193 */ ED_UNASSIGNED, /* M-A */
- /* 194 */ ED_PREV_WORD, /* M-B */
- /* 195 */ EM_CAPITOL_CASE, /* M-C */
- /* 196 */ EM_DELETE_NEXT_WORD, /* M-D */
- /* 197 */ ED_UNASSIGNED, /* M-E */
- /* 198 */ EM_NEXT_WORD, /* M-F */
- /* 199 */ ED_UNASSIGNED, /* M-G */
- /* 200 */ ED_UNASSIGNED, /* M-H */
- /* 201 */ ED_UNASSIGNED, /* M-I */
- /* 202 */ ED_UNASSIGNED, /* M-J */
- /* 203 */ ED_UNASSIGNED, /* M-K */
- /* 204 */ EM_LOWER_CASE, /* M-L */
- /* 205 */ ED_UNASSIGNED, /* M-M */
- /* 206 */ ED_SEARCH_NEXT_HISTORY, /* M-N */
- /* 207 */ ED_SEQUENCE_LEAD_IN, /* M-O */
- /* 208 */ ED_SEARCH_PREV_HISTORY, /* M-P */
- /* 209 */ ED_UNASSIGNED, /* M-Q */
- /* 210 */ ED_UNASSIGNED, /* M-R */
- /* 211 */ ED_UNASSIGNED, /* M-S */
- /* 212 */ ED_UNASSIGNED, /* M-T */
- /* 213 */ EM_UPPER_CASE, /* M-U */
- /* 214 */ ED_UNASSIGNED, /* M-V */
- /* 215 */ EM_COPY_REGION, /* M-W */
- /* 216 */ ED_COMMAND, /* M-X */
- /* 217 */ ED_UNASSIGNED, /* M-Y */
- /* 218 */ ED_UNASSIGNED, /* M-Z */
- /* 219 */ ED_SEQUENCE_LEAD_IN, /* M-[ */
- /* 220 */ ED_UNASSIGNED, /* M-\ */
- /* 221 */ ED_UNASSIGNED, /* M-] */
- /* 222 */ ED_UNASSIGNED, /* M-^ */
- /* 223 */ ED_UNASSIGNED, /* M-_ */
- /* 223 */ ED_UNASSIGNED, /* M-` */
- /* 224 */ ED_UNASSIGNED, /* M-a */
- /* 225 */ ED_PREV_WORD, /* M-b */
- /* 226 */ EM_CAPITOL_CASE, /* M-c */
- /* 227 */ EM_DELETE_NEXT_WORD, /* M-d */
- /* 228 */ ED_UNASSIGNED, /* M-e */
- /* 229 */ EM_NEXT_WORD, /* M-f */
- /* 230 */ ED_UNASSIGNED, /* M-g */
- /* 231 */ ED_UNASSIGNED, /* M-h */
- /* 232 */ ED_UNASSIGNED, /* M-i */
- /* 233 */ ED_UNASSIGNED, /* M-j */
- /* 234 */ ED_UNASSIGNED, /* M-k */
- /* 235 */ EM_LOWER_CASE, /* M-l */
- /* 236 */ ED_UNASSIGNED, /* M-m */
- /* 237 */ ED_SEARCH_NEXT_HISTORY, /* M-n */
- /* 238 */ ED_UNASSIGNED, /* M-o */
- /* 239 */ ED_SEARCH_PREV_HISTORY, /* M-p */
- /* 240 */ ED_UNASSIGNED, /* M-q */
- /* 241 */ ED_UNASSIGNED, /* M-r */
- /* 242 */ ED_UNASSIGNED, /* M-s */
- /* 243 */ ED_UNASSIGNED, /* M-t */
- /* 244 */ EM_UPPER_CASE, /* M-u */
- /* 245 */ ED_UNASSIGNED, /* M-v */
- /* 246 */ EM_COPY_REGION, /* M-w */
- /* 247 */ ED_COMMAND, /* M-x */
- /* 248 */ ED_UNASSIGNED, /* M-y */
- /* 249 */ ED_UNASSIGNED, /* M-z */
- /* 250 */ ED_UNASSIGNED, /* M-{ */
- /* 251 */ ED_UNASSIGNED, /* M-| */
- /* 252 */ ED_UNASSIGNED, /* M-} */
- /* 253 */ ED_UNASSIGNED, /* M-~ */
- /* 254 */ ED_DELETE_PREV_WORD /* M-^? */
- /* 255 */
-};
-
-
-/*
- * keymap table for vi. Each index into above tbl; should be
- * N_KEYS entries long. Vi mode uses a sticky-extend to do command mode:
- * insert mode characters are in the normal keymap, and command mode
- * in the extended keymap.
- */
-private const el_action_t el_map_vi_insert[] = {
-#ifdef KSHVI
- /* 0 */ ED_UNASSIGNED, /* ^@ */
- /* 1 */ ED_INSERT, /* ^A */
- /* 2 */ ED_INSERT, /* ^B */
- /* 3 */ ED_INSERT, /* ^C */
- /* 4 */ VI_LIST_OR_EOF, /* ^D */
- /* 5 */ ED_INSERT, /* ^E */
- /* 6 */ ED_INSERT, /* ^F */
- /* 7 */ ED_INSERT, /* ^G */
- /* 8 */ VI_DELETE_PREV_CHAR, /* ^H */ /* BackSpace key */
- /* 9 */ ED_INSERT, /* ^I */ /* Tab Key */
- /* 10 */ ED_NEWLINE, /* ^J */
- /* 11 */ ED_INSERT, /* ^K */
- /* 12 */ ED_INSERT, /* ^L */
- /* 13 */ ED_NEWLINE, /* ^M */
- /* 14 */ ED_INSERT, /* ^N */
- /* 15 */ ED_INSERT, /* ^O */
- /* 16 */ ED_INSERT, /* ^P */
- /* 17 */ ED_TTY_START_OUTPUT, /* ^Q */
- /* 18 */ ED_INSERT, /* ^R */
- /* 19 */ ED_TTY_STOP_OUTPUT, /* ^S */
- /* 20 */ ED_INSERT, /* ^T */
- /* 21 */ VI_KILL_LINE_PREV, /* ^U */
- /* 22 */ ED_QUOTED_INSERT, /* ^V */
- /* 23 */ ED_DELETE_PREV_WORD, /* ^W */
- /* ED_DELETE_PREV_WORD: Only until strt edit pos */
- /* 24 */ ED_INSERT, /* ^X */
- /* 25 */ ED_INSERT, /* ^Y */
- /* 26 */ ED_INSERT, /* ^Z */
- /* 27 */ VI_COMMAND_MODE, /* ^[ */ /* [ Esc ] key */
- /* 28 */ ED_TTY_SIGQUIT, /* ^\ */
- /* 29 */ ED_INSERT, /* ^] */
- /* 30 */ ED_INSERT, /* ^^ */
- /* 31 */ ED_INSERT, /* ^_ */
-#else /* !KSHVI */
- /*
- * NOTE: These mappings do NOT Correspond well
- * to the KSH VI editing assignments.
- * On the other and they are convenient and
- * many people have gotten used to them.
- */
- /* 0 */ ED_UNASSIGNED, /* ^@ */
- /* 1 */ ED_MOVE_TO_BEG, /* ^A */
- /* 2 */ ED_PREV_CHAR, /* ^B */
- /* 3 */ ED_TTY_SIGINT, /* ^C */
- /* 4 */ VI_LIST_OR_EOF, /* ^D */
- /* 5 */ ED_MOVE_TO_END, /* ^E */
- /* 6 */ ED_NEXT_CHAR, /* ^F */
- /* 7 */ ED_UNASSIGNED, /* ^G */
- /* 8 */ VI_DELETE_PREV_CHAR, /* ^H */ /* BackSpace key */
- /* 9 */ ED_UNASSIGNED, /* ^I */ /* Tab Key */
- /* 10 */ ED_NEWLINE, /* ^J */
- /* 11 */ ED_KILL_LINE, /* ^K */
- /* 12 */ ED_CLEAR_SCREEN, /* ^L */
- /* 13 */ ED_NEWLINE, /* ^M */
- /* 14 */ ED_NEXT_HISTORY, /* ^N */
- /* 15 */ ED_TTY_FLUSH_OUTPUT, /* ^O */
- /* 16 */ ED_PREV_HISTORY, /* ^P */
- /* 17 */ ED_TTY_START_OUTPUT, /* ^Q */
- /* 18 */ ED_REDISPLAY, /* ^R */
- /* 19 */ ED_TTY_STOP_OUTPUT, /* ^S */
- /* 20 */ ED_TRANSPOSE_CHARS, /* ^T */
- /* 21 */ VI_KILL_LINE_PREV, /* ^U */
- /* 22 */ ED_QUOTED_INSERT, /* ^V */
- /* 23 */ ED_DELETE_PREV_WORD, /* ^W */
- /* 24 */ ED_UNASSIGNED, /* ^X */
- /* 25 */ ED_TTY_DSUSP, /* ^Y */
- /* 26 */ ED_TTY_SIGTSTP, /* ^Z */
- /* 27 */ VI_COMMAND_MODE, /* ^[ */
- /* 28 */ ED_TTY_SIGQUIT, /* ^\ */
- /* 29 */ ED_UNASSIGNED, /* ^] */
- /* 30 */ ED_UNASSIGNED, /* ^^ */
- /* 31 */ ED_UNASSIGNED, /* ^_ */
-#endif /* KSHVI */
- /* 32 */ ED_INSERT, /* SPACE */
- /* 33 */ ED_INSERT, /* ! */
- /* 34 */ ED_INSERT, /* " */
- /* 35 */ ED_INSERT, /* # */
- /* 36 */ ED_INSERT, /* $ */
- /* 37 */ ED_INSERT, /* % */
- /* 38 */ ED_INSERT, /* & */
- /* 39 */ ED_INSERT, /* ' */
- /* 40 */ ED_INSERT, /* ( */
- /* 41 */ ED_INSERT, /* ) */
- /* 42 */ ED_INSERT, /* * */
- /* 43 */ ED_INSERT, /* + */
- /* 44 */ ED_INSERT, /* , */
- /* 45 */ ED_INSERT, /* - */
- /* 46 */ ED_INSERT, /* . */
- /* 47 */ ED_INSERT, /* / */
- /* 48 */ ED_INSERT, /* 0 */
- /* 49 */ ED_INSERT, /* 1 */
- /* 50 */ ED_INSERT, /* 2 */
- /* 51 */ ED_INSERT, /* 3 */
- /* 52 */ ED_INSERT, /* 4 */
- /* 53 */ ED_INSERT, /* 5 */
- /* 54 */ ED_INSERT, /* 6 */
- /* 55 */ ED_INSERT, /* 7 */
- /* 56 */ ED_INSERT, /* 8 */
- /* 57 */ ED_INSERT, /* 9 */
- /* 58 */ ED_INSERT, /* : */
- /* 59 */ ED_INSERT, /* ; */
- /* 60 */ ED_INSERT, /* < */
- /* 61 */ ED_INSERT, /* = */
- /* 62 */ ED_INSERT, /* > */
- /* 63 */ ED_INSERT, /* ? */
- /* 64 */ ED_INSERT, /* @ */
- /* 65 */ ED_INSERT, /* A */
- /* 66 */ ED_INSERT, /* B */
- /* 67 */ ED_INSERT, /* C */
- /* 68 */ ED_INSERT, /* D */
- /* 69 */ ED_INSERT, /* E */
- /* 70 */ ED_INSERT, /* F */
- /* 71 */ ED_INSERT, /* G */
- /* 72 */ ED_INSERT, /* H */
- /* 73 */ ED_INSERT, /* I */
- /* 74 */ ED_INSERT, /* J */
- /* 75 */ ED_INSERT, /* K */
- /* 76 */ ED_INSERT, /* L */
- /* 77 */ ED_INSERT, /* M */
- /* 78 */ ED_INSERT, /* N */
- /* 79 */ ED_INSERT, /* O */
- /* 80 */ ED_INSERT, /* P */
- /* 81 */ ED_INSERT, /* Q */
- /* 82 */ ED_INSERT, /* R */
- /* 83 */ ED_INSERT, /* S */
- /* 84 */ ED_INSERT, /* T */
- /* 85 */ ED_INSERT, /* U */
- /* 86 */ ED_INSERT, /* V */
- /* 87 */ ED_INSERT, /* W */
- /* 88 */ ED_INSERT, /* X */
- /* 89 */ ED_INSERT, /* Y */
- /* 90 */ ED_INSERT, /* Z */
- /* 91 */ ED_INSERT, /* [ */
- /* 92 */ ED_INSERT, /* \ */
- /* 93 */ ED_INSERT, /* ] */
- /* 94 */ ED_INSERT, /* ^ */
- /* 95 */ ED_INSERT, /* _ */
- /* 96 */ ED_INSERT, /* ` */
- /* 97 */ ED_INSERT, /* a */
- /* 98 */ ED_INSERT, /* b */
- /* 99 */ ED_INSERT, /* c */
- /* 100 */ ED_INSERT, /* d */
- /* 101 */ ED_INSERT, /* e */
- /* 102 */ ED_INSERT, /* f */
- /* 103 */ ED_INSERT, /* g */
- /* 104 */ ED_INSERT, /* h */
- /* 105 */ ED_INSERT, /* i */
- /* 106 */ ED_INSERT, /* j */
- /* 107 */ ED_INSERT, /* k */
- /* 108 */ ED_INSERT, /* l */
- /* 109 */ ED_INSERT, /* m */
- /* 110 */ ED_INSERT, /* n */
- /* 111 */ ED_INSERT, /* o */
- /* 112 */ ED_INSERT, /* p */
- /* 113 */ ED_INSERT, /* q */
- /* 114 */ ED_INSERT, /* r */
- /* 115 */ ED_INSERT, /* s */
- /* 116 */ ED_INSERT, /* t */
- /* 117 */ ED_INSERT, /* u */
- /* 118 */ ED_INSERT, /* v */
- /* 119 */ ED_INSERT, /* w */
- /* 120 */ ED_INSERT, /* x */
- /* 121 */ ED_INSERT, /* y */
- /* 122 */ ED_INSERT, /* z */
- /* 123 */ ED_INSERT, /* { */
- /* 124 */ ED_INSERT, /* | */
- /* 125 */ ED_INSERT, /* } */
- /* 126 */ ED_INSERT, /* ~ */
- /* 127 */ VI_DELETE_PREV_CHAR, /* ^? */
- /* 128 */ ED_INSERT, /* M-^@ */
- /* 129 */ ED_INSERT, /* M-^A */
- /* 130 */ ED_INSERT, /* M-^B */
- /* 131 */ ED_INSERT, /* M-^C */
- /* 132 */ ED_INSERT, /* M-^D */
- /* 133 */ ED_INSERT, /* M-^E */
- /* 134 */ ED_INSERT, /* M-^F */
- /* 135 */ ED_INSERT, /* M-^G */
- /* 136 */ ED_INSERT, /* M-^H */
- /* 137 */ ED_INSERT, /* M-^I */
- /* 138 */ ED_INSERT, /* M-^J */
- /* 139 */ ED_INSERT, /* M-^K */
- /* 140 */ ED_INSERT, /* M-^L */
- /* 141 */ ED_INSERT, /* M-^M */
- /* 142 */ ED_INSERT, /* M-^N */
- /* 143 */ ED_INSERT, /* M-^O */
- /* 144 */ ED_INSERT, /* M-^P */
- /* 145 */ ED_INSERT, /* M-^Q */
- /* 146 */ ED_INSERT, /* M-^R */
- /* 147 */ ED_INSERT, /* M-^S */
- /* 148 */ ED_INSERT, /* M-^T */
- /* 149 */ ED_INSERT, /* M-^U */
- /* 150 */ ED_INSERT, /* M-^V */
- /* 151 */ ED_INSERT, /* M-^W */
- /* 152 */ ED_INSERT, /* M-^X */
- /* 153 */ ED_INSERT, /* M-^Y */
- /* 154 */ ED_INSERT, /* M-^Z */
- /* 155 */ ED_INSERT, /* M-^[ */
- /* 156 */ ED_INSERT, /* M-^\ */
- /* 157 */ ED_INSERT, /* M-^] */
- /* 158 */ ED_INSERT, /* M-^^ */
- /* 159 */ ED_INSERT, /* M-^_ */
- /* 160 */ ED_INSERT, /* M-SPACE */
- /* 161 */ ED_INSERT, /* M-! */
- /* 162 */ ED_INSERT, /* M-" */
- /* 163 */ ED_INSERT, /* M-# */
- /* 164 */ ED_INSERT, /* M-$ */
- /* 165 */ ED_INSERT, /* M-% */
- /* 166 */ ED_INSERT, /* M-& */
- /* 167 */ ED_INSERT, /* M-' */
- /* 168 */ ED_INSERT, /* M-( */
- /* 169 */ ED_INSERT, /* M-) */
- /* 170 */ ED_INSERT, /* M-* */
- /* 171 */ ED_INSERT, /* M-+ */
- /* 172 */ ED_INSERT, /* M-, */
- /* 173 */ ED_INSERT, /* M-- */
- /* 174 */ ED_INSERT, /* M-. */
- /* 175 */ ED_INSERT, /* M-/ */
- /* 176 */ ED_INSERT, /* M-0 */
- /* 177 */ ED_INSERT, /* M-1 */
- /* 178 */ ED_INSERT, /* M-2 */
- /* 179 */ ED_INSERT, /* M-3 */
- /* 180 */ ED_INSERT, /* M-4 */
- /* 181 */ ED_INSERT, /* M-5 */
- /* 182 */ ED_INSERT, /* M-6 */
- /* 183 */ ED_INSERT, /* M-7 */
- /* 184 */ ED_INSERT, /* M-8 */
- /* 185 */ ED_INSERT, /* M-9 */
- /* 186 */ ED_INSERT, /* M-: */
- /* 187 */ ED_INSERT, /* M-; */
- /* 188 */ ED_INSERT, /* M-< */
- /* 189 */ ED_INSERT, /* M-= */
- /* 190 */ ED_INSERT, /* M-> */
- /* 191 */ ED_INSERT, /* M-? */
- /* 192 */ ED_INSERT, /* M-@ */
- /* 193 */ ED_INSERT, /* M-A */
- /* 194 */ ED_INSERT, /* M-B */
- /* 195 */ ED_INSERT, /* M-C */
- /* 196 */ ED_INSERT, /* M-D */
- /* 197 */ ED_INSERT, /* M-E */
- /* 198 */ ED_INSERT, /* M-F */
- /* 199 */ ED_INSERT, /* M-G */
- /* 200 */ ED_INSERT, /* M-H */
- /* 201 */ ED_INSERT, /* M-I */
- /* 202 */ ED_INSERT, /* M-J */
- /* 203 */ ED_INSERT, /* M-K */
- /* 204 */ ED_INSERT, /* M-L */
- /* 205 */ ED_INSERT, /* M-M */
- /* 206 */ ED_INSERT, /* M-N */
- /* 207 */ ED_INSERT, /* M-O */
- /* 208 */ ED_INSERT, /* M-P */
- /* 209 */ ED_INSERT, /* M-Q */
- /* 210 */ ED_INSERT, /* M-R */
- /* 211 */ ED_INSERT, /* M-S */
- /* 212 */ ED_INSERT, /* M-T */
- /* 213 */ ED_INSERT, /* M-U */
- /* 214 */ ED_INSERT, /* M-V */
- /* 215 */ ED_INSERT, /* M-W */
- /* 216 */ ED_INSERT, /* M-X */
- /* 217 */ ED_INSERT, /* M-Y */
- /* 218 */ ED_INSERT, /* M-Z */
- /* 219 */ ED_INSERT, /* M-[ */
- /* 220 */ ED_INSERT, /* M-\ */
- /* 221 */ ED_INSERT, /* M-] */
- /* 222 */ ED_INSERT, /* M-^ */
- /* 223 */ ED_INSERT, /* M-_ */
- /* 224 */ ED_INSERT, /* M-` */
- /* 225 */ ED_INSERT, /* M-a */
- /* 226 */ ED_INSERT, /* M-b */
- /* 227 */ ED_INSERT, /* M-c */
- /* 228 */ ED_INSERT, /* M-d */
- /* 229 */ ED_INSERT, /* M-e */
- /* 230 */ ED_INSERT, /* M-f */
- /* 231 */ ED_INSERT, /* M-g */
- /* 232 */ ED_INSERT, /* M-h */
- /* 233 */ ED_INSERT, /* M-i */
- /* 234 */ ED_INSERT, /* M-j */
- /* 235 */ ED_INSERT, /* M-k */
- /* 236 */ ED_INSERT, /* M-l */
- /* 237 */ ED_INSERT, /* M-m */
- /* 238 */ ED_INSERT, /* M-n */
- /* 239 */ ED_INSERT, /* M-o */
- /* 240 */ ED_INSERT, /* M-p */
- /* 241 */ ED_INSERT, /* M-q */
- /* 242 */ ED_INSERT, /* M-r */
- /* 243 */ ED_INSERT, /* M-s */
- /* 244 */ ED_INSERT, /* M-t */
- /* 245 */ ED_INSERT, /* M-u */
- /* 246 */ ED_INSERT, /* M-v */
- /* 247 */ ED_INSERT, /* M-w */
- /* 248 */ ED_INSERT, /* M-x */
- /* 249 */ ED_INSERT, /* M-y */
- /* 250 */ ED_INSERT, /* M-z */
- /* 251 */ ED_INSERT, /* M-{ */
- /* 252 */ ED_INSERT, /* M-| */
- /* 253 */ ED_INSERT, /* M-} */
- /* 254 */ ED_INSERT, /* M-~ */
- /* 255 */ ED_INSERT /* M-^? */
-};
-
-private const el_action_t el_map_vi_command[] = {
- /* 0 */ ED_UNASSIGNED, /* ^@ */
- /* 1 */ ED_MOVE_TO_BEG, /* ^A */
- /* 2 */ ED_UNASSIGNED, /* ^B */
- /* 3 */ ED_TTY_SIGINT, /* ^C */
- /* 4 */ ED_UNASSIGNED, /* ^D */
- /* 5 */ ED_MOVE_TO_END, /* ^E */
- /* 6 */ ED_UNASSIGNED, /* ^F */
- /* 7 */ ED_UNASSIGNED, /* ^G */
- /* 8 */ ED_DELETE_PREV_CHAR, /* ^H */
- /* 9 */ ED_UNASSIGNED, /* ^I */
- /* 10 */ ED_NEWLINE, /* ^J */
- /* 11 */ ED_KILL_LINE, /* ^K */
- /* 12 */ ED_CLEAR_SCREEN, /* ^L */
- /* 13 */ ED_NEWLINE, /* ^M */
- /* 14 */ ED_NEXT_HISTORY, /* ^N */
- /* 15 */ ED_TTY_FLUSH_OUTPUT, /* ^O */
- /* 16 */ ED_PREV_HISTORY, /* ^P */
- /* 17 */ ED_TTY_START_OUTPUT, /* ^Q */
- /* 18 */ ED_REDISPLAY, /* ^R */
- /* 19 */ ED_TTY_STOP_OUTPUT, /* ^S */
- /* 20 */ ED_UNASSIGNED, /* ^T */
- /* 21 */ VI_KILL_LINE_PREV, /* ^U */
- /* 22 */ ED_UNASSIGNED, /* ^V */
- /* 23 */ ED_DELETE_PREV_WORD, /* ^W */
- /* 24 */ ED_UNASSIGNED, /* ^X */
- /* 25 */ ED_UNASSIGNED, /* ^Y */
- /* 26 */ ED_UNASSIGNED, /* ^Z */
- /* 27 */ EM_META_NEXT, /* ^[ */
- /* 28 */ ED_TTY_SIGQUIT, /* ^\ */
- /* 29 */ ED_UNASSIGNED, /* ^] */
- /* 30 */ ED_UNASSIGNED, /* ^^ */
- /* 31 */ ED_UNASSIGNED, /* ^_ */
- /* 32 */ ED_NEXT_CHAR, /* SPACE */
- /* 33 */ ED_UNASSIGNED, /* ! */
- /* 34 */ ED_UNASSIGNED, /* " */
- /* 35 */ VI_COMMENT_OUT, /* # */
- /* 36 */ ED_MOVE_TO_END, /* $ */
- /* 37 */ VI_MATCH, /* % */
- /* 38 */ ED_UNASSIGNED, /* & */
- /* 39 */ ED_UNASSIGNED, /* ' */
- /* 40 */ ED_UNASSIGNED, /* ( */
- /* 41 */ ED_UNASSIGNED, /* ) */
- /* 42 */ ED_UNASSIGNED, /* * */
- /* 43 */ ED_NEXT_HISTORY, /* + */
- /* 44 */ VI_REPEAT_PREV_CHAR, /* , */
- /* 45 */ ED_PREV_HISTORY, /* - */
- /* 46 */ VI_REDO, /* . */
- /* 47 */ VI_SEARCH_PREV, /* / */
- /* 48 */ VI_ZERO, /* 0 */
- /* 49 */ ED_ARGUMENT_DIGIT, /* 1 */
- /* 50 */ ED_ARGUMENT_DIGIT, /* 2 */
- /* 51 */ ED_ARGUMENT_DIGIT, /* 3 */
- /* 52 */ ED_ARGUMENT_DIGIT, /* 4 */
- /* 53 */ ED_ARGUMENT_DIGIT, /* 5 */
- /* 54 */ ED_ARGUMENT_DIGIT, /* 6 */
- /* 55 */ ED_ARGUMENT_DIGIT, /* 7 */
- /* 56 */ ED_ARGUMENT_DIGIT, /* 8 */
- /* 57 */ ED_ARGUMENT_DIGIT, /* 9 */
- /* 58 */ ED_COMMAND, /* : */
- /* 59 */ VI_REPEAT_NEXT_CHAR, /* ; */
- /* 60 */ ED_UNASSIGNED, /* < */
- /* 61 */ ED_UNASSIGNED, /* = */
- /* 62 */ ED_UNASSIGNED, /* > */
- /* 63 */ VI_SEARCH_NEXT, /* ? */
- /* 64 */ VI_ALIAS, /* @ */
- /* 65 */ VI_ADD_AT_EOL, /* A */
- /* 66 */ VI_PREV_BIG_WORD, /* B */
- /* 67 */ VI_CHANGE_TO_EOL, /* C */
- /* 68 */ ED_KILL_LINE, /* D */
- /* 69 */ VI_END_BIG_WORD, /* E */
- /* 70 */ VI_PREV_CHAR, /* F */
- /* 71 */ VI_TO_HISTORY_LINE, /* G */
- /* 72 */ ED_UNASSIGNED, /* H */
- /* 73 */ VI_INSERT_AT_BOL, /* I */
- /* 74 */ ED_SEARCH_NEXT_HISTORY, /* J */
- /* 75 */ ED_SEARCH_PREV_HISTORY, /* K */
- /* 76 */ ED_UNASSIGNED, /* L */
- /* 77 */ ED_UNASSIGNED, /* M */
- /* 78 */ VI_REPEAT_SEARCH_PREV, /* N */
- /* 79 */ ED_SEQUENCE_LEAD_IN, /* O */
- /* 80 */ VI_PASTE_PREV, /* P */
- /* 81 */ ED_UNASSIGNED, /* Q */
- /* 82 */ VI_REPLACE_MODE, /* R */
- /* 83 */ VI_SUBSTITUTE_LINE, /* S */
- /* 84 */ VI_TO_PREV_CHAR, /* T */
- /* 85 */ VI_UNDO_LINE, /* U */
- /* 86 */ ED_UNASSIGNED, /* V */
- /* 87 */ VI_NEXT_BIG_WORD, /* W */
- /* 88 */ ED_DELETE_PREV_CHAR, /* X */
- /* 89 */ VI_YANK_END, /* Y */
- /* 90 */ ED_UNASSIGNED, /* Z */
- /* 91 */ ED_SEQUENCE_LEAD_IN, /* [ */
- /* 92 */ ED_UNASSIGNED, /* \ */
- /* 93 */ ED_UNASSIGNED, /* ] */
- /* 94 */ ED_MOVE_TO_BEG, /* ^ */
- /* 95 */ VI_HISTORY_WORD, /* _ */
- /* 96 */ ED_UNASSIGNED, /* ` */
- /* 97 */ VI_ADD, /* a */
- /* 98 */ VI_PREV_WORD, /* b */
- /* 99 */ VI_CHANGE_META, /* c */
- /* 100 */ VI_DELETE_META, /* d */
- /* 101 */ VI_END_WORD, /* e */
- /* 102 */ VI_NEXT_CHAR, /* f */
- /* 103 */ ED_UNASSIGNED, /* g */
- /* 104 */ ED_PREV_CHAR, /* h */
- /* 105 */ VI_INSERT, /* i */
- /* 106 */ ED_NEXT_HISTORY, /* j */
- /* 107 */ ED_PREV_HISTORY, /* k */
- /* 108 */ ED_NEXT_CHAR, /* l */
- /* 109 */ ED_UNASSIGNED, /* m */
- /* 110 */ VI_REPEAT_SEARCH_NEXT, /* n */
- /* 111 */ ED_UNASSIGNED, /* o */
- /* 112 */ VI_PASTE_NEXT, /* p */
- /* 113 */ ED_UNASSIGNED, /* q */
- /* 114 */ VI_REPLACE_CHAR, /* r */
- /* 115 */ VI_SUBSTITUTE_CHAR, /* s */
- /* 116 */ VI_TO_NEXT_CHAR, /* t */
- /* 117 */ VI_UNDO, /* u */
- /* 118 */ VI_HISTEDIT, /* v */
- /* 119 */ VI_NEXT_WORD, /* w */
- /* 120 */ ED_DELETE_NEXT_CHAR, /* x */
- /* 121 */ VI_YANK, /* y */
- /* 122 */ ED_UNASSIGNED, /* z */
- /* 123 */ ED_UNASSIGNED, /* { */
- /* 124 */ VI_TO_COLUMN, /* | */
- /* 125 */ ED_UNASSIGNED, /* } */
- /* 126 */ VI_CHANGE_CASE, /* ~ */
- /* 127 */ ED_DELETE_PREV_CHAR, /* ^? */
- /* 128 */ ED_UNASSIGNED, /* M-^@ */
- /* 129 */ ED_UNASSIGNED, /* M-^A */
- /* 130 */ ED_UNASSIGNED, /* M-^B */
- /* 131 */ ED_UNASSIGNED, /* M-^C */
- /* 132 */ ED_UNASSIGNED, /* M-^D */
- /* 133 */ ED_UNASSIGNED, /* M-^E */
- /* 134 */ ED_UNASSIGNED, /* M-^F */
- /* 135 */ ED_UNASSIGNED, /* M-^G */
- /* 136 */ ED_UNASSIGNED, /* M-^H */
- /* 137 */ ED_UNASSIGNED, /* M-^I */
- /* 138 */ ED_UNASSIGNED, /* M-^J */
- /* 139 */ ED_UNASSIGNED, /* M-^K */
- /* 140 */ ED_UNASSIGNED, /* M-^L */
- /* 141 */ ED_UNASSIGNED, /* M-^M */
- /* 142 */ ED_UNASSIGNED, /* M-^N */
- /* 143 */ ED_UNASSIGNED, /* M-^O */
- /* 144 */ ED_UNASSIGNED, /* M-^P */
- /* 145 */ ED_UNASSIGNED, /* M-^Q */
- /* 146 */ ED_UNASSIGNED, /* M-^R */
- /* 147 */ ED_UNASSIGNED, /* M-^S */
- /* 148 */ ED_UNASSIGNED, /* M-^T */
- /* 149 */ ED_UNASSIGNED, /* M-^U */
- /* 150 */ ED_UNASSIGNED, /* M-^V */
- /* 151 */ ED_UNASSIGNED, /* M-^W */
- /* 152 */ ED_UNASSIGNED, /* M-^X */
- /* 153 */ ED_UNASSIGNED, /* M-^Y */
- /* 154 */ ED_UNASSIGNED, /* M-^Z */
- /* 155 */ ED_UNASSIGNED, /* M-^[ */
- /* 156 */ ED_UNASSIGNED, /* M-^\ */
- /* 157 */ ED_UNASSIGNED, /* M-^] */
- /* 158 */ ED_UNASSIGNED, /* M-^^ */
- /* 159 */ ED_UNASSIGNED, /* M-^_ */
- /* 160 */ ED_UNASSIGNED, /* M-SPACE */
- /* 161 */ ED_UNASSIGNED, /* M-! */
- /* 162 */ ED_UNASSIGNED, /* M-" */
- /* 163 */ ED_UNASSIGNED, /* M-# */
- /* 164 */ ED_UNASSIGNED, /* M-$ */
- /* 165 */ ED_UNASSIGNED, /* M-% */
- /* 166 */ ED_UNASSIGNED, /* M-& */
- /* 167 */ ED_UNASSIGNED, /* M-' */
- /* 168 */ ED_UNASSIGNED, /* M-( */
- /* 169 */ ED_UNASSIGNED, /* M-) */
- /* 170 */ ED_UNASSIGNED, /* M-* */
- /* 171 */ ED_UNASSIGNED, /* M-+ */
- /* 172 */ ED_UNASSIGNED, /* M-, */
- /* 173 */ ED_UNASSIGNED, /* M-- */
- /* 174 */ ED_UNASSIGNED, /* M-. */
- /* 175 */ ED_UNASSIGNED, /* M-/ */
- /* 176 */ ED_UNASSIGNED, /* M-0 */
- /* 177 */ ED_UNASSIGNED, /* M-1 */
- /* 178 */ ED_UNASSIGNED, /* M-2 */
- /* 179 */ ED_UNASSIGNED, /* M-3 */
- /* 180 */ ED_UNASSIGNED, /* M-4 */
- /* 181 */ ED_UNASSIGNED, /* M-5 */
- /* 182 */ ED_UNASSIGNED, /* M-6 */
- /* 183 */ ED_UNASSIGNED, /* M-7 */
- /* 184 */ ED_UNASSIGNED, /* M-8 */
- /* 185 */ ED_UNASSIGNED, /* M-9 */
- /* 186 */ ED_UNASSIGNED, /* M-: */
- /* 187 */ ED_UNASSIGNED, /* M-; */
- /* 188 */ ED_UNASSIGNED, /* M-< */
- /* 189 */ ED_UNASSIGNED, /* M-= */
- /* 190 */ ED_UNASSIGNED, /* M-> */
- /* 191 */ ED_UNASSIGNED, /* M-? */
- /* 192 */ ED_UNASSIGNED, /* M-@ */
- /* 193 */ ED_UNASSIGNED, /* M-A */
- /* 194 */ ED_UNASSIGNED, /* M-B */
- /* 195 */ ED_UNASSIGNED, /* M-C */
- /* 196 */ ED_UNASSIGNED, /* M-D */
- /* 197 */ ED_UNASSIGNED, /* M-E */
- /* 198 */ ED_UNASSIGNED, /* M-F */
- /* 199 */ ED_UNASSIGNED, /* M-G */
- /* 200 */ ED_UNASSIGNED, /* M-H */
- /* 201 */ ED_UNASSIGNED, /* M-I */
- /* 202 */ ED_UNASSIGNED, /* M-J */
- /* 203 */ ED_UNASSIGNED, /* M-K */
- /* 204 */ ED_UNASSIGNED, /* M-L */
- /* 205 */ ED_UNASSIGNED, /* M-M */
- /* 206 */ ED_UNASSIGNED, /* M-N */
- /* 207 */ ED_SEQUENCE_LEAD_IN, /* M-O */
- /* 208 */ ED_UNASSIGNED, /* M-P */
- /* 209 */ ED_UNASSIGNED, /* M-Q */
- /* 210 */ ED_UNASSIGNED, /* M-R */
- /* 211 */ ED_UNASSIGNED, /* M-S */
- /* 212 */ ED_UNASSIGNED, /* M-T */
- /* 213 */ ED_UNASSIGNED, /* M-U */
- /* 214 */ ED_UNASSIGNED, /* M-V */
- /* 215 */ ED_UNASSIGNED, /* M-W */
- /* 216 */ ED_UNASSIGNED, /* M-X */
- /* 217 */ ED_UNASSIGNED, /* M-Y */
- /* 218 */ ED_UNASSIGNED, /* M-Z */
- /* 219 */ ED_SEQUENCE_LEAD_IN, /* M-[ */
- /* 220 */ ED_UNASSIGNED, /* M-\ */
- /* 221 */ ED_UNASSIGNED, /* M-] */
- /* 222 */ ED_UNASSIGNED, /* M-^ */
- /* 223 */ ED_UNASSIGNED, /* M-_ */
- /* 224 */ ED_UNASSIGNED, /* M-` */
- /* 225 */ ED_UNASSIGNED, /* M-a */
- /* 226 */ ED_UNASSIGNED, /* M-b */
- /* 227 */ ED_UNASSIGNED, /* M-c */
- /* 228 */ ED_UNASSIGNED, /* M-d */
- /* 229 */ ED_UNASSIGNED, /* M-e */
- /* 230 */ ED_UNASSIGNED, /* M-f */
- /* 231 */ ED_UNASSIGNED, /* M-g */
- /* 232 */ ED_UNASSIGNED, /* M-h */
- /* 233 */ ED_UNASSIGNED, /* M-i */
- /* 234 */ ED_UNASSIGNED, /* M-j */
- /* 235 */ ED_UNASSIGNED, /* M-k */
- /* 236 */ ED_UNASSIGNED, /* M-l */
- /* 237 */ ED_UNASSIGNED, /* M-m */
- /* 238 */ ED_UNASSIGNED, /* M-n */
- /* 239 */ ED_UNASSIGNED, /* M-o */
- /* 240 */ ED_UNASSIGNED, /* M-p */
- /* 241 */ ED_UNASSIGNED, /* M-q */
- /* 242 */ ED_UNASSIGNED, /* M-r */
- /* 243 */ ED_UNASSIGNED, /* M-s */
- /* 244 */ ED_UNASSIGNED, /* M-t */
- /* 245 */ ED_UNASSIGNED, /* M-u */
- /* 246 */ ED_UNASSIGNED, /* M-v */
- /* 247 */ ED_UNASSIGNED, /* M-w */
- /* 248 */ ED_UNASSIGNED, /* M-x */
- /* 249 */ ED_UNASSIGNED, /* M-y */
- /* 250 */ ED_UNASSIGNED, /* M-z */
- /* 251 */ ED_UNASSIGNED, /* M-{ */
- /* 252 */ ED_UNASSIGNED, /* M-| */
- /* 253 */ ED_UNASSIGNED, /* M-} */
- /* 254 */ ED_UNASSIGNED, /* M-~ */
- /* 255 */ ED_UNASSIGNED /* M-^? */
-};
-
-
-/* map_init():
- * Initialize and allocate the maps
- */
-protected int
-map_init(EditLine *el)
-{
-
- /*
- * Make sure those are correct before starting.
- */
-#ifdef MAP_DEBUG
- if (sizeof(el_map_emacs) != N_KEYS * sizeof(el_action_t))
- EL_ABORT((el->errfile, "Emacs map incorrect\n"));
- if (sizeof(el_map_vi_command) != N_KEYS * sizeof(el_action_t))
- EL_ABORT((el->errfile, "Vi command map incorrect\n"));
- if (sizeof(el_map_vi_insert) != N_KEYS * sizeof(el_action_t))
- EL_ABORT((el->errfile, "Vi insert map incorrect\n"));
-#endif
-
- el->el_map.alt = el_malloc(sizeof(*el->el_map.alt) * N_KEYS);
- if (el->el_map.alt == NULL)
- return -1;
- el->el_map.key = el_malloc(sizeof(*el->el_map.key) * N_KEYS);
- if (el->el_map.key == NULL)
- return -1;
- el->el_map.emacs = el_map_emacs;
- el->el_map.vic = el_map_vi_command;
- el->el_map.vii = el_map_vi_insert;
- el->el_map.help = el_malloc(sizeof(*el->el_map.help) * EL_NUM_FCNS);
- if (el->el_map.help == NULL)
- return -1;
- (void) memcpy(el->el_map.help, help__get(),
- sizeof(*el->el_map.help) * EL_NUM_FCNS);
- el->el_map.func = el_malloc(sizeof(*el->el_map.func) * EL_NUM_FCNS);
- if (el->el_map.func == NULL)
- return -1;
- memcpy(el->el_map.func, func__get(), sizeof(*el->el_map.func)
- * EL_NUM_FCNS);
- el->el_map.nfunc = EL_NUM_FCNS;
-
-#ifdef VIDEFAULT
- map_init_vi(el);
-#else
- map_init_emacs(el);
-#endif /* VIDEFAULT */
- return 0;
-}
-
-
-/* map_end():
- * Free the space taken by the editor maps
- */
-protected void
-map_end(EditLine *el)
-{
-
- el_free(el->el_map.alt);
- el->el_map.alt = NULL;
- el_free(el->el_map.key);
- el->el_map.key = NULL;
- el->el_map.emacs = NULL;
- el->el_map.vic = NULL;
- el->el_map.vii = NULL;
- el_free(el->el_map.help);
- el->el_map.help = NULL;
- el_free(el->el_map.func);
- el->el_map.func = NULL;
-}
-
-
-/* map_init_nls():
- * Find all the printable keys and bind them to self insert
- */
-private void
-map_init_nls(EditLine *el)
-{
- int i;
-
- el_action_t *map = el->el_map.key;
-
- for (i = 0200; i <= 0377; i++)
- if (Isprint(i))
- map[i] = ED_INSERT;
-}
-
-
-/* map_init_meta():
- * Bind all the meta keys to the appropriate ESC-<key> sequence
- */
-private void
-map_init_meta(EditLine *el)
-{
- Char buf[3];
- int i;
- el_action_t *map = el->el_map.key;
- el_action_t *alt = el->el_map.alt;
-
- for (i = 0; i <= 0377 && map[i] != EM_META_NEXT; i++)
- continue;
-
- if (i > 0377) {
- for (i = 0; i <= 0377 && alt[i] != EM_META_NEXT; i++)
- continue;
- if (i > 0377) {
- i = 033;
- if (el->el_map.type == MAP_VI)
- map = alt;
- } else
- map = alt;
- }
- buf[0] = (Char) i;
- buf[2] = 0;
- for (i = 0200; i <= 0377; i++)
- switch (map[i]) {
- case ED_INSERT:
- case ED_UNASSIGNED:
- case ED_SEQUENCE_LEAD_IN:
- break;
- default:
- buf[1] = i & 0177;
- keymacro_add(el, buf, keymacro_map_cmd(el, (int) map[i]), XK_CMD);
- break;
- }
- map[(int) buf[0]] = ED_SEQUENCE_LEAD_IN;
-}
-
-
-/* map_init_vi():
- * Initialize the vi bindings
- */
-protected void
-map_init_vi(EditLine *el)
-{
- int i;
- el_action_t *key = el->el_map.key;
- el_action_t *alt = el->el_map.alt;
- const el_action_t *vii = el->el_map.vii;
- const el_action_t *vic = el->el_map.vic;
-
- el->el_map.type = MAP_VI;
- el->el_map.current = el->el_map.key;
-
- keymacro_reset(el);
-
- for (i = 0; i < N_KEYS; i++) {
- key[i] = vii[i];
- alt[i] = vic[i];
- }
-
- map_init_meta(el);
- map_init_nls(el);
-
- tty_bind_char(el, 1);
- terminal_bind_arrow(el);
-}
-
-
-/* map_init_emacs():
- * Initialize the emacs bindings
- */
-protected void
-map_init_emacs(EditLine *el)
-{
- int i;
- Char buf[3];
- el_action_t *key = el->el_map.key;
- el_action_t *alt = el->el_map.alt;
- const el_action_t *emacs = el->el_map.emacs;
-
- el->el_map.type = MAP_EMACS;
- el->el_map.current = el->el_map.key;
- keymacro_reset(el);
-
- for (i = 0; i < N_KEYS; i++) {
- key[i] = emacs[i];
- alt[i] = ED_UNASSIGNED;
- }
-
- map_init_meta(el);
- map_init_nls(el);
-
- buf[0] = CONTROL('X');
- buf[1] = CONTROL('X');
- buf[2] = 0;
- keymacro_add(el, buf, keymacro_map_cmd(el, EM_EXCHANGE_MARK), XK_CMD);
-
- tty_bind_char(el, 1);
- terminal_bind_arrow(el);
-}
-
-
-/* map_set_editor():
- * Set the editor
- */
-protected int
-map_set_editor(EditLine *el, Char *editor)
-{
-
- if (Strcmp(editor, STR("emacs")) == 0) {
- map_init_emacs(el);
- return 0;
- }
- if (Strcmp(editor, STR("vi")) == 0) {
- map_init_vi(el);
- return 0;
- }
- return -1;
-}
-
-
-/* map_get_editor():
- * Retrieve the editor
- */
-protected int
-map_get_editor(EditLine *el, const Char **editor)
-{
-
- if (editor == NULL)
- return -1;
- switch (el->el_map.type) {
- case MAP_EMACS:
- *editor = STR("emacs");
- return 0;
- case MAP_VI:
- *editor = STR("vi");
- return 0;
- }
- return -1;
-}
-
-
-/* map_print_key():
- * Print the function description for 1 key
- */
-private void
-map_print_key(EditLine *el, el_action_t *map, const Char *in)
-{
- char outbuf[EL_BUFSIZ];
- el_bindings_t *bp, *ep;
-
- if (in[0] == '\0' || in[1] == '\0') {
- (void) keymacro__decode_str(in, outbuf, sizeof(outbuf), "");
- ep = &el->el_map.help[el->el_map.nfunc];
- for (bp = el->el_map.help; bp < ep; bp++)
- if (bp->func == map[(unsigned char) *in]) {
- (void) fprintf(el->el_outfile,
- "%s\t->\t" FSTR "\n", outbuf, bp->name);
- return;
- }
- } else
- keymacro_print(el, in);
-}
-
-
-/* map_print_some_keys():
- * Print keys from first to last
- */
-private void
-map_print_some_keys(EditLine *el, el_action_t *map, wint_t first, wint_t last)
-{
- el_bindings_t *bp, *ep;
- Char firstbuf[2], lastbuf[2];
- char unparsbuf[EL_BUFSIZ], extrabuf[EL_BUFSIZ];
-
- firstbuf[0] = (Char)first;
- firstbuf[1] = 0;
- lastbuf[0] = (Char)last;
- lastbuf[1] = 0;
- if (map[first] == ED_UNASSIGNED) {
- if (first == last) {
- (void) keymacro__decode_str(firstbuf, unparsbuf,
- sizeof(unparsbuf), STRQQ);
- (void) fprintf(el->el_outfile,
- "%-15s-> is undefined\n", unparsbuf);
- }
- return;
- }
- ep = &el->el_map.help[el->el_map.nfunc];
- for (bp = el->el_map.help; bp < ep; bp++) {
- if (bp->func == map[first]) {
- if (first == last) {
- (void) keymacro__decode_str(firstbuf, unparsbuf,
- sizeof(unparsbuf), STRQQ);
- (void) fprintf(el->el_outfile, "%-15s-> " FSTR "\n",
- unparsbuf, bp->name);
- } else {
- (void) keymacro__decode_str(firstbuf, unparsbuf,
- sizeof(unparsbuf), STRQQ);
- (void) keymacro__decode_str(lastbuf, extrabuf,
- sizeof(extrabuf), STRQQ);
- (void) fprintf(el->el_outfile,
- "%-4s to %-7s-> " FSTR "\n",
- unparsbuf, extrabuf, bp->name);
- }
- return;
- }
- }
-#ifdef MAP_DEBUG
- if (map == el->el_map.key) {
- (void) keymacro__decode_str(firstbuf, unparsbuf,
- sizeof(unparsbuf), STRQQ);
- (void) fprintf(el->el_outfile,
- "BUG!!! %s isn't bound to anything.\n", unparsbuf);
- (void) fprintf(el->el_outfile, "el->el_map.key[%d] == %d\n",
- first, el->el_map.key[first]);
- } else {
- (void) keymacro__decode_str(firstbuf, unparsbuf,
- sizeof(unparsbuf), STRQQ);
- (void) fprintf(el->el_outfile,
- "BUG!!! %s isn't bound to anything.\n", unparsbuf);
- (void) fprintf(el->el_outfile, "el->el_map.alt[%d] == %d\n",
- first, el->el_map.alt[first]);
- }
-#endif
- EL_ABORT((el->el_errfile, "Error printing keys\n"));
-}
-
-
-/* map_print_all_keys():
- * Print the function description for all keys.
- */
-private void
-map_print_all_keys(EditLine *el)
-{
- int prev, i;
-
- (void) fprintf(el->el_outfile, "Standard key bindings\n");
- prev = 0;
- for (i = 0; i < N_KEYS; i++) {
- if (el->el_map.key[prev] == el->el_map.key[i])
- continue;
- map_print_some_keys(el, el->el_map.key, prev, i - 1);
- prev = i;
- }
- map_print_some_keys(el, el->el_map.key, prev, i - 1);
-
- (void) fprintf(el->el_outfile, "Alternative key bindings\n");
- prev = 0;
- for (i = 0; i < N_KEYS; i++) {
- if (el->el_map.alt[prev] == el->el_map.alt[i])
- continue;
- map_print_some_keys(el, el->el_map.alt, prev, i - 1);
- prev = i;
- }
- map_print_some_keys(el, el->el_map.alt, prev, i - 1);
-
- (void) fprintf(el->el_outfile, "Multi-character bindings\n");
- keymacro_print(el, STR(""));
- (void) fprintf(el->el_outfile, "Arrow key bindings\n");
- terminal_print_arrow(el, STR(""));
-}
-
-
-/* map_bind():
- * Add/remove/change bindings
- */
-protected int
-map_bind(EditLine *el, int argc, const Char **argv)
-{
- el_action_t *map;
- int ntype, rem;
- const Char *p;
- Char inbuf[EL_BUFSIZ];
- Char outbuf[EL_BUFSIZ];
- const Char *in = NULL;
- Char *out;
- el_bindings_t *bp, *ep;
- int cmd;
- int key;
-
- if (argv == NULL)
- return -1;
-
- map = el->el_map.key;
- ntype = XK_CMD;
- key = rem = 0;
- for (argc = 1; (p = argv[argc]) != NULL; argc++)
- if (p[0] == '-')
- switch (p[1]) {
- case 'a':
- map = el->el_map.alt;
- break;
-
- case 's':
- ntype = XK_STR;
- break;
-#ifdef notyet
- case 'c':
- ntype = XK_EXE;
- break;
-#endif
- case 'k':
- key = 1;
- break;
-
- case 'r':
- rem = 1;
- break;
-
- case 'v':
- map_init_vi(el);
- return 0;
-
- case 'e':
- map_init_emacs(el);
- return 0;
-
- case 'l':
- ep = &el->el_map.help[el->el_map.nfunc];
- for (bp = el->el_map.help; bp < ep; bp++)
- (void) fprintf(el->el_outfile,
- "" FSTR "\n\t" FSTR "\n",
- bp->name, bp->description);
- return 0;
- default:
- (void) fprintf(el->el_errfile,
- "" FSTR ": Invalid switch `%lc'.\n",
- argv[0], (wint_t)p[1]);
- }
- else
- break;
-
- if (argv[argc] == NULL) {
- map_print_all_keys(el);
- return 0;
- }
- if (key)
- in = argv[argc++];
- else if ((in = parse__string(inbuf, argv[argc++])) == NULL) {
- (void) fprintf(el->el_errfile,
- "" FSTR ": Invalid \\ or ^ in instring.\n",
- argv[0]);
- return -1;
- }
- if (rem) {
- if (key) {
- (void) terminal_clear_arrow(el, in);
- return -1;
- }
- if (in[1])
- (void) keymacro_delete(el, in);
- else if (map[(unsigned char) *in] == ED_SEQUENCE_LEAD_IN)
- (void) keymacro_delete(el, in);
- else
- map[(unsigned char) *in] = ED_UNASSIGNED;
- return 0;
- }
- if (argv[argc] == NULL) {
- if (key)
- terminal_print_arrow(el, in);
- else
- map_print_key(el, map, in);
- return 0;
- }
-#ifdef notyet
- if (argv[argc + 1] != NULL) {
- bindkeymacro_usage();
- return -1;
- }
-#endif
-
- switch (ntype) {
- case XK_STR:
- case XK_EXE:
- if ((out = parse__string(outbuf, argv[argc])) == NULL) {
- (void) fprintf(el->el_errfile,
- "" FSTR ": Invalid \\ or ^ in outstring.\n", argv[0]);
- return -1;
- }
- if (key)
- terminal_set_arrow(el, in, keymacro_map_str(el, out), ntype);
- else
- keymacro_add(el, in, keymacro_map_str(el, out), ntype);
- map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;
- break;
-
- case XK_CMD:
- if ((cmd = parse_cmd(el, argv[argc])) == -1) {
- (void) fprintf(el->el_errfile,
- "" FSTR ": Invalid command `" FSTR "'.\n",
- argv[0], argv[argc]);
- return -1;
- }
- if (key)
- terminal_set_arrow(el, in, keymacro_map_cmd(el, cmd), ntype);
- else {
- if (in[1]) {
- keymacro_add(el, in, keymacro_map_cmd(el, cmd), ntype);
- map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;
- } else {
- keymacro_clear(el, map, in);
- map[(unsigned char) *in] = (el_action_t)cmd;
- }
- }
- break;
-
- /* coverity[dead_error_begin] */
- default:
- EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype));
- break;
- }
- return 0;
-}
-
-
-/* map_addfunc():
- * add a user defined function
- */
-protected int
-map_addfunc(EditLine *el, const Char *name, const Char *help, el_func_t func)
-{
- void *p;
- size_t nf = el->el_map.nfunc + 1;
-
- if (name == NULL || help == NULL || func == NULL)
- return -1;
-
- if ((p = el_realloc(el->el_map.func, nf *
- sizeof(*el->el_map.func))) == NULL)
- return -1;
- el->el_map.func = p;
- if ((p = el_realloc(el->el_map.help, nf * sizeof(*el->el_map.help)))
- == NULL)
- return -1;
- el->el_map.help = p;
-
- nf = (size_t)el->el_map.nfunc;
- el->el_map.func[nf] = func;
-
- el->el_map.help[nf].name = name;
- el->el_map.help[nf].func = (int)nf;
- el->el_map.help[nf].description = help;
- el->el_map.nfunc++;
-
- return 0;
-}
diff --git a/lib/libedit/map.h b/lib/libedit/map.h
deleted file mode 100644
index 03802977dea5..000000000000
--- a/lib/libedit/map.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* $NetBSD: map.h,v 1.10 2014/07/06 18:15:34 christos Exp $ */
-
-/*-
- * 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.
- *
- * @(#)map.h 8.1 (Berkeley) 6/4/93
- * $FreeBSD$
- */
-
-/*
- * el.map.h: Editor maps
- */
-#ifndef _h_el_map
-#define _h_el_map
-
-typedef struct el_bindings_t { /* for the "bind" shell command */
- const Char *name; /* function name for bind command */
- int func; /* function numeric value */
- const Char *description; /* description of function */
-} el_bindings_t;
-
-
-typedef struct el_map_t {
- el_action_t *alt; /* The current alternate key map */
- el_action_t *key; /* The current normal key map */
- el_action_t *current; /* The keymap we are using */
- const el_action_t *emacs; /* The default emacs key map */
- const el_action_t *vic; /* The vi command mode key map */
- const el_action_t *vii; /* The vi insert mode key map */
- int type; /* Emacs or vi */
- el_bindings_t *help; /* The help for the editor functions */
- el_func_t *func; /* List of available functions */
- size_t nfunc; /* The number of functions/help items */
-} el_map_t;
-
-#define MAP_EMACS 0
-#define MAP_VI 1
-
-#define N_KEYS 256
-
-protected int map_bind(EditLine *, int, const Char **);
-protected int map_init(EditLine *);
-protected void map_end(EditLine *);
-protected void map_init_vi(EditLine *);
-protected void map_init_emacs(EditLine *);
-protected int map_set_editor(EditLine *, Char *);
-protected int map_get_editor(EditLine *, const Char **);
-protected int map_addfunc(EditLine *, const Char *, const Char *, el_func_t);
-
-#endif /* _h_el_map */
diff --git a/lib/libedit/parse.c b/lib/libedit/parse.c
deleted file mode 100644
index 1b7bdb427e97..000000000000
--- a/lib/libedit/parse.c
+++ /dev/null
@@ -1,291 +0,0 @@
-/* $NetBSD: parse.c,v 1.35 2016/02/17 19:47:49 christos Exp $ */
-
-/*-
- * 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.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-#if 0
-static char sccsid[] = "@(#)parse.c 8.1 (Berkeley) 6/4/93";
-#else
-__RCSID("$NetBSD: parse.c,v 1.35 2016/02/17 19:47:49 christos Exp $");
-#endif
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * parse.c: parse an editline extended command
- *
- * commands are:
- *
- * bind
- * echotc
- * edit
- * gettc
- * history
- * settc
- * setty
- */
-#include <stdlib.h>
-#include <string.h>
-
-#include "el.h"
-#include "parse.h"
-
-private const struct {
- const Char *name;
- int (*func)(EditLine *, int, const Char **);
-} cmds[] = {
- { STR("bind"), map_bind },
- { STR("echotc"), terminal_echotc },
- { STR("edit"), el_editmode },
- { STR("history"), hist_command },
- { STR("telltc"), terminal_telltc },
- { STR("settc"), terminal_settc },
- { STR("setty"), tty_stty },
- { NULL, NULL }
-};
-
-
-/* parse_line():
- * Parse a line and dispatch it
- */
-protected int
-parse_line(EditLine *el, const Char *line)
-{
- const Char **argv;
- int argc;
- TYPE(Tokenizer) *tok;
-
- tok = FUN(tok,init)(NULL);
- FUN(tok,str)(tok, line, &argc, &argv);
- argc = FUN(el,parse)(el, argc, argv);
- FUN(tok,end)(tok);
- return argc;
-}
-
-
-/* el_parse():
- * Command dispatcher
- */
-public int
-FUN(el,parse)(EditLine *el, int argc, const Char *argv[])
-{
- const Char *ptr;
- int i;
-
- if (argc < 1)
- return -1;
- ptr = Strchr(argv[0], ':');
- if (ptr != NULL) {
- Char *tprog;
- size_t l;
-
- if (ptr == argv[0])
- return 0;
- l = (size_t)(ptr - argv[0] - 1);
- tprog = el_malloc((l + 1) * sizeof(*tprog));
- if (tprog == NULL)
- return 0;
- (void) Strncpy(tprog, argv[0], l);
- tprog[l] = '\0';
- ptr++;
- l = (size_t)el_match(el->el_prog, tprog);
- el_free(tprog);
- if (!l)
- return 0;
- } else
- ptr = argv[0];
-
- for (i = 0; cmds[i].name != NULL; i++)
- if (Strcmp(cmds[i].name, ptr) == 0) {
- i = (*cmds[i].func) (el, argc, argv);
- return -i;
- }
- return -1;
-}
-
-
-/* parse__escape():
- * Parse a string of the form ^<char> \<odigit> \<char> \U+xxxx and return
- * the appropriate character or -1 if the escape is not valid
- */
-protected int
-parse__escape(const Char **ptr)
-{
- const Char *p;
- wint_t c;
-
- p = *ptr;
-
- if (p[1] == 0)
- return -1;
-
- if (*p == '\\') {
- p++;
- switch (*p) {
- case 'a':
- c = '\007'; /* Bell */
- break;
- case 'b':
- c = '\010'; /* Backspace */
- break;
- case 't':
- c = '\011'; /* Horizontal Tab */
- break;
- case 'n':
- c = '\012'; /* New Line */
- break;
- case 'v':
- c = '\013'; /* Vertical Tab */
- break;
- case 'f':
- c = '\014'; /* Form Feed */
- break;
- case 'r':
- c = '\015'; /* Carriage Return */
- break;
- case 'e':
- c = '\033'; /* Escape */
- break;
- case 'U': /* Unicode \U+xxxx or \U+xxxxx format */
- {
- int i;
- const Char hex[] = STR("0123456789ABCDEF");
- const Char *h;
- ++p;
- if (*p++ != '+')
- return -1;
- c = 0;
- for (i = 0; i < 5; ++i) {
- h = Strchr(hex, *p++);
- if (!h && i < 4)
- return -1;
- else if (h)
- c = (c << 4) | ((int)(h - hex));
- else
- --p;
- }
- if (c > 0x10FFFF) /* outside valid character range */
- return -1;
- break;
- }
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- {
- int cnt, ch;
-
- for (cnt = 0, c = 0; cnt < 3; cnt++) {
- ch = *p++;
- if (ch < '0' || ch > '7') {
- p--;
- break;
- }
- c = (c << 3) | (ch - '0');
- }
- if ((c & (wint_t)0xffffff00) != (wint_t)0)
- return -1;
- --p;
- break;
- }
- default:
- c = *p;
- break;
- }
- } else if (*p == '^') {
- p++;
- c = (*p == '?') ? '\177' : (*p & 0237);
- } else
- c = *p;
- *ptr = ++p;
- return c;
-}
-
-/* parse__string():
- * Parse the escapes from in and put the raw string out
- */
-protected Char *
-parse__string(Char *out, const Char *in)
-{
- Char *rv = out;
- int n;
-
- for (;;)
- switch (*in) {
- case '\0':
- *out = '\0';
- return rv;
-
- case '\\':
- case '^':
- if ((n = parse__escape(&in)) == -1)
- return NULL;
- *out++ = (Char)n;
- break;
-
- case 'M':
- if (in[1] == '-' && in[2] != '\0') {
- *out++ = '\033';
- in += 2;
- break;
- }
- /*FALLTHROUGH*/
-
- default:
- *out++ = *in++;
- break;
- }
-}
-
-
-/* parse_cmd():
- * Return the command number for the command string given
- * or -1 if one is not found
- */
-protected int
-parse_cmd(EditLine *el, const Char *cmd)
-{
- el_bindings_t *b = el->el_map.help;
- size_t i;
-
- for (i = 0; i < el->el_map.nfunc; i++)
- if (Strcmp(b[i].name, cmd) == 0)
- return b[i].func;
- return -1;
-}
diff --git a/lib/libedit/parse.h b/lib/libedit/parse.h
deleted file mode 100644
index 9d8c934e627f..000000000000
--- a/lib/libedit/parse.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* $NetBSD: parse.h,v 1.7 2009/12/30 22:37:40 christos Exp $ */
-
-/*-
- * 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.
- *
- * @(#)parse.h 8.1 (Berkeley) 6/4/93
- * $FreeBSD$
- */
-
-/*
- * el.parse.h: Parser functions
- */
-#ifndef _h_el_parse
-#define _h_el_parse
-
-protected int parse_line(EditLine *, const Char *);
-protected int parse__escape(const Char **);
-protected Char *parse__string(Char *, const Char *);
-protected int parse_cmd(EditLine *, const Char *);
-
-#endif /* _h_el_parse */
diff --git a/lib/libedit/prompt.c b/lib/libedit/prompt.c
deleted file mode 100644
index afd75bd68dce..000000000000
--- a/lib/libedit/prompt.c
+++ /dev/null
@@ -1,201 +0,0 @@
-/* $NetBSD: prompt.c,v 1.23 2016/02/16 15:53:48 christos Exp $ */
-
-/*-
- * 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.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-#if 0
-static char sccsid[] = "@(#)prompt.c 8.1 (Berkeley) 6/4/93";
-#else
-__RCSID("$NetBSD: prompt.c,v 1.23 2016/02/16 15:53:48 christos Exp $");
-#endif
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * prompt.c: Prompt printing functions
- */
-#include <stdio.h>
-#include "el.h"
-
-private Char *prompt_default(EditLine *);
-private Char *prompt_default_r(EditLine *);
-
-/* prompt_default():
- * Just a default prompt, in case the user did not provide one
- */
-private Char *
-/*ARGSUSED*/
-prompt_default(EditLine *el __attribute__((__unused__)))
-{
- static Char a[3] = {'?', ' ', '\0'};
-
- return a;
-}
-
-
-/* prompt_default_r():
- * Just a default rprompt, in case the user did not provide one
- */
-private Char *
-/*ARGSUSED*/
-prompt_default_r(EditLine *el __attribute__((__unused__)))
-{
- static Char a[1] = {'\0'};
-
- return a;
-}
-
-
-/* prompt_print():
- * Print the prompt and update the prompt position.
- */
-protected void
-prompt_print(EditLine *el, int op)
-{
- el_prompt_t *elp;
- Char *p;
- int ignore = 0;
-
- if (op == EL_PROMPT)
- elp = &el->el_prompt;
- else
- elp = &el->el_rprompt;
-
- if (elp->p_wide)
- p = (*elp->p_func)(el);
- else
- p = ct_decode_string((char *)(void *)(*elp->p_func)(el),
- &el->el_scratch);
-
- for (; *p; p++) {
- if (elp->p_ignore == *p) {
- ignore = !ignore;
- continue;
- }
- if (ignore)
- terminal__putc(el, *p);
- else
- re_putc(el, *p, 1);
- }
-
- elp->p_pos.v = el->el_refresh.r_cursor.v;
- elp->p_pos.h = el->el_refresh.r_cursor.h;
-}
-
-
-/* prompt_init():
- * Initialize the prompt stuff
- */
-protected int
-prompt_init(EditLine *el)
-{
-
- el->el_prompt.p_func = prompt_default;
- el->el_prompt.p_pos.v = 0;
- el->el_prompt.p_pos.h = 0;
- el->el_prompt.p_ignore = '\0';
- el->el_rprompt.p_func = prompt_default_r;
- el->el_rprompt.p_pos.v = 0;
- el->el_rprompt.p_pos.h = 0;
- el->el_rprompt.p_ignore = '\0';
- return 0;
-}
-
-
-/* prompt_end():
- * Clean up the prompt stuff
- */
-protected void
-/*ARGSUSED*/
-prompt_end(EditLine *el __attribute__((__unused__)))
-{
-}
-
-
-/* prompt_set():
- * Install a prompt printing function
- */
-protected int
-prompt_set(EditLine *el, el_pfunc_t prf, Char c, int op, int wide)
-{
- el_prompt_t *p;
-
- if (op == EL_PROMPT || op == EL_PROMPT_ESC)
- p = &el->el_prompt;
- else
- p = &el->el_rprompt;
-
- if (prf == NULL) {
- if (op == EL_PROMPT || op == EL_PROMPT_ESC)
- p->p_func = prompt_default;
- else
- p->p_func = prompt_default_r;
- } else {
- p->p_func = prf;
- }
-
- p->p_ignore = c;
-
- p->p_pos.v = 0;
- p->p_pos.h = 0;
- p->p_wide = wide;
-
- return 0;
-}
-
-
-/* prompt_get():
- * Retrieve the prompt printing function
- */
-protected int
-prompt_get(EditLine *el, el_pfunc_t *prf, Char *c, int op)
-{
- el_prompt_t *p;
-
- if (prf == NULL)
- return -1;
-
- if (op == EL_PROMPT)
- p = &el->el_prompt;
- else
- p = &el->el_rprompt;
-
- if (prf)
- *prf = p->p_func;
- if (c)
- *c = p->p_ignore;
-
- return 0;
-}
diff --git a/lib/libedit/prompt.h b/lib/libedit/prompt.h
deleted file mode 100644
index 5e14b761b5c6..000000000000
--- a/lib/libedit/prompt.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* $NetBSD: prompt.h,v 1.13 2016/02/17 19:47:49 christos Exp $ */
-
-/*-
- * 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.
- *
- * @(#)prompt.h 8.1 (Berkeley) 6/4/93
- * $FreeBSD$
- */
-
-/*
- * el.prompt.h: Prompt printing stuff
- */
-#ifndef _h_el_prompt
-#define _h_el_prompt
-
-typedef Char *(*el_pfunc_t)(EditLine *);
-
-typedef struct el_prompt_t {
- el_pfunc_t p_func; /* Function to return the prompt */
- coord_t p_pos; /* position in the line after prompt */
- Char p_ignore; /* character to start/end literal */
- int p_wide;
-} el_prompt_t;
-
-protected void prompt_print(EditLine *, int);
-protected int prompt_set(EditLine *, el_pfunc_t, Char, int, int);
-protected int prompt_get(EditLine *, el_pfunc_t *, Char *, int);
-protected int prompt_init(EditLine *);
-protected void prompt_end(EditLine *);
-
-#endif /* _h_el_prompt */
diff --git a/lib/libedit/read.c b/lib/libedit/read.c
deleted file mode 100644
index 054177348dd3..000000000000
--- a/lib/libedit/read.c
+++ /dev/null
@@ -1,733 +0,0 @@
-/* $NetBSD: read.c,v 1.86 2016/03/02 19:24:20 christos Exp $ */
-
-/*-
- * 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.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-#if 0
-static char sccsid[] = "@(#)read.c 8.1 (Berkeley) 6/4/93";
-#else
-__RCSID("$NetBSD: read.c,v 1.86 2016/03/02 19:24:20 christos Exp $");
-#endif
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * read.c: Clean this junk up! This is horrible code.
- * Terminal read functions
- */
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "el.h"
-
-#define OKCMD -1 /* must be -1! */
-
-private int read__fixio(int, int);
-private int read_preread(EditLine *);
-private int read_char(EditLine *, wchar_t *);
-private int read_getcmd(EditLine *, el_action_t *, Char *);
-private void read_pop(c_macro_t *);
-
-/* read_init():
- * Initialize the read stuff
- */
-protected int
-read_init(EditLine *el)
-{
- /* builtin read_char */
- el->el_read.read_char = read_char;
- return 0;
-}
-
-
-/* el_read_setfn():
- * Set the read char function to the one provided.
- * If it is set to EL_BUILTIN_GETCFN, then reset to the builtin one.
- */
-protected int
-el_read_setfn(EditLine *el, el_rfunc_t rc)
-{
- el->el_read.read_char = (rc == EL_BUILTIN_GETCFN) ? read_char : rc;
- return 0;
-}
-
-
-/* el_read_getfn():
- * return the current read char function, or EL_BUILTIN_GETCFN
- * if it is the default one
- */
-protected el_rfunc_t
-el_read_getfn(EditLine *el)
-{
- return el->el_read.read_char == read_char ?
- EL_BUILTIN_GETCFN : el->el_read.read_char;
-}
-
-
-#ifndef MIN
-#define MIN(A,B) ((A) < (B) ? (A) : (B))
-#endif
-
-#ifdef DEBUG_EDIT
-private void
-read_debug(EditLine *el)
-{
-
- if (el->el_line.cursor > el->el_line.lastchar)
- (void) fprintf(el->el_errfile, "cursor > lastchar\r\n");
- if (el->el_line.cursor < el->el_line.buffer)
- (void) fprintf(el->el_errfile, "cursor < buffer\r\n");
- if (el->el_line.cursor > el->el_line.limit)
- (void) fprintf(el->el_errfile, "cursor > limit\r\n");
- if (el->el_line.lastchar > el->el_line.limit)
- (void) fprintf(el->el_errfile, "lastchar > limit\r\n");
- if (el->el_line.limit != &el->el_line.buffer[EL_BUFSIZ - 2])
- (void) fprintf(el->el_errfile, "limit != &buffer[EL_BUFSIZ-2]\r\n");
-}
-#endif /* DEBUG_EDIT */
-
-
-/* read__fixio():
- * Try to recover from a read error
- */
-/* ARGSUSED */
-private int
-read__fixio(int fd __attribute__((__unused__)), int e)
-{
-
- switch (e) {
- case -1: /* Make sure that the code is reachable */
-
-#ifdef EWOULDBLOCK
- case EWOULDBLOCK:
-#ifndef TRY_AGAIN
-#define TRY_AGAIN
-#endif
-#endif /* EWOULDBLOCK */
-
-#if defined(POSIX) && defined(EAGAIN)
-#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
- case EAGAIN:
-#ifndef TRY_AGAIN
-#define TRY_AGAIN
-#endif
-#endif /* EWOULDBLOCK && EWOULDBLOCK != EAGAIN */
-#endif /* POSIX && EAGAIN */
-
- e = 0;
-#ifdef TRY_AGAIN
-#if defined(F_SETFL) && defined(O_NDELAY)
- if ((e = fcntl(fd, F_GETFL, 0)) == -1)
- return -1;
-
- if (fcntl(fd, F_SETFL, e & ~O_NDELAY) == -1)
- return -1;
- else
- e = 1;
-#endif /* F_SETFL && O_NDELAY */
-
-#ifdef FIONBIO
- {
- int zero = 0;
-
- if (ioctl(fd, FIONBIO, &zero) == -1)
- return -1;
- else
- e = 1;
- }
-#endif /* FIONBIO */
-
-#endif /* TRY_AGAIN */
- return e ? 0 : -1;
-
- case EINTR:
- return 0;
-
- default:
- return -1;
- }
-}
-
-
-/* read_preread():
- * Try to read the stuff in the input queue;
- */
-private int
-read_preread(EditLine *el)
-{
- int chrs = 0;
-
- if (el->el_tty.t_mode == ED_IO)
- return 0;
-
-#ifndef WIDECHAR
-/* FIONREAD attempts to buffer up multiple bytes, and to make that work
- * properly with partial wide/UTF-8 characters would need some careful work. */
-#ifdef FIONREAD
- (void) ioctl(el->el_infd, FIONREAD, &chrs);
- if (chrs > 0) {
- char buf[EL_BUFSIZ];
-
- chrs = read(el->el_infd, buf,
- (size_t) MIN(chrs, EL_BUFSIZ - 1));
- if (chrs > 0) {
- buf[chrs] = '\0';
- el_push(el, buf);
- }
- }
-#endif /* FIONREAD */
-#endif
- return chrs > 0;
-}
-
-
-/* el_push():
- * Push a macro
- */
-public void
-FUN(el,push)(EditLine *el, const Char *str)
-{
- c_macro_t *ma = &el->el_chared.c_macro;
-
- if (str != NULL && ma->level + 1 < EL_MAXMACRO) {
- ma->level++;
- if ((ma->macro[ma->level] = Strdup(str)) != NULL)
- return;
- ma->level--;
- }
- terminal_beep(el);
- terminal__flush(el);
-}
-
-
-/* read_getcmd():
- * Get next command from the input stream, return OKCMD on success.
- * Character values > 255 are not looked up in the map, but inserted.
- */
-private int
-read_getcmd(EditLine *el, el_action_t *cmdnum, Char *ch)
-{
- static const Char meta = (Char)0x80;
- el_action_t cmd;
- wchar_t wc;
- int num;
-
- el->el_errno = 0;
- do {
- if ((num = el_wgetc(el, &wc)) != 1) {/* if EOF or error */
- el->el_errno = num == 0 ? 0 : errno;
- return 0; /* not OKCMD */
- }
- *ch = (Char)wc;
-
-#ifdef KANJI
- if ((*ch & meta)) {
- el->el_state.metanext = 0;
- cmd = CcViMap[' '];
- break;
- } else
-#endif /* KANJI */
-
- if (el->el_state.metanext) {
- el->el_state.metanext = 0;
- *ch |= meta;
- }
-#ifdef WIDECHAR
- if (*ch >= N_KEYS)
- cmd = ED_INSERT;
- else
-#endif
- cmd = el->el_map.current[(unsigned char) *ch];
- if (cmd == ED_SEQUENCE_LEAD_IN) {
- keymacro_value_t val;
- switch (keymacro_get(el, ch, &val)) {
- case XK_CMD:
- cmd = val.cmd;
- break;
- case XK_STR:
- FUN(el,push)(el, val.str);
- break;
-#ifdef notyet
- case XK_EXE:
- /* XXX: In the future to run a user function */
- RunCommand(val.str);
- break;
-#endif
- default:
- EL_ABORT((el->el_errfile, "Bad XK_ type \n"));
- break;
- }
- }
- if (el->el_map.alt == NULL)
- el->el_map.current = el->el_map.key;
- } while (cmd == ED_SEQUENCE_LEAD_IN);
- *cmdnum = cmd;
- return OKCMD;
-}
-
-/* read_char():
- * Read a character from the tty.
- */
-private int
-read_char(EditLine *el, wchar_t *cp)
-{
- ssize_t num_read;
- int tried = 0;
- char cbuf[MB_LEN_MAX];
- size_t cbp = 0;
- int save_errno = errno;
-
- again:
- el->el_signal->sig_no = 0;
- while ((num_read = read(el->el_infd, cbuf + cbp, (size_t)1)) == -1) {
- int e = errno;
- switch (el->el_signal->sig_no) {
- case SIGCONT:
- FUN(el,set)(el, EL_REFRESH);
- /*FALLTHROUGH*/
- case SIGWINCH:
- sig_set(el);
- goto again;
- default:
- break;
- }
- if (!tried && read__fixio(el->el_infd, e) == 0) {
- errno = save_errno;
- tried = 1;
- } else {
- errno = e;
- *cp = L'\0';
- return -1;
- }
- }
-
- /* Test for EOF */
- if (num_read == 0) {
- *cp = L'\0';
- return 0;
- }
-
- for (;;) {
-
- ++cbp;
- switch (ct_mbrtowc(cp, cbuf, cbp)) {
- case (size_t)-1:
- if (cbp > 1) {
- /*
- * Invalid sequence, discard all bytes
- * except the last one.
- */
- cbuf[0] = cbuf[cbp - 1];
- cbp = 0;
- break;
- } else {
- /* Invalid byte, discard it. */
- cbp = 0;
- goto again;
- }
- case (size_t)-2:
- if (cbp >= MB_LEN_MAX) {
- errno = EILSEQ;
- *cp = L'\0';
- return -1;
- }
- /* Incomplete sequence, read another byte. */
- goto again;
- default:
- /* Valid character, process it. */
- return 1;
- }
- }
-}
-
-/* read_pop():
- * Pop a macro from the stack
- */
-private void
-read_pop(c_macro_t *ma)
-{
- int i;
-
- el_free(ma->macro[0]);
- for (i = 0; i < ma->level; i++)
- ma->macro[i] = ma->macro[i + 1];
- ma->level--;
- ma->offset = 0;
-}
-
-/* el_wgetc():
- * Read a wide character
- */
-public int
-el_wgetc(EditLine *el, wchar_t *cp)
-{
- int num_read;
- c_macro_t *ma = &el->el_chared.c_macro;
-
- terminal__flush(el);
- for (;;) {
- if (ma->level < 0) {
- if (!read_preread(el))
- break;
- }
-
- if (ma->level < 0)
- break;
-
- if (ma->macro[0][ma->offset] == '\0') {
- read_pop(ma);
- continue;
- }
-
- *cp = ma->macro[0][ma->offset++];
-
- if (ma->macro[0][ma->offset] == '\0') {
- /* Needed for QuoteMode On */
- read_pop(ma);
- }
-
- return 1;
- }
-
-#ifdef DEBUG_READ
- (void) fprintf(el->el_errfile, "Turning raw mode on\n");
-#endif /* DEBUG_READ */
- if (tty_rawmode(el) < 0)/* make sure the tty is set up correctly */
- return 0;
-
-#ifdef DEBUG_READ
- (void) fprintf(el->el_errfile, "Reading a character\n");
-#endif /* DEBUG_READ */
- num_read = (*el->el_read.read_char)(el, cp);
- if (num_read < 0)
- el->el_errno = errno;
-#ifdef DEBUG_READ
- (void) fprintf(el->el_errfile, "Got it %lc\n", *cp);
-#endif /* DEBUG_READ */
- return num_read;
-}
-
-protected void
-read_prepare(EditLine *el)
-{
- if (el->el_flags & HANDLE_SIGNALS)
- sig_set(el);
- if (el->el_flags & NO_TTY)
- return;
- if ((el->el_flags & (UNBUFFERED|EDIT_DISABLED)) == UNBUFFERED)
- tty_rawmode(el);
-
- /* This is relatively cheap, and things go terribly wrong if
- we have the wrong size. */
- el_resize(el);
- re_clear_display(el); /* reset the display stuff */
- ch_reset(el, 0);
- re_refresh(el); /* print the prompt */
-
- if (el->el_flags & UNBUFFERED)
- terminal__flush(el);
-}
-
-protected void
-read_finish(EditLine *el)
-{
- if ((el->el_flags & UNBUFFERED) == 0)
- (void) tty_cookedmode(el);
- if (el->el_flags & HANDLE_SIGNALS)
- sig_clr(el);
-}
-
-public const Char *
-FUN(el,gets)(EditLine *el, int *nread)
-{
- int retval;
- el_action_t cmdnum = 0;
- int num; /* how many chars we have read at NL */
- wchar_t wc;
- Char ch, *cp;
- int crlf = 0;
- int nrb;
-#ifdef FIONREAD
- c_macro_t *ma = &el->el_chared.c_macro;
-#endif /* FIONREAD */
-
- if (nread == NULL)
- nread = &nrb;
- *nread = 0;
-
- if (el->el_flags & NO_TTY) {
- size_t idx;
-
- cp = el->el_line.buffer;
- while ((num = (*el->el_read.read_char)(el, &wc)) == 1) {
- *cp = (Char)wc;
- /* make sure there is space for next character */
- if (cp + 1 >= el->el_line.limit) {
- idx = (size_t)(cp - el->el_line.buffer);
- if (!ch_enlargebufs(el, (size_t)2))
- break;
- cp = &el->el_line.buffer[idx];
- }
- cp++;
- if (el->el_flags & UNBUFFERED)
- break;
- if (cp[-1] == '\r' || cp[-1] == '\n')
- break;
- }
- if (num == -1) {
- if (errno == EINTR)
- cp = el->el_line.buffer;
- el->el_errno = errno;
- }
-
- goto noedit;
- }
-
-
-#ifdef FIONREAD
- if (el->el_tty.t_mode == EX_IO && ma->level < 0) {
- long chrs = 0;
-
- (void) ioctl(el->el_infd, FIONREAD, &chrs);
- if (chrs == 0) {
- if (tty_rawmode(el) < 0) {
- errno = 0;
- *nread = 0;
- return NULL;
- }
- }
- }
-#endif /* FIONREAD */
-
- if ((el->el_flags & UNBUFFERED) == 0)
- read_prepare(el);
-
- if (el->el_flags & EDIT_DISABLED) {
- size_t idx;
-
- if ((el->el_flags & UNBUFFERED) == 0)
- cp = el->el_line.buffer;
- else
- cp = el->el_line.lastchar;
-
- terminal__flush(el);
-
- while ((num = (*el->el_read.read_char)(el, &wc)) == 1) {
- *cp = (Char)wc;
- /* make sure there is space next character */
- if (cp + 1 >= el->el_line.limit) {
- idx = (size_t)(cp - el->el_line.buffer);
- if (!ch_enlargebufs(el, (size_t)2))
- break;
- cp = &el->el_line.buffer[idx];
- }
- cp++;
- crlf = cp[-1] == '\r' || cp[-1] == '\n';
- if (el->el_flags & UNBUFFERED)
- break;
- if (crlf)
- break;
- }
-
- if (num == -1) {
- if (errno == EINTR)
- cp = el->el_line.buffer;
- el->el_errno = errno;
- }
-
- goto noedit;
- }
-
- for (num = OKCMD; num == OKCMD;) { /* while still editing this
- * line */
-#ifdef DEBUG_EDIT
- read_debug(el);
-#endif /* DEBUG_EDIT */
- /* if EOF or error */
- if ((num = read_getcmd(el, &cmdnum, &ch)) != OKCMD) {
- num = -1;
-#ifdef DEBUG_READ
- (void) fprintf(el->el_errfile,
- "Returning from el_gets %d\n", num);
-#endif /* DEBUG_READ */
- break;
- }
- if (el->el_errno == EINTR) {
- el->el_line.buffer[0] = '\0';
- el->el_line.lastchar =
- el->el_line.cursor = el->el_line.buffer;
- break;
- }
- if ((size_t)cmdnum >= el->el_map.nfunc) { /* BUG CHECK command */
-#ifdef DEBUG_EDIT
- (void) fprintf(el->el_errfile,
- "ERROR: illegal command from key 0%o\r\n", ch);
-#endif /* DEBUG_EDIT */
- continue; /* try again */
- }
- /* now do the real command */
-#ifdef DEBUG_READ
- {
- el_bindings_t *b;
- for (b = el->el_map.help; b->name; b++)
- if (b->func == cmdnum)
- break;
- if (b->name)
- (void) fprintf(el->el_errfile,
- "Executing " FSTR "\n", b->name);
- else
- (void) fprintf(el->el_errfile,
- "Error command = %d\n", cmdnum);
- }
-#endif /* DEBUG_READ */
- /* vi redo needs these way down the levels... */
- el->el_state.thiscmd = cmdnum;
- el->el_state.thisch = ch;
- if (el->el_map.type == MAP_VI &&
- el->el_map.current == el->el_map.key &&
- el->el_chared.c_redo.pos < el->el_chared.c_redo.lim) {
- if (cmdnum == VI_DELETE_PREV_CHAR &&
- el->el_chared.c_redo.pos != el->el_chared.c_redo.buf
- && Isprint(el->el_chared.c_redo.pos[-1]))
- el->el_chared.c_redo.pos--;
- else
- *el->el_chared.c_redo.pos++ = ch;
- }
- retval = (*el->el_map.func[cmdnum]) (el, ch);
-#ifdef DEBUG_READ
- (void) fprintf(el->el_errfile,
- "Returned state %d\n", retval );
-#endif /* DEBUG_READ */
-
- /* save the last command here */
- el->el_state.lastcmd = cmdnum;
-
- /* use any return value */
- switch (retval) {
- case CC_CURSOR:
- re_refresh_cursor(el);
- break;
-
- case CC_REDISPLAY:
- re_clear_lines(el);
- re_clear_display(el);
- /* FALLTHROUGH */
-
- case CC_REFRESH:
- re_refresh(el);
- break;
-
- case CC_REFRESH_BEEP:
- re_refresh(el);
- terminal_beep(el);
- break;
-
- case CC_NORM: /* normal char */
- break;
-
- case CC_ARGHACK: /* Suggested by Rich Salz */
- /* <rsalz@pineapple.bbn.com> */
- continue; /* keep going... */
-
- case CC_EOF: /* end of file typed */
- if ((el->el_flags & UNBUFFERED) == 0)
- num = 0;
- else if (num == -1) {
- *el->el_line.lastchar++ = CONTROL('d');
- el->el_line.cursor = el->el_line.lastchar;
- num = 1;
- }
- break;
-
- case CC_NEWLINE: /* normal end of line */
- num = (int)(el->el_line.lastchar - el->el_line.buffer);
- break;
-
- case CC_FATAL: /* fatal error, reset to known state */
-#ifdef DEBUG_READ
- (void) fprintf(el->el_errfile,
- "*** editor fatal ERROR ***\r\n\n");
-#endif /* DEBUG_READ */
- /* put (real) cursor in a known place */
- re_clear_display(el); /* reset the display stuff */
- ch_reset(el, 1); /* reset the input pointers */
- re_refresh(el); /* print the prompt again */
- break;
-
- case CC_ERROR:
- default: /* functions we don't know about */
-#ifdef DEBUG_READ
- (void) fprintf(el->el_errfile,
- "*** editor ERROR ***\r\n\n");
-#endif /* DEBUG_READ */
- terminal_beep(el);
- terminal__flush(el);
- break;
- }
- el->el_state.argument = 1;
- el->el_state.doingarg = 0;
- el->el_chared.c_vcmd.action = NOP;
- if (el->el_flags & UNBUFFERED)
- break;
- }
-
- terminal__flush(el); /* flush any buffered output */
- /* make sure the tty is set up correctly */
- if ((el->el_flags & UNBUFFERED) == 0) {
- read_finish(el);
- *nread = num != -1 ? num : 0;
- } else {
- *nread = (int)(el->el_line.lastchar - el->el_line.buffer);
- }
- goto done;
-noedit:
- el->el_line.cursor = el->el_line.lastchar = cp;
- *cp = '\0';
- *nread = (int)(el->el_line.cursor - el->el_line.buffer);
-done:
- if (*nread == 0) {
- if (num == -1) {
- *nread = -1;
- errno = el->el_errno;
- }
- return NULL;
- } else
- return el->el_line.buffer;
-}
diff --git a/lib/libedit/read.h b/lib/libedit/read.h
deleted file mode 100644
index bf430530464a..000000000000
--- a/lib/libedit/read.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* $NetBSD: read.h,v 1.9 2016/02/24 17:13:22 christos Exp $ */
-
-/*-
- * Copyright (c) 2001 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Anthony Mallet.
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
- *
- * $FreeBSD$
- */
-
-/*
- * el.read.h: Character reading functions
- */
-#ifndef _h_el_read
-#define _h_el_read
-
-typedef int (*el_rfunc_t)(EditLine *, wchar_t *);
-
-typedef struct el_read_t {
- el_rfunc_t read_char; /* Function to read a character */
-} el_read_t;
-
-protected int read_init(EditLine *);
-protected void read_prepare(EditLine *);
-protected void read_finish(EditLine *);
-protected int el_read_setfn(EditLine *, el_rfunc_t);
-protected el_rfunc_t el_read_getfn(EditLine *);
-
-#endif /* _h_el_read */
diff --git a/lib/libedit/readline.c b/lib/libedit/readline.c
deleted file mode 100644
index 00ea369a9aaa..000000000000
--- a/lib/libedit/readline.c
+++ /dev/null
@@ -1,2336 +0,0 @@
-/* $NetBSD: readline.c,v 1.126 2016/02/24 17:13:22 christos Exp $ */
-
-/*-
- * Copyright (c) 1997 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Jaromir Dolecek.
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-__RCSID("$NetBSD: readline.c,v 1.126 2016/02/24 17:13:22 christos Exp $");
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <ctype.h>
-#include <dirent.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <pwd.h>
-#include <setjmp.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <vis.h>
-
-#include "readline/readline.h"
-#include "el.h"
-#include "filecomplete.h"
-
-void rl_prep_terminal(int);
-void rl_deprep_terminal(void);
-
-/* for rl_complete() */
-#define TAB '\r'
-
-/* see comment at the #ifdef for sense of this */
-/* #define GDB_411_HACK */
-
-/* readline compatibility stuff - look at readline sources/documentation */
-/* to see what these variables mean */
-const char *rl_library_version = "EditLine wrapper";
-int rl_readline_version = RL_READLINE_VERSION;
-static char empty[] = { '\0' };
-static char expand_chars[] = { ' ', '\t', '\n', '=', '(', '\0' };
-static char break_chars[] = { ' ', '\t', '\n', '"', '\\', '\'', '`', '@', '$',
- '>', '<', '=', ';', '|', '&', '{', '(', '\0' };
-char *rl_readline_name = empty;
-FILE *rl_instream = NULL;
-FILE *rl_outstream = NULL;
-int rl_point = 0;
-int rl_end = 0;
-char *rl_line_buffer = NULL;
-rl_vcpfunc_t *rl_linefunc = NULL;
-int rl_done = 0;
-VFunction *rl_event_hook = NULL;
-KEYMAP_ENTRY_ARRAY emacs_standard_keymap,
- emacs_meta_keymap,
- emacs_ctlx_keymap;
-/*
- * The following is not implemented; we always catch signals in the
- * libedit fashion: set handlers on entry to el_gets() and clear them
- * on the way out. This simplistic approach works for most cases; if
- * it does not work for your application, please let us know.
- */
-int rl_catch_signals = 1;
-int rl_catch_sigwinch = 1;
-
-int history_base = 1; /* probably never subject to change */
-int history_length = 0;
-int max_input_history = 0;
-char history_expansion_char = '!';
-char history_subst_char = '^';
-char *history_no_expand_chars = expand_chars;
-Function *history_inhibit_expansion_function = NULL;
-char *history_arg_extract(int start, int end, const char *str);
-
-int rl_inhibit_completion = 0;
-int rl_attempted_completion_over = 0;
-char *rl_basic_word_break_characters = break_chars;
-char *rl_completer_word_break_characters = NULL;
-char *rl_completer_quote_characters = NULL;
-rl_compentry_func_t *rl_completion_entry_function = NULL;
-char *(*rl_completion_word_break_hook)(void) = NULL;
-rl_completion_func_t *rl_attempted_completion_function = NULL;
-Function *rl_pre_input_hook = NULL;
-Function *rl_startup1_hook = NULL;
-int (*rl_getc_function)(FILE *) = NULL;
-char *rl_terminal_name = NULL;
-int rl_already_prompted = 0;
-int rl_filename_completion_desired = 0;
-int rl_ignore_completion_duplicates = 0;
-int readline_echoing_p = 1;
-int _rl_print_completions_horizontally = 0;
-VFunction *rl_redisplay_function = NULL;
-Function *rl_startup_hook = NULL;
-VFunction *rl_completion_display_matches_hook = NULL;
-VFunction *rl_prep_term_function = (VFunction *)rl_prep_terminal;
-VFunction *rl_deprep_term_function = (VFunction *)rl_deprep_terminal;
-KEYMAP_ENTRY_ARRAY emacs_meta_keymap;
-
-/*
- * The current prompt string.
- */
-char *rl_prompt = NULL;
-/*
- * This is set to character indicating type of completion being done by
- * rl_complete_internal(); this is available for application completion
- * functions.
- */
-int rl_completion_type = 0;
-
-/*
- * If more than this number of items results from query for possible
- * completions, we ask user if they are sure to really display the list.
- */
-int rl_completion_query_items = 100;
-
-/*
- * List of characters which are word break characters, but should be left
- * in the parsed text when it is passed to the completion function.
- * Shell uses this to help determine what kind of completing to do.
- */
-char *rl_special_prefixes = NULL;
-
-/*
- * This is the character appended to the completed words if at the end of
- * the line. Default is ' ' (a space).
- */
-int rl_completion_append_character = ' ';
-
-/* stuff below is used internally by libedit for readline emulation */
-
-static History *h = NULL;
-static EditLine *e = NULL;
-static rl_command_func_t *map[256];
-static jmp_buf topbuf;
-
-/* internal functions */
-static unsigned char _el_rl_complete(EditLine *, int);
-static unsigned char _el_rl_tstp(EditLine *, int);
-static char *_get_prompt(EditLine *);
-static int _getc_function(EditLine *, wchar_t *);
-static HIST_ENTRY *_move_history(int);
-static int _history_expand_command(const char *, size_t, size_t,
- char **);
-static char *_rl_compat_sub(const char *, const char *,
- const char *, int);
-static int _rl_event_read_char(EditLine *, wchar_t *);
-static void _rl_update_pos(void);
-
-
-/* ARGSUSED */
-static char *
-_get_prompt(EditLine *el __attribute__((__unused__)))
-{
- rl_already_prompted = 1;
- return rl_prompt;
-}
-
-
-/*
- * generic function for moving around history
- */
-static HIST_ENTRY *
-_move_history(int op)
-{
- HistEvent ev;
- static HIST_ENTRY rl_he;
-
- if (history(h, &ev, op) != 0)
- return NULL;
-
- rl_he.line = ev.str;
- rl_he.data = NULL;
-
- return &rl_he;
-}
-
-
-/*
- * read one key from user defined input function
- */
-static int
-/*ARGSUSED*/
-_getc_function(EditLine *el __attribute__((__unused__)), wchar_t *c)
-{
- int i;
-
- i = (*rl_getc_function)(NULL);
- if (i == -1)
- return 0;
- *c = (wchar_t)i;
- return 1;
-}
-
-static void
-_resize_fun(EditLine *el, void *a)
-{
- const LineInfo *li;
- char **ap = a;
-
- li = el_line(el);
- /* a cheesy way to get rid of const cast. */
- *ap = memchr(li->buffer, *li->buffer, (size_t)1);
-}
-
-static const char *
-_default_history_file(void)
-{
- struct passwd *p;
- static char *path;
- size_t len;
-
- if (path)
- return path;
-
- if ((p = getpwuid(getuid())) == NULL)
- return NULL;
-
- len = strlen(p->pw_dir) + sizeof("/.history");
- if ((path = malloc(len)) == NULL)
- return NULL;
-
- (void)snprintf(path, len, "%s/.history", p->pw_dir);
- return path;
-}
-
-/*
- * READLINE compatibility stuff
- */
-
-/*
- * Set the prompt
- */
-int
-rl_set_prompt(const char *prompt)
-{
- char *p;
-
- if (!prompt)
- prompt = "";
- if (rl_prompt != NULL && strcmp(rl_prompt, prompt) == 0)
- return 0;
- if (rl_prompt)
- el_free(rl_prompt);
- rl_prompt = strdup(prompt);
- if (rl_prompt == NULL)
- return -1;
-
- while ((p = strchr(rl_prompt, RL_PROMPT_END_IGNORE)) != NULL)
- *p = RL_PROMPT_START_IGNORE;
-
- return 0;
-}
-
-/*
- * initialize rl compat stuff
- */
-int
-rl_initialize(void)
-{
- HistEvent ev;
- int editmode = 1;
- struct termios t;
-
- if (e != NULL)
- el_end(e);
- if (h != NULL)
- history_end(h);
-
- if (!rl_instream)
- rl_instream = stdin;
- if (!rl_outstream)
- rl_outstream = stdout;
-
- /*
- * See if we don't really want to run the editor
- */
- if (tcgetattr(fileno(rl_instream), &t) != -1 && (t.c_lflag & ECHO) == 0)
- editmode = 0;
-
- e = el_init(rl_readline_name, rl_instream, rl_outstream, stderr);
-
- if (!editmode)
- el_set(e, EL_EDITMODE, 0);
-
- h = history_init();
- if (!e || !h)
- return -1;
-
- history(h, &ev, H_SETSIZE, INT_MAX); /* unlimited */
- history_length = 0;
- max_input_history = INT_MAX;
- el_set(e, EL_HIST, history, h);
-
- /* Setup resize function */
- el_set(e, EL_RESIZE, _resize_fun, &rl_line_buffer);
-
- /* setup getc function if valid */
- if (rl_getc_function)
- el_set(e, EL_GETCFN, _getc_function);
-
- /* for proper prompt printing in readline() */
- if (rl_set_prompt("") == -1) {
- history_end(h);
- el_end(e);
- return -1;
- }
- el_set(e, EL_PROMPT, _get_prompt, RL_PROMPT_START_IGNORE);
- el_set(e, EL_SIGNAL, rl_catch_signals);
-
- /* set default mode to "emacs"-style and read setting afterwards */
- /* so this can be overridden */
- el_set(e, EL_EDITOR, "emacs");
- if (rl_terminal_name != NULL)
- el_set(e, EL_TERMINAL, rl_terminal_name);
- else
- el_get(e, EL_TERMINAL, &rl_terminal_name);
-
- /*
- * Word completion - this has to go AFTER rebinding keys
- * to emacs-style.
- */
- el_set(e, EL_ADDFN, "rl_complete",
- "ReadLine compatible completion function",
- _el_rl_complete);
- el_set(e, EL_BIND, "^I", "rl_complete", NULL);
-
- /*
- * Send TSTP when ^Z is pressed.
- */
- el_set(e, EL_ADDFN, "rl_tstp",
- "ReadLine compatible suspend function",
- _el_rl_tstp);
- el_set(e, EL_BIND, "^Z", "rl_tstp", NULL);
-
- /*
- * Set some readline compatible key-bindings.
- */
- el_set(e, EL_BIND, "^R", "em-inc-search-prev", NULL);
-
- /*
- * Allow the use of Home/End keys.
- */
- el_set(e, EL_BIND, "\\e[1~", "ed-move-to-beg", NULL);
- el_set(e, EL_BIND, "\\e[4~", "ed-move-to-end", NULL);
- el_set(e, EL_BIND, "\\e[7~", "ed-move-to-beg", NULL);
- el_set(e, EL_BIND, "\\e[8~", "ed-move-to-end", NULL);
- el_set(e, EL_BIND, "\\e[H", "ed-move-to-beg", NULL);
- el_set(e, EL_BIND, "\\e[F", "ed-move-to-end", NULL);
-
- /*
- * Allow the use of the Delete/Insert keys.
- */
- el_set(e, EL_BIND, "\\e[3~", "ed-delete-next-char", NULL);
- el_set(e, EL_BIND, "\\e[2~", "ed-quoted-insert", NULL);
-
- /*
- * Ctrl-left-arrow and Ctrl-right-arrow for word moving.
- */
- el_set(e, EL_BIND, "\\e[1;5C", "em-next-word", NULL);
- el_set(e, EL_BIND, "\\e[1;5D", "ed-prev-word", NULL);
- el_set(e, EL_BIND, "\\e[5C", "em-next-word", NULL);
- el_set(e, EL_BIND, "\\e[5D", "ed-prev-word", NULL);
- el_set(e, EL_BIND, "\\e\\e[C", "em-next-word", NULL);
- el_set(e, EL_BIND, "\\e\\e[D", "ed-prev-word", NULL);
-
- /* read settings from configuration file */
- el_source(e, NULL);
-
- /*
- * Unfortunately, some applications really do use rl_point
- * and rl_line_buffer directly.
- */
- _resize_fun(e, &rl_line_buffer);
- _rl_update_pos();
-
- if (rl_startup_hook)
- (*rl_startup_hook)(NULL, 0);
-
- return 0;
-}
-
-
-/*
- * read one line from input stream and return it, chomping
- * trailing newline (if there is any)
- */
-char *
-readline(const char *p)
-{
- HistEvent ev;
- const char * volatile prompt = p;
- int count;
- const char *ret;
- char *buf;
- static int used_event_hook;
-
- if (e == NULL || h == NULL)
- rl_initialize();
-
- rl_done = 0;
-
- (void)setjmp(topbuf);
-
- /* update prompt accordingly to what has been passed */
- if (rl_set_prompt(prompt) == -1)
- return NULL;
-
- if (rl_pre_input_hook)
- (*rl_pre_input_hook)(NULL, 0);
-
- if (rl_event_hook && !(e->el_flags&NO_TTY)) {
- el_set(e, EL_GETCFN, _rl_event_read_char);
- used_event_hook = 1;
- }
-
- if (!rl_event_hook && used_event_hook) {
- el_set(e, EL_GETCFN, EL_BUILTIN_GETCFN);
- used_event_hook = 0;
- }
-
- rl_already_prompted = 0;
-
- /* get one line from input stream */
- ret = el_gets(e, &count);
-
- if (ret && count > 0) {
- int lastidx;
-
- buf = strdup(ret);
- if (buf == NULL)
- return NULL;
- lastidx = count - 1;
- if (buf[lastidx] == '\n')
- buf[lastidx] = '\0';
- } else
- buf = NULL;
-
- history(h, &ev, H_GETSIZE);
- history_length = ev.num;
-
- return buf;
-}
-
-/*
- * history functions
- */
-
-/*
- * is normally called before application starts to use
- * history expansion functions
- */
-void
-using_history(void)
-{
- if (h == NULL || e == NULL)
- rl_initialize();
-}
-
-
-/*
- * substitute ``what'' with ``with'', returning resulting string; if
- * globally == 1, substitutes all occurrences of what, otherwise only the
- * first one
- */
-static char *
-_rl_compat_sub(const char *str, const char *what, const char *with,
- int globally)
-{
- const char *s;
- char *r, *result;
- size_t len, with_len, what_len;
-
- len = strlen(str);
- with_len = strlen(with);
- what_len = strlen(what);
-
- /* calculate length we need for result */
- s = str;
- while (*s) {
- if (*s == *what && !strncmp(s, what, what_len)) {
- len += with_len - what_len;
- if (!globally)
- break;
- s += what_len;
- } else
- s++;
- }
- r = result = el_malloc((len + 1) * sizeof(*r));
- if (result == NULL)
- return NULL;
- s = str;
- while (*s) {
- if (*s == *what && !strncmp(s, what, what_len)) {
- (void)strncpy(r, with, with_len);
- r += with_len;
- s += what_len;
- if (!globally) {
- (void)strcpy(r, s);
- return result;
- }
- } else
- *r++ = *s++;
- }
- *r = '\0';
- return result;
-}
-
-static char *last_search_pat; /* last !?pat[?] search pattern */
-static char *last_search_match; /* last !?pat[?] that matched */
-
-const char *
-get_history_event(const char *cmd, int *cindex, int qchar)
-{
- int idx, sign, sub, num, begin, ret;
- size_t len;
- char *pat;
- const char *rptr;
- HistEvent ev;
-
- idx = *cindex;
- if (cmd[idx++] != history_expansion_char)
- return NULL;
-
- /* find out which event to take */
- if (cmd[idx] == history_expansion_char || cmd[idx] == '\0') {
- if (history(h, &ev, H_FIRST) != 0)
- return NULL;
- *cindex = cmd[idx]? (idx + 1):idx;
- return ev.str;
- }
- sign = 0;
- if (cmd[idx] == '-') {
- sign = 1;
- idx++;
- }
-
- if ('0' <= cmd[idx] && cmd[idx] <= '9') {
- HIST_ENTRY *rl_he;
-
- num = 0;
- while (cmd[idx] && '0' <= cmd[idx] && cmd[idx] <= '9') {
- num = num * 10 + cmd[idx] - '0';
- idx++;
- }
- if (sign)
- num = history_length - num + 1;
-
- if (!(rl_he = history_get(num)))
- return NULL;
-
- *cindex = idx;
- return rl_he->line;
- }
- sub = 0;
- if (cmd[idx] == '?') {
- sub = 1;
- idx++;
- }
- begin = idx;
- while (cmd[idx]) {
- if (cmd[idx] == '\n')
- break;
- if (sub && cmd[idx] == '?')
- break;
- if (!sub && (cmd[idx] == ':' || cmd[idx] == ' '
- || cmd[idx] == '\t' || cmd[idx] == qchar))
- break;
- idx++;
- }
- len = (size_t)idx - (size_t)begin;
- if (sub && cmd[idx] == '?')
- idx++;
- if (sub && len == 0 && last_search_pat && *last_search_pat)
- pat = last_search_pat;
- else if (len == 0)
- return NULL;
- else {
- if ((pat = el_malloc((len + 1) * sizeof(*pat))) == NULL)
- return NULL;
- (void)strncpy(pat, cmd + begin, len);
- pat[len] = '\0';
- }
-
- if (history(h, &ev, H_CURR) != 0) {
- if (pat != last_search_pat)
- el_free(pat);
- return NULL;
- }
- num = ev.num;
-
- if (sub) {
- if (pat != last_search_pat) {
- if (last_search_pat)
- el_free(last_search_pat);
- last_search_pat = pat;
- }
- ret = history_search(pat, -1);
- } else
- ret = history_search_prefix(pat, -1);
-
- if (ret == -1) {
- /* restore to end of list on failed search */
- history(h, &ev, H_FIRST);
- (void)fprintf(rl_outstream, "%s: Event not found\n", pat);
- if (pat != last_search_pat)
- el_free(pat);
- return NULL;
- }
-
- if (sub && len) {
- if (last_search_match && last_search_match != pat)
- el_free(last_search_match);
- last_search_match = pat;
- }
-
- if (pat != last_search_pat)
- el_free(pat);
-
- if (history(h, &ev, H_CURR) != 0)
- return NULL;
- *cindex = idx;
- rptr = ev.str;
-
- /* roll back to original position */
- (void)history(h, &ev, H_SET, num);
-
- return rptr;
-}
-
-/*
- * the real function doing history expansion - takes as argument command
- * to do and data upon which the command should be executed
- * does expansion the way I've understood readline documentation
- *
- * returns 0 if data was not modified, 1 if it was and 2 if the string
- * should be only printed and not executed; in case of error,
- * returns -1 and *result points to NULL
- * it's the caller's responsibility to free() the string returned in *result
- */
-static int
-_history_expand_command(const char *command, size_t offs, size_t cmdlen,
- char **result)
-{
- char *tmp, *search = NULL, *aptr;
- const char *ptr, *cmd;
- static char *from = NULL, *to = NULL;
- int start, end, idx, has_mods = 0;
- int p_on = 0, g_on = 0;
-
- *result = NULL;
- aptr = NULL;
- ptr = NULL;
-
- /* First get event specifier */
- idx = 0;
-
- if (strchr(":^*$", command[offs + 1])) {
- char str[4];
- /*
- * "!:" is shorthand for "!!:".
- * "!^", "!*" and "!$" are shorthand for
- * "!!:^", "!!:*" and "!!:$" respectively.
- */
- str[0] = str[1] = '!';
- str[2] = '0';
- ptr = get_history_event(str, &idx, 0);
- idx = (command[offs + 1] == ':')? 1:0;
- has_mods = 1;
- } else {
- if (command[offs + 1] == '#') {
- /* use command so far */
- if ((aptr = el_malloc((offs + 1) * sizeof(*aptr)))
- == NULL)
- return -1;
- (void)strncpy(aptr, command, offs);
- aptr[offs] = '\0';
- idx = 1;
- } else {
- int qchar;
-
- qchar = (offs > 0 && command[offs - 1] == '"')? '"':0;
- ptr = get_history_event(command + offs, &idx, qchar);
- }
- has_mods = command[offs + (size_t)idx] == ':';
- }
-
- if (ptr == NULL && aptr == NULL)
- return -1;
-
- if (!has_mods) {
- *result = strdup(aptr ? aptr : ptr);
- if (aptr)
- el_free(aptr);
- if (*result == NULL)
- return -1;
- return 1;
- }
-
- cmd = command + offs + idx + 1;
-
- /* Now parse any word designators */
-
- if (*cmd == '%') /* last word matched by ?pat? */
- tmp = strdup(last_search_match? last_search_match:"");
- else if (strchr("^*$-0123456789", *cmd)) {
- start = end = -1;
- if (*cmd == '^')
- start = end = 1, cmd++;
- else if (*cmd == '$')
- start = -1, cmd++;
- else if (*cmd == '*')
- start = 1, cmd++;
- else if (*cmd == '-' || isdigit((unsigned char) *cmd)) {
- start = 0;
- while (*cmd && '0' <= *cmd && *cmd <= '9')
- start = start * 10 + *cmd++ - '0';
-
- if (*cmd == '-') {
- if (isdigit((unsigned char) cmd[1])) {
- cmd++;
- end = 0;
- while (*cmd && '0' <= *cmd && *cmd <= '9')
- end = end * 10 + *cmd++ - '0';
- } else if (cmd[1] == '$') {
- cmd += 2;
- end = -1;
- } else {
- cmd++;
- end = -2;
- }
- } else if (*cmd == '*')
- end = -1, cmd++;
- else
- end = start;
- }
- tmp = history_arg_extract(start, end, aptr? aptr:ptr);
- if (tmp == NULL) {
- (void)fprintf(rl_outstream, "%s: Bad word specifier",
- command + offs + idx);
- if (aptr)
- el_free(aptr);
- return -1;
- }
- } else
- tmp = strdup(aptr? aptr:ptr);
-
- if (aptr)
- el_free(aptr);
-
- if (*cmd == '\0' || ((size_t)(cmd - (command + offs)) >= cmdlen)) {
- *result = tmp;
- return 1;
- }
-
- for (; *cmd; cmd++) {
- if (*cmd == ':')
- continue;
- else if (*cmd == 'h') { /* remove trailing path */
- if ((aptr = strrchr(tmp, '/')) != NULL)
- *aptr = '\0';
- } else if (*cmd == 't') { /* remove leading path */
- if ((aptr = strrchr(tmp, '/')) != NULL) {
- aptr = strdup(aptr + 1);
- el_free(tmp);
- tmp = aptr;
- }
- } else if (*cmd == 'r') { /* remove trailing suffix */
- if ((aptr = strrchr(tmp, '.')) != NULL)
- *aptr = '\0';
- } else if (*cmd == 'e') { /* remove all but suffix */
- if ((aptr = strrchr(tmp, '.')) != NULL) {
- aptr = strdup(aptr);
- el_free(tmp);
- tmp = aptr;
- }
- } else if (*cmd == 'p') /* print only */
- p_on = 1;
- else if (*cmd == 'g')
- g_on = 2;
- else if (*cmd == 's' || *cmd == '&') {
- char *what, *with, delim;
- size_t len, from_len;
- size_t size;
-
- if (*cmd == '&' && (from == NULL || to == NULL))
- continue;
- else if (*cmd == 's') {
- delim = *(++cmd), cmd++;
- size = 16;
- what = el_realloc(from, size * sizeof(*what));
- if (what == NULL) {
- el_free(from);
- el_free(tmp);
- return 0;
- }
- len = 0;
- for (; *cmd && *cmd != delim; cmd++) {
- if (*cmd == '\\' && cmd[1] == delim)
- cmd++;
- if (len >= size) {
- char *nwhat;
- nwhat = el_realloc(what,
- (size <<= 1) *
- sizeof(*nwhat));
- if (nwhat == NULL) {
- el_free(what);
- el_free(tmp);
- return 0;
- }
- what = nwhat;
- }
- what[len++] = *cmd;
- }
- what[len] = '\0';
- from = what;
- if (*what == '\0') {
- el_free(what);
- if (search) {
- from = strdup(search);
- if (from == NULL) {
- el_free(tmp);
- return 0;
- }
- } else {
- from = NULL;
- el_free(tmp);
- return -1;
- }
- }
- cmd++; /* shift after delim */
- if (!*cmd)
- continue;
-
- size = 16;
- with = el_realloc(to, size * sizeof(*with));
- if (with == NULL) {
- el_free(to);
- el_free(tmp);
- return -1;
- }
- len = 0;
- from_len = strlen(from);
- for (; *cmd && *cmd != delim; cmd++) {
- if (len + from_len + 1 >= size) {
- char *nwith;
- size += from_len + 1;
- nwith = el_realloc(with,
- size * sizeof(*nwith));
- if (nwith == NULL) {
- el_free(with);
- el_free(tmp);
- return -1;
- }
- with = nwith;
- }
- if (*cmd == '&') {
- /* safe */
- (void)strcpy(&with[len], from);
- len += from_len;
- continue;
- }
- if (*cmd == '\\'
- && (*(cmd + 1) == delim
- || *(cmd + 1) == '&'))
- cmd++;
- with[len++] = *cmd;
- }
- with[len] = '\0';
- to = with;
- }
-
- aptr = _rl_compat_sub(tmp, from, to, g_on);
- if (aptr) {
- el_free(tmp);
- tmp = aptr;
- }
- g_on = 0;
- }
- }
- *result = tmp;
- return p_on? 2:1;
-}
-
-
-/*
- * csh-style history expansion
- */
-int
-history_expand(char *str, char **output)
-{
- int ret = 0;
- size_t idx, i, size;
- char *tmp, *result;
-
- if (h == NULL || e == NULL)
- rl_initialize();
-
- if (history_expansion_char == 0) {
- *output = strdup(str);
- return 0;
- }
-
- *output = NULL;
- if (str[0] == history_subst_char) {
- /* ^foo^foo2^ is equivalent to !!:s^foo^foo2^ */
- *output = el_malloc((strlen(str) + 4 + 1) * sizeof(**output));
- if (*output == NULL)
- return 0;
- (*output)[0] = (*output)[1] = history_expansion_char;
- (*output)[2] = ':';
- (*output)[3] = 's';
- (void)strcpy((*output) + 4, str);
- str = *output;
- } else {
- *output = strdup(str);
- if (*output == NULL)
- return 0;
- }
-
-#define ADD_STRING(what, len, fr) \
- { \
- if (idx + len + 1 > size) { \
- char *nresult = el_realloc(result, \
- (size += len + 1) * sizeof(*nresult)); \
- if (nresult == NULL) { \
- el_free(*output); \
- if (/*CONSTCOND*/fr) \
- el_free(tmp); \
- return 0; \
- } \
- result = nresult; \
- } \
- (void)strncpy(&result[idx], what, len); \
- idx += len; \
- result[idx] = '\0'; \
- }
-
- result = NULL;
- size = idx = 0;
- tmp = NULL;
- for (i = 0; str[i];) {
- int qchar, loop_again;
- size_t len, start, j;
-
- qchar = 0;
- loop_again = 1;
- start = j = i;
-loop:
- for (; str[j]; j++) {
- if (str[j] == '\\' &&
- str[j + 1] == history_expansion_char) {
- len = strlen(&str[j + 1]) + 1;
- memmove(&str[j], &str[j + 1], len);
- continue;
- }
- if (!loop_again) {
- if (isspace((unsigned char) str[j])
- || str[j] == qchar)
- break;
- }
- if (str[j] == history_expansion_char
- && !strchr(history_no_expand_chars, str[j + 1])
- && (!history_inhibit_expansion_function ||
- (*history_inhibit_expansion_function)(str,
- (int)j) == 0))
- break;
- }
-
- if (str[j] && loop_again) {
- i = j;
- qchar = (j > 0 && str[j - 1] == '"' )? '"':0;
- j++;
- if (str[j] == history_expansion_char)
- j++;
- loop_again = 0;
- goto loop;
- }
- len = i - start;
- ADD_STRING(&str[start], len, 0);
-
- if (str[i] == '\0' || str[i] != history_expansion_char) {
- len = j - i;
- ADD_STRING(&str[i], len, 0);
- if (start == 0)
- ret = 0;
- else
- ret = 1;
- break;
- }
- ret = _history_expand_command (str, i, (j - i), &tmp);
- if (ret > 0 && tmp) {
- len = strlen(tmp);
- ADD_STRING(tmp, len, 1);
- }
- if (tmp) {
- el_free(tmp);
- tmp = NULL;
- }
- i = j;
- }
-
- /* ret is 2 for "print only" option */
- if (ret == 2) {
- add_history(result);
-#ifdef GDB_411_HACK
- /* gdb 4.11 has been shipped with readline, where */
- /* history_expand() returned -1 when the line */
- /* should not be executed; in readline 2.1+ */
- /* it should return 2 in such a case */
- ret = -1;
-#endif
- }
- el_free(*output);
- *output = result;
-
- return ret;
-}
-
-/*
-* Return a string consisting of arguments of "str" from "start" to "end".
-*/
-char *
-history_arg_extract(int start, int end, const char *str)
-{
- size_t i, len, max;
- char **arr, *result = NULL;
-
- arr = history_tokenize(str);
- if (!arr)
- return NULL;
- if (arr && *arr == NULL)
- goto out;
-
- for (max = 0; arr[max]; max++)
- continue;
- max--;
-
- if (start == '$')
- start = (int)max;
- if (end == '$')
- end = (int)max;
- if (end < 0)
- end = (int)max + end + 1;
- if (start < 0)
- start = end;
-
- if (start < 0 || end < 0 || (size_t)start > max ||
- (size_t)end > max || start > end)
- goto out;
-
- for (i = (size_t)start, len = 0; i <= (size_t)end; i++)
- len += strlen(arr[i]) + 1;
- len++;
- result = el_malloc(len * sizeof(*result));
- if (result == NULL)
- goto out;
-
- for (i = (size_t)start, len = 0; i <= (size_t)end; i++) {
- (void)strcpy(result + len, arr[i]);
- len += strlen(arr[i]);
- if (i < (size_t)end)
- result[len++] = ' ';
- }
- result[len] = '\0';
-
-out:
- for (i = 0; arr[i]; i++)
- el_free(arr[i]);
- el_free(arr);
-
- return result;
-}
-
-/*
- * Parse the string into individual tokens,
- * similar to how shell would do it.
- */
-char **
-history_tokenize(const char *str)
-{
- int size = 1, idx = 0, i, start;
- size_t len;
- char **result = NULL, *temp, delim = '\0';
-
- for (i = 0; str[i];) {
- while (isspace((unsigned char) str[i]))
- i++;
- start = i;
- for (; str[i];) {
- if (str[i] == '\\') {
- if (str[i+1] != '\0')
- i++;
- } else if (str[i] == delim)
- delim = '\0';
- else if (!delim &&
- (isspace((unsigned char) str[i]) ||
- strchr("()<>;&|$", str[i])))
- break;
- else if (!delim && strchr("'`\"", str[i]))
- delim = str[i];
- if (str[i])
- i++;
- }
-
- if (idx + 2 >= size) {
- char **nresult;
- size <<= 1;
- nresult = el_realloc(result, (size_t)size * sizeof(*nresult));
- if (nresult == NULL) {
- el_free(result);
- return NULL;
- }
- result = nresult;
- }
- len = (size_t)i - (size_t)start;
- temp = el_malloc((size_t)(len + 1) * sizeof(*temp));
- if (temp == NULL) {
- for (i = 0; i < idx; i++)
- el_free(result[i]);
- el_free(result);
- return NULL;
- }
- (void)strncpy(temp, &str[start], len);
- temp[len] = '\0';
- result[idx++] = temp;
- result[idx] = NULL;
- if (str[i])
- i++;
- }
- return result;
-}
-
-
-/*
- * limit size of history record to ``max'' events
- */
-void
-stifle_history(int max)
-{
- HistEvent ev;
-
- if (h == NULL || e == NULL)
- rl_initialize();
-
- if (history(h, &ev, H_SETSIZE, max) == 0)
- max_input_history = max;
-}
-
-
-/*
- * "unlimit" size of history - set the limit to maximum allowed int value
- */
-int
-unstifle_history(void)
-{
- HistEvent ev;
- int omax;
-
- history(h, &ev, H_SETSIZE, INT_MAX);
- omax = max_input_history;
- max_input_history = INT_MAX;
- return omax; /* some value _must_ be returned */
-}
-
-
-int
-history_is_stifled(void)
-{
-
- /* cannot return true answer */
- return max_input_history != INT_MAX;
-}
-
-static const char _history_tmp_template[] = "/tmp/.historyXXXXXX";
-
-int
-history_truncate_file (const char *filename, int nlines)
-{
- int ret = 0;
- FILE *fp, *tp;
- char template[sizeof(_history_tmp_template)];
- char buf[4096];
- int fd;
- char *cp;
- off_t off;
- int count = 0;
- ssize_t left = 0;
-
- if (filename == NULL && (filename = _default_history_file()) == NULL)
- return errno;
- if ((fp = fopen(filename, "r+")) == NULL)
- return errno;
- strcpy(template, _history_tmp_template);
- if ((fd = mkstemp(template)) == -1) {
- ret = errno;
- goto out1;
- }
-
- if ((tp = fdopen(fd, "r+")) == NULL) {
- close(fd);
- ret = errno;
- goto out2;
- }
-
- for(;;) {
- if (fread(buf, sizeof(buf), (size_t)1, fp) != 1) {
- if (ferror(fp)) {
- ret = errno;
- break;
- }
- if (fseeko(fp, (off_t)sizeof(buf) * count, SEEK_SET) ==
- (off_t)-1) {
- ret = errno;
- break;
- }
- left = (ssize_t)fread(buf, (size_t)1, sizeof(buf), fp);
- if (ferror(fp)) {
- ret = errno;
- break;
- }
- if (left == 0) {
- count--;
- left = sizeof(buf);
- } else if (fwrite(buf, (size_t)left, (size_t)1, tp)
- != 1) {
- ret = errno;
- break;
- }
- fflush(tp);
- break;
- }
- if (fwrite(buf, sizeof(buf), (size_t)1, tp) != 1) {
- ret = errno;
- break;
- }
- count++;
- }
- if (ret)
- goto out3;
- cp = buf + left - 1;
- if(*cp != '\n')
- cp++;
- for(;;) {
- while (--cp >= buf) {
- if (*cp == '\n') {
- if (--nlines == 0) {
- if (++cp >= buf + sizeof(buf)) {
- count++;
- cp = buf;
- }
- break;
- }
- }
- }
- if (nlines <= 0 || count == 0)
- break;
- count--;
- if (fseeko(tp, (off_t)sizeof(buf) * count, SEEK_SET) < 0) {
- ret = errno;
- break;
- }
- if (fread(buf, sizeof(buf), (size_t)1, tp) != 1) {
- if (ferror(tp)) {
- ret = errno;
- break;
- }
- ret = EAGAIN;
- break;
- }
- cp = buf + sizeof(buf);
- }
-
- if (ret || nlines > 0)
- goto out3;
-
- if (fseeko(fp, (off_t)0, SEEK_SET) == (off_t)-1) {
- ret = errno;
- goto out3;
- }
-
- if (fseeko(tp, (off_t)sizeof(buf) * count + (cp - buf), SEEK_SET) ==
- (off_t)-1) {
- ret = errno;
- goto out3;
- }
-
- for(;;) {
- if ((left = (ssize_t)fread(buf, (size_t)1, sizeof(buf), tp)) == 0) {
- if (ferror(fp))
- ret = errno;
- break;
- }
- if (fwrite(buf, (size_t)left, (size_t)1, fp) != 1) {
- ret = errno;
- break;
- }
- }
- fflush(fp);
- if((off = ftello(fp)) > 0)
- (void)ftruncate(fileno(fp), off);
-out3:
- fclose(tp);
-out2:
- unlink(template);
-out1:
- fclose(fp);
-
- return ret;
-}
-
-
-/*
- * read history from a file given
- */
-int
-read_history(const char *filename)
-{
- HistEvent ev;
-
- if (h == NULL || e == NULL)
- rl_initialize();
- if (filename == NULL && (filename = _default_history_file()) == NULL)
- return errno;
- return history(h, &ev, H_LOAD, filename) == -1 ?
- (errno ? errno : EINVAL) : 0;
-}
-
-
-/*
- * write history to a file given
- */
-int
-write_history(const char *filename)
-{
- HistEvent ev;
-
- if (h == NULL || e == NULL)
- rl_initialize();
- if (filename == NULL && (filename = _default_history_file()) == NULL)
- return errno;
- return history(h, &ev, H_SAVE, filename) == -1 ?
- (errno ? errno : EINVAL) : 0;
-}
-
-
-/*
- * returns history ``num''th event
- *
- * returned pointer points to static variable
- */
-HIST_ENTRY *
-history_get(int num)
-{
- static HIST_ENTRY she;
- HistEvent ev;
- int curr_num;
-
- if (h == NULL || e == NULL)
- rl_initialize();
-
- /* save current position */
- if (history(h, &ev, H_CURR) != 0)
- return NULL;
- curr_num = ev.num;
-
- /* start from the oldest */
- if (history(h, &ev, H_LAST) != 0)
- return NULL; /* error */
-
- /* look forwards for event matching specified offset */
- if (history(h, &ev, H_NEXT_EVDATA, num, &she.data))
- return NULL;
-
- she.line = ev.str;
-
- /* restore pointer to where it was */
- (void)history(h, &ev, H_SET, curr_num);
-
- return &she;
-}
-
-
-/*
- * add the line to history table
- */
-int
-add_history(const char *line)
-{
- HistEvent ev;
-
- if (line == NULL)
- return 0;
-
- if (h == NULL || e == NULL)
- rl_initialize();
-
- (void)history(h, &ev, H_ENTER, line);
- if (history(h, &ev, H_GETSIZE) == 0)
- history_length = ev.num;
-
- return !(history_length > 0); /* return 0 if all is okay */
-}
-
-
-/*
- * remove the specified entry from the history list and return it.
- */
-HIST_ENTRY *
-remove_history(int num)
-{
- HIST_ENTRY *he;
- HistEvent ev;
-
- if (h == NULL || e == NULL)
- rl_initialize();
-
- if ((he = el_malloc(sizeof(*he))) == NULL)
- return NULL;
-
- if (history(h, &ev, H_DELDATA, num, &he->data) != 0) {
- el_free(he);
- return NULL;
- }
-
- he->line = ev.str;
- if (history(h, &ev, H_GETSIZE) == 0)
- history_length = ev.num;
-
- return he;
-}
-
-
-/*
- * replace the line and data of the num-th entry
- */
-HIST_ENTRY *
-replace_history_entry(int num, const char *line, histdata_t data)
-{
- HIST_ENTRY *he;
- HistEvent ev;
- int curr_num;
-
- if (h == NULL || e == NULL)
- rl_initialize();
-
- /* save current position */
- if (history(h, &ev, H_CURR) != 0)
- return NULL;
- curr_num = ev.num;
-
- /* start from the oldest */
- if (history(h, &ev, H_LAST) != 0)
- return NULL; /* error */
-
- if ((he = el_malloc(sizeof(*he))) == NULL)
- return NULL;
-
- /* look forwards for event matching specified offset */
- if (history(h, &ev, H_NEXT_EVDATA, num, &he->data))
- goto out;
-
- he->line = strdup(ev.str);
- if (he->line == NULL)
- goto out;
-
- if (history(h, &ev, H_REPLACE, line, data))
- goto out;
-
- /* restore pointer to where it was */
- if (history(h, &ev, H_SET, curr_num))
- goto out;
-
- return he;
-out:
- el_free(he);
- return NULL;
-}
-
-/*
- * clear the history list - delete all entries
- */
-void
-clear_history(void)
-{
- HistEvent ev;
-
- if (h == NULL || e == NULL)
- rl_initialize();
-
- (void)history(h, &ev, H_CLEAR);
- history_length = 0;
-}
-
-
-/*
- * returns offset of the current history event
- */
-int
-where_history(void)
-{
- HistEvent ev;
- int curr_num, off;
-
- if (history(h, &ev, H_CURR) != 0)
- return 0;
- curr_num = ev.num;
-
- (void)history(h, &ev, H_FIRST);
- off = 1;
- while (ev.num != curr_num && history(h, &ev, H_NEXT) == 0)
- off++;
-
- return off;
-}
-
-
-/*
- * returns current history event or NULL if there is no such event
- */
-HIST_ENTRY *
-current_history(void)
-{
-
- return _move_history(H_CURR);
-}
-
-
-/*
- * returns total number of bytes history events' data are using
- */
-int
-history_total_bytes(void)
-{
- HistEvent ev;
- int curr_num;
- size_t size;
-
- if (history(h, &ev, H_CURR) != 0)
- return -1;
- curr_num = ev.num;
-
- (void)history(h, &ev, H_FIRST);
- size = 0;
- do
- size += strlen(ev.str) * sizeof(*ev.str);
- while (history(h, &ev, H_NEXT) == 0);
-
- /* get to the same position as before */
- history(h, &ev, H_PREV_EVENT, curr_num);
-
- return (int)size;
-}
-
-
-/*
- * sets the position in the history list to ``pos''
- */
-int
-history_set_pos(int pos)
-{
- HistEvent ev;
- int curr_num;
-
- if (pos >= history_length || pos < 0)
- return -1;
-
- (void)history(h, &ev, H_CURR);
- curr_num = ev.num;
-
- /*
- * use H_DELDATA to set to nth history (without delete) by passing
- * (void **)-1
- */
- if (history(h, &ev, H_DELDATA, pos, (void **)-1)) {
- (void)history(h, &ev, H_SET, curr_num);
- return -1;
- }
- return 0;
-}
-
-
-/*
- * returns previous event in history and shifts pointer accordingly
- */
-HIST_ENTRY *
-previous_history(void)
-{
-
- return _move_history(H_PREV);
-}
-
-
-/*
- * returns next event in history and shifts pointer accordingly
- */
-HIST_ENTRY *
-next_history(void)
-{
-
- return _move_history(H_NEXT);
-}
-
-
-/*
- * searches for first history event containing the str
- */
-int
-history_search(const char *str, int direction)
-{
- HistEvent ev;
- const char *strp;
- int curr_num;
-
- if (history(h, &ev, H_CURR) != 0)
- return -1;
- curr_num = ev.num;
-
- for (;;) {
- if ((strp = strstr(ev.str, str)) != NULL)
- return (int)(strp - ev.str);
- if (history(h, &ev, direction < 0 ? H_NEXT:H_PREV) != 0)
- break;
- }
- (void)history(h, &ev, H_SET, curr_num);
- return -1;
-}
-
-
-/*
- * searches for first history event beginning with str
- */
-int
-history_search_prefix(const char *str, int direction)
-{
- HistEvent ev;
-
- return (history(h, &ev, direction < 0 ?
- H_PREV_STR : H_NEXT_STR, str));
-}
-
-
-/*
- * search for event in history containing str, starting at offset
- * abs(pos); continue backward, if pos<0, forward otherwise
- */
-/* ARGSUSED */
-int
-history_search_pos(const char *str,
- int direction __attribute__((__unused__)), int pos)
-{
- HistEvent ev;
- int curr_num, off;
-
- off = (pos > 0) ? pos : -pos;
- pos = (pos > 0) ? 1 : -1;
-
- if (history(h, &ev, H_CURR) != 0)
- return -1;
- curr_num = ev.num;
-
- if (history_set_pos(off) != 0 || history(h, &ev, H_CURR) != 0)
- return -1;
-
- for (;;) {
- if (strstr(ev.str, str))
- return off;
- if (history(h, &ev, (pos < 0) ? H_PREV : H_NEXT) != 0)
- break;
- }
-
- /* set "current" pointer back to previous state */
- (void)history(h, &ev,
- pos < 0 ? H_NEXT_EVENT : H_PREV_EVENT, curr_num);
-
- return -1;
-}
-
-
-/********************************/
-/* completion functions */
-
-char *
-tilde_expand(char *name)
-{
- return fn_tilde_expand(name);
-}
-
-char *
-filename_completion_function(const char *name, int state)
-{
- return fn_filename_completion_function(name, state);
-}
-
-/*
- * a completion generator for usernames; returns _first_ username
- * which starts with supplied text
- * text contains a partial username preceded by random character
- * (usually '~'); state resets search from start (??? should we do that anyway)
- * it's the caller's responsibility to free the returned value
- */
-char *
-username_completion_function(const char *text, int state)
-{
-#if defined(HAVE_GETPW_R_POSIX) || defined(HAVE_GETPW_R_DRAFT)
- struct passwd pwres;
- char pwbuf[1024];
-#endif
- struct passwd *pass = NULL;
-
- if (text[0] == '\0')
- return NULL;
-
- if (*text == '~')
- text++;
-
- if (state == 0)
- setpwent();
-
- while (
-#if defined(HAVE_GETPW_R_POSIX) || defined(HAVE_GETPW_R_DRAFT)
- getpwent_r(&pwres, pwbuf, sizeof(pwbuf), &pass) == 0 && pass != NULL
-#else
- (pass = getpwent()) != NULL
-#endif
- && text[0] == pass->pw_name[0]
- && strcmp(text, pass->pw_name) == 0)
- continue;
-
- if (pass == NULL) {
- endpwent();
- return NULL;
- }
- return strdup(pass->pw_name);
-}
-
-
-/*
- * el-compatible wrapper to send TSTP on ^Z
- */
-/* ARGSUSED */
-static unsigned char
-_el_rl_tstp(EditLine *el __attribute__((__unused__)), int ch __attribute__((__unused__)))
-{
- (void)kill(0, SIGTSTP);
- return CC_NORM;
-}
-
-/*
- * Display list of strings in columnar format on readline's output stream.
- * 'matches' is list of strings, 'len' is number of strings in 'matches',
- * 'max' is maximum length of string in 'matches'.
- */
-void
-rl_display_match_list(char **matches, int len, int max)
-{
-
- fn_display_match_list(e, matches, (size_t)len, (size_t)max);
-}
-
-static const char *
-/*ARGSUSED*/
-_rl_completion_append_character_function(const char *dummy
- __attribute__((__unused__)))
-{
- static char buf[2];
- buf[0] = (char)rl_completion_append_character;
- buf[1] = '\0';
- return buf;
-}
-
-
-/*
- * complete word at current point
- */
-/* ARGSUSED */
-int
-rl_complete(int ignore __attribute__((__unused__)), int invoking_key)
-{
-#ifdef WIDECHAR
- static ct_buffer_t wbreak_conv, sprefix_conv;
-#endif
- char *breakchars;
-
- if (h == NULL || e == NULL)
- rl_initialize();
-
- if (rl_inhibit_completion) {
- char arr[2];
- arr[0] = (char)invoking_key;
- arr[1] = '\0';
- el_insertstr(e, arr);
- return CC_REFRESH;
- }
-
- if (rl_completion_word_break_hook != NULL)
- breakchars = (*rl_completion_word_break_hook)();
- else
- breakchars = rl_basic_word_break_characters;
-
- _rl_update_pos();
-
- /* Just look at how many global variables modify this operation! */
- return fn_complete(e,
- (rl_compentry_func_t *)rl_completion_entry_function,
- rl_attempted_completion_function,
- ct_decode_string(rl_basic_word_break_characters, &wbreak_conv),
- ct_decode_string(breakchars, &sprefix_conv),
- _rl_completion_append_character_function,
- (size_t)rl_completion_query_items,
- &rl_completion_type, &rl_attempted_completion_over,
- &rl_point, &rl_end, NULL, NULL, NULL);
-
-
-}
-
-
-/* ARGSUSED */
-static unsigned char
-_el_rl_complete(EditLine *el __attribute__((__unused__)), int ch)
-{
- return (unsigned char)rl_complete(0, ch);
-}
-
-/*
- * misc other functions
- */
-
-/*
- * bind key c to readline-type function func
- */
-int
-rl_bind_key(int c, rl_command_func_t *func)
-{
- int retval = -1;
-
- if (h == NULL || e == NULL)
- rl_initialize();
-
- if (func == rl_insert) {
- /* XXX notice there is no range checking of ``c'' */
- e->el_map.key[c] = ED_INSERT;
- retval = 0;
- }
- return retval;
-}
-
-
-/*
- * read one key from input - handles chars pushed back
- * to input stream also
- */
-int
-rl_read_key(void)
-{
- char fooarr[2 * sizeof(int)];
-
- if (e == NULL || h == NULL)
- rl_initialize();
-
- return el_getc(e, fooarr);
-}
-
-
-/*
- * reset the terminal
- */
-/* ARGSUSED */
-void
-rl_reset_terminal(const char *p __attribute__((__unused__)))
-{
-
- if (h == NULL || e == NULL)
- rl_initialize();
- el_reset(e);
-}
-
-
-/*
- * insert character ``c'' back into input stream, ``count'' times
- */
-int
-rl_insert(int count, int c)
-{
- char arr[2];
-
- if (h == NULL || e == NULL)
- rl_initialize();
-
- /* XXX - int -> char conversion can lose on multichars */
- arr[0] = (char)c;
- arr[1] = '\0';
-
- for (; count > 0; count--)
- el_push(e, arr);
-
- return 0;
-}
-
-int
-rl_insert_text(const char *text)
-{
- if (!text || *text == 0)
- return 0;
-
- if (h == NULL || e == NULL)
- rl_initialize();
-
- if (el_insertstr(e, text) < 0)
- return 0;
- return (int)strlen(text);
-}
-
-/*ARGSUSED*/
-int
-rl_newline(int count __attribute__((__unused__)),
- int c __attribute__((__unused__)))
-{
- /*
- * Readline-4.0 appears to ignore the args.
- */
- return rl_insert(1, '\n');
-}
-
-/*ARGSUSED*/
-static unsigned char
-rl_bind_wrapper(EditLine *el __attribute__((__unused__)), unsigned char c)
-{
- if (map[c] == NULL)
- return CC_ERROR;
-
- _rl_update_pos();
-
- (*map[c])(1, c);
-
- /* If rl_done was set by the above call, deal with it here */
- if (rl_done)
- return CC_EOF;
-
- return CC_NORM;
-}
-
-int
-rl_add_defun(const char *name, rl_command_func_t *fun, int c)
-{
- char dest[8];
- if ((size_t)c >= sizeof(map) / sizeof(map[0]) || c < 0)
- return -1;
- map[(unsigned char)c] = fun;
- el_set(e, EL_ADDFN, name, name, rl_bind_wrapper);
- vis(dest, c, VIS_WHITE|VIS_NOSLASH, 0);
- el_set(e, EL_BIND, dest, name, NULL);
- return 0;
-}
-
-void
-rl_callback_read_char(void)
-{
- int count = 0, done = 0;
- const char *buf = el_gets(e, &count);
- char *wbuf;
-
- if (buf == NULL || count-- <= 0)
- return;
- if (count == 0 && buf[0] == e->el_tty.t_c[TS_IO][C_EOF])
- done = 1;
- if (buf[count] == '\n' || buf[count] == '\r')
- done = 2;
-
- if (done && rl_linefunc != NULL) {
- el_set(e, EL_UNBUFFERED, 0);
- if (done == 2) {
- if ((wbuf = strdup(buf)) != NULL)
- wbuf[count] = '\0';
- } else
- wbuf = NULL;
- (*(void (*)(const char *))rl_linefunc)(wbuf);
- el_set(e, EL_UNBUFFERED, 1);
- }
-}
-
-void
-rl_callback_handler_install(const char *prompt, rl_vcpfunc_t *linefunc)
-{
- if (e == NULL) {
- rl_initialize();
- }
- (void)rl_set_prompt(prompt);
- rl_linefunc = linefunc;
- el_set(e, EL_UNBUFFERED, 1);
-}
-
-void
-rl_callback_handler_remove(void)
-{
- el_set(e, EL_UNBUFFERED, 0);
- rl_linefunc = NULL;
-}
-
-void
-rl_redisplay(void)
-{
- char a[2];
- a[0] = (char)e->el_tty.t_c[TS_IO][C_REPRINT];
- a[1] = '\0';
- el_push(e, a);
-}
-
-int
-rl_get_previous_history(int count, int key)
-{
- char a[2];
- a[0] = (char)key;
- a[1] = '\0';
- while (count--)
- el_push(e, a);
- return 0;
-}
-
-void
-/*ARGSUSED*/
-rl_prep_terminal(int meta_flag __attribute__((__unused__)))
-{
- el_set(e, EL_PREP_TERM, 1);
-}
-
-void
-rl_deprep_terminal(void)
-{
- el_set(e, EL_PREP_TERM, 0);
-}
-
-int
-rl_read_init_file(const char *s)
-{
- return el_source(e, s);
-}
-
-int
-rl_parse_and_bind(const char *line)
-{
- const char **argv;
- int argc;
- Tokenizer *tok;
-
- tok = tok_init(NULL);
- tok_str(tok, line, &argc, &argv);
- argc = el_parse(e, argc, argv);
- tok_end(tok);
- return argc ? 1 : 0;
-}
-
-int
-rl_variable_bind(const char *var, const char *value)
-{
- /*
- * The proper return value is undocument, but this is what the
- * readline source seems to do.
- */
- return el_set(e, EL_BIND, "", var, value, NULL) == -1 ? 1 : 0;
-}
-
-void
-rl_stuff_char(int c)
-{
- char buf[2];
-
- buf[0] = (char)c;
- buf[1] = '\0';
- el_insertstr(e, buf);
-}
-
-static int
-_rl_event_read_char(EditLine *el, wchar_t *wc)
-{
- char ch;
- int n;
- ssize_t num_read = 0;
-
- ch = '\0';
- *wc = L'\0';
- while (rl_event_hook) {
-
- (*rl_event_hook)();
-
-#if defined(FIONREAD)
- if (ioctl(el->el_infd, FIONREAD, &n) < 0)
- return -1;
- if (n)
- num_read = read(el->el_infd, &ch, (size_t)1);
- else
- num_read = 0;
-#elif defined(F_SETFL) && defined(O_NDELAY)
- if ((n = fcntl(el->el_infd, F_GETFL, 0)) < 0)
- return -1;
- if (fcntl(el->el_infd, F_SETFL, n|O_NDELAY) < 0)
- return -1;
- num_read = read(el->el_infd, &ch, 1);
- if (fcntl(el->el_infd, F_SETFL, n))
- return -1;
-#else
- /* not non-blocking, but what you gonna do? */
- num_read = read(el->el_infd, &ch, 1);
- return -1;
-#endif
-
- if (num_read < 0 && errno == EAGAIN)
- continue;
- if (num_read == 0)
- continue;
- break;
- }
- if (!rl_event_hook)
- el_set(el, EL_GETCFN, EL_BUILTIN_GETCFN);
- *wc = (wchar_t)ch;
- return (int)num_read;
-}
-
-static void
-_rl_update_pos(void)
-{
- const LineInfo *li = el_line(e);
-
- rl_point = (int)(li->cursor - li->buffer);
- rl_end = (int)(li->lastchar - li->buffer);
-}
-
-void
-rl_get_screen_size(int *rows, int *cols)
-{
- if (rows)
- el_get(e, EL_GETTC, "li", rows, (void *)0);
- if (cols)
- el_get(e, EL_GETTC, "co", cols, (void *)0);
-}
-
-void
-rl_set_screen_size(int rows, int cols)
-{
- char buf[64];
- (void)snprintf(buf, sizeof(buf), "%d", rows);
- el_set(e, EL_SETTC, "li", buf, NULL);
- (void)snprintf(buf, sizeof(buf), "%d", cols);
- el_set(e, EL_SETTC, "co", buf, NULL);
-}
-
-char **
-rl_completion_matches(const char *str, rl_compentry_func_t *fun)
-{
- size_t len, max, i, j, min;
- char **list, *match, *a, *b;
-
- len = 1;
- max = 10;
- if ((list = el_malloc(max * sizeof(*list))) == NULL)
- return NULL;
-
- while ((match = (*fun)(str, (int)(len - 1))) != NULL) {
- list[len++] = match;
- if (len == max) {
- char **nl;
- max += 10;
- if ((nl = el_realloc(list, max * sizeof(*nl))) == NULL)
- goto out;
- list = nl;
- }
- }
- if (len == 1)
- goto out;
- list[len] = NULL;
- if (len == 2) {
- if ((list[0] = strdup(list[1])) == NULL)
- goto out;
- return list;
- }
- qsort(&list[1], len - 1, sizeof(*list),
- (int (*)(const void *, const void *)) strcmp);
- min = SIZE_MAX;
- for (i = 1, a = list[i]; i < len - 1; i++, a = b) {
- b = list[i + 1];
- for (j = 0; a[j] && a[j] == b[j]; j++)
- continue;
- if (min > j)
- min = j;
- }
- if (min == 0 && *str) {
- if ((list[0] = strdup(str)) == NULL)
- goto out;
- } else {
- if ((list[0] = el_malloc((min + 1) * sizeof(*list[0]))) == NULL)
- goto out;
- (void)memcpy(list[0], list[1], min);
- list[0][min] = '\0';
- }
- return list;
-
-out:
- el_free(list);
- return NULL;
-}
-
-char *
-rl_filename_completion_function (const char *text, int state)
-{
- return fn_filename_completion_function(text, state);
-}
-
-void
-rl_forced_update_display(void)
-{
- el_set(e, EL_REFRESH);
-}
-
-int
-_rl_abort_internal(void)
-{
- el_beep(e);
- longjmp(topbuf, 1);
- /*NOTREACHED*/
-}
-
-int
-_rl_qsort_string_compare(char **s1, char **s2)
-{
- return strcoll(*s1, *s2);
-}
-
-HISTORY_STATE *
-history_get_history_state(void)
-{
- HISTORY_STATE *hs;
-
- if ((hs = el_malloc(sizeof(*hs))) == NULL)
- return NULL;
- hs->length = history_length;
- return hs;
-}
-
-int
-/*ARGSUSED*/
-rl_kill_text(int from __attribute__((__unused__)),
- int to __attribute__((__unused__)))
-{
- return 0;
-}
-
-Keymap
-rl_make_bare_keymap(void)
-{
- return NULL;
-}
-
-Keymap
-rl_get_keymap(void)
-{
- return NULL;
-}
-
-void
-/*ARGSUSED*/
-rl_set_keymap(Keymap k __attribute__((__unused__)))
-{
-}
-
-int
-/*ARGSUSED*/
-rl_generic_bind(int type __attribute__((__unused__)),
- const char * keyseq __attribute__((__unused__)),
- const char * data __attribute__((__unused__)),
- Keymap k __attribute__((__unused__)))
-{
- return 0;
-}
-
-int
-/*ARGSUSED*/
-rl_bind_key_in_map(int key __attribute__((__unused__)),
- rl_command_func_t *fun __attribute__((__unused__)),
- Keymap k __attribute__((__unused__)))
-{
- return 0;
-}
-
-/* unsupported, but needed by python */
-void
-rl_cleanup_after_signal(void)
-{
-}
-
-int
-rl_on_new_line(void)
-{
- return 0;
-}
-
-void
-rl_free_line_state(void)
-{
-}
-
-int
-/*ARGSUSED*/
-rl_set_keyboard_input_timeout(int u __attribute__((__unused__)))
-{
- return 0;
-}
diff --git a/lib/libedit/edit/readline/Makefile b/lib/libedit/readline/Makefile
index c36bb686ef9b..b30e6ef1d2f0 100644
--- a/lib/libedit/edit/readline/Makefile
+++ b/lib/libedit/readline/Makefile
@@ -1,6 +1,6 @@
-# Copyright (c) 2011 David E O'Brien
# $FreeBSD$
+.PATH: ${SRCTOP}/contrib/libedit/readline
INCS= readline.h history.h tilde.h
INCSDIR= ${INCLUDEDIR}/edit/readline
diff --git a/lib/libedit/edit/readline/history.h b/lib/libedit/readline/history.h
index 1b84338470e7..1b84338470e7 100644
--- a/lib/libedit/edit/readline/history.h
+++ b/lib/libedit/readline/history.h
diff --git a/lib/libedit/edit/readline/tilde.h b/lib/libedit/readline/tilde.h
index 1b84338470e7..1b84338470e7 100644
--- a/lib/libedit/edit/readline/tilde.h
+++ b/lib/libedit/readline/tilde.h
diff --git a/lib/libedit/refresh.c b/lib/libedit/refresh.c
deleted file mode 100644
index 844554ee188f..000000000000
--- a/lib/libedit/refresh.c
+++ /dev/null
@@ -1,1187 +0,0 @@
-/* $NetBSD: refresh.c,v 1.45 2016/03/02 19:24:20 christos Exp $ */
-
-/*-
- * 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.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-#if 0
-static char sccsid[] = "@(#)refresh.c 8.1 (Berkeley) 6/4/93";
-#else
-__RCSID("$NetBSD: refresh.c,v 1.45 2016/03/02 19:24:20 christos Exp $");
-#endif
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * refresh.c: Lower level screen refreshing functions
- */
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "el.h"
-
-private void re_nextline(EditLine *);
-private void re_addc(EditLine *, wint_t);
-private void re_update_line(EditLine *, Char *, Char *, int);
-private void re_insert (EditLine *, Char *, int, int, Char *, int);
-private void re_delete(EditLine *, Char *, int, int, int);
-private void re_fastputc(EditLine *, wint_t);
-private void re_clear_eol(EditLine *, int, int, int);
-private void re__strncopy(Char *, Char *, size_t);
-private void re__copy_and_pad(Char *, const Char *, size_t);
-
-#ifdef DEBUG_REFRESH
-private void re_printstr(EditLine *, const char *, Char *, Char *);
-#define __F el->el_errfile
-#define ELRE_ASSERT(a, b, c) do \
- if (/*CONSTCOND*/ a) { \
- (void) fprintf b; \
- c; \
- } \
- while (/*CONSTCOND*/0)
-#define ELRE_DEBUG(a, b) ELRE_ASSERT(a,b,;)
-
-/* re_printstr():
- * Print a string on the debugging pty
- */
-private void
-re_printstr(EditLine *el, const char *str, Char *f, Char *t)
-{
-
- ELRE_DEBUG(1, (__F, "%s:\"", str));
- while (f < t)
- ELRE_DEBUG(1, (__F, "%c", *f++ & 0177));
- ELRE_DEBUG(1, (__F, "\"\r\n"));
-}
-#else
-#define ELRE_ASSERT(a, b, c)
-#define ELRE_DEBUG(a, b)
-#endif
-
-/* re_nextline():
- * Move to the next line or scroll
- */
-private void
-re_nextline(EditLine *el)
-{
- el->el_refresh.r_cursor.h = 0; /* reset it. */
-
- /*
- * If we would overflow (input is longer than terminal size),
- * emulate scroll by dropping first line and shuffling the rest.
- * We do this via pointer shuffling - it's safe in this case
- * and we avoid memcpy().
- */
- if (el->el_refresh.r_cursor.v + 1 >= el->el_terminal.t_size.v) {
- int i, lins = el->el_terminal.t_size.v;
- Char *firstline = el->el_vdisplay[0];
-
- for(i = 1; i < lins; i++)
- el->el_vdisplay[i - 1] = el->el_vdisplay[i];
-
- firstline[0] = '\0'; /* empty the string */
- el->el_vdisplay[i - 1] = firstline;
- } else
- el->el_refresh.r_cursor.v++;
-
- ELRE_ASSERT(el->el_refresh.r_cursor.v >= el->el_terminal.t_size.v,
- (__F, "\r\nre_putc: overflow! r_cursor.v == %d > %d\r\n",
- el->el_refresh.r_cursor.v, el->el_terminal.t_size.v),
- abort());
-}
-
-/* re_addc():
- * Draw c, expanding tabs, control chars etc.
- */
-private void
-re_addc(EditLine *el, wint_t c)
-{
- switch (ct_chr_class((Char)c)) {
- case CHTYPE_TAB: /* expand the tab */
- for (;;) {
- re_putc(el, ' ', 1);
- if ((el->el_refresh.r_cursor.h & 07) == 0)
- break; /* go until tab stop */
- }
- break;
- case CHTYPE_NL: {
- int oldv = el->el_refresh.r_cursor.v;
- re_putc(el, '\0', 0); /* assure end of line */
- if (oldv == el->el_refresh.r_cursor.v) /* XXX */
- re_nextline(el);
- break;
- }
- case CHTYPE_PRINT:
- re_putc(el, c, 1);
- break;
- default: {
- Char visbuf[VISUAL_WIDTH_MAX];
- ssize_t i, n =
- ct_visual_char(visbuf, VISUAL_WIDTH_MAX, (Char)c);
- for (i = 0; n-- > 0; ++i)
- re_putc(el, visbuf[i], 1);
- break;
- }
- }
-}
-
-
-/* re_putc():
- * Draw the character given
- */
-protected void
-re_putc(EditLine *el, wint_t c, int shift)
-{
- int i, w = Width(c);
- ELRE_DEBUG(1, (__F, "printing %5x '%lc'\r\n", c, c));
-
- while (shift && (el->el_refresh.r_cursor.h + w > el->el_terminal.t_size.h))
- re_putc(el, ' ', 1);
-
- el->el_vdisplay[el->el_refresh.r_cursor.v]
- [el->el_refresh.r_cursor.h] = (Char)c;
- /* assumes !shift is only used for single-column chars */
- i = w;
- while (--i > 0)
- el->el_vdisplay[el->el_refresh.r_cursor.v]
- [el->el_refresh.r_cursor.h + i] = MB_FILL_CHAR;
-
- if (!shift)
- return;
-
- el->el_refresh.r_cursor.h += w; /* advance to next place */
- if (el->el_refresh.r_cursor.h >= el->el_terminal.t_size.h) {
- /* assure end of line */
- el->el_vdisplay[el->el_refresh.r_cursor.v][el->el_terminal.t_size.h]
- = '\0';
- re_nextline(el);
- }
-}
-
-
-/* re_refresh():
- * draws the new virtual screen image from the current input
- * line, then goes line-by-line changing the real image to the new
- * virtual image. The routine to re-draw a line can be replaced
- * easily in hopes of a smarter one being placed there.
- */
-protected void
-re_refresh(EditLine *el)
-{
- int i, rhdiff;
- Char *cp, *st;
- coord_t cur;
-#ifdef notyet
- size_t termsz;
-#endif
-
- ELRE_DEBUG(1, (__F, "el->el_line.buffer = :" FSTR ":\r\n",
- el->el_line.buffer));
-
- /* reset the Drawing cursor */
- el->el_refresh.r_cursor.h = 0;
- el->el_refresh.r_cursor.v = 0;
-
- /* temporarily draw rprompt to calculate its size */
- prompt_print(el, EL_RPROMPT);
-
- /* reset the Drawing cursor */
- el->el_refresh.r_cursor.h = 0;
- el->el_refresh.r_cursor.v = 0;
-
- if (el->el_line.cursor >= el->el_line.lastchar) {
- if (el->el_map.current == el->el_map.alt
- && el->el_line.lastchar != el->el_line.buffer)
- el->el_line.cursor = el->el_line.lastchar - 1;
- else
- el->el_line.cursor = el->el_line.lastchar;
- }
-
- cur.h = -1; /* set flag in case I'm not set */
- cur.v = 0;
-
- prompt_print(el, EL_PROMPT);
-
- /* draw the current input buffer */
-#if notyet
- termsz = el->el_terminal.t_size.h * el->el_terminal.t_size.v;
- if (el->el_line.lastchar - el->el_line.buffer > termsz) {
- /*
- * If line is longer than terminal, process only part
- * of line which would influence display.
- */
- size_t rem = (el->el_line.lastchar-el->el_line.buffer)%termsz;
-
- st = el->el_line.lastchar - rem
- - (termsz - (((rem / el->el_terminal.t_size.v) - 1)
- * el->el_terminal.t_size.v));
- } else
-#endif
- st = el->el_line.buffer;
-
- for (cp = st; cp < el->el_line.lastchar; cp++) {
- if (cp == el->el_line.cursor) {
- int w = Width(*cp);
- /* save for later */
- cur.h = el->el_refresh.r_cursor.h;
- cur.v = el->el_refresh.r_cursor.v;
- /* handle being at a linebroken doublewidth char */
- if (w > 1 && el->el_refresh.r_cursor.h + w >
- el->el_terminal.t_size.h) {
- cur.h = 0;
- cur.v++;
- }
- }
- re_addc(el, *cp);
- }
-
- if (cur.h == -1) { /* if I haven't been set yet, I'm at the end */
- cur.h = el->el_refresh.r_cursor.h;
- cur.v = el->el_refresh.r_cursor.v;
- }
- rhdiff = el->el_terminal.t_size.h - el->el_refresh.r_cursor.h -
- el->el_rprompt.p_pos.h;
- if (el->el_rprompt.p_pos.h && !el->el_rprompt.p_pos.v &&
- !el->el_refresh.r_cursor.v && rhdiff > 1) {
- /*
- * have a right-hand side prompt that will fit
- * on the end of the first line with at least
- * one character gap to the input buffer.
- */
- while (--rhdiff > 0) /* pad out with spaces */
- re_putc(el, ' ', 1);
- prompt_print(el, EL_RPROMPT);
- } else {
- el->el_rprompt.p_pos.h = 0; /* flag "not using rprompt" */
- el->el_rprompt.p_pos.v = 0;
- }
-
- re_putc(el, '\0', 0); /* make line ended with NUL, no cursor shift */
-
- el->el_refresh.r_newcv = el->el_refresh.r_cursor.v;
-
- ELRE_DEBUG(1, (__F,
- "term.h=%d vcur.h=%d vcur.v=%d vdisplay[0]=\r\n:%80.80s:\r\n",
- el->el_terminal.t_size.h, el->el_refresh.r_cursor.h,
- el->el_refresh.r_cursor.v, ct_encode_string(el->el_vdisplay[0],
- &el->el_scratch)));
-
- ELRE_DEBUG(1, (__F, "updating %d lines.\r\n", el->el_refresh.r_newcv));
- for (i = 0; i <= el->el_refresh.r_newcv; i++) {
- /* NOTE THAT re_update_line MAY CHANGE el_display[i] */
- re_update_line(el, el->el_display[i], el->el_vdisplay[i], i);
-
- /*
- * Copy the new line to be the current one, and pad out with
- * spaces to the full width of the terminal so that if we try
- * moving the cursor by writing the character that is at the
- * end of the screen line, it won't be a NUL or some old
- * leftover stuff.
- */
- re__copy_and_pad(el->el_display[i], el->el_vdisplay[i],
- (size_t) el->el_terminal.t_size.h);
- }
- ELRE_DEBUG(1, (__F,
- "\r\nel->el_refresh.r_cursor.v=%d,el->el_refresh.r_oldcv=%d i=%d\r\n",
- el->el_refresh.r_cursor.v, el->el_refresh.r_oldcv, i));
-
- if (el->el_refresh.r_oldcv > el->el_refresh.r_newcv)
- for (; i <= el->el_refresh.r_oldcv; i++) {
- terminal_move_to_line(el, i);
- terminal_move_to_char(el, 0);
- /* This Strlen should be safe even with MB_FILL_CHARs */
- terminal_clear_EOL(el, (int) Strlen(el->el_display[i]));
-#ifdef DEBUG_REFRESH
- terminal_overwrite(el, STR("C\b"), 2);
-#endif /* DEBUG_REFRESH */
- el->el_display[i][0] = '\0';
- }
-
- el->el_refresh.r_oldcv = el->el_refresh.r_newcv; /* set for next time */
- ELRE_DEBUG(1, (__F,
- "\r\ncursor.h = %d, cursor.v = %d, cur.h = %d, cur.v = %d\r\n",
- el->el_refresh.r_cursor.h, el->el_refresh.r_cursor.v,
- cur.h, cur.v));
- terminal_move_to_line(el, cur.v); /* go to where the cursor is */
- terminal_move_to_char(el, cur.h);
-}
-
-
-/* re_goto_bottom():
- * used to go to last used screen line
- */
-protected void
-re_goto_bottom(EditLine *el)
-{
-
- terminal_move_to_line(el, el->el_refresh.r_oldcv);
- terminal__putc(el, '\n');
- re_clear_display(el);
- terminal__flush(el);
-}
-
-
-/* re_insert():
- * insert num characters of s into d (in front of the character)
- * at dat, maximum length of d is dlen
- */
-private void
-/*ARGSUSED*/
-re_insert(EditLine *el __attribute__((__unused__)),
- Char *d, int dat, int dlen, Char *s, int num)
-{
- Char *a, *b;
-
- if (num <= 0)
- return;
- if (num > dlen - dat)
- num = dlen - dat;
-
- ELRE_DEBUG(1,
- (__F, "re_insert() starting: %d at %d max %d, d == \"%s\"\n",
- num, dat, dlen, ct_encode_string(d, &el->el_scratch)));
- ELRE_DEBUG(1, (__F, "s == \"%s\"\n", ct_encode_string(s,
- &el->el_scratch)));
-
- /* open up the space for num chars */
- if (num > 0) {
- b = d + dlen - 1;
- a = b - num;
- while (a >= &d[dat])
- *b-- = *a--;
- d[dlen] = '\0'; /* just in case */
- }
-
- ELRE_DEBUG(1, (__F,
- "re_insert() after insert: %d at %d max %d, d == \"%s\"\n",
- num, dat, dlen, ct_encode_string(d, &el->el_scratch)));
- ELRE_DEBUG(1, (__F, "s == \"%s\"\n", ct_encode_string(s,
- &el->el_scratch)));
-
- /* copy the characters */
- for (a = d + dat; (a < d + dlen) && (num > 0); num--)
- *a++ = *s++;
-
-#ifdef notyet
- /* ct_encode_string() uses a static buffer, so we can't conveniently
- * encode both d & s here */
- ELRE_DEBUG(1,
- (__F, "re_insert() after copy: %d at %d max %d, %s == \"%s\"\n",
- num, dat, dlen, d, s));
- ELRE_DEBUG(1, (__F, "s == \"%s\"\n", s));
-#endif
-}
-
-
-/* re_delete():
- * delete num characters d at dat, maximum length of d is dlen
- */
-private void
-/*ARGSUSED*/
-re_delete(EditLine *el __attribute__((__unused__)),
- Char *d, int dat, int dlen, int num)
-{
- Char *a, *b;
-
- if (num <= 0)
- return;
- if (dat + num >= dlen) {
- d[dat] = '\0';
- return;
- }
- ELRE_DEBUG(1,
- (__F, "re_delete() starting: %d at %d max %d, d == \"%s\"\n",
- num, dat, dlen, ct_encode_string(d, &el->el_scratch)));
-
- /* open up the space for num chars */
- if (num > 0) {
- b = d + dat;
- a = b + num;
- while (a < &d[dlen])
- *b++ = *a++;
- d[dlen] = '\0'; /* just in case */
- }
- ELRE_DEBUG(1,
- (__F, "re_delete() after delete: %d at %d max %d, d == \"%s\"\n",
- num, dat, dlen, ct_encode_string(d, &el->el_scratch)));
-}
-
-
-/* re__strncopy():
- * Like strncpy without padding.
- */
-private void
-re__strncopy(Char *a, Char *b, size_t n)
-{
-
- while (n-- && *b)
- *a++ = *b++;
-}
-
-/* re_clear_eol():
- * Find the number of characters we need to clear till the end of line
- * in order to make sure that we have cleared the previous contents of
- * the line. fx and sx is the number of characters inserted or deleted
- * in the first or second diff, diff is the difference between the
- * number of characters between the new and old line.
- */
-private void
-re_clear_eol(EditLine *el, int fx, int sx, int diff)
-{
-
- ELRE_DEBUG(1, (__F, "re_clear_eol sx %d, fx %d, diff %d\n",
- sx, fx, diff));
-
- if (fx < 0)
- fx = -fx;
- if (sx < 0)
- sx = -sx;
- if (fx > diff)
- diff = fx;
- if (sx > diff)
- diff = sx;
-
- ELRE_DEBUG(1, (__F, "re_clear_eol %d\n", diff));
- terminal_clear_EOL(el, diff);
-}
-
-/*****************************************************************
- re_update_line() is based on finding the middle difference of each line
- on the screen; vis:
-
- /old first difference
- /beginning of line | /old last same /old EOL
- v v v v
-old: eddie> Oh, my little gruntle-buggy is to me, as lurgid as
-new: eddie> Oh, my little buggy says to me, as lurgid as
- ^ ^ ^ ^
- \beginning of line | \new last same \new end of line
- \new first difference
-
- all are character pointers for the sake of speed. Special cases for
- no differences, as well as for end of line additions must be handled.
-**************************************************************** */
-
-/* Minimum at which doing an insert it "worth it". This should be about
- * half the "cost" of going into insert mode, inserting a character, and
- * going back out. This should really be calculated from the termcap
- * data... For the moment, a good number for ANSI terminals.
- */
-#define MIN_END_KEEP 4
-
-private void
-re_update_line(EditLine *el, Char *old, Char *new, int i)
-{
- Char *o, *n, *p, c;
- Char *ofd, *ols, *oe, *nfd, *nls, *ne;
- Char *osb, *ose, *nsb, *nse;
- int fx, sx;
- size_t len;
-
- /*
- * find first diff
- */
- for (o = old, n = new; *o && (*o == *n); o++, n++)
- continue;
- ofd = o;
- nfd = n;
-
- /*
- * Find the end of both old and new
- */
- while (*o)
- o++;
- /*
- * Remove any trailing blanks off of the end, being careful not to
- * back up past the beginning.
- */
- while (ofd < o) {
- if (o[-1] != ' ')
- break;
- o--;
- }
- oe = o;
- *oe = '\0';
-
- while (*n)
- n++;
-
- /* remove blanks from end of new */
- while (nfd < n) {
- if (n[-1] != ' ')
- break;
- n--;
- }
- ne = n;
- *ne = '\0';
-
- /*
- * if no diff, continue to next line of redraw
- */
- if (*ofd == '\0' && *nfd == '\0') {
- ELRE_DEBUG(1, (__F, "no difference.\r\n"));
- return;
- }
- /*
- * find last same pointer
- */
- while ((o > ofd) && (n > nfd) && (*--o == *--n))
- continue;
- ols = ++o;
- nls = ++n;
-
- /*
- * find same beginning and same end
- */
- osb = ols;
- nsb = nls;
- ose = ols;
- nse = nls;
-
- /*
- * case 1: insert: scan from nfd to nls looking for *ofd
- */
- if (*ofd) {
- for (c = *ofd, n = nfd; n < nls; n++) {
- if (c == *n) {
- for (o = ofd, p = n;
- p < nls && o < ols && *o == *p;
- o++, p++)
- continue;
- /*
- * if the new match is longer and it's worth
- * keeping, then we take it
- */
- if (((nse - nsb) < (p - n)) &&
- (2 * (p - n) > n - nfd)) {
- nsb = n;
- nse = p;
- osb = ofd;
- ose = o;
- }
- }
- }
- }
- /*
- * case 2: delete: scan from ofd to ols looking for *nfd
- */
- if (*nfd) {
- for (c = *nfd, o = ofd; o < ols; o++) {
- if (c == *o) {
- for (n = nfd, p = o;
- p < ols && n < nls && *p == *n;
- p++, n++)
- continue;
- /*
- * if the new match is longer and it's worth
- * keeping, then we take it
- */
- if (((ose - osb) < (p - o)) &&
- (2 * (p - o) > o - ofd)) {
- nsb = nfd;
- nse = n;
- osb = o;
- ose = p;
- }
- }
- }
- }
- /*
- * Pragmatics I: If old trailing whitespace or not enough characters to
- * save to be worth it, then don't save the last same info.
- */
- if ((oe - ols) < MIN_END_KEEP) {
- ols = oe;
- nls = ne;
- }
- /*
- * Pragmatics II: if the terminal isn't smart enough, make the data
- * dumber so the smart update doesn't try anything fancy
- */
-
- /*
- * fx is the number of characters we need to insert/delete: in the
- * beginning to bring the two same begins together
- */
- fx = (int)((nsb - nfd) - (osb - ofd));
- /*
- * sx is the number of characters we need to insert/delete: in the
- * end to bring the two same last parts together
- */
- sx = (int)((nls - nse) - (ols - ose));
-
- if (!EL_CAN_INSERT) {
- if (fx > 0) {
- osb = ols;
- ose = ols;
- nsb = nls;
- nse = nls;
- }
- if (sx > 0) {
- ols = oe;
- nls = ne;
- }
- if ((ols - ofd) < (nls - nfd)) {
- ols = oe;
- nls = ne;
- }
- }
- if (!EL_CAN_DELETE) {
- if (fx < 0) {
- osb = ols;
- ose = ols;
- nsb = nls;
- nse = nls;
- }
- if (sx < 0) {
- ols = oe;
- nls = ne;
- }
- if ((ols - ofd) > (nls - nfd)) {
- ols = oe;
- nls = ne;
- }
- }
- /*
- * Pragmatics III: make sure the middle shifted pointers are correct if
- * they don't point to anything (we may have moved ols or nls).
- */
- /* if the change isn't worth it, don't bother */
- /* was: if (osb == ose) */
- if ((ose - osb) < MIN_END_KEEP) {
- osb = ols;
- ose = ols;
- nsb = nls;
- nse = nls;
- }
- /*
- * Now that we are done with pragmatics we recompute fx, sx
- */
- fx = (int)((nsb - nfd) - (osb - ofd));
- sx = (int)((nls - nse) - (ols - ose));
-
- ELRE_DEBUG(1, (__F, "fx %d, sx %d\n", fx, sx));
- ELRE_DEBUG(1, (__F, "ofd %td, osb %td, ose %td, ols %td, oe %td\n",
- ofd - old, osb - old, ose - old, ols - old, oe - old));
- ELRE_DEBUG(1, (__F, "nfd %td, nsb %td, nse %td, nls %td, ne %td\n",
- nfd - new, nsb - new, nse - new, nls - new, ne - new));
- ELRE_DEBUG(1, (__F,
- "xxx-xxx:\"00000000001111111111222222222233333333334\"\r\n"));
- ELRE_DEBUG(1, (__F,
- "xxx-xxx:\"01234567890123456789012345678901234567890\"\r\n"));
-#ifdef DEBUG_REFRESH
- re_printstr(el, "old- oe", old, oe);
- re_printstr(el, "new- ne", new, ne);
- re_printstr(el, "old-ofd", old, ofd);
- re_printstr(el, "new-nfd", new, nfd);
- re_printstr(el, "ofd-osb", ofd, osb);
- re_printstr(el, "nfd-nsb", nfd, nsb);
- re_printstr(el, "osb-ose", osb, ose);
- re_printstr(el, "nsb-nse", nsb, nse);
- re_printstr(el, "ose-ols", ose, ols);
- re_printstr(el, "nse-nls", nse, nls);
- re_printstr(el, "ols- oe", ols, oe);
- re_printstr(el, "nls- ne", nls, ne);
-#endif /* DEBUG_REFRESH */
-
- /*
- * el_cursor.v to this line i MUST be in this routine so that if we
- * don't have to change the line, we don't move to it. el_cursor.h to
- * first diff char
- */
- terminal_move_to_line(el, i);
-
- /*
- * at this point we have something like this:
- *
- * /old /ofd /osb /ose /ols /oe
- * v.....................v v..................v v........v
- * eddie> Oh, my fredded gruntle-buggy is to me, as foo var lurgid as
- * eddie> Oh, my fredded quiux buggy is to me, as gruntle-lurgid as
- * ^.....................^ ^..................^ ^........^
- * \new \nfd \nsb \nse \nls \ne
- *
- * fx is the difference in length between the chars between nfd and
- * nsb, and the chars between ofd and osb, and is thus the number of
- * characters to delete if < 0 (new is shorter than old, as above),
- * or insert (new is longer than short).
- *
- * sx is the same for the second differences.
- */
-
- /*
- * if we have a net insert on the first difference, AND inserting the
- * net amount ((nsb-nfd) - (osb-ofd)) won't push the last useful
- * character (which is ne if nls != ne, otherwise is nse) off the edge
- * of the screen (el->el_terminal.t_size.h) else we do the deletes first
- * so that we keep everything we need to.
- */
-
- /*
- * if the last same is the same like the end, there is no last same
- * part, otherwise we want to keep the last same part set p to the
- * last useful old character
- */
- p = (ols != oe) ? oe : ose;
-
- /*
- * if (There is a diffence in the beginning) && (we need to insert
- * characters) && (the number of characters to insert is less than
- * the term width)
- * We need to do an insert!
- * else if (we need to delete characters)
- * We need to delete characters!
- * else
- * No insert or delete
- */
- if ((nsb != nfd) && fx > 0 &&
- ((p - old) + fx <= el->el_terminal.t_size.h)) {
- ELRE_DEBUG(1,
- (__F, "first diff insert at %td...\r\n", nfd - new));
- /*
- * Move to the first char to insert, where the first diff is.
- */
- terminal_move_to_char(el, (int)(nfd - new));
- /*
- * Check if we have stuff to keep at end
- */
- if (nsb != ne) {
- ELRE_DEBUG(1, (__F, "with stuff to keep at end\r\n"));
- /*
- * insert fx chars of new starting at nfd
- */
- if (fx > 0) {
- ELRE_DEBUG(!EL_CAN_INSERT, (__F,
- "ERROR: cannot insert in early first diff\n"));
- terminal_insertwrite(el, nfd, fx);
- re_insert(el, old, (int)(ofd - old),
- el->el_terminal.t_size.h, nfd, fx);
- }
- /*
- * write (nsb-nfd) - fx chars of new starting at
- * (nfd + fx)
- */
- len = (size_t) ((nsb - nfd) - fx);
- terminal_overwrite(el, (nfd + fx), len);
- re__strncopy(ofd + fx, nfd + fx, len);
- } else {
- ELRE_DEBUG(1, (__F, "without anything to save\r\n"));
- len = (size_t)(nsb - nfd);
- terminal_overwrite(el, nfd, len);
- re__strncopy(ofd, nfd, len);
- /*
- * Done
- */
- return;
- }
- } else if (fx < 0) {
- ELRE_DEBUG(1,
- (__F, "first diff delete at %td...\r\n", ofd - old));
- /*
- * move to the first char to delete where the first diff is
- */
- terminal_move_to_char(el, (int)(ofd - old));
- /*
- * Check if we have stuff to save
- */
- if (osb != oe) {
- ELRE_DEBUG(1, (__F, "with stuff to save at end\r\n"));
- /*
- * fx is less than zero *always* here but we check
- * for code symmetry
- */
- if (fx < 0) {
- ELRE_DEBUG(!EL_CAN_DELETE, (__F,
- "ERROR: cannot delete in first diff\n"));
- terminal_deletechars(el, -fx);
- re_delete(el, old, (int)(ofd - old),
- el->el_terminal.t_size.h, -fx);
- }
- /*
- * write (nsb-nfd) chars of new starting at nfd
- */
- len = (size_t) (nsb - nfd);
- terminal_overwrite(el, nfd, len);
- re__strncopy(ofd, nfd, len);
-
- } else {
- ELRE_DEBUG(1, (__F,
- "but with nothing left to save\r\n"));
- /*
- * write (nsb-nfd) chars of new starting at nfd
- */
- terminal_overwrite(el, nfd, (size_t)(nsb - nfd));
- re_clear_eol(el, fx, sx,
- (int)((oe - old) - (ne - new)));
- /*
- * Done
- */
- return;
- }
- } else
- fx = 0;
-
- if (sx < 0 && (ose - old) + fx < el->el_terminal.t_size.h) {
- ELRE_DEBUG(1, (__F,
- "second diff delete at %td...\r\n", (ose - old) + fx));
- /*
- * Check if we have stuff to delete
- */
- /*
- * fx is the number of characters inserted (+) or deleted (-)
- */
-
- terminal_move_to_char(el, (int)((ose - old) + fx));
- /*
- * Check if we have stuff to save
- */
- if (ols != oe) {
- ELRE_DEBUG(1, (__F, "with stuff to save at end\r\n"));
- /*
- * Again a duplicate test.
- */
- if (sx < 0) {
- ELRE_DEBUG(!EL_CAN_DELETE, (__F,
- "ERROR: cannot delete in second diff\n"));
- terminal_deletechars(el, -sx);
- }
- /*
- * write (nls-nse) chars of new starting at nse
- */
- terminal_overwrite(el, nse, (size_t)(nls - nse));
- } else {
- ELRE_DEBUG(1, (__F,
- "but with nothing left to save\r\n"));
- terminal_overwrite(el, nse, (size_t)(nls - nse));
- re_clear_eol(el, fx, sx,
- (int)((oe - old) - (ne - new)));
- }
- }
- /*
- * if we have a first insert AND WE HAVEN'T ALREADY DONE IT...
- */
- if ((nsb != nfd) && (osb - ofd) <= (nsb - nfd) && (fx == 0)) {
- ELRE_DEBUG(1, (__F, "late first diff insert at %td...\r\n",
- nfd - new));
-
- terminal_move_to_char(el, (int)(nfd - new));
- /*
- * Check if we have stuff to keep at the end
- */
- if (nsb != ne) {
- ELRE_DEBUG(1, (__F, "with stuff to keep at end\r\n"));
- /*
- * We have to recalculate fx here because we set it
- * to zero above as a flag saying that we hadn't done
- * an early first insert.
- */
- fx = (int)((nsb - nfd) - (osb - ofd));
- if (fx > 0) {
- /*
- * insert fx chars of new starting at nfd
- */
- ELRE_DEBUG(!EL_CAN_INSERT, (__F,
- "ERROR: cannot insert in late first diff\n"));
- terminal_insertwrite(el, nfd, fx);
- re_insert(el, old, (int)(ofd - old),
- el->el_terminal.t_size.h, nfd, fx);
- }
- /*
- * write (nsb-nfd) - fx chars of new starting at
- * (nfd + fx)
- */
- len = (size_t) ((nsb - nfd) - fx);
- terminal_overwrite(el, (nfd + fx), len);
- re__strncopy(ofd + fx, nfd + fx, len);
- } else {
- ELRE_DEBUG(1, (__F, "without anything to save\r\n"));
- len = (size_t) (nsb - nfd);
- terminal_overwrite(el, nfd, len);
- re__strncopy(ofd, nfd, len);
- }
- }
- /*
- * line is now NEW up to nse
- */
- if (sx >= 0) {
- ELRE_DEBUG(1, (__F,
- "second diff insert at %d...\r\n", (int)(nse - new)));
- terminal_move_to_char(el, (int)(nse - new));
- if (ols != oe) {
- ELRE_DEBUG(1, (__F, "with stuff to keep at end\r\n"));
- if (sx > 0) {
- /* insert sx chars of new starting at nse */
- ELRE_DEBUG(!EL_CAN_INSERT, (__F,
- "ERROR: cannot insert in second diff\n"));
- terminal_insertwrite(el, nse, sx);
- }
- /*
- * write (nls-nse) - sx chars of new starting at
- * (nse + sx)
- */
- terminal_overwrite(el, (nse + sx),
- (size_t)((nls - nse) - sx));
- } else {
- ELRE_DEBUG(1, (__F, "without anything to save\r\n"));
- terminal_overwrite(el, nse, (size_t)(nls - nse));
-
- /*
- * No need to do a clear-to-end here because we were
- * doing a second insert, so we will have over
- * written all of the old string.
- */
- }
- }
- ELRE_DEBUG(1, (__F, "done.\r\n"));
-}
-
-
-/* re__copy_and_pad():
- * Copy string and pad with spaces
- */
-private void
-re__copy_and_pad(Char *dst, const Char *src, size_t width)
-{
- size_t i;
-
- for (i = 0; i < width; i++) {
- if (*src == '\0')
- break;
- *dst++ = *src++;
- }
-
- for (; i < width; i++)
- *dst++ = ' ';
-
- *dst = '\0';
-}
-
-
-/* re_refresh_cursor():
- * Move to the new cursor position
- */
-protected void
-re_refresh_cursor(EditLine *el)
-{
- Char *cp;
- int h, v, th, w;
-
- if (el->el_line.cursor >= el->el_line.lastchar) {
- if (el->el_map.current == el->el_map.alt
- && el->el_line.lastchar != el->el_line.buffer)
- el->el_line.cursor = el->el_line.lastchar - 1;
- else
- el->el_line.cursor = el->el_line.lastchar;
- }
-
- /* first we must find where the cursor is... */
- h = el->el_prompt.p_pos.h;
- v = el->el_prompt.p_pos.v;
- th = el->el_terminal.t_size.h; /* optimize for speed */
-
- /* do input buffer to el->el_line.cursor */
- for (cp = el->el_line.buffer; cp < el->el_line.cursor; cp++) {
- switch (ct_chr_class(*cp)) {
- case CHTYPE_NL: /* handle newline in data part too */
- h = 0;
- v++;
- break;
- case CHTYPE_TAB: /* if a tab, to next tab stop */
- while (++h & 07)
- continue;
- break;
- default:
- w = Width(*cp);
- if (w > 1 && h + w > th) { /* won't fit on line */
- h = 0;
- v++;
- }
- h += ct_visual_width(*cp);
- break;
- }
-
- if (h >= th) { /* check, extra long tabs picked up here also */
- h -= th;
- v++;
- }
- }
- /* if we have a next character, and it's a doublewidth one, we need to
- * check whether we need to linebreak for it to fit */
- if (cp < el->el_line.lastchar && (w = Width(*cp)) > 1)
- if (h + w > th) {
- h = 0;
- v++;
- }
-
- /* now go there */
- terminal_move_to_line(el, v);
- terminal_move_to_char(el, h);
- terminal__flush(el);
-}
-
-
-/* re_fastputc():
- * Add a character fast.
- */
-private void
-re_fastputc(EditLine *el, wint_t c)
-{
- int w = Width((Char)c);
- while (w > 1 && el->el_cursor.h + w > el->el_terminal.t_size.h)
- re_fastputc(el, ' ');
-
- terminal__putc(el, c);
- el->el_display[el->el_cursor.v][el->el_cursor.h++] = (Char)c;
- while (--w > 0)
- el->el_display[el->el_cursor.v][el->el_cursor.h++]
- = MB_FILL_CHAR;
-
- if (el->el_cursor.h >= el->el_terminal.t_size.h) {
- /* if we must overflow */
- el->el_cursor.h = 0;
-
- /*
- * If we would overflow (input is longer than terminal size),
- * emulate scroll by dropping first line and shuffling the rest.
- * We do this via pointer shuffling - it's safe in this case
- * and we avoid memcpy().
- */
- if (el->el_cursor.v + 1 >= el->el_terminal.t_size.v) {
- int i, lins = el->el_terminal.t_size.v;
- Char *firstline = el->el_display[0];
-
- for(i = 1; i < lins; i++)
- el->el_display[i - 1] = el->el_display[i];
-
- re__copy_and_pad(firstline, STR(""), (size_t)0);
- el->el_display[i - 1] = firstline;
- } else {
- el->el_cursor.v++;
- el->el_refresh.r_oldcv++;
- }
- if (EL_HAS_AUTO_MARGINS) {
- if (EL_HAS_MAGIC_MARGINS) {
- terminal__putc(el, ' ');
- terminal__putc(el, '\b');
- }
- } else {
- terminal__putc(el, '\r');
- terminal__putc(el, '\n');
- }
- }
-}
-
-
-/* re_fastaddc():
- * we added just one char, handle it fast.
- * Assumes that screen cursor == real cursor
- */
-protected void
-re_fastaddc(EditLine *el)
-{
- Char c;
- int rhdiff;
-
- c = el->el_line.cursor[-1];
-
- if (c == '\t' || el->el_line.cursor != el->el_line.lastchar) {
- re_refresh(el); /* too hard to handle */
- return;
- }
- rhdiff = el->el_terminal.t_size.h - el->el_cursor.h -
- el->el_rprompt.p_pos.h;
- if (el->el_rprompt.p_pos.h && rhdiff < 3) {
- re_refresh(el); /* clear out rprompt if less than 1 char gap */
- return;
- } /* else (only do at end of line, no TAB) */
- switch (ct_chr_class(c)) {
- case CHTYPE_TAB: /* already handled, should never happen here */
- break;
- case CHTYPE_NL:
- case CHTYPE_PRINT:
- re_fastputc(el, c);
- break;
- case CHTYPE_ASCIICTL:
- case CHTYPE_NONPRINT: {
- Char visbuf[VISUAL_WIDTH_MAX];
- ssize_t i, n =
- ct_visual_char(visbuf, VISUAL_WIDTH_MAX, (Char)c);
- for (i = 0; n-- > 0; ++i)
- re_fastputc(el, visbuf[i]);
- break;
- }
- }
- terminal__flush(el);
-}
-
-
-/* re_clear_display():
- * clear the screen buffers so that new prompt starts fresh.
- */
-protected void
-re_clear_display(EditLine *el)
-{
- int i;
-
- el->el_cursor.v = 0;
- el->el_cursor.h = 0;
- for (i = 0; i < el->el_terminal.t_size.v; i++)
- el->el_display[i][0] = '\0';
- el->el_refresh.r_oldcv = 0;
-}
-
-
-/* re_clear_lines():
- * Make sure all lines are *really* blank
- */
-protected void
-re_clear_lines(EditLine *el)
-{
-
- if (EL_CAN_CEOL) {
- int i;
- for (i = el->el_refresh.r_oldcv; i >= 0; i--) {
- /* for each line on the screen */
- terminal_move_to_line(el, i);
- terminal_move_to_char(el, 0);
- terminal_clear_EOL(el, el->el_terminal.t_size.h);
- }
- } else {
- terminal_move_to_line(el, el->el_refresh.r_oldcv);
- /* go to last line */
- terminal__putc(el, '\r'); /* go to BOL */
- terminal__putc(el, '\n'); /* go to new line */
- }
-}
diff --git a/lib/libedit/refresh.h b/lib/libedit/refresh.h
deleted file mode 100644
index b9c4b30ea961..000000000000
--- a/lib/libedit/refresh.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* $NetBSD: refresh.h,v 1.9 2016/02/16 15:53:48 christos Exp $ */
-
-/*-
- * 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.
- *
- * @(#)refresh.h 8.1 (Berkeley) 6/4/93
- * $FreeBSD$
- */
-
-/*
- * el.refresh.h: Screen refresh functions
- */
-#ifndef _h_el_refresh
-#define _h_el_refresh
-
-typedef struct {
- coord_t r_cursor; /* Refresh cursor position */
- int r_oldcv; /* Vertical locations */
- int r_newcv;
-} el_refresh_t;
-
-protected void re_putc(EditLine *, wint_t, int);
-protected void re_clear_lines(EditLine *);
-protected void re_clear_display(EditLine *);
-protected void re_refresh(EditLine *);
-protected void re_refresh_cursor(EditLine *);
-protected void re_fastaddc(EditLine *);
-protected void re_goto_bottom(EditLine *);
-
-#endif /* _h_el_refresh */
diff --git a/lib/libedit/search.c b/lib/libedit/search.c
deleted file mode 100644
index 53ad6efae35f..000000000000
--- a/lib/libedit/search.c
+++ /dev/null
@@ -1,647 +0,0 @@
-/* $NetBSD: search.c,v 1.39 2016/02/24 14:25:38 christos Exp $ */
-
-/*-
- * 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.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-#if 0
-static char sccsid[] = "@(#)search.c 8.1 (Berkeley) 6/4/93";
-#else
-__RCSID("$NetBSD: search.c,v 1.39 2016/02/24 14:25:38 christos Exp $");
-#endif
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * search.c: History and character search functions
- */
-#include <stdlib.h>
-#include <string.h>
-#if defined(REGEX)
-#include <regex.h>
-#elif defined(REGEXP)
-#include <regexp.h>
-#endif
-
-#include "el.h"
-#include "common.h"
-
-/*
- * Adjust cursor in vi mode to include the character under it
- */
-#define EL_CURSOR(el) \
- ((el)->el_line.cursor + (((el)->el_map.type == MAP_VI) && \
- ((el)->el_map.current == (el)->el_map.alt)))
-
-/* search_init():
- * Initialize the search stuff
- */
-protected int
-search_init(EditLine *el)
-{
-
- el->el_search.patbuf = el_malloc(EL_BUFSIZ *
- sizeof(*el->el_search.patbuf));
- if (el->el_search.patbuf == NULL)
- return -1;
- el->el_search.patlen = 0;
- el->el_search.patdir = -1;
- el->el_search.chacha = '\0';
- el->el_search.chadir = CHAR_FWD;
- el->el_search.chatflg = 0;
- return 0;
-}
-
-
-/* search_end():
- * Initialize the search stuff
- */
-protected void
-search_end(EditLine *el)
-{
-
- el_free(el->el_search.patbuf);
- el->el_search.patbuf = NULL;
-}
-
-
-#ifdef REGEXP
-/* regerror():
- * Handle regular expression errors
- */
-public void
-/*ARGSUSED*/
-regerror(const char *msg)
-{
-}
-#endif
-
-
-/* el_match():
- * Return if string matches pattern
- */
-protected int
-el_match(const Char *str, const Char *pat)
-{
-#ifdef WIDECHAR
- static ct_buffer_t conv;
-#endif
-#if defined (REGEX)
- regex_t re;
- int rv;
-#elif defined (REGEXP)
- regexp *rp;
- int rv;
-#else
- extern char *re_comp(const char *);
- extern int re_exec(const char *);
-#endif
-
- if (Strstr(str, pat) != 0)
- return 1;
-
-#if defined(REGEX)
- if (regcomp(&re, ct_encode_string(pat, &conv), 0) == 0) {
- rv = regexec(&re, ct_encode_string(str, &conv), (size_t)0, NULL,
- 0) == 0;
- regfree(&re);
- } else {
- rv = 0;
- }
- return rv;
-#elif defined(REGEXP)
- if ((re = regcomp(ct_encode_string(pat, &conv))) != NULL) {
- rv = regexec(re, ct_encode_string(str, &conv));
- el_free(re);
- } else {
- rv = 0;
- }
- return rv;
-#else
- if (re_comp(ct_encode_string(pat, &conv)) != NULL)
- return 0;
- else
- return re_exec(ct_encode_string(str, &conv)) == 1;
-#endif
-}
-
-
-/* c_hmatch():
- * return True if the pattern matches the prefix
- */
-protected int
-c_hmatch(EditLine *el, const Char *str)
-{
-#ifdef SDEBUG
- (void) fprintf(el->el_errfile, "match `%s' with `%s'\n",
- el->el_search.patbuf, str);
-#endif /* SDEBUG */
-
- return el_match(str, el->el_search.patbuf);
-}
-
-
-/* c_setpat():
- * Set the history seatch pattern
- */
-protected void
-c_setpat(EditLine *el)
-{
- if (el->el_state.lastcmd != ED_SEARCH_PREV_HISTORY &&
- el->el_state.lastcmd != ED_SEARCH_NEXT_HISTORY) {
- el->el_search.patlen =
- (size_t)(EL_CURSOR(el) - el->el_line.buffer);
- if (el->el_search.patlen >= EL_BUFSIZ)
- el->el_search.patlen = EL_BUFSIZ - 1;
- if (el->el_search.patlen != 0) {
- (void) Strncpy(el->el_search.patbuf, el->el_line.buffer,
- el->el_search.patlen);
- el->el_search.patbuf[el->el_search.patlen] = '\0';
- } else
- el->el_search.patlen = Strlen(el->el_search.patbuf);
- }
-#ifdef SDEBUG
- (void) fprintf(el->el_errfile, "\neventno = %d\n",
- el->el_history.eventno);
- (void) fprintf(el->el_errfile, "patlen = %d\n", el->el_search.patlen);
- (void) fprintf(el->el_errfile, "patbuf = \"%s\"\n",
- el->el_search.patbuf);
- (void) fprintf(el->el_errfile, "cursor %d lastchar %d\n",
- EL_CURSOR(el) - el->el_line.buffer,
- el->el_line.lastchar - el->el_line.buffer);
-#endif
-}
-
-
-/* ce_inc_search():
- * Emacs incremental search
- */
-protected el_action_t
-ce_inc_search(EditLine *el, int dir)
-{
- static const Char STRfwd[] = {'f', 'w', 'd', '\0'},
- STRbck[] = {'b', 'c', 'k', '\0'};
- static Char pchar = ':';/* ':' = normal, '?' = failed */
- static Char endcmd[2] = {'\0', '\0'};
- Char *ocursor = el->el_line.cursor, oldpchar = pchar, ch;
- const Char *cp;
- wchar_t wch;
-
- el_action_t ret = CC_NORM;
-
- int ohisteventno = el->el_history.eventno;
- size_t oldpatlen = el->el_search.patlen;
- int newdir = dir;
- int done, redo;
-
- if (el->el_line.lastchar + sizeof(STRfwd) /
- sizeof(*el->el_line.lastchar) + 2 +
- el->el_search.patlen >= el->el_line.limit)
- return CC_ERROR;
-
- for (;;) {
-
- if (el->el_search.patlen == 0) { /* first round */
- pchar = ':';
-#ifdef ANCHOR
-#define LEN 2
- el->el_search.patbuf[el->el_search.patlen++] = '.';
- el->el_search.patbuf[el->el_search.patlen++] = '*';
-#else
-#define LEN 0
-#endif
- }
- done = redo = 0;
- *el->el_line.lastchar++ = '\n';
- for (cp = (newdir == ED_SEARCH_PREV_HISTORY) ? STRbck : STRfwd;
- *cp; *el->el_line.lastchar++ = *cp++)
- continue;
- *el->el_line.lastchar++ = pchar;
- for (cp = &el->el_search.patbuf[LEN];
- cp < &el->el_search.patbuf[el->el_search.patlen];
- *el->el_line.lastchar++ = *cp++)
- continue;
- *el->el_line.lastchar = '\0';
- re_refresh(el);
-
- if (el_wgetc(el, &wch) != 1)
- return ed_end_of_file(el, 0);
-
- ch = (Char)wch;
-
- switch (el->el_map.current[(unsigned char) ch]) {
- case ED_INSERT:
- case ED_DIGIT:
- if (el->el_search.patlen >= EL_BUFSIZ - LEN)
- terminal_beep(el);
- else {
- el->el_search.patbuf[el->el_search.patlen++] =
- ch;
- *el->el_line.lastchar++ = ch;
- *el->el_line.lastchar = '\0';
- re_refresh(el);
- }
- break;
-
- case EM_INC_SEARCH_NEXT:
- newdir = ED_SEARCH_NEXT_HISTORY;
- redo++;
- break;
-
- case EM_INC_SEARCH_PREV:
- newdir = ED_SEARCH_PREV_HISTORY;
- redo++;
- break;
-
- case EM_DELETE_PREV_CHAR:
- case ED_DELETE_PREV_CHAR:
- if (el->el_search.patlen > LEN)
- done++;
- else
- terminal_beep(el);
- break;
-
- default:
- switch (ch) {
- case 0007: /* ^G: Abort */
- ret = CC_ERROR;
- done++;
- break;
-
- case 0027: /* ^W: Append word */
- /* No can do if globbing characters in pattern */
- for (cp = &el->el_search.patbuf[LEN];; cp++)
- if (cp >= &el->el_search.patbuf[
- el->el_search.patlen]) {
- el->el_line.cursor +=
- el->el_search.patlen - LEN - 1;
- cp = c__next_word(el->el_line.cursor,
- el->el_line.lastchar, 1,
- ce__isword);
- while (el->el_line.cursor < cp &&
- *el->el_line.cursor != '\n') {
- if (el->el_search.patlen >=
- EL_BUFSIZ - LEN) {
- terminal_beep(el);
- break;
- }
- el->el_search.patbuf[el->el_search.patlen++] =
- *el->el_line.cursor;
- *el->el_line.lastchar++ =
- *el->el_line.cursor++;
- }
- el->el_line.cursor = ocursor;
- *el->el_line.lastchar = '\0';
- re_refresh(el);
- break;
- } else if (isglob(*cp)) {
- terminal_beep(el);
- break;
- }
- break;
-
- default: /* Terminate and execute cmd */
- endcmd[0] = ch;
- FUN(el,push)(el, endcmd);
- /* FALLTHROUGH */
-
- case 0033: /* ESC: Terminate */
- ret = CC_REFRESH;
- done++;
- break;
- }
- break;
- }
-
- while (el->el_line.lastchar > el->el_line.buffer &&
- *el->el_line.lastchar != '\n')
- *el->el_line.lastchar-- = '\0';
- *el->el_line.lastchar = '\0';
-
- if (!done) {
-
- /* Can't search if unmatched '[' */
- for (cp = &el->el_search.patbuf[el->el_search.patlen-1],
- ch = L']';
- cp >= &el->el_search.patbuf[LEN];
- cp--)
- if (*cp == '[' || *cp == ']') {
- ch = *cp;
- break;
- }
- if (el->el_search.patlen > LEN && ch != L'[') {
- if (redo && newdir == dir) {
- if (pchar == '?') { /* wrap around */
- el->el_history.eventno =
- newdir == ED_SEARCH_PREV_HISTORY ? 0 : 0x7fffffff;
- if (hist_get(el) == CC_ERROR)
- /* el->el_history.event
- * no was fixed by
- * first call */
- (void) hist_get(el);
- el->el_line.cursor = newdir ==
- ED_SEARCH_PREV_HISTORY ?
- el->el_line.lastchar :
- el->el_line.buffer;
- } else
- el->el_line.cursor +=
- newdir ==
- ED_SEARCH_PREV_HISTORY ?
- -1 : 1;
- }
-#ifdef ANCHOR
- el->el_search.patbuf[el->el_search.patlen++] =
- '.';
- el->el_search.patbuf[el->el_search.patlen++] =
- '*';
-#endif
- el->el_search.patbuf[el->el_search.patlen] =
- '\0';
- if (el->el_line.cursor < el->el_line.buffer ||
- el->el_line.cursor > el->el_line.lastchar ||
- (ret = ce_search_line(el, newdir))
- == CC_ERROR) {
- /* avoid c_setpat */
- el->el_state.lastcmd =
- (el_action_t) newdir;
- ret = (el_action_t)
- (newdir == ED_SEARCH_PREV_HISTORY ?
- ed_search_prev_history(el, 0) :
- ed_search_next_history(el, 0));
- if (ret != CC_ERROR) {
- el->el_line.cursor = newdir ==
- ED_SEARCH_PREV_HISTORY ?
- el->el_line.lastchar :
- el->el_line.buffer;
- (void) ce_search_line(el,
- newdir);
- }
- }
- el->el_search.patlen -= LEN;
- el->el_search.patbuf[el->el_search.patlen] =
- '\0';
- if (ret == CC_ERROR) {
- terminal_beep(el);
- if (el->el_history.eventno !=
- ohisteventno) {
- el->el_history.eventno =
- ohisteventno;
- if (hist_get(el) == CC_ERROR)
- return CC_ERROR;
- }
- el->el_line.cursor = ocursor;
- pchar = '?';
- } else {
- pchar = ':';
- }
- }
- ret = ce_inc_search(el, newdir);
-
- if (ret == CC_ERROR && pchar == '?' && oldpchar == ':')
- /*
- * break abort of failed search at last
- * non-failed
- */
- ret = CC_NORM;
-
- }
- if (ret == CC_NORM || (ret == CC_ERROR && oldpatlen == 0)) {
- /* restore on normal return or error exit */
- pchar = oldpchar;
- el->el_search.patlen = oldpatlen;
- if (el->el_history.eventno != ohisteventno) {
- el->el_history.eventno = ohisteventno;
- if (hist_get(el) == CC_ERROR)
- return CC_ERROR;
- }
- el->el_line.cursor = ocursor;
- if (ret == CC_ERROR)
- re_refresh(el);
- }
- if (done || ret != CC_NORM)
- return ret;
- }
-}
-
-
-/* cv_search():
- * Vi search.
- */
-protected el_action_t
-cv_search(EditLine *el, int dir)
-{
- Char ch;
- Char tmpbuf[EL_BUFSIZ];
- ssize_t tmplen;
-
-#ifdef ANCHOR
- tmpbuf[0] = '.';
- tmpbuf[1] = '*';
-#endif
- tmplen = LEN;
-
- el->el_search.patdir = dir;
-
- tmplen = c_gets(el, &tmpbuf[LEN],
- dir == ED_SEARCH_PREV_HISTORY ? STR("\n/") : STR("\n?") );
- if (tmplen == -1)
- return CC_REFRESH;
-
- tmplen += LEN;
- ch = tmpbuf[tmplen];
- tmpbuf[tmplen] = '\0';
-
- if (tmplen == LEN) {
- /*
- * Use the old pattern, but wild-card it.
- */
- if (el->el_search.patlen == 0) {
- re_refresh(el);
- return CC_ERROR;
- }
-#ifdef ANCHOR
- if (el->el_search.patbuf[0] != '.' &&
- el->el_search.patbuf[0] != '*') {
- (void) Strncpy(tmpbuf, el->el_search.patbuf,
- sizeof(tmpbuf) / sizeof(*tmpbuf) - 1);
- el->el_search.patbuf[0] = '.';
- el->el_search.patbuf[1] = '*';
- (void) Strncpy(&el->el_search.patbuf[2], tmpbuf,
- EL_BUFSIZ - 3);
- el->el_search.patlen++;
- el->el_search.patbuf[el->el_search.patlen++] = '.';
- el->el_search.patbuf[el->el_search.patlen++] = '*';
- el->el_search.patbuf[el->el_search.patlen] = '\0';
- }
-#endif
- } else {
-#ifdef ANCHOR
- tmpbuf[tmplen++] = '.';
- tmpbuf[tmplen++] = '*';
-#endif
- tmpbuf[tmplen] = '\0';
- (void) Strncpy(el->el_search.patbuf, tmpbuf, EL_BUFSIZ - 1);
- el->el_search.patlen = (size_t)tmplen;
- }
- el->el_state.lastcmd = (el_action_t) dir; /* avoid c_setpat */
- el->el_line.cursor = el->el_line.lastchar = el->el_line.buffer;
- if ((dir == ED_SEARCH_PREV_HISTORY ? ed_search_prev_history(el, 0) :
- ed_search_next_history(el, 0)) == CC_ERROR) {
- re_refresh(el);
- return CC_ERROR;
- }
- if (ch == 0033) {
- re_refresh(el);
- return ed_newline(el, 0);
- }
- return CC_REFRESH;
-}
-
-
-/* ce_search_line():
- * Look for a pattern inside a line
- */
-protected el_action_t
-ce_search_line(EditLine *el, int dir)
-{
- Char *cp = el->el_line.cursor;
- Char *pattern = el->el_search.patbuf;
- Char oc, *ocp;
-#ifdef ANCHOR
- ocp = &pattern[1];
- oc = *ocp;
- *ocp = '^';
-#else
- ocp = pattern;
- oc = *ocp;
-#endif
-
- if (dir == ED_SEARCH_PREV_HISTORY) {
- for (; cp >= el->el_line.buffer; cp--) {
- if (el_match(cp, ocp)) {
- *ocp = oc;
- el->el_line.cursor = cp;
- return CC_NORM;
- }
- }
- *ocp = oc;
- return CC_ERROR;
- } else {
- for (; *cp != '\0' && cp < el->el_line.limit; cp++) {
- if (el_match(cp, ocp)) {
- *ocp = oc;
- el->el_line.cursor = cp;
- return CC_NORM;
- }
- }
- *ocp = oc;
- return CC_ERROR;
- }
-}
-
-
-/* cv_repeat_srch():
- * Vi repeat search
- */
-protected el_action_t
-cv_repeat_srch(EditLine *el, wint_t c)
-{
-
-#ifdef SDEBUG
- (void) fprintf(el->el_errfile, "dir %d patlen %d patbuf %s\n",
- c, el->el_search.patlen, ct_encode_string(el->el_search.patbuf));
-#endif
-
- el->el_state.lastcmd = (el_action_t) c; /* Hack to stop c_setpat */
- el->el_line.lastchar = el->el_line.buffer;
-
- switch (c) {
- case ED_SEARCH_NEXT_HISTORY:
- return ed_search_next_history(el, 0);
- case ED_SEARCH_PREV_HISTORY:
- return ed_search_prev_history(el, 0);
- default:
- return CC_ERROR;
- }
-}
-
-
-/* cv_csearch():
- * Vi character search
- */
-protected el_action_t
-cv_csearch(EditLine *el, int direction, wint_t ch, int count, int tflag)
-{
- Char *cp;
-
- if (ch == 0)
- return CC_ERROR;
-
- if (ch == (wint_t)-1) {
- if (el_wgetc(el, &ch) != 1)
- return ed_end_of_file(el, 0);
- }
-
- /* Save for ';' and ',' commands */
- el->el_search.chacha = (Char)ch;
- el->el_search.chadir = direction;
- el->el_search.chatflg = (char)tflag;
-
- cp = el->el_line.cursor;
- while (count--) {
- if ((wint_t)*cp == ch)
- cp += direction;
- for (;;cp += direction) {
- if (cp >= el->el_line.lastchar)
- return CC_ERROR;
- if (cp < el->el_line.buffer)
- return CC_ERROR;
- if ((wint_t)*cp == ch)
- break;
- }
- }
-
- if (tflag)
- cp -= direction;
-
- el->el_line.cursor = cp;
-
- if (el->el_chared.c_vcmd.action != NOP) {
- if (direction > 0)
- el->el_line.cursor++;
- cv_delfini(el);
- return CC_REFRESH;
- }
- return CC_CURSOR;
-}
diff --git a/lib/libedit/search.h b/lib/libedit/search.h
deleted file mode 100644
index 1e745bd82cac..000000000000
--- a/lib/libedit/search.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* $NetBSD: search.h,v 1.12 2016/02/16 15:53:48 christos Exp $ */
-
-/*-
- * 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.
- *
- * @(#)search.h 8.1 (Berkeley) 6/4/93
- * $FreeBSD$
- */
-
-/*
- * el.search.h: Line and history searching utilities
- */
-#ifndef _h_el_search
-#define _h_el_search
-
-typedef struct el_search_t {
- Char *patbuf; /* The pattern buffer */
- size_t patlen; /* Length of the pattern buffer */
- int patdir; /* Direction of the last search */
- int chadir; /* Character search direction */
- Char chacha; /* Character we are looking for */
- char chatflg; /* 0 if f, 1 if t */
-} el_search_t;
-
-
-protected int el_match(const Char *, const Char *);
-protected int search_init(EditLine *);
-protected void search_end(EditLine *);
-protected int c_hmatch(EditLine *, const Char *);
-protected void c_setpat(EditLine *);
-protected el_action_t ce_inc_search(EditLine *, int);
-protected el_action_t cv_search(EditLine *, int);
-protected el_action_t ce_search_line(EditLine *, int);
-protected el_action_t cv_repeat_srch(EditLine *, wint_t);
-protected el_action_t cv_csearch(EditLine *, int, wint_t, int, int);
-
-#endif /* _h_el_search */
diff --git a/lib/libedit/sig.c b/lib/libedit/sig.c
deleted file mode 100644
index f37a12e75e69..000000000000
--- a/lib/libedit/sig.c
+++ /dev/null
@@ -1,207 +0,0 @@
-/* $NetBSD: sig.c,v 1.24 2016/02/16 19:08:41 christos Exp $ */
-
-/*-
- * 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.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-#if 0
-static char sccsid[] = "@(#)sig.c 8.1 (Berkeley) 6/4/93";
-#else
-__RCSID("$NetBSD: sig.c,v 1.24 2016/02/16 19:08:41 christos Exp $");
-#endif
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * sig.c: Signal handling stuff.
- * our policy is to trap all signals, set a good state
- * and pass the ball to our caller.
- */
-#include <errno.h>
-#include <stdlib.h>
-
-#include "el.h"
-#include "common.h"
-
-private EditLine *sel = NULL;
-
-private const int sighdl[] = {
-#define _DO(a) (a),
- ALLSIGS
-#undef _DO
- - 1
-};
-
-private void sig_handler(int);
-
-/* sig_handler():
- * This is the handler called for all signals
- * XXX: we cannot pass any data so we just store the old editline
- * state in a private variable
- */
-private void
-sig_handler(int signo)
-{
- int i, save_errno;
- sigset_t nset, oset;
-
- save_errno = errno;
- (void) sigemptyset(&nset);
- (void) sigaddset(&nset, signo);
- (void) sigprocmask(SIG_BLOCK, &nset, &oset);
-
- sel->el_signal->sig_no = signo;
-
- switch (signo) {
- case SIGCONT:
- tty_rawmode(sel);
- if (ed_redisplay(sel, 0) == CC_REFRESH)
- re_refresh(sel);
- terminal__flush(sel);
- break;
-
- case SIGWINCH:
- el_resize(sel);
- break;
-
- default:
- tty_cookedmode(sel);
- break;
- }
-
- for (i = 0; sighdl[i] != -1; i++)
- if (signo == sighdl[i])
- break;
-
- (void) sigaction(signo, &sel->el_signal->sig_action[i], NULL);
- sel->el_signal->sig_action[i].sa_handler = SIG_ERR;
- sel->el_signal->sig_action[i].sa_flags = 0;
- sigemptyset(&sel->el_signal->sig_action[i].sa_mask);
- (void) sigprocmask(SIG_SETMASK, &oset, NULL);
- (void) kill(0, signo);
- errno = save_errno;
-}
-
-
-/* sig_init():
- * Initialize all signal stuff
- */
-protected int
-sig_init(EditLine *el)
-{
- size_t i;
- sigset_t *nset, oset;
-
- el->el_signal = el_malloc(sizeof(*el->el_signal));
- if (el->el_signal == NULL)
- return -1;
-
- nset = &el->el_signal->sig_set;
- (void) sigemptyset(nset);
-#define _DO(a) (void) sigaddset(nset, a);
- ALLSIGS
-#undef _DO
- (void) sigprocmask(SIG_BLOCK, nset, &oset);
-
- for (i = 0; sighdl[i] != -1; i++) {
- el->el_signal->sig_action[i].sa_handler = SIG_ERR;
- el->el_signal->sig_action[i].sa_flags = 0;
- sigemptyset(&el->el_signal->sig_action[i].sa_mask);
- }
-
- (void) sigprocmask(SIG_SETMASK, &oset, NULL);
-
- return 0;
-}
-
-
-/* sig_end():
- * Clear all signal stuff
- */
-protected void
-sig_end(EditLine *el)
-{
-
- el_free(el->el_signal);
- el->el_signal = NULL;
-}
-
-
-/* sig_set():
- * set all the signal handlers
- */
-protected void
-sig_set(EditLine *el)
-{
- size_t i;
- sigset_t oset;
- struct sigaction osa, nsa;
-
- nsa.sa_handler = sig_handler;
- nsa.sa_flags = 0;
- sigemptyset(&nsa.sa_mask);
-
- (void) sigprocmask(SIG_BLOCK, &el->el_signal->sig_set, &oset);
-
- for (i = 0; sighdl[i] != -1; i++) {
- /* This could happen if we get interrupted */
- if (sigaction(sighdl[i], &nsa, &osa) != -1 &&
- osa.sa_handler != sig_handler)
- el->el_signal->sig_action[i] = osa;
- }
- sel = el;
- (void) sigprocmask(SIG_SETMASK, &oset, NULL);
-}
-
-
-/* sig_clr():
- * clear all the signal handlers
- */
-protected void
-sig_clr(EditLine *el)
-{
- size_t i;
- sigset_t oset;
-
- (void) sigprocmask(SIG_BLOCK, &el->el_signal->sig_set, &oset);
-
- for (i = 0; sighdl[i] != -1; i++)
- if (el->el_signal->sig_action[i].sa_handler != SIG_ERR)
- (void)sigaction(sighdl[i],
- &el->el_signal->sig_action[i], NULL);
-
- sel = NULL; /* we are going to die if the handler is
- * called */
- (void)sigprocmask(SIG_SETMASK, &oset, NULL);
-}
diff --git a/lib/libedit/sig.h b/lib/libedit/sig.h
deleted file mode 100644
index 34ec1da0a226..000000000000
--- a/lib/libedit/sig.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* $NetBSD: sig.h,v 1.10 2016/02/16 15:53:48 christos Exp $ */
-
-/*-
- * 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.
- *
- * @(#)sig.h 8.1 (Berkeley) 6/4/93
- * $FreeBSD$
- */
-
-/*
- * el.sig.h: Signal handling functions
- */
-#ifndef _h_el_sig
-#define _h_el_sig
-
-#include <signal.h>
-
-/*
- * Define here all the signals we are going to handle
- * The _DO macro is used to iterate in the source code
- */
-#define ALLSIGS \
- _DO(SIGINT) \
- _DO(SIGTSTP) \
- _DO(SIGQUIT) \
- _DO(SIGHUP) \
- _DO(SIGTERM) \
- _DO(SIGCONT) \
- _DO(SIGWINCH)
-#define ALLSIGSNO 7
-
-typedef struct {
- struct sigaction sig_action[ALLSIGSNO];
- sigset_t sig_set;
- volatile sig_atomic_t sig_no;
-} *el_signal_t;
-
-protected void sig_end(EditLine*);
-protected int sig_init(EditLine*);
-protected void sig_set(EditLine*);
-protected void sig_clr(EditLine*);
-
-#endif /* _h_el_sig */
diff --git a/lib/libedit/sys.h b/lib/libedit/sys.h
deleted file mode 100644
index 3807c9500c73..000000000000
--- a/lib/libedit/sys.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/* $NetBSD: sys.h,v 1.23 2016/02/17 19:47:49 christos Exp $ */
-
-/*-
- * 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.
- *
- * @(#)sys.h 8.1 (Berkeley) 6/4/93
- * $FreeBSD$
- */
-
-/*
- * sys.h: Put all the stupid compiler and system dependencies here...
- */
-#ifndef _h_sys
-#define _h_sys
-
-#ifdef HAVE_SYS_CDEFS_H
-#include <sys/cdefs.h>
-#endif
-
-#if !defined(__attribute__) && (defined(__cplusplus) || !defined(__GNUC__) || __GNUC__ == 2 && __GNUC_MINOR__ < 8)
-# define __attribute__(A)
-#endif
-
-#ifndef __BEGIN_DECLS
-# ifdef __cplusplus
-# define __BEGIN_DECLS extern "C" {
-# define __END_DECLS }
-# else
-# define __BEGIN_DECLS
-# define __END_DECLS
-# endif
-#endif
-
-#ifndef public
-# define public /* Externally visible functions/variables */
-#endif
-
-#ifndef private
-# define private static /* Always hidden internals */
-#endif
-
-#ifndef protected
-# define protected /* Redefined from elsewhere to "static" */
- /* When we want to hide everything */
-#endif
-
-#ifndef __arraycount
-# define __arraycount(a) (sizeof(a) / sizeof(*(a)))
-#endif
-
-#include <stdio.h>
-
-#ifndef HAVE_STRLCAT
-#define strlcat libedit_strlcat
-size_t strlcat(char *dst, const char *src, size_t size);
-#endif
-
-#ifndef HAVE_STRLCPY
-#define strlcpy libedit_strlcpy
-size_t strlcpy(char *dst, const char *src, size_t size);
-#endif
-
-#ifndef HAVE_GETLINE
-#define getline libedit_getline
-ssize_t getline(char **line, size_t *len, FILE *fp);
-#endif
-
-#ifndef _DIAGASSERT
-#define _DIAGASSERT(x)
-#endif
-
-#ifndef __RCSID
-#define __RCSID(x)
-#endif
-
-#ifndef HAVE_U_INT32_T
-typedef unsigned int u_int32_t;
-#endif
-
-#ifndef HAVE_SIZE_MAX
-#define SIZE_MAX ((size_t)-1)
-#endif
-
-#define REGEX /* Use POSIX.2 regular expression functions */
-#undef REGEXP /* Use UNIX V8 regular expression functions */
-
-#ifndef WIDECHAR
-#define setlocale(c, l) /*LINTED*/NULL
-#define nl_langinfo(i) ""
-#endif
-
-#if defined(__sun)
-extern int tgetent(char *, const char *);
-extern int tgetflag(char *);
-extern int tgetnum(char *);
-extern int tputs(const char *, int, int (*)(int));
-extern char* tgoto(const char*, int, int);
-extern char* tgetstr(char*, char**);
-#endif
-
-#endif /* _h_sys */
diff --git a/lib/libedit/terminal.c b/lib/libedit/terminal.c
deleted file mode 100644
index 971b0f607c27..000000000000
--- a/lib/libedit/terminal.c
+++ /dev/null
@@ -1,1689 +0,0 @@
-/* $NetBSD: terminal.c,v 1.24 2016/03/22 01:38:17 christos Exp $ */
-
-/*-
- * 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.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-#if 0
-static char sccsid[] = "@(#)term.c 8.2 (Berkeley) 4/30/95";
-#else
-__RCSID("$NetBSD: terminal.c,v 1.24 2016/03/22 01:38:17 christos Exp $");
-#endif
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * terminal.c: Editor/termcap-curses interface
- * We have to declare a static variable here, since the
- * termcap putchar routine does not take an argument!
- */
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <limits.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#ifdef HAVE_TERMCAP_H
-#include <termcap.h>
-#endif
-#ifdef HAVE_CURSES_H
-#include <curses.h>
-#elif HAVE_NCURSES_H
-#include <ncurses.h>
-#endif
-
-/* Solaris's term.h does horrid things. */
-#if defined(HAVE_TERM_H) && !defined(__sun) && !defined(HAVE_TERMCAP_H)
-#include <term.h>
-#endif
-
-#ifdef _REENTRANT
-#include <pthread.h>
-#endif
-
-#include "el.h"
-
-/*
- * IMPORTANT NOTE: these routines are allowed to look at the current screen
- * and the current position assuming that it is correct. If this is not
- * true, then the update will be WRONG! This is (should be) a valid
- * assumption...
- */
-
-#define TC_BUFSIZE ((size_t)2048)
-
-#define GoodStr(a) (el->el_terminal.t_str[a] != NULL && \
- el->el_terminal.t_str[a][0] != '\0')
-#define Str(a) el->el_terminal.t_str[a]
-#define Val(a) el->el_terminal.t_val[a]
-
-private const struct termcapstr {
- const char *name;
- const char *long_name;
-} tstr[] = {
-#define T_al 0
- { "al", "add new blank line" },
-#define T_bl 1
- { "bl", "audible bell" },
-#define T_cd 2
- { "cd", "clear to bottom" },
-#define T_ce 3
- { "ce", "clear to end of line" },
-#define T_ch 4
- { "ch", "cursor to horiz pos" },
-#define T_cl 5
- { "cl", "clear screen" },
-#define T_dc 6
- { "dc", "delete a character" },
-#define T_dl 7
- { "dl", "delete a line" },
-#define T_dm 8
- { "dm", "start delete mode" },
-#define T_ed 9
- { "ed", "end delete mode" },
-#define T_ei 10
- { "ei", "end insert mode" },
-#define T_fs 11
- { "fs", "cursor from status line" },
-#define T_ho 12
- { "ho", "home cursor" },
-#define T_ic 13
- { "ic", "insert character" },
-#define T_im 14
- { "im", "start insert mode" },
-#define T_ip 15
- { "ip", "insert padding" },
-#define T_kd 16
- { "kd", "sends cursor down" },
-#define T_kl 17
- { "kl", "sends cursor left" },
-#define T_kr 18
- { "kr", "sends cursor right" },
-#define T_ku 19
- { "ku", "sends cursor up" },
-#define T_md 20
- { "md", "begin bold" },
-#define T_me 21
- { "me", "end attributes" },
-#define T_nd 22
- { "nd", "non destructive space" },
-#define T_se 23
- { "se", "end standout" },
-#define T_so 24
- { "so", "begin standout" },
-#define T_ts 25
- { "ts", "cursor to status line" },
-#define T_up 26
- { "up", "cursor up one" },
-#define T_us 27
- { "us", "begin underline" },
-#define T_ue 28
- { "ue", "end underline" },
-#define T_vb 29
- { "vb", "visible bell" },
-#define T_DC 30
- { "DC", "delete multiple chars" },
-#define T_DO 31
- { "DO", "cursor down multiple" },
-#define T_IC 32
- { "IC", "insert multiple chars" },
-#define T_LE 33
- { "LE", "cursor left multiple" },
-#define T_RI 34
- { "RI", "cursor right multiple" },
-#define T_UP 35
- { "UP", "cursor up multiple" },
-#define T_kh 36
- { "kh", "send cursor home" },
-#define T_at7 37
- { "@7", "send cursor end" },
-#define T_kD 38
- { "kD", "send cursor delete" },
-#define T_str 39
- { NULL, NULL }
-};
-
-private const struct termcapval {
- const char *name;
- const char *long_name;
-} tval[] = {
-#define T_am 0
- { "am", "has automatic margins" },
-#define T_pt 1
- { "pt", "has physical tabs" },
-#define T_li 2
- { "li", "Number of lines" },
-#define T_co 3
- { "co", "Number of columns" },
-#define T_km 4
- { "km", "Has meta key" },
-#define T_xt 5
- { "xt", "Tab chars destructive" },
-#define T_xn 6
- { "xn", "newline ignored at right margin" },
-#define T_MT 7
- { "MT", "Has meta key" }, /* XXX? */
-#define T_val 8
- { NULL, NULL, }
-};
-/* do two or more of the attributes use me */
-
-private void terminal_setflags(EditLine *);
-private int terminal_rebuffer_display(EditLine *);
-private void terminal_free_display(EditLine *);
-private int terminal_alloc_display(EditLine *);
-private void terminal_alloc(EditLine *, const struct termcapstr *,
- const char *);
-private void terminal_init_arrow(EditLine *);
-private void terminal_reset_arrow(EditLine *);
-private int terminal_putc(int);
-private void terminal_tputs(EditLine *, const char *, int);
-
-#ifdef _REENTRANT
-private pthread_mutex_t terminal_mutex = PTHREAD_MUTEX_INITIALIZER;
-#endif
-private FILE *terminal_outfile = NULL;
-
-
-/* terminal_setflags():
- * Set the terminal capability flags
- */
-private void
-terminal_setflags(EditLine *el)
-{
- EL_FLAGS = 0;
- if (el->el_tty.t_tabs)
- EL_FLAGS |= (Val(T_pt) && !Val(T_xt)) ? TERM_CAN_TAB : 0;
-
- EL_FLAGS |= (Val(T_km) || Val(T_MT)) ? TERM_HAS_META : 0;
- EL_FLAGS |= GoodStr(T_ce) ? TERM_CAN_CEOL : 0;
- EL_FLAGS |= (GoodStr(T_dc) || GoodStr(T_DC)) ? TERM_CAN_DELETE : 0;
- EL_FLAGS |= (GoodStr(T_im) || GoodStr(T_ic) || GoodStr(T_IC)) ?
- TERM_CAN_INSERT : 0;
- EL_FLAGS |= (GoodStr(T_up) || GoodStr(T_UP)) ? TERM_CAN_UP : 0;
- EL_FLAGS |= Val(T_am) ? TERM_HAS_AUTO_MARGINS : 0;
- EL_FLAGS |= Val(T_xn) ? TERM_HAS_MAGIC_MARGINS : 0;
-
- if (GoodStr(T_me) && GoodStr(T_ue))
- EL_FLAGS |= (strcmp(Str(T_me), Str(T_ue)) == 0) ?
- TERM_CAN_ME : 0;
- else
- EL_FLAGS &= ~TERM_CAN_ME;
- if (GoodStr(T_me) && GoodStr(T_se))
- EL_FLAGS |= (strcmp(Str(T_me), Str(T_se)) == 0) ?
- TERM_CAN_ME : 0;
-
-
-#ifdef DEBUG_SCREEN
- if (!EL_CAN_UP) {
- (void) fprintf(el->el_errfile,
- "WARNING: Your terminal cannot move up.\n");
- (void) fprintf(el->el_errfile,
- "Editing may be odd for long lines.\n");
- }
- if (!EL_CAN_CEOL)
- (void) fprintf(el->el_errfile, "no clear EOL capability.\n");
- if (!EL_CAN_DELETE)
- (void) fprintf(el->el_errfile, "no delete char capability.\n");
- if (!EL_CAN_INSERT)
- (void) fprintf(el->el_errfile, "no insert char capability.\n");
-#endif /* DEBUG_SCREEN */
-}
-
-/* terminal_init():
- * Initialize the terminal stuff
- */
-protected int
-terminal_init(EditLine *el)
-{
-
- el->el_terminal.t_buf = el_malloc(TC_BUFSIZE *
- sizeof(*el->el_terminal.t_buf));
- if (el->el_terminal.t_buf == NULL)
- goto fail1;
- el->el_terminal.t_cap = el_malloc(TC_BUFSIZE *
- sizeof(*el->el_terminal.t_cap));
- if (el->el_terminal.t_cap == NULL)
- goto fail2;
- el->el_terminal.t_fkey = el_malloc(A_K_NKEYS *
- sizeof(*el->el_terminal.t_fkey));
- if (el->el_terminal.t_fkey == NULL)
- goto fail3;
- el->el_terminal.t_loc = 0;
- el->el_terminal.t_str = el_malloc(T_str *
- sizeof(*el->el_terminal.t_str));
- if (el->el_terminal.t_str == NULL)
- goto fail4;
- (void) memset(el->el_terminal.t_str, 0, T_str *
- sizeof(*el->el_terminal.t_str));
- el->el_terminal.t_val = el_malloc(T_val *
- sizeof(*el->el_terminal.t_val));
- if (el->el_terminal.t_val == NULL)
- goto fail5;
- (void) memset(el->el_terminal.t_val, 0, T_val *
- sizeof(*el->el_terminal.t_val));
- (void) terminal_set(el, NULL);
- terminal_init_arrow(el);
- return 0;
-fail5:
- free(el->el_terminal.t_str);
- el->el_terminal.t_str = NULL;
-fail4:
- free(el->el_terminal.t_fkey);
- el->el_terminal.t_fkey = NULL;
-fail3:
- free(el->el_terminal.t_cap);
- el->el_terminal.t_cap = NULL;
-fail2:
- free(el->el_terminal.t_buf);
- el->el_terminal.t_buf = NULL;
-fail1:
- return -1;
-}
-
-/* terminal_end():
- * Clean up the terminal stuff
- */
-protected void
-terminal_end(EditLine *el)
-{
-
- el_free(el->el_terminal.t_buf);
- el->el_terminal.t_buf = NULL;
- el_free(el->el_terminal.t_cap);
- el->el_terminal.t_cap = NULL;
- el->el_terminal.t_loc = 0;
- el_free(el->el_terminal.t_str);
- el->el_terminal.t_str = NULL;
- el_free(el->el_terminal.t_val);
- el->el_terminal.t_val = NULL;
- el_free(el->el_terminal.t_fkey);
- el->el_terminal.t_fkey = NULL;
- terminal_free_display(el);
-}
-
-
-/* terminal_alloc():
- * Maintain a string pool for termcap strings
- */
-private void
-terminal_alloc(EditLine *el, const struct termcapstr *t, const char *cap)
-{
- char termbuf[TC_BUFSIZE];
- size_t tlen, clen;
- char **tlist = el->el_terminal.t_str;
- char **tmp, **str = &tlist[t - tstr];
-
- (void) memset(termbuf, 0, sizeof(termbuf));
- if (cap == NULL || *cap == '\0') {
- *str = NULL;
- return;
- } else
- clen = strlen(cap);
-
- tlen = *str == NULL ? 0 : strlen(*str);
-
- /*
- * New string is shorter; no need to allocate space
- */
- if (clen <= tlen) {
- if (*str)
- (void) strcpy(*str, cap); /* XXX strcpy is safe */
- return;
- }
- /*
- * New string is longer; see if we have enough space to append
- */
- if (el->el_terminal.t_loc + 3 < TC_BUFSIZE) {
- /* XXX strcpy is safe */
- (void) strcpy(*str = &el->el_terminal.t_buf[
- el->el_terminal.t_loc], cap);
- el->el_terminal.t_loc += clen + 1; /* one for \0 */
- return;
- }
- /*
- * Compact our buffer; no need to check compaction, cause we know it
- * fits...
- */
- tlen = 0;
- for (tmp = tlist; tmp < &tlist[T_str]; tmp++)
- if (*tmp != NULL && **tmp != '\0' && *tmp != *str) {
- char *ptr;
-
- for (ptr = *tmp; *ptr != '\0'; termbuf[tlen++] = *ptr++)
- continue;
- termbuf[tlen++] = '\0';
- }
- memcpy(el->el_terminal.t_buf, termbuf, TC_BUFSIZE);
- el->el_terminal.t_loc = tlen;
- if (el->el_terminal.t_loc + 3 >= TC_BUFSIZE) {
- (void) fprintf(el->el_errfile,
- "Out of termcap string space.\n");
- return;
- }
- /* XXX strcpy is safe */
- (void) strcpy(*str = &el->el_terminal.t_buf[el->el_terminal.t_loc],
- cap);
- el->el_terminal.t_loc += (size_t)clen + 1; /* one for \0 */
- return;
-}
-
-
-/* terminal_rebuffer_display():
- * Rebuffer the display after the screen changed size
- */
-private int
-terminal_rebuffer_display(EditLine *el)
-{
- coord_t *c = &el->el_terminal.t_size;
-
- terminal_free_display(el);
-
- c->h = Val(T_co);
- c->v = Val(T_li);
-
- if (terminal_alloc_display(el) == -1)
- return -1;
- return 0;
-}
-
-
-/* terminal_alloc_display():
- * Allocate a new display.
- */
-private int
-terminal_alloc_display(EditLine *el)
-{
- int i;
- Char **b;
- coord_t *c = &el->el_terminal.t_size;
-
- b = el_malloc(sizeof(*b) * (size_t)(c->v + 1));
- if (b == NULL)
- goto done;
- for (i = 0; i < c->v; i++) {
- b[i] = el_malloc(sizeof(**b) * (size_t)(c->h + 1));
- if (b[i] == NULL) {
- while (--i >= 0)
- el_free(b[i]);
- el_free(b);
- goto done;
- }
- }
- b[c->v] = NULL;
- el->el_display = b;
-
- b = el_malloc(sizeof(*b) * (size_t)(c->v + 1));
- if (b == NULL)
- goto done;
- for (i = 0; i < c->v; i++) {
- b[i] = el_malloc(sizeof(**b) * (size_t)(c->h + 1));
- if (b[i] == NULL) {
- while (--i >= 0)
- el_free(b[i]);
- el_free(b);
- goto done;
- }
- }
- b[c->v] = NULL;
- el->el_vdisplay = b;
- return 0;
-done:
- terminal_free_display(el);
- return -1;
-}
-
-
-/* terminal_free_display():
- * Free the display buffers
- */
-private void
-terminal_free_display(EditLine *el)
-{
- Char **b;
- Char **bufp;
-
- b = el->el_display;
- el->el_display = NULL;
- if (b != NULL) {
- for (bufp = b; *bufp != NULL; bufp++)
- el_free(*bufp);
- el_free(b);
- }
- b = el->el_vdisplay;
- el->el_vdisplay = NULL;
- if (b != NULL) {
- for (bufp = b; *bufp != NULL; bufp++)
- el_free(*bufp);
- el_free(b);
- }
-}
-
-
-/* terminal_move_to_line():
- * move to line <where> (first line == 0)
- * as efficiently as possible
- */
-protected void
-terminal_move_to_line(EditLine *el, int where)
-{
- int del;
-
- if (where == el->el_cursor.v)
- return;
-
- if (where > el->el_terminal.t_size.v) {
-#ifdef DEBUG_SCREEN
- (void) fprintf(el->el_errfile,
- "%s: where is ridiculous: %d\r\n", __func__, where);
-#endif /* DEBUG_SCREEN */
- return;
- }
- if ((del = where - el->el_cursor.v) > 0) {
- while (del > 0) {
- if (EL_HAS_AUTO_MARGINS &&
- el->el_display[el->el_cursor.v][0] != '\0') {
- size_t h = (size_t)
- (el->el_terminal.t_size.h - 1);
-#ifdef WIDECHAR
- for (; h > 0 &&
- el->el_display[el->el_cursor.v][h] ==
- MB_FILL_CHAR;
- h--)
- continue;
-#endif
- /* move without newline */
- terminal_move_to_char(el, (int)h);
- terminal_overwrite(el, &el->el_display
- [el->el_cursor.v][el->el_cursor.h],
- (size_t)(el->el_terminal.t_size.h -
- el->el_cursor.h));
- /* updates Cursor */
- del--;
- } else {
- if ((del > 1) && GoodStr(T_DO)) {
- terminal_tputs(el, tgoto(Str(T_DO), del,
- del), del);
- del = 0;
- } else {
- for (; del > 0; del--)
- terminal__putc(el, '\n');
- /* because the \n will become \r\n */
- el->el_cursor.h = 0;
- }
- }
- }
- } else { /* del < 0 */
- if (GoodStr(T_UP) && (-del > 1 || !GoodStr(T_up)))
- terminal_tputs(el, tgoto(Str(T_UP), -del, -del), -del);
- else {
- if (GoodStr(T_up))
- for (; del < 0; del++)
- terminal_tputs(el, Str(T_up), 1);
- }
- }
- el->el_cursor.v = where;/* now where is here */
-}
-
-
-/* terminal_move_to_char():
- * Move to the character position specified
- */
-protected void
-terminal_move_to_char(EditLine *el, int where)
-{
- int del, i;
-
-mc_again:
- if (where == el->el_cursor.h)
- return;
-
- if (where > el->el_terminal.t_size.h) {
-#ifdef DEBUG_SCREEN
- (void) fprintf(el->el_errfile,
- "%s: where is ridiculous: %d\r\n", __func__, where);
-#endif /* DEBUG_SCREEN */
- return;
- }
- if (!where) { /* if where is first column */
- terminal__putc(el, '\r'); /* do a CR */
- el->el_cursor.h = 0;
- return;
- }
- del = where - el->el_cursor.h;
-
- if ((del < -4 || del > 4) && GoodStr(T_ch))
- /* go there directly */
- terminal_tputs(el, tgoto(Str(T_ch), where, where), where);
- else {
- if (del > 0) { /* moving forward */
- if ((del > 4) && GoodStr(T_RI))
- terminal_tputs(el, tgoto(Str(T_RI), del, del),
- del);
- else {
- /* if I can do tabs, use them */
- if (EL_CAN_TAB) {
- if ((el->el_cursor.h & 0370) !=
- (where & ~0x7)
-#ifdef WIDECHAR
- && (el->el_display[
- el->el_cursor.v][where & 0370] !=
- MB_FILL_CHAR)
-#endif
- ) {
- /* if not within tab stop */
- for (i =
- (el->el_cursor.h & 0370);
- i < (where & ~0x7);
- i += 8)
- terminal__putc(el,
- '\t');
- /* then tab over */
- el->el_cursor.h = where & ~0x7;
- }
- }
- /*
- * it's usually cheaper to just write the
- * chars, so we do.
- */
- /*
- * NOTE THAT terminal_overwrite() WILL CHANGE
- * el->el_cursor.h!!!
- */
- terminal_overwrite(el, &el->el_display[
- el->el_cursor.v][el->el_cursor.h],
- (size_t)(where - el->el_cursor.h));
-
- }
- } else { /* del < 0 := moving backward */
- if ((-del > 4) && GoodStr(T_LE))
- terminal_tputs(el, tgoto(Str(T_LE), -del, -del),
- -del);
- else { /* can't go directly there */
- /*
- * if the "cost" is greater than the "cost"
- * from col 0
- */
- if (EL_CAN_TAB ?
- ((unsigned int)-del >
- (((unsigned int) where >> 3) +
- (where & 07)))
- : (-del > where)) {
- terminal__putc(el, '\r');/* do a CR */
- el->el_cursor.h = 0;
- goto mc_again; /* and try again */
- }
- for (i = 0; i < -del; i++)
- terminal__putc(el, '\b');
- }
- }
- }
- el->el_cursor.h = where; /* now where is here */
-}
-
-
-/* terminal_overwrite():
- * Overstrike num characters
- * Assumes MB_FILL_CHARs are present to keep the column count correct
- */
-protected void
-terminal_overwrite(EditLine *el, const Char *cp, size_t n)
-{
- if (n == 0)
- return;
-
- if (n > (size_t)el->el_terminal.t_size.h) {
-#ifdef DEBUG_SCREEN
- (void) fprintf(el->el_errfile,
- "%s: n is ridiculous: %zu\r\n", __func__, n);
-#endif /* DEBUG_SCREEN */
- return;
- }
-
- do {
- /* terminal__putc() ignores any MB_FILL_CHARs */
- terminal__putc(el, *cp++);
- el->el_cursor.h++;
- } while (--n);
-
- if (el->el_cursor.h >= el->el_terminal.t_size.h) { /* wrap? */
- if (EL_HAS_AUTO_MARGINS) { /* yes */
- el->el_cursor.h = 0;
- el->el_cursor.v++;
- if (EL_HAS_MAGIC_MARGINS) {
- /* force the wrap to avoid the "magic"
- * situation */
- Char c;
- if ((c = el->el_display[el->el_cursor.v]
- [el->el_cursor.h]) != '\0') {
- terminal_overwrite(el, &c, (size_t)1);
-#ifdef WIDECHAR
- while (el->el_display[el->el_cursor.v]
- [el->el_cursor.h] == MB_FILL_CHAR)
- el->el_cursor.h++;
-#endif
- } else {
- terminal__putc(el, ' ');
- el->el_cursor.h = 1;
- }
- }
- } else /* no wrap, but cursor stays on screen */
- el->el_cursor.h = el->el_terminal.t_size.h - 1;
- }
-}
-
-
-/* terminal_deletechars():
- * Delete num characters
- */
-protected void
-terminal_deletechars(EditLine *el, int num)
-{
- if (num <= 0)
- return;
-
- if (!EL_CAN_DELETE) {
-#ifdef DEBUG_EDIT
- (void) fprintf(el->el_errfile, " ERROR: cannot delete \n");
-#endif /* DEBUG_EDIT */
- return;
- }
- if (num > el->el_terminal.t_size.h) {
-#ifdef DEBUG_SCREEN
- (void) fprintf(el->el_errfile,
- "%s: num is ridiculous: %d\r\n", __func__, num);
-#endif /* DEBUG_SCREEN */
- return;
- }
- if (GoodStr(T_DC)) /* if I have multiple delete */
- if ((num > 1) || !GoodStr(T_dc)) { /* if dc would be more
- * expen. */
- terminal_tputs(el, tgoto(Str(T_DC), num, num), num);
- return;
- }
- if (GoodStr(T_dm)) /* if I have delete mode */
- terminal_tputs(el, Str(T_dm), 1);
-
- if (GoodStr(T_dc)) /* else do one at a time */
- while (num--)
- terminal_tputs(el, Str(T_dc), 1);
-
- if (GoodStr(T_ed)) /* if I have delete mode */
- terminal_tputs(el, Str(T_ed), 1);
-}
-
-
-/* terminal_insertwrite():
- * Puts terminal in insert character mode or inserts num
- * characters in the line
- * Assumes MB_FILL_CHARs are present to keep column count correct
- */
-protected void
-terminal_insertwrite(EditLine *el, Char *cp, int num)
-{
- if (num <= 0)
- return;
- if (!EL_CAN_INSERT) {
-#ifdef DEBUG_EDIT
- (void) fprintf(el->el_errfile, " ERROR: cannot insert \n");
-#endif /* DEBUG_EDIT */
- return;
- }
- if (num > el->el_terminal.t_size.h) {
-#ifdef DEBUG_SCREEN
- (void) fprintf(el->el_errfile,
- "%s: num is ridiculous: %d\r\n", __func__, num);
-#endif /* DEBUG_SCREEN */
- return;
- }
- if (GoodStr(T_IC)) /* if I have multiple insert */
- if ((num > 1) || !GoodStr(T_ic)) {
- /* if ic would be more expensive */
- terminal_tputs(el, tgoto(Str(T_IC), num, num), num);
- terminal_overwrite(el, cp, (size_t)num);
- /* this updates el_cursor.h */
- return;
- }
- if (GoodStr(T_im) && GoodStr(T_ei)) { /* if I have insert mode */
- terminal_tputs(el, Str(T_im), 1);
-
- el->el_cursor.h += num;
- do
- terminal__putc(el, *cp++);
- while (--num);
-
- if (GoodStr(T_ip)) /* have to make num chars insert */
- terminal_tputs(el, Str(T_ip), 1);
-
- terminal_tputs(el, Str(T_ei), 1);
- return;
- }
- do {
- if (GoodStr(T_ic)) /* have to make num chars insert */
- terminal_tputs(el, Str(T_ic), 1);
-
- terminal__putc(el, *cp++);
-
- el->el_cursor.h++;
-
- if (GoodStr(T_ip)) /* have to make num chars insert */
- terminal_tputs(el, Str(T_ip), 1);
- /* pad the inserted char */
-
- } while (--num);
-}
-
-
-/* terminal_clear_EOL():
- * clear to end of line. There are num characters to clear
- */
-protected void
-terminal_clear_EOL(EditLine *el, int num)
-{
- int i;
-
- if (EL_CAN_CEOL && GoodStr(T_ce))
- terminal_tputs(el, Str(T_ce), 1);
- else {
- for (i = 0; i < num; i++)
- terminal__putc(el, ' ');
- el->el_cursor.h += num; /* have written num spaces */
- }
-}
-
-
-/* terminal_clear_screen():
- * Clear the screen
- */
-protected void
-terminal_clear_screen(EditLine *el)
-{ /* clear the whole screen and home */
-
- if (GoodStr(T_cl))
- /* send the clear screen code */
- terminal_tputs(el, Str(T_cl), Val(T_li));
- else if (GoodStr(T_ho) && GoodStr(T_cd)) {
- terminal_tputs(el, Str(T_ho), Val(T_li)); /* home */
- /* clear to bottom of screen */
- terminal_tputs(el, Str(T_cd), Val(T_li));
- } else {
- terminal__putc(el, '\r');
- terminal__putc(el, '\n');
- }
-}
-
-
-/* terminal_beep():
- * Beep the way the terminal wants us
- */
-protected void
-terminal_beep(EditLine *el)
-{
- if (GoodStr(T_bl))
- /* what termcap says we should use */
- terminal_tputs(el, Str(T_bl), 1);
- else
- terminal__putc(el, '\007'); /* an ASCII bell; ^G */
-}
-
-
-protected void
-terminal_get(EditLine *el, const char **term)
-{
- *term = el->el_terminal.t_name;
-}
-
-
-/* terminal_set():
- * Read in the terminal capabilities from the requested terminal
- */
-protected int
-terminal_set(EditLine *el, const char *term)
-{
- int i;
- char buf[TC_BUFSIZE];
- char *area;
- const struct termcapstr *t;
- sigset_t oset, nset;
- int lins, cols;
-
- (void) sigemptyset(&nset);
- (void) sigaddset(&nset, SIGWINCH);
- (void) sigprocmask(SIG_BLOCK, &nset, &oset);
-
- area = buf;
-
-
- if (term == NULL)
- term = getenv("TERM");
-
- if (!term || !term[0])
- term = "dumb";
-
- if (strcmp(term, "emacs") == 0)
- el->el_flags |= EDIT_DISABLED;
-
- (void) memset(el->el_terminal.t_cap, 0, TC_BUFSIZE);
-
- i = tgetent(el->el_terminal.t_cap, term);
-
- if (i <= 0) {
- if (i == -1)
- (void) fprintf(el->el_errfile,
- "Cannot read termcap database;\n");
- else if (i == 0)
- (void) fprintf(el->el_errfile,
- "No entry for terminal type \"%s\";\n", term);
- (void) fprintf(el->el_errfile,
- "using dumb terminal settings.\n");
- Val(T_co) = 80; /* do a dumb terminal */
- Val(T_pt) = Val(T_km) = Val(T_li) = 0;
- Val(T_xt) = Val(T_MT);
- for (t = tstr; t->name != NULL; t++)
- terminal_alloc(el, t, NULL);
- } else {
- /* auto/magic margins */
- Val(T_am) = tgetflag("am");
- Val(T_xn) = tgetflag("xn");
- /* Can we tab */
- Val(T_pt) = tgetflag("pt");
- Val(T_xt) = tgetflag("xt");
- /* do we have a meta? */
- Val(T_km) = tgetflag("km");
- Val(T_MT) = tgetflag("MT");
- /* Get the size */
- Val(T_co) = tgetnum("co");
- Val(T_li) = tgetnum("li");
- for (t = tstr; t->name != NULL; t++) {
- /* XXX: some systems' tgetstr needs non const */
- terminal_alloc(el, t, tgetstr(strchr(t->name, *t->name),
- &area));
- }
- }
-
- if (Val(T_co) < 2)
- Val(T_co) = 80; /* just in case */
- if (Val(T_li) < 1)
- Val(T_li) = 24;
-
- el->el_terminal.t_size.v = Val(T_co);
- el->el_terminal.t_size.h = Val(T_li);
-
- terminal_setflags(el);
-
- /* get the correct window size */
- (void) terminal_get_size(el, &lins, &cols);
- if (terminal_change_size(el, lins, cols) == -1)
- return -1;
- (void) sigprocmask(SIG_SETMASK, &oset, NULL);
- terminal_bind_arrow(el);
- el->el_terminal.t_name = term;
- return i <= 0 ? -1 : 0;
-}
-
-
-/* terminal_get_size():
- * Return the new window size in lines and cols, and
- * true if the size was changed.
- */
-protected int
-terminal_get_size(EditLine *el, int *lins, int *cols)
-{
-
- *cols = Val(T_co);
- *lins = Val(T_li);
-
-#ifdef TIOCGWINSZ
- {
- struct winsize ws;
- if (ioctl(el->el_infd, TIOCGWINSZ, &ws) != -1) {
- if (ws.ws_col)
- *cols = ws.ws_col;
- if (ws.ws_row)
- *lins = ws.ws_row;
- }
- }
-#endif
-#ifdef TIOCGSIZE
- {
- struct ttysize ts;
- if (ioctl(el->el_infd, TIOCGSIZE, &ts) != -1) {
- if (ts.ts_cols)
- *cols = ts.ts_cols;
- if (ts.ts_lines)
- *lins = ts.ts_lines;
- }
- }
-#endif
- return Val(T_co) != *cols || Val(T_li) != *lins;
-}
-
-
-/* terminal_change_size():
- * Change the size of the terminal
- */
-protected int
-terminal_change_size(EditLine *el, int lins, int cols)
-{
- /*
- * Just in case
- */
- Val(T_co) = (cols < 2) ? 80 : cols;
- Val(T_li) = (lins < 1) ? 24 : lins;
-
- /* re-make display buffers */
- if (terminal_rebuffer_display(el) == -1)
- return -1;
- re_clear_display(el);
- return 0;
-}
-
-
-/* terminal_init_arrow():
- * Initialize the arrow key bindings from termcap
- */
-private void
-terminal_init_arrow(EditLine *el)
-{
- funckey_t *arrow = el->el_terminal.t_fkey;
-
- arrow[A_K_DN].name = STR("down");
- arrow[A_K_DN].key = T_kd;
- arrow[A_K_DN].fun.cmd = ED_NEXT_HISTORY;
- arrow[A_K_DN].type = XK_CMD;
-
- arrow[A_K_UP].name = STR("up");
- arrow[A_K_UP].key = T_ku;
- arrow[A_K_UP].fun.cmd = ED_PREV_HISTORY;
- arrow[A_K_UP].type = XK_CMD;
-
- arrow[A_K_LT].name = STR("left");
- arrow[A_K_LT].key = T_kl;
- arrow[A_K_LT].fun.cmd = ED_PREV_CHAR;
- arrow[A_K_LT].type = XK_CMD;
-
- arrow[A_K_RT].name = STR("right");
- arrow[A_K_RT].key = T_kr;
- arrow[A_K_RT].fun.cmd = ED_NEXT_CHAR;
- arrow[A_K_RT].type = XK_CMD;
-
- arrow[A_K_HO].name = STR("home");
- arrow[A_K_HO].key = T_kh;
- arrow[A_K_HO].fun.cmd = ED_MOVE_TO_BEG;
- arrow[A_K_HO].type = XK_CMD;
-
- arrow[A_K_EN].name = STR("end");
- arrow[A_K_EN].key = T_at7;
- arrow[A_K_EN].fun.cmd = ED_MOVE_TO_END;
- arrow[A_K_EN].type = XK_CMD;
-
- arrow[A_K_DE].name = STR("delete");
- arrow[A_K_DE].key = T_kD;
- arrow[A_K_DE].fun.cmd = ED_DELETE_NEXT_CHAR;
- arrow[A_K_DE].type = XK_CMD;
-}
-
-
-/* terminal_reset_arrow():
- * Reset arrow key bindings
- */
-private void
-terminal_reset_arrow(EditLine *el)
-{
- funckey_t *arrow = el->el_terminal.t_fkey;
- static const Char strA[] = {033, '[', 'A', '\0'};
- static const Char strB[] = {033, '[', 'B', '\0'};
- static const Char strC[] = {033, '[', 'C', '\0'};
- static const Char strD[] = {033, '[', 'D', '\0'};
- static const Char strH[] = {033, '[', 'H', '\0'};
- static const Char strF[] = {033, '[', 'F', '\0'};
- static const Char stOA[] = {033, 'O', 'A', '\0'};
- static const Char stOB[] = {033, 'O', 'B', '\0'};
- static const Char stOC[] = {033, 'O', 'C', '\0'};
- static const Char stOD[] = {033, 'O', 'D', '\0'};
- static const Char stOH[] = {033, 'O', 'H', '\0'};
- static const Char stOF[] = {033, 'O', 'F', '\0'};
-
- keymacro_add(el, strA, &arrow[A_K_UP].fun, arrow[A_K_UP].type);
- keymacro_add(el, strB, &arrow[A_K_DN].fun, arrow[A_K_DN].type);
- keymacro_add(el, strC, &arrow[A_K_RT].fun, arrow[A_K_RT].type);
- keymacro_add(el, strD, &arrow[A_K_LT].fun, arrow[A_K_LT].type);
- keymacro_add(el, strH, &arrow[A_K_HO].fun, arrow[A_K_HO].type);
- keymacro_add(el, strF, &arrow[A_K_EN].fun, arrow[A_K_EN].type);
- keymacro_add(el, stOA, &arrow[A_K_UP].fun, arrow[A_K_UP].type);
- keymacro_add(el, stOB, &arrow[A_K_DN].fun, arrow[A_K_DN].type);
- keymacro_add(el, stOC, &arrow[A_K_RT].fun, arrow[A_K_RT].type);
- keymacro_add(el, stOD, &arrow[A_K_LT].fun, arrow[A_K_LT].type);
- keymacro_add(el, stOH, &arrow[A_K_HO].fun, arrow[A_K_HO].type);
- keymacro_add(el, stOF, &arrow[A_K_EN].fun, arrow[A_K_EN].type);
-
- if (el->el_map.type != MAP_VI)
- return;
- keymacro_add(el, &strA[1], &arrow[A_K_UP].fun, arrow[A_K_UP].type);
- keymacro_add(el, &strB[1], &arrow[A_K_DN].fun, arrow[A_K_DN].type);
- keymacro_add(el, &strC[1], &arrow[A_K_RT].fun, arrow[A_K_RT].type);
- keymacro_add(el, &strD[1], &arrow[A_K_LT].fun, arrow[A_K_LT].type);
- keymacro_add(el, &strH[1], &arrow[A_K_HO].fun, arrow[A_K_HO].type);
- keymacro_add(el, &strF[1], &arrow[A_K_EN].fun, arrow[A_K_EN].type);
- keymacro_add(el, &stOA[1], &arrow[A_K_UP].fun, arrow[A_K_UP].type);
- keymacro_add(el, &stOB[1], &arrow[A_K_DN].fun, arrow[A_K_DN].type);
- keymacro_add(el, &stOC[1], &arrow[A_K_RT].fun, arrow[A_K_RT].type);
- keymacro_add(el, &stOD[1], &arrow[A_K_LT].fun, arrow[A_K_LT].type);
- keymacro_add(el, &stOH[1], &arrow[A_K_HO].fun, arrow[A_K_HO].type);
- keymacro_add(el, &stOF[1], &arrow[A_K_EN].fun, arrow[A_K_EN].type);
-}
-
-
-/* terminal_set_arrow():
- * Set an arrow key binding
- */
-protected int
-terminal_set_arrow(EditLine *el, const Char *name, keymacro_value_t *fun,
- int type)
-{
- funckey_t *arrow = el->el_terminal.t_fkey;
- int i;
-
- for (i = 0; i < A_K_NKEYS; i++)
- if (Strcmp(name, arrow[i].name) == 0) {
- arrow[i].fun = *fun;
- arrow[i].type = type;
- return 0;
- }
- return -1;
-}
-
-
-/* terminal_clear_arrow():
- * Clear an arrow key binding
- */
-protected int
-terminal_clear_arrow(EditLine *el, const Char *name)
-{
- funckey_t *arrow = el->el_terminal.t_fkey;
- int i;
-
- for (i = 0; i < A_K_NKEYS; i++)
- if (Strcmp(name, arrow[i].name) == 0) {
- arrow[i].type = XK_NOD;
- return 0;
- }
- return -1;
-}
-
-
-/* terminal_print_arrow():
- * Print the arrow key bindings
- */
-protected void
-terminal_print_arrow(EditLine *el, const Char *name)
-{
- int i;
- funckey_t *arrow = el->el_terminal.t_fkey;
-
- for (i = 0; i < A_K_NKEYS; i++)
- if (*name == '\0' || Strcmp(name, arrow[i].name) == 0)
- if (arrow[i].type != XK_NOD)
- keymacro_kprint(el, arrow[i].name,
- &arrow[i].fun, arrow[i].type);
-}
-
-
-/* terminal_bind_arrow():
- * Bind the arrow keys
- */
-protected void
-terminal_bind_arrow(EditLine *el)
-{
- el_action_t *map;
- const el_action_t *dmap;
- int i, j;
- char *p;
- funckey_t *arrow = el->el_terminal.t_fkey;
-
- /* Check if the components needed are initialized */
- if (el->el_terminal.t_buf == NULL || el->el_map.key == NULL)
- return;
-
- map = el->el_map.type == MAP_VI ? el->el_map.alt : el->el_map.key;
- dmap = el->el_map.type == MAP_VI ? el->el_map.vic : el->el_map.emacs;
-
- terminal_reset_arrow(el);
-
- for (i = 0; i < A_K_NKEYS; i++) {
- Char wt_str[VISUAL_WIDTH_MAX];
- Char *px;
- size_t n;
-
- p = el->el_terminal.t_str[arrow[i].key];
- if (!p || !*p)
- continue;
- for (n = 0; n < VISUAL_WIDTH_MAX && p[n]; ++n)
- wt_str[n] = p[n];
- while (n < VISUAL_WIDTH_MAX)
- wt_str[n++] = '\0';
- px = wt_str;
- j = (unsigned char) *p;
- /*
- * Assign the arrow keys only if:
- *
- * 1. They are multi-character arrow keys and the user
- * has not re-assigned the leading character, or
- * has re-assigned the leading character to be
- * ED_SEQUENCE_LEAD_IN
- * 2. They are single arrow keys pointing to an
- * unassigned key.
- */
- if (arrow[i].type == XK_NOD)
- keymacro_clear(el, map, px);
- else {
- if (p[1] && (dmap[j] == map[j] ||
- map[j] == ED_SEQUENCE_LEAD_IN)) {
- keymacro_add(el, px, &arrow[i].fun,
- arrow[i].type);
- map[j] = ED_SEQUENCE_LEAD_IN;
- } else if (map[j] == ED_UNASSIGNED) {
- keymacro_clear(el, map, px);
- if (arrow[i].type == XK_CMD)
- map[j] = arrow[i].fun.cmd;
- else
- keymacro_add(el, px, &arrow[i].fun,
- arrow[i].type);
- }
- }
- }
-}
-
-/* terminal_putc():
- * Add a character
- */
-private int
-terminal_putc(int c)
-{
- if (terminal_outfile == NULL)
- return -1;
- return fputc(c, terminal_outfile);
-}
-
-private void
-terminal_tputs(EditLine *el, const char *cap, int affcnt)
-{
-#ifdef _REENTRANT
- pthread_mutex_lock(&terminal_mutex);
-#endif
- terminal_outfile = el->el_outfile;
- (void)tputs(cap, affcnt, terminal_putc);
-#ifdef _REENTRANT
- pthread_mutex_unlock(&terminal_mutex);
-#endif
-}
-
-/* terminal__putc():
- * Add a character
- */
-protected int
-terminal__putc(EditLine *el, wint_t c)
-{
- char buf[MB_LEN_MAX +1];
- ssize_t i;
- if (c == (wint_t)MB_FILL_CHAR)
- return 0;
- i = ct_encode_char(buf, (size_t)MB_LEN_MAX, (Char)c);
- if (i <= 0)
- return (int)i;
- buf[i] = '\0';
- return fputs(buf, el->el_outfile);
-}
-
-/* terminal__flush():
- * Flush output
- */
-protected void
-terminal__flush(EditLine *el)
-{
-
- (void) fflush(el->el_outfile);
-}
-
-/* terminal_writec():
- * Write the given character out, in a human readable form
- */
-protected void
-terminal_writec(EditLine *el, wint_t c)
-{
- Char visbuf[VISUAL_WIDTH_MAX +1];
- ssize_t vcnt = ct_visual_char(visbuf, VISUAL_WIDTH_MAX, (Char)c);
- if (vcnt < 0)
- vcnt = 0;
- visbuf[vcnt] = '\0';
- terminal_overwrite(el, visbuf, (size_t)vcnt);
- terminal__flush(el);
-}
-
-
-/* terminal_telltc():
- * Print the current termcap characteristics
- */
-protected int
-/*ARGSUSED*/
-terminal_telltc(EditLine *el, int argc __attribute__((__unused__)),
- const Char **argv __attribute__((__unused__)))
-{
- const struct termcapstr *t;
- char **ts;
-
- (void) fprintf(el->el_outfile, "\n\tYour terminal has the\n");
- (void) fprintf(el->el_outfile, "\tfollowing characteristics:\n\n");
- (void) fprintf(el->el_outfile, "\tIt has %d columns and %d lines\n",
- Val(T_co), Val(T_li));
- (void) fprintf(el->el_outfile,
- "\tIt has %s meta key\n", EL_HAS_META ? "a" : "no");
- (void) fprintf(el->el_outfile,
- "\tIt can%suse tabs\n", EL_CAN_TAB ? " " : "not ");
- (void) fprintf(el->el_outfile, "\tIt %s automatic margins\n",
- EL_HAS_AUTO_MARGINS ? "has" : "does not have");
- if (EL_HAS_AUTO_MARGINS)
- (void) fprintf(el->el_outfile, "\tIt %s magic margins\n",
- EL_HAS_MAGIC_MARGINS ? "has" : "does not have");
-
- for (t = tstr, ts = el->el_terminal.t_str; t->name != NULL; t++, ts++) {
- const char *ub;
- if (*ts && **ts) {
- ub = ct_encode_string(ct_visual_string(
- ct_decode_string(*ts, &el->el_scratch)),
- &el->el_scratch);
- } else {
- ub = "(empty)";
- }
- (void) fprintf(el->el_outfile, "\t%25s (%s) == %s\n",
- t->long_name, t->name, ub);
- }
- (void) fputc('\n', el->el_outfile);
- return 0;
-}
-
-
-/* terminal_settc():
- * Change the current terminal characteristics
- */
-protected int
-/*ARGSUSED*/
-terminal_settc(EditLine *el, int argc __attribute__((__unused__)),
- const Char **argv)
-{
- const struct termcapstr *ts;
- const struct termcapval *tv;
- char what[8], how[8];
-
- if (argv == NULL || argv[1] == NULL || argv[2] == NULL)
- return -1;
-
- strncpy(what, ct_encode_string(argv[1], &el->el_scratch), sizeof(what));
- what[sizeof(what) - 1] = '\0';
- strncpy(how, ct_encode_string(argv[2], &el->el_scratch), sizeof(how));
- how[sizeof(how) - 1] = '\0';
-
- /*
- * Do the strings first
- */
- for (ts = tstr; ts->name != NULL; ts++)
- if (strcmp(ts->name, what) == 0)
- break;
-
- if (ts->name != NULL) {
- terminal_alloc(el, ts, how);
- terminal_setflags(el);
- return 0;
- }
- /*
- * Do the numeric ones second
- */
- for (tv = tval; tv->name != NULL; tv++)
- if (strcmp(tv->name, what) == 0)
- break;
-
- if (tv->name != NULL)
- return -1;
-
- if (tv == &tval[T_pt] || tv == &tval[T_km] ||
- tv == &tval[T_am] || tv == &tval[T_xn]) {
- if (strcmp(how, "yes") == 0)
- el->el_terminal.t_val[tv - tval] = 1;
- else if (strcmp(how, "no") == 0)
- el->el_terminal.t_val[tv - tval] = 0;
- else {
- (void) fprintf(el->el_errfile,
- "" FSTR ": Bad value `%s'.\n", argv[0], how);
- return -1;
- }
- terminal_setflags(el);
- if (terminal_change_size(el, Val(T_li), Val(T_co)) == -1)
- return -1;
- return 0;
- } else {
- long i;
- char *ep;
-
- i = strtol(how, &ep, 10);
- if (*ep != '\0') {
- (void) fprintf(el->el_errfile,
- "" FSTR ": Bad value `%s'.\n", argv[0], how);
- return -1;
- }
- el->el_terminal.t_val[tv - tval] = (int) i;
- el->el_terminal.t_size.v = Val(T_co);
- el->el_terminal.t_size.h = Val(T_li);
- if (tv == &tval[T_co] || tv == &tval[T_li])
- if (terminal_change_size(el, Val(T_li), Val(T_co))
- == -1)
- return -1;
- return 0;
- }
-}
-
-
-/* terminal_gettc():
- * Get the current terminal characteristics
- */
-protected int
-/*ARGSUSED*/
-terminal_gettc(EditLine *el, int argc __attribute__((__unused__)), char **argv)
-{
- const struct termcapstr *ts;
- const struct termcapval *tv;
- char *what;
- void *how;
-
- if (argv == NULL || argv[1] == NULL || argv[2] == NULL)
- return -1;
-
- what = argv[1];
- how = argv[2];
-
- /*
- * Do the strings first
- */
- for (ts = tstr; ts->name != NULL; ts++)
- if (strcmp(ts->name, what) == 0)
- break;
-
- if (ts->name != NULL) {
- *(char **)how = el->el_terminal.t_str[ts - tstr];
- return 0;
- }
- /*
- * Do the numeric ones second
- */
- for (tv = tval; tv->name != NULL; tv++)
- if (strcmp(tv->name, what) == 0)
- break;
-
- if (tv->name == NULL)
- return -1;
-
- if (tv == &tval[T_pt] || tv == &tval[T_km] ||
- tv == &tval[T_am] || tv == &tval[T_xn]) {
- static char yes[] = "yes";
- static char no[] = "no";
- if (el->el_terminal.t_val[tv - tval])
- *(char **)how = yes;
- else
- *(char **)how = no;
- return 0;
- } else {
- *(int *)how = el->el_terminal.t_val[tv - tval];
- return 0;
- }
-}
-
-/* terminal_echotc():
- * Print the termcap string out with variable substitution
- */
-protected int
-/*ARGSUSED*/
-terminal_echotc(EditLine *el, int argc __attribute__((__unused__)),
- const Char **argv)
-{
- char *cap, *scap;
- Char *ep;
- int arg_need, arg_cols, arg_rows;
- int verbose = 0, silent = 0;
- char *area;
- static const char fmts[] = "%s\n", fmtd[] = "%d\n";
- const struct termcapstr *t;
- char buf[TC_BUFSIZE];
- long i;
-
- area = buf;
-
- if (argv == NULL || argv[1] == NULL)
- return -1;
- argv++;
-
- if (argv[0][0] == '-') {
- switch (argv[0][1]) {
- case 'v':
- verbose = 1;
- break;
- case 's':
- silent = 1;
- break;
- default:
- /* stderror(ERR_NAME | ERR_TCUSAGE); */
- break;
- }
- argv++;
- }
- if (!*argv || *argv[0] == '\0')
- return 0;
- if (Strcmp(*argv, STR("tabs")) == 0) {
- (void) fprintf(el->el_outfile, fmts, EL_CAN_TAB ? "yes" : "no");
- return 0;
- } else if (Strcmp(*argv, STR("meta")) == 0) {
- (void) fprintf(el->el_outfile, fmts, Val(T_km) ? "yes" : "no");
- return 0;
- } else if (Strcmp(*argv, STR("xn")) == 0) {
- (void) fprintf(el->el_outfile, fmts, EL_HAS_MAGIC_MARGINS ?
- "yes" : "no");
- return 0;
- } else if (Strcmp(*argv, STR("am")) == 0) {
- (void) fprintf(el->el_outfile, fmts, EL_HAS_AUTO_MARGINS ?
- "yes" : "no");
- return 0;
- } else if (Strcmp(*argv, STR("baud")) == 0) {
- (void) fprintf(el->el_outfile, fmtd, (int)el->el_tty.t_speed);
- return 0;
- } else if (Strcmp(*argv, STR("rows")) == 0 ||
- Strcmp(*argv, STR("lines")) == 0) {
- (void) fprintf(el->el_outfile, fmtd, Val(T_li));
- return 0;
- } else if (Strcmp(*argv, STR("cols")) == 0) {
- (void) fprintf(el->el_outfile, fmtd, Val(T_co));
- return 0;
- }
- /*
- * Try to use our local definition first
- */
- scap = NULL;
- for (t = tstr; t->name != NULL; t++)
- if (strcmp(t->name,
- ct_encode_string(*argv, &el->el_scratch)) == 0) {
- scap = el->el_terminal.t_str[t - tstr];
- break;
- }
- if (t->name == NULL) {
- /* XXX: some systems' tgetstr needs non const */
- scap = tgetstr(ct_encode_string(*argv, &el->el_scratch), &area);
- }
- if (!scap || scap[0] == '\0') {
- if (!silent)
- (void) fprintf(el->el_errfile,
- "echotc: Termcap parameter `" FSTR "' not found.\n",
- *argv);
- return -1;
- }
- /*
- * Count home many values we need for this capability.
- */
- for (cap = scap, arg_need = 0; *cap; cap++)
- if (*cap == '%')
- switch (*++cap) {
- case 'd':
- case '2':
- case '3':
- case '.':
- case '+':
- arg_need++;
- break;
- case '%':
- case '>':
- case 'i':
- case 'r':
- case 'n':
- case 'B':
- case 'D':
- break;
- default:
- /*
- * hpux has lot's of them...
- */
- if (verbose)
- (void) fprintf(el->el_errfile,
- "echotc: Warning: unknown termcap %% `%c'.\n",
- *cap);
- /* This is bad, but I won't complain */
- break;
- }
-
- switch (arg_need) {
- case 0:
- argv++;
- if (*argv && *argv[0]) {
- if (!silent)
- (void) fprintf(el->el_errfile,
- "echotc: Warning: Extra argument `" FSTR "'.\n",
- *argv);
- return -1;
- }
- terminal_tputs(el, scap, 1);
- break;
- case 1:
- argv++;
- if (!*argv || *argv[0] == '\0') {
- if (!silent)
- (void) fprintf(el->el_errfile,
- "echotc: Warning: Missing argument.\n");
- return -1;
- }
- arg_cols = 0;
- i = Strtol(*argv, &ep, 10);
- if (*ep != '\0' || i < 0) {
- if (!silent)
- (void) fprintf(el->el_errfile,
- "echotc: Bad value `" FSTR "' for rows.\n",
- *argv);
- return -1;
- }
- arg_rows = (int) i;
- argv++;
- if (*argv && *argv[0]) {
- if (!silent)
- (void) fprintf(el->el_errfile,
- "echotc: Warning: Extra argument `" FSTR
- "'.\n", *argv);
- return -1;
- }
- terminal_tputs(el, tgoto(scap, arg_cols, arg_rows), 1);
- break;
- default:
- /* This is wrong, but I will ignore it... */
- if (verbose)
- (void) fprintf(el->el_errfile,
- "echotc: Warning: Too many required arguments (%d).\n",
- arg_need);
- /* FALLTHROUGH */
- case 2:
- argv++;
- if (!*argv || *argv[0] == '\0') {
- if (!silent)
- (void) fprintf(el->el_errfile,
- "echotc: Warning: Missing argument.\n");
- return -1;
- }
- i = Strtol(*argv, &ep, 10);
- if (*ep != '\0' || i < 0) {
- if (!silent)
- (void) fprintf(el->el_errfile,
- "echotc: Bad value `" FSTR "' for cols.\n",
- *argv);
- return -1;
- }
- arg_cols = (int) i;
- argv++;
- if (!*argv || *argv[0] == '\0') {
- if (!silent)
- (void) fprintf(el->el_errfile,
- "echotc: Warning: Missing argument.\n");
- return -1;
- }
- i = Strtol(*argv, &ep, 10);
- if (*ep != '\0' || i < 0) {
- if (!silent)
- (void) fprintf(el->el_errfile,
- "echotc: Bad value `" FSTR "' for rows.\n",
- *argv);
- return -1;
- }
- arg_rows = (int) i;
- if (*ep != '\0') {
- if (!silent)
- (void) fprintf(el->el_errfile,
- "echotc: Bad value `" FSTR "'.\n", *argv);
- return -1;
- }
- argv++;
- if (*argv && *argv[0]) {
- if (!silent)
- (void) fprintf(el->el_errfile,
- "echotc: Warning: Extra argument `" FSTR
- "'.\n", *argv);
- return -1;
- }
- terminal_tputs(el, tgoto(scap, arg_cols, arg_rows), arg_rows);
- break;
- }
- return 0;
-}
diff --git a/lib/libedit/terminal.h b/lib/libedit/terminal.h
deleted file mode 100644
index 9c66c191ee3a..000000000000
--- a/lib/libedit/terminal.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/* $NetBSD: terminal.h,v 1.7 2016/02/16 15:53:48 christos Exp $ */
-
-/*-
- * 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.
- *
- * @(#)term.h 8.1 (Berkeley) 6/4/93
- * $FreeBSD$
- */
-
-/*
- * el.term.h: Termcap header
- */
-#ifndef _h_el_terminal
-#define _h_el_terminal
-
-typedef struct { /* Symbolic function key bindings */
- const Char *name; /* name of the key */
- int key; /* Index in termcap table */
- keymacro_value_t fun; /* Function bound to it */
- int type; /* Type of function */
-} funckey_t;
-
-typedef struct {
- const char *t_name; /* the terminal name */
- coord_t t_size; /* # lines and cols */
- int t_flags;
-#define TERM_CAN_INSERT 0x001 /* Has insert cap */
-#define TERM_CAN_DELETE 0x002 /* Has delete cap */
-#define TERM_CAN_CEOL 0x004 /* Has CEOL cap */
-#define TERM_CAN_TAB 0x008 /* Can use tabs */
-#define TERM_CAN_ME 0x010 /* Can turn all attrs. */
-#define TERM_CAN_UP 0x020 /* Can move up */
-#define TERM_HAS_META 0x040 /* Has a meta key */
-#define TERM_HAS_AUTO_MARGINS 0x080 /* Has auto margins */
-#define TERM_HAS_MAGIC_MARGINS 0x100 /* Has magic margins */
- char *t_buf; /* Termcap buffer */
- size_t t_loc; /* location used */
- char **t_str; /* termcap strings */
- int *t_val; /* termcap values */
- char *t_cap; /* Termcap buffer */
- funckey_t *t_fkey; /* Array of keys */
-} el_terminal_t;
-
-/*
- * fKey indexes
- */
-#define A_K_DN 0
-#define A_K_UP 1
-#define A_K_LT 2
-#define A_K_RT 3
-#define A_K_HO 4
-#define A_K_EN 5
-#define A_K_DE 6
-#define A_K_NKEYS 7
-
-protected void terminal_move_to_line(EditLine *, int);
-protected void terminal_move_to_char(EditLine *, int);
-protected void terminal_clear_EOL(EditLine *, int);
-protected void terminal_overwrite(EditLine *, const Char *, size_t);
-protected void terminal_insertwrite(EditLine *, Char *, int);
-protected void terminal_deletechars(EditLine *, int);
-protected void terminal_clear_screen(EditLine *);
-protected void terminal_beep(EditLine *);
-protected int terminal_change_size(EditLine *, int, int);
-protected int terminal_get_size(EditLine *, int *, int *);
-protected int terminal_init(EditLine *);
-protected void terminal_bind_arrow(EditLine *);
-protected void terminal_print_arrow(EditLine *, const Char *);
-protected int terminal_clear_arrow(EditLine *, const Char *);
-protected int terminal_set_arrow(EditLine *, const Char *, keymacro_value_t *, int);
-protected void terminal_end(EditLine *);
-protected void terminal_get(EditLine *, const char **);
-protected int terminal_set(EditLine *, const char *);
-protected int terminal_settc(EditLine *, int, const Char **);
-protected int terminal_gettc(EditLine *, int, char **);
-protected int terminal_telltc(EditLine *, int, const Char **);
-protected int terminal_echotc(EditLine *, int, const Char **);
-protected void terminal_writec(EditLine *, wint_t);
-protected int terminal__putc(EditLine *, wint_t);
-protected void terminal__flush(EditLine *);
-
-/*
- * Easy access macros
- */
-#define EL_FLAGS (el)->el_terminal.t_flags
-
-#define EL_CAN_INSERT (EL_FLAGS & TERM_CAN_INSERT)
-#define EL_CAN_DELETE (EL_FLAGS & TERM_CAN_DELETE)
-#define EL_CAN_CEOL (EL_FLAGS & TERM_CAN_CEOL)
-#define EL_CAN_TAB (EL_FLAGS & TERM_CAN_TAB)
-#define EL_CAN_ME (EL_FLAGS & TERM_CAN_ME)
-#define EL_CAN_UP (EL_FLAGS & TERM_CAN_UP)
-#define EL_HAS_META (EL_FLAGS & TERM_HAS_META)
-#define EL_HAS_AUTO_MARGINS (EL_FLAGS & TERM_HAS_AUTO_MARGINS)
-#define EL_HAS_MAGIC_MARGINS (EL_FLAGS & TERM_HAS_MAGIC_MARGINS)
-
-#endif /* _h_el_terminal */
diff --git a/lib/libedit/tokenizer.c b/lib/libedit/tokenizer.c
deleted file mode 100644
index 23f940ff866a..000000000000
--- a/lib/libedit/tokenizer.c
+++ /dev/null
@@ -1,455 +0,0 @@
-/* $NetBSD: tokenizer.c,v 1.24 2016/02/17 19:47:49 christos Exp $ */
-
-/*-
- * 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.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-#if 0
-static char sccsid[] = "@(#)tokenizer.c 8.1 (Berkeley) 6/4/93";
-#else
-__RCSID("$NetBSD: tokenizer.c,v 1.24 2016/02/17 19:47:49 christos Exp $");
-#endif
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/* We build this file twice, once as NARROW, once as WIDE. */
-/*
- * tokenize.c: Bourne shell like tokenizer
- */
-#include <stdlib.h>
-#include <string.h>
-
-#include "histedit.h"
-#include "chartype.h"
-
-typedef enum {
- Q_none, Q_single, Q_double, Q_one, Q_doubleone
-} quote_t;
-
-#define TOK_KEEP 1
-#define TOK_EAT 2
-
-#define WINCR 20
-#define AINCR 10
-
-#define IFS STR("\t \n")
-
-#define tok_malloc(a) malloc(a)
-#define tok_free(a) free(a)
-#define tok_realloc(a, b) realloc(a, b)
-#define tok_strdup(a) Strdup(a)
-
-
-struct TYPE(tokenizer) {
- Char *ifs; /* In field separator */
- size_t argc, amax; /* Current and maximum number of args */
- Char **argv; /* Argument list */
- Char *wptr, *wmax; /* Space and limit on the word buffer */
- Char *wstart; /* Beginning of next word */
- Char *wspace; /* Space of word buffer */
- quote_t quote; /* Quoting state */
- int flags; /* flags; */
-};
-
-
-private void FUN(tok,finish)(TYPE(Tokenizer) *);
-
-
-/* FUN(tok,finish)():
- * Finish a word in the tokenizer.
- */
-private void
-FUN(tok,finish)(TYPE(Tokenizer) *tok)
-{
-
- *tok->wptr = '\0';
- if ((tok->flags & TOK_KEEP) || tok->wptr != tok->wstart) {
- tok->argv[tok->argc++] = tok->wstart;
- tok->argv[tok->argc] = NULL;
- tok->wstart = ++tok->wptr;
- }
- tok->flags &= ~TOK_KEEP;
-}
-
-
-/* FUN(tok,init)():
- * Initialize the tokenizer
- */
-public TYPE(Tokenizer) *
-FUN(tok,init)(const Char *ifs)
-{
- TYPE(Tokenizer) *tok = tok_malloc(sizeof(*tok));
-
- if (tok == NULL)
- return NULL;
- tok->ifs = tok_strdup(ifs ? ifs : IFS);
- if (tok->ifs == NULL) {
- tok_free(tok);
- return NULL;
- }
- tok->argc = 0;
- tok->amax = AINCR;
- tok->argv = tok_malloc(sizeof(*tok->argv) * tok->amax);
- if (tok->argv == NULL) {
- tok_free(tok->ifs);
- tok_free(tok);
- return NULL;
- }
- tok->argv[0] = NULL;
- tok->wspace = tok_malloc(WINCR * sizeof(*tok->wspace));
- if (tok->wspace == NULL) {
- tok_free(tok->argv);
- tok_free(tok->ifs);
- tok_free(tok);
- return NULL;
- }
- tok->wmax = tok->wspace + WINCR;
- tok->wstart = tok->wspace;
- tok->wptr = tok->wspace;
- tok->flags = 0;
- tok->quote = Q_none;
-
- return tok;
-}
-
-
-/* FUN(tok,reset)():
- * Reset the tokenizer
- */
-public void
-FUN(tok,reset)(TYPE(Tokenizer) *tok)
-{
-
- tok->argc = 0;
- tok->wstart = tok->wspace;
- tok->wptr = tok->wspace;
- tok->flags = 0;
- tok->quote = Q_none;
-}
-
-
-/* FUN(tok,end)():
- * Clean up
- */
-public void
-FUN(tok,end)(TYPE(Tokenizer) *tok)
-{
-
- tok_free(tok->ifs);
- tok_free(tok->wspace);
- tok_free(tok->argv);
- tok_free(tok);
-}
-
-
-
-/* FUN(tok,line)():
- * Bourne shell (sh(1)) like tokenizing
- * Arguments:
- * tok current tokenizer state (setup with FUN(tok,init)())
- * line line to parse
- * Returns:
- * -1 Internal error
- * 3 Quoted return
- * 2 Unmatched double quote
- * 1 Unmatched single quote
- * 0 Ok
- * Modifies (if return value is 0):
- * argc number of arguments
- * argv argument array
- * cursorc if !NULL, argv element containing cursor
- * cursorv if !NULL, offset in argv[cursorc] of cursor
- */
-public int
-FUN(tok,line)(TYPE(Tokenizer) *tok, const TYPE(LineInfo) *line,
- int *argc, const Char ***argv, int *cursorc, int *cursoro)
-{
- const Char *ptr;
- int cc, co;
-
- cc = co = -1;
- ptr = line->buffer;
- for (ptr = line->buffer; ;ptr++) {
- if (ptr >= line->lastchar)
- ptr = STR("");
- if (ptr == line->cursor) {
- cc = (int)tok->argc;
- co = (int)(tok->wptr - tok->wstart);
- }
- switch (*ptr) {
- case '\'':
- tok->flags |= TOK_KEEP;
- tok->flags &= ~TOK_EAT;
- switch (tok->quote) {
- case Q_none:
- tok->quote = Q_single; /* Enter single quote
- * mode */
- break;
-
- case Q_single: /* Exit single quote mode */
- tok->quote = Q_none;
- break;
-
- case Q_one: /* Quote this ' */
- tok->quote = Q_none;
- *tok->wptr++ = *ptr;
- break;
-
- case Q_double: /* Stay in double quote mode */
- *tok->wptr++ = *ptr;
- break;
-
- case Q_doubleone: /* Quote this ' */
- tok->quote = Q_double;
- *tok->wptr++ = *ptr;
- break;
-
- default:
- return -1;
- }
- break;
-
- case '"':
- tok->flags &= ~TOK_EAT;
- tok->flags |= TOK_KEEP;
- switch (tok->quote) {
- case Q_none: /* Enter double quote mode */
- tok->quote = Q_double;
- break;
-
- case Q_double: /* Exit double quote mode */
- tok->quote = Q_none;
- break;
-
- case Q_one: /* Quote this " */
- tok->quote = Q_none;
- *tok->wptr++ = *ptr;
- break;
-
- case Q_single: /* Stay in single quote mode */
- *tok->wptr++ = *ptr;
- break;
-
- case Q_doubleone: /* Quote this " */
- tok->quote = Q_double;
- *tok->wptr++ = *ptr;
- break;
-
- default:
- return -1;
- }
- break;
-
- case '\\':
- tok->flags |= TOK_KEEP;
- tok->flags &= ~TOK_EAT;
- switch (tok->quote) {
- case Q_none: /* Quote next character */
- tok->quote = Q_one;
- break;
-
- case Q_double: /* Quote next character */
- tok->quote = Q_doubleone;
- break;
-
- case Q_one: /* Quote this, restore state */
- *tok->wptr++ = *ptr;
- tok->quote = Q_none;
- break;
-
- case Q_single: /* Stay in single quote mode */
- *tok->wptr++ = *ptr;
- break;
-
- case Q_doubleone: /* Quote this \ */
- tok->quote = Q_double;
- *tok->wptr++ = *ptr;
- break;
-
- default:
- return -1;
- }
- break;
-
- case '\n':
- tok->flags &= ~TOK_EAT;
- switch (tok->quote) {
- case Q_none:
- goto tok_line_outok;
-
- case Q_single:
- case Q_double:
- *tok->wptr++ = *ptr; /* Add the return */
- break;
-
- case Q_doubleone: /* Back to double, eat the '\n' */
- tok->flags |= TOK_EAT;
- tok->quote = Q_double;
- break;
-
- case Q_one: /* No quote, more eat the '\n' */
- tok->flags |= TOK_EAT;
- tok->quote = Q_none;
- break;
-
- default:
- return 0;
- }
- break;
-
- case '\0':
- switch (tok->quote) {
- case Q_none:
- /* Finish word and return */
- if (tok->flags & TOK_EAT) {
- tok->flags &= ~TOK_EAT;
- return 3;
- }
- goto tok_line_outok;
-
- case Q_single:
- return 1;
-
- case Q_double:
- return 2;
-
- case Q_doubleone:
- tok->quote = Q_double;
- *tok->wptr++ = *ptr;
- break;
-
- case Q_one:
- tok->quote = Q_none;
- *tok->wptr++ = *ptr;
- break;
-
- default:
- return -1;
- }
- break;
-
- default:
- tok->flags &= ~TOK_EAT;
- switch (tok->quote) {
- case Q_none:
- if (Strchr(tok->ifs, *ptr) != NULL)
- FUN(tok,finish)(tok);
- else
- *tok->wptr++ = *ptr;
- break;
-
- case Q_single:
- case Q_double:
- *tok->wptr++ = *ptr;
- break;
-
-
- case Q_doubleone:
- *tok->wptr++ = '\\';
- tok->quote = Q_double;
- *tok->wptr++ = *ptr;
- break;
-
- case Q_one:
- tok->quote = Q_none;
- *tok->wptr++ = *ptr;
- break;
-
- default:
- return -1;
-
- }
- break;
- }
-
- if (tok->wptr >= tok->wmax - 4) {
- size_t size = (size_t)(tok->wmax - tok->wspace + WINCR);
- Char *s = tok_realloc(tok->wspace,
- size * sizeof(*s));
- if (s == NULL)
- return -1;
-
- if (s != tok->wspace) {
- size_t i;
- for (i = 0; i < tok->argc; i++) {
- tok->argv[i] =
- (tok->argv[i] - tok->wspace) + s;
- }
- tok->wptr = (tok->wptr - tok->wspace) + s;
- tok->wstart = (tok->wstart - tok->wspace) + s;
- tok->wspace = s;
- }
- tok->wmax = s + size;
- }
- if (tok->argc >= tok->amax - 4) {
- Char **p;
- tok->amax += AINCR;
- p = tok_realloc(tok->argv, tok->amax * sizeof(*p));
- if (p == NULL) {
- tok->amax -= AINCR;
- return -1;
- }
- tok->argv = p;
- }
- }
- tok_line_outok:
- if (cc == -1 && co == -1) {
- cc = (int)tok->argc;
- co = (int)(tok->wptr - tok->wstart);
- }
- if (cursorc != NULL)
- *cursorc = cc;
- if (cursoro != NULL)
- *cursoro = co;
- FUN(tok,finish)(tok);
- *argv = (const Char **)tok->argv;
- *argc = (int)tok->argc;
- return 0;
-}
-
-/* FUN(tok,str)():
- * Simpler version of tok_line, taking a NUL terminated line
- * and splitting into words, ignoring cursor state.
- */
-public int
-FUN(tok,str)(TYPE(Tokenizer) *tok, const Char *line, int *argc,
- const Char ***argv)
-{
- TYPE(LineInfo) li;
-
- memset(&li, 0, sizeof(li));
- li.buffer = line;
- li.cursor = li.lastchar = Strchr(line, '\0');
- return FUN(tok,line)(tok, &li, argc, argv, NULL, NULL);
-}
diff --git a/lib/libedit/tty.c b/lib/libedit/tty.c
deleted file mode 100644
index 971bfc6afd68..000000000000
--- a/lib/libedit/tty.c
+++ /dev/null
@@ -1,1340 +0,0 @@
-/* $NetBSD: tty.c,v 1.59 2016/03/22 01:34:32 christos Exp $ */
-
-/*-
- * 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.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-#if 0
-static char sccsid[] = "@(#)tty.c 8.1 (Berkeley) 6/4/93";
-#else
-__RCSID("$NetBSD: tty.c,v 1.59 2016/03/22 01:34:32 christos Exp $");
-#endif
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * tty.c: tty interface stuff
- */
-#include <assert.h>
-#include <errno.h>
-#include <stdlib.h> /* for abort */
-#include <string.h>
-#include <strings.h> /* for ffs */
-#include <unistd.h> /* for isatty */
-
-#include "el.h"
-#include "parse.h"
-
-typedef struct ttymodes_t {
- const char *m_name;
- unsigned int m_value;
- int m_type;
-} ttymodes_t;
-
-typedef struct ttymap_t {
- wint_t nch, och; /* Internal and termio rep of chars */
- el_action_t bind[3]; /* emacs, vi, and vi-cmd */
-} ttymap_t;
-
-
-private const ttyperm_t ttyperm = {
- {
- {"iflag:", ICRNL, (INLCR | IGNCR)},
- {"oflag:", (OPOST | ONLCR), ONLRET},
- {"cflag:", 0, 0},
- {"lflag:", (ISIG | ICANON | ECHO | ECHOE | ECHOCTL | IEXTEN),
- (NOFLSH | ECHONL | EXTPROC | FLUSHO)},
- {"chars:", 0, 0},
- },
- {
- {"iflag:", (INLCR | ICRNL), IGNCR},
- {"oflag:", (OPOST | ONLCR), ONLRET},
- {"cflag:", 0, 0},
- {"lflag:", ISIG,
- (NOFLSH | ICANON | ECHO | ECHOK | ECHONL | EXTPROC | IEXTEN | FLUSHO)},
- {"chars:", (C_SH(C_MIN) | C_SH(C_TIME) | C_SH(C_SWTCH) | C_SH(C_DSWTCH) |
- C_SH(C_SUSP) | C_SH(C_DSUSP) | C_SH(C_EOL) | C_SH(C_DISCARD) |
- C_SH(C_PGOFF) | C_SH(C_PAGE) | C_SH(C_STATUS)), 0}
- },
- {
- {"iflag:", 0, IXON | IXOFF | INLCR | ICRNL},
- {"oflag:", 0, 0},
- {"cflag:", 0, 0},
- {"lflag:", 0, ISIG | IEXTEN},
- {"chars:", 0, 0},
- }
-};
-
-private const ttychar_t ttychar = {
- {
- CINTR, CQUIT, CERASE, CKILL,
- CEOF, CEOL, CEOL2, CSWTCH,
- CDSWTCH, CERASE2, CSTART, CSTOP,
- CWERASE, CSUSP, CDSUSP, CREPRINT,
- CDISCARD, CLNEXT, CSTATUS, CPAGE,
- CPGOFF, CKILL2, CBRK, CMIN,
- CTIME
- },
- {
- CINTR, CQUIT, CERASE, CKILL,
- _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE,
- _POSIX_VDISABLE, CERASE2, CSTART, CSTOP,
- _POSIX_VDISABLE, CSUSP, _POSIX_VDISABLE, _POSIX_VDISABLE,
- CDISCARD, _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE,
- _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, 1,
- 0
- },
- {
- 0, 0, 0, 0,
- 0, 0, 0, 0,
- 0, 0, 0, 0,
- 0, 0, 0, 0,
- 0, 0, 0, 0,
- 0, 0, 0, 0,
- 0
- }
-};
-
-private const ttymap_t tty_map[] = {
-#ifdef VERASE
- {C_ERASE, VERASE,
- {EM_DELETE_PREV_CHAR, VI_DELETE_PREV_CHAR, ED_PREV_CHAR}},
-#endif /* VERASE */
-#ifdef VERASE2
- {C_ERASE2, VERASE2,
- {EM_DELETE_PREV_CHAR, VI_DELETE_PREV_CHAR, ED_PREV_CHAR}},
-#endif /* VERASE2 */
-#ifdef VKILL
- {C_KILL, VKILL,
- {EM_KILL_LINE, VI_KILL_LINE_PREV, ED_UNASSIGNED}},
-#endif /* VKILL */
-#ifdef VKILL2
- {C_KILL2, VKILL2,
- {EM_KILL_LINE, VI_KILL_LINE_PREV, ED_UNASSIGNED}},
-#endif /* VKILL2 */
-#ifdef VEOF
- {C_EOF, VEOF,
- {EM_DELETE_OR_LIST, VI_LIST_OR_EOF, ED_UNASSIGNED}},
-#endif /* VEOF */
-#ifdef VWERASE
- {C_WERASE, VWERASE,
- {ED_DELETE_PREV_WORD, ED_DELETE_PREV_WORD, ED_PREV_WORD}},
-#endif /* VWERASE */
-#ifdef VREPRINT
- {C_REPRINT, VREPRINT,
- {ED_REDISPLAY, ED_INSERT, ED_REDISPLAY}},
-#endif /* VREPRINT */
-#ifdef VLNEXT
- {C_LNEXT, VLNEXT,
- {ED_QUOTED_INSERT, ED_QUOTED_INSERT, ED_UNASSIGNED}},
-#endif /* VLNEXT */
- {(wint_t)-1, (wint_t)-1,
- {ED_UNASSIGNED, ED_UNASSIGNED, ED_UNASSIGNED}}
-};
-
-private const ttymodes_t ttymodes[] = {
-#ifdef IGNBRK
- {"ignbrk", IGNBRK, MD_INP},
-#endif /* IGNBRK */
-#ifdef BRKINT
- {"brkint", BRKINT, MD_INP},
-#endif /* BRKINT */
-#ifdef IGNPAR
- {"ignpar", IGNPAR, MD_INP},
-#endif /* IGNPAR */
-#ifdef PARMRK
- {"parmrk", PARMRK, MD_INP},
-#endif /* PARMRK */
-#ifdef INPCK
- {"inpck", INPCK, MD_INP},
-#endif /* INPCK */
-#ifdef ISTRIP
- {"istrip", ISTRIP, MD_INP},
-#endif /* ISTRIP */
-#ifdef INLCR
- {"inlcr", INLCR, MD_INP},
-#endif /* INLCR */
-#ifdef IGNCR
- {"igncr", IGNCR, MD_INP},
-#endif /* IGNCR */
-#ifdef ICRNL
- {"icrnl", ICRNL, MD_INP},
-#endif /* ICRNL */
-#ifdef IUCLC
- {"iuclc", IUCLC, MD_INP},
-#endif /* IUCLC */
-#ifdef IXON
- {"ixon", IXON, MD_INP},
-#endif /* IXON */
-#ifdef IXANY
- {"ixany", IXANY, MD_INP},
-#endif /* IXANY */
-#ifdef IXOFF
- {"ixoff", IXOFF, MD_INP},
-#endif /* IXOFF */
-#ifdef IMAXBEL
- {"imaxbel", IMAXBEL, MD_INP},
-#endif /* IMAXBEL */
-
-#ifdef OPOST
- {"opost", OPOST, MD_OUT},
-#endif /* OPOST */
-#ifdef OLCUC
- {"olcuc", OLCUC, MD_OUT},
-#endif /* OLCUC */
-#ifdef ONLCR
- {"onlcr", ONLCR, MD_OUT},
-#endif /* ONLCR */
-#ifdef OCRNL
- {"ocrnl", OCRNL, MD_OUT},
-#endif /* OCRNL */
-#ifdef ONOCR
- {"onocr", ONOCR, MD_OUT},
-#endif /* ONOCR */
-#ifdef ONOEOT
- {"onoeot", ONOEOT, MD_OUT},
-#endif /* ONOEOT */
-#ifdef ONLRET
- {"onlret", ONLRET, MD_OUT},
-#endif /* ONLRET */
-#ifdef OFILL
- {"ofill", OFILL, MD_OUT},
-#endif /* OFILL */
-#ifdef OFDEL
- {"ofdel", OFDEL, MD_OUT},
-#endif /* OFDEL */
-#ifdef NLDLY
- {"nldly", NLDLY, MD_OUT},
-#endif /* NLDLY */
-#ifdef CRDLY
- {"crdly", CRDLY, MD_OUT},
-#endif /* CRDLY */
-#ifdef TABDLY
- {"tabdly", TABDLY, MD_OUT},
-#endif /* TABDLY */
-#ifdef XTABS
- {"xtabs", XTABS, MD_OUT},
-#endif /* XTABS */
-#ifdef BSDLY
- {"bsdly", BSDLY, MD_OUT},
-#endif /* BSDLY */
-#ifdef VTDLY
- {"vtdly", VTDLY, MD_OUT},
-#endif /* VTDLY */
-#ifdef FFDLY
- {"ffdly", FFDLY, MD_OUT},
-#endif /* FFDLY */
-#ifdef PAGEOUT
- {"pageout", PAGEOUT, MD_OUT},
-#endif /* PAGEOUT */
-#ifdef WRAP
- {"wrap", WRAP, MD_OUT},
-#endif /* WRAP */
-
-#ifdef CIGNORE
- {"cignore", CIGNORE, MD_CTL},
-#endif /* CBAUD */
-#ifdef CBAUD
- {"cbaud", CBAUD, MD_CTL},
-#endif /* CBAUD */
-#ifdef CSTOPB
- {"cstopb", CSTOPB, MD_CTL},
-#endif /* CSTOPB */
-#ifdef CREAD
- {"cread", CREAD, MD_CTL},
-#endif /* CREAD */
-#ifdef PARENB
- {"parenb", PARENB, MD_CTL},
-#endif /* PARENB */
-#ifdef PARODD
- {"parodd", PARODD, MD_CTL},
-#endif /* PARODD */
-#ifdef HUPCL
- {"hupcl", HUPCL, MD_CTL},
-#endif /* HUPCL */
-#ifdef CLOCAL
- {"clocal", CLOCAL, MD_CTL},
-#endif /* CLOCAL */
-#ifdef LOBLK
- {"loblk", LOBLK, MD_CTL},
-#endif /* LOBLK */
-#ifdef CIBAUD
- {"cibaud", CIBAUD, MD_CTL},
-#endif /* CIBAUD */
-#ifdef CRTSCTS
-#ifdef CCTS_OFLOW
- {"ccts_oflow", CCTS_OFLOW, MD_CTL},
-#else
- {"crtscts", CRTSCTS, MD_CTL},
-#endif /* CCTS_OFLOW */
-#endif /* CRTSCTS */
-#ifdef CRTS_IFLOW
- {"crts_iflow", CRTS_IFLOW, MD_CTL},
-#endif /* CRTS_IFLOW */
-#ifdef CDTRCTS
- {"cdtrcts", CDTRCTS, MD_CTL},
-#endif /* CDTRCTS */
-#ifdef MDMBUF
- {"mdmbuf", MDMBUF, MD_CTL},
-#endif /* MDMBUF */
-#ifdef RCV1EN
- {"rcv1en", RCV1EN, MD_CTL},
-#endif /* RCV1EN */
-#ifdef XMT1EN
- {"xmt1en", XMT1EN, MD_CTL},
-#endif /* XMT1EN */
-
-#ifdef ISIG
- {"isig", ISIG, MD_LIN},
-#endif /* ISIG */
-#ifdef ICANON
- {"icanon", ICANON, MD_LIN},
-#endif /* ICANON */
-#ifdef XCASE
- {"xcase", XCASE, MD_LIN},
-#endif /* XCASE */
-#ifdef ECHO
- {"echo", ECHO, MD_LIN},
-#endif /* ECHO */
-#ifdef ECHOE
- {"echoe", ECHOE, MD_LIN},
-#endif /* ECHOE */
-#ifdef ECHOK
- {"echok", ECHOK, MD_LIN},
-#endif /* ECHOK */
-#ifdef ECHONL
- {"echonl", ECHONL, MD_LIN},
-#endif /* ECHONL */
-#ifdef NOFLSH
- {"noflsh", NOFLSH, MD_LIN},
-#endif /* NOFLSH */
-#ifdef TOSTOP
- {"tostop", TOSTOP, MD_LIN},
-#endif /* TOSTOP */
-#ifdef ECHOCTL
- {"echoctl", ECHOCTL, MD_LIN},
-#endif /* ECHOCTL */
-#ifdef ECHOPRT
- {"echoprt", ECHOPRT, MD_LIN},
-#endif /* ECHOPRT */
-#ifdef ECHOKE
- {"echoke", ECHOKE, MD_LIN},
-#endif /* ECHOKE */
-#ifdef DEFECHO
- {"defecho", DEFECHO, MD_LIN},
-#endif /* DEFECHO */
-#ifdef FLUSHO
- {"flusho", FLUSHO, MD_LIN},
-#endif /* FLUSHO */
-#ifdef PENDIN
- {"pendin", PENDIN, MD_LIN},
-#endif /* PENDIN */
-#ifdef IEXTEN
- {"iexten", IEXTEN, MD_LIN},
-#endif /* IEXTEN */
-#ifdef NOKERNINFO
- {"nokerninfo", NOKERNINFO, MD_LIN},
-#endif /* NOKERNINFO */
-#ifdef ALTWERASE
- {"altwerase", ALTWERASE, MD_LIN},
-#endif /* ALTWERASE */
-#ifdef EXTPROC
- {"extproc", EXTPROC, MD_LIN},
-#endif /* EXTPROC */
-
-#if defined(VINTR)
- {"intr", C_SH(C_INTR), MD_CHAR},
-#endif /* VINTR */
-#if defined(VQUIT)
- {"quit", C_SH(C_QUIT), MD_CHAR},
-#endif /* VQUIT */
-#if defined(VERASE)
- {"erase", C_SH(C_ERASE), MD_CHAR},
-#endif /* VERASE */
-#if defined(VKILL)
- {"kill", C_SH(C_KILL), MD_CHAR},
-#endif /* VKILL */
-#if defined(VEOF)
- {"eof", C_SH(C_EOF), MD_CHAR},
-#endif /* VEOF */
-#if defined(VEOL)
- {"eol", C_SH(C_EOL), MD_CHAR},
-#endif /* VEOL */
-#if defined(VEOL2)
- {"eol2", C_SH(C_EOL2), MD_CHAR},
-#endif /* VEOL2 */
-#if defined(VSWTCH)
- {"swtch", C_SH(C_SWTCH), MD_CHAR},
-#endif /* VSWTCH */
-#if defined(VDSWTCH)
- {"dswtch", C_SH(C_DSWTCH), MD_CHAR},
-#endif /* VDSWTCH */
-#if defined(VERASE2)
- {"erase2", C_SH(C_ERASE2), MD_CHAR},
-#endif /* VERASE2 */
-#if defined(VSTART)
- {"start", C_SH(C_START), MD_CHAR},
-#endif /* VSTART */
-#if defined(VSTOP)
- {"stop", C_SH(C_STOP), MD_CHAR},
-#endif /* VSTOP */
-#if defined(VWERASE)
- {"werase", C_SH(C_WERASE), MD_CHAR},
-#endif /* VWERASE */
-#if defined(VSUSP)
- {"susp", C_SH(C_SUSP), MD_CHAR},
-#endif /* VSUSP */
-#if defined(VDSUSP)
- {"dsusp", C_SH(C_DSUSP), MD_CHAR},
-#endif /* VDSUSP */
-#if defined(VREPRINT)
- {"reprint", C_SH(C_REPRINT), MD_CHAR},
-#endif /* VREPRINT */
-#if defined(VDISCARD)
- {"discard", C_SH(C_DISCARD), MD_CHAR},
-#endif /* VDISCARD */
-#if defined(VLNEXT)
- {"lnext", C_SH(C_LNEXT), MD_CHAR},
-#endif /* VLNEXT */
-#if defined(VSTATUS)
- {"status", C_SH(C_STATUS), MD_CHAR},
-#endif /* VSTATUS */
-#if defined(VPAGE)
- {"page", C_SH(C_PAGE), MD_CHAR},
-#endif /* VPAGE */
-#if defined(VPGOFF)
- {"pgoff", C_SH(C_PGOFF), MD_CHAR},
-#endif /* VPGOFF */
-#if defined(VKILL2)
- {"kill2", C_SH(C_KILL2), MD_CHAR},
-#endif /* VKILL2 */
-#if defined(VBRK)
- {"brk", C_SH(C_BRK), MD_CHAR},
-#endif /* VBRK */
-#if defined(VMIN)
- {"min", C_SH(C_MIN), MD_CHAR},
-#endif /* VMIN */
-#if defined(VTIME)
- {"time", C_SH(C_TIME), MD_CHAR},
-#endif /* VTIME */
- {NULL, 0, -1},
-};
-
-
-
-#define tty__gettabs(td) ((((td)->c_oflag & TAB3) == TAB3) ? 0 : 1)
-#define tty__geteightbit(td) (((td)->c_cflag & CSIZE) == CS8)
-#define tty__cooked_mode(td) ((td)->c_lflag & ICANON)
-
-private int tty_getty(EditLine *, struct termios *);
-private int tty_setty(EditLine *, int, const struct termios *);
-private int tty__getcharindex(int);
-private void tty__getchar(struct termios *, unsigned char *);
-private void tty__setchar(struct termios *, unsigned char *);
-private speed_t tty__getspeed(struct termios *);
-private int tty_setup(EditLine *);
-private void tty_setup_flags(EditLine *, struct termios *, int);
-
-#define t_qu t_ts
-
-/* tty_getty():
- * Wrapper for tcgetattr to handle EINTR
- */
-private int
-tty_getty(EditLine *el, struct termios *t)
-{
- int rv;
- while ((rv = tcgetattr(el->el_infd, t)) == -1 && errno == EINTR)
- continue;
- return rv;
-}
-
-/* tty_setty():
- * Wrapper for tcsetattr to handle EINTR
- */
-private int
-tty_setty(EditLine *el, int action, const struct termios *t)
-{
- int rv;
- while ((rv = tcsetattr(el->el_infd, action, t)) == -1 && errno == EINTR)
- continue;
- return rv;
-}
-
-/* tty_setup():
- * Get the tty parameters and initialize the editing state
- */
-private int
-tty_setup(EditLine *el)
-{
- int rst = 1;
-
- if (el->el_flags & EDIT_DISABLED)
- return 0;
-
- if (el->el_tty.t_initialized)
- return -1;
-
- if (!isatty(el->el_outfd)) {
-#ifdef DEBUG_TTY
- (void) fprintf(el->el_errfile, "%s: isatty: %s\n", __func__,
- strerror(errno));
-#endif /* DEBUG_TTY */
- return -1;
- }
- if (tty_getty(el, &el->el_tty.t_or) == -1) {
-#ifdef DEBUG_TTY
- (void) fprintf(el->el_errfile, "%s: tty_getty: %s\n", __func__,
- strerror(errno));
-#endif /* DEBUG_TTY */
- return -1;
- }
- el->el_tty.t_ts = el->el_tty.t_ex = el->el_tty.t_ed = el->el_tty.t_or;
-
- el->el_tty.t_speed = tty__getspeed(&el->el_tty.t_ex);
- el->el_tty.t_tabs = tty__gettabs(&el->el_tty.t_ex);
- el->el_tty.t_eight = tty__geteightbit(&el->el_tty.t_ex);
-
- tty_setup_flags(el, &el->el_tty.t_ex, EX_IO);
-
- /*
- * Reset the tty chars to reasonable defaults
- * If they are disabled, then enable them.
- */
- if (rst) {
- if (tty__cooked_mode(&el->el_tty.t_ts)) {
- tty__getchar(&el->el_tty.t_ts, el->el_tty.t_c[TS_IO]);
- /*
- * Don't affect CMIN and CTIME for the editor mode
- */
- for (rst = 0; rst < C_NCC - 2; rst++)
- if (el->el_tty.t_c[TS_IO][rst] !=
- el->el_tty.t_vdisable
- && el->el_tty.t_c[ED_IO][rst] !=
- el->el_tty.t_vdisable)
- el->el_tty.t_c[ED_IO][rst] =
- el->el_tty.t_c[TS_IO][rst];
- for (rst = 0; rst < C_NCC; rst++)
- if (el->el_tty.t_c[TS_IO][rst] !=
- el->el_tty.t_vdisable)
- el->el_tty.t_c[EX_IO][rst] =
- el->el_tty.t_c[TS_IO][rst];
- }
- tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]);
- if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ex) == -1) {
-#ifdef DEBUG_TTY
- (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n",
- __func__, strerror(errno));
-#endif /* DEBUG_TTY */
- return -1;
- }
- }
-
- tty_setup_flags(el, &el->el_tty.t_ed, ED_IO);
-
- tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]);
- tty_bind_char(el, 1);
- el->el_tty.t_initialized = 1;
- return 0;
-}
-
-protected int
-tty_init(EditLine *el)
-{
-
- el->el_tty.t_mode = EX_IO;
- el->el_tty.t_vdisable = _POSIX_VDISABLE;
- el->el_tty.t_initialized = 0;
- (void) memcpy(el->el_tty.t_t, ttyperm, sizeof(ttyperm_t));
- (void) memcpy(el->el_tty.t_c, ttychar, sizeof(ttychar_t));
- return tty_setup(el);
-}
-
-
-/* tty_end():
- * Restore the tty to its original settings
- */
-protected void
-/*ARGSUSED*/
-tty_end(EditLine *el)
-{
- if (el->el_flags & EDIT_DISABLED)
- return;
-
- if (!el->el_tty.t_initialized)
- return;
-
- if (tty_setty(el, TCSAFLUSH, &el->el_tty.t_or) == -1) {
-#ifdef DEBUG_TTY
- (void) fprintf(el->el_errfile,
- "%s: tty_setty: %s\n", __func__, strerror(errno));
-#endif /* DEBUG_TTY */
- }
-}
-
-
-/* tty__getspeed():
- * Get the tty speed
- */
-private speed_t
-tty__getspeed(struct termios *td)
-{
- speed_t spd;
-
- if ((spd = cfgetispeed(td)) == 0)
- spd = cfgetospeed(td);
- return spd;
-}
-
-/* tty__getspeed():
- * Return the index of the asked char in the c_cc array
- */
-private int
-tty__getcharindex(int i)
-{
- switch (i) {
-#ifdef VINTR
- case C_INTR:
- return VINTR;
-#endif /* VINTR */
-#ifdef VQUIT
- case C_QUIT:
- return VQUIT;
-#endif /* VQUIT */
-#ifdef VERASE
- case C_ERASE:
- return VERASE;
-#endif /* VERASE */
-#ifdef VKILL
- case C_KILL:
- return VKILL;
-#endif /* VKILL */
-#ifdef VEOF
- case C_EOF:
- return VEOF;
-#endif /* VEOF */
-#ifdef VEOL
- case C_EOL:
- return VEOL;
-#endif /* VEOL */
-#ifdef VEOL2
- case C_EOL2:
- return VEOL2;
-#endif /* VEOL2 */
-#ifdef VSWTCH
- case C_SWTCH:
- return VSWTCH;
-#endif /* VSWTCH */
-#ifdef VDSWTCH
- case C_DSWTCH:
- return VDSWTCH;
-#endif /* VDSWTCH */
-#ifdef VERASE2
- case C_ERASE2:
- return VERASE2;
-#endif /* VERASE2 */
-#ifdef VSTART
- case C_START:
- return VSTART;
-#endif /* VSTART */
-#ifdef VSTOP
- case C_STOP:
- return VSTOP;
-#endif /* VSTOP */
-#ifdef VWERASE
- case C_WERASE:
- return VWERASE;
-#endif /* VWERASE */
-#ifdef VSUSP
- case C_SUSP:
- return VSUSP;
-#endif /* VSUSP */
-#ifdef VDSUSP
- case C_DSUSP:
- return VDSUSP;
-#endif /* VDSUSP */
-#ifdef VREPRINT
- case C_REPRINT:
- return VREPRINT;
-#endif /* VREPRINT */
-#ifdef VDISCARD
- case C_DISCARD:
- return VDISCARD;
-#endif /* VDISCARD */
-#ifdef VLNEXT
- case C_LNEXT:
- return VLNEXT;
-#endif /* VLNEXT */
-#ifdef VSTATUS
- case C_STATUS:
- return VSTATUS;
-#endif /* VSTATUS */
-#ifdef VPAGE
- case C_PAGE:
- return VPAGE;
-#endif /* VPAGE */
-#ifdef VPGOFF
- case C_PGOFF:
- return VPGOFF;
-#endif /* VPGOFF */
-#ifdef VKILL2
- case C_KILL2:
- return VKILL2;
-#endif /* KILL2 */
-#ifdef VMIN
- case C_MIN:
- return VMIN;
-#endif /* VMIN */
-#ifdef VTIME
- case C_TIME:
- return VTIME;
-#endif /* VTIME */
- default:
- return -1;
- }
-}
-
-/* tty__getchar():
- * Get the tty characters
- */
-private void
-tty__getchar(struct termios *td, unsigned char *s)
-{
-
-#ifdef VINTR
- s[C_INTR] = td->c_cc[VINTR];
-#endif /* VINTR */
-#ifdef VQUIT
- s[C_QUIT] = td->c_cc[VQUIT];
-#endif /* VQUIT */
-#ifdef VERASE
- s[C_ERASE] = td->c_cc[VERASE];
-#endif /* VERASE */
-#ifdef VKILL
- s[C_KILL] = td->c_cc[VKILL];
-#endif /* VKILL */
-#ifdef VEOF
- s[C_EOF] = td->c_cc[VEOF];
-#endif /* VEOF */
-#ifdef VEOL
- s[C_EOL] = td->c_cc[VEOL];
-#endif /* VEOL */
-#ifdef VEOL2
- s[C_EOL2] = td->c_cc[VEOL2];
-#endif /* VEOL2 */
-#ifdef VSWTCH
- s[C_SWTCH] = td->c_cc[VSWTCH];
-#endif /* VSWTCH */
-#ifdef VDSWTCH
- s[C_DSWTCH] = td->c_cc[VDSWTCH];
-#endif /* VDSWTCH */
-#ifdef VERASE2
- s[C_ERASE2] = td->c_cc[VERASE2];
-#endif /* VERASE2 */
-#ifdef VSTART
- s[C_START] = td->c_cc[VSTART];
-#endif /* VSTART */
-#ifdef VSTOP
- s[C_STOP] = td->c_cc[VSTOP];
-#endif /* VSTOP */
-#ifdef VWERASE
- s[C_WERASE] = td->c_cc[VWERASE];
-#endif /* VWERASE */
-#ifdef VSUSP
- s[C_SUSP] = td->c_cc[VSUSP];
-#endif /* VSUSP */
-#ifdef VDSUSP
- s[C_DSUSP] = td->c_cc[VDSUSP];
-#endif /* VDSUSP */
-#ifdef VREPRINT
- s[C_REPRINT] = td->c_cc[VREPRINT];
-#endif /* VREPRINT */
-#ifdef VDISCARD
- s[C_DISCARD] = td->c_cc[VDISCARD];
-#endif /* VDISCARD */
-#ifdef VLNEXT
- s[C_LNEXT] = td->c_cc[VLNEXT];
-#endif /* VLNEXT */
-#ifdef VSTATUS
- s[C_STATUS] = td->c_cc[VSTATUS];
-#endif /* VSTATUS */
-#ifdef VPAGE
- s[C_PAGE] = td->c_cc[VPAGE];
-#endif /* VPAGE */
-#ifdef VPGOFF
- s[C_PGOFF] = td->c_cc[VPGOFF];
-#endif /* VPGOFF */
-#ifdef VKILL2
- s[C_KILL2] = td->c_cc[VKILL2];
-#endif /* KILL2 */
-#ifdef VMIN
- s[C_MIN] = td->c_cc[VMIN];
-#endif /* VMIN */
-#ifdef VTIME
- s[C_TIME] = td->c_cc[VTIME];
-#endif /* VTIME */
-} /* tty__getchar */
-
-
-/* tty__setchar():
- * Set the tty characters
- */
-private void
-tty__setchar(struct termios *td, unsigned char *s)
-{
-
-#ifdef VINTR
- td->c_cc[VINTR] = s[C_INTR];
-#endif /* VINTR */
-#ifdef VQUIT
- td->c_cc[VQUIT] = s[C_QUIT];
-#endif /* VQUIT */
-#ifdef VERASE
- td->c_cc[VERASE] = s[C_ERASE];
-#endif /* VERASE */
-#ifdef VKILL
- td->c_cc[VKILL] = s[C_KILL];
-#endif /* VKILL */
-#ifdef VEOF
- td->c_cc[VEOF] = s[C_EOF];
-#endif /* VEOF */
-#ifdef VEOL
- td->c_cc[VEOL] = s[C_EOL];
-#endif /* VEOL */
-#ifdef VEOL2
- td->c_cc[VEOL2] = s[C_EOL2];
-#endif /* VEOL2 */
-#ifdef VSWTCH
- td->c_cc[VSWTCH] = s[C_SWTCH];
-#endif /* VSWTCH */
-#ifdef VDSWTCH
- td->c_cc[VDSWTCH] = s[C_DSWTCH];
-#endif /* VDSWTCH */
-#ifdef VERASE2
- td->c_cc[VERASE2] = s[C_ERASE2];
-#endif /* VERASE2 */
-#ifdef VSTART
- td->c_cc[VSTART] = s[C_START];
-#endif /* VSTART */
-#ifdef VSTOP
- td->c_cc[VSTOP] = s[C_STOP];
-#endif /* VSTOP */
-#ifdef VWERASE
- td->c_cc[VWERASE] = s[C_WERASE];
-#endif /* VWERASE */
-#ifdef VSUSP
- td->c_cc[VSUSP] = s[C_SUSP];
-#endif /* VSUSP */
-#ifdef VDSUSP
- td->c_cc[VDSUSP] = s[C_DSUSP];
-#endif /* VDSUSP */
-#ifdef VREPRINT
- td->c_cc[VREPRINT] = s[C_REPRINT];
-#endif /* VREPRINT */
-#ifdef VDISCARD
- td->c_cc[VDISCARD] = s[C_DISCARD];
-#endif /* VDISCARD */
-#ifdef VLNEXT
- td->c_cc[VLNEXT] = s[C_LNEXT];
-#endif /* VLNEXT */
-#ifdef VSTATUS
- td->c_cc[VSTATUS] = s[C_STATUS];
-#endif /* VSTATUS */
-#ifdef VPAGE
- td->c_cc[VPAGE] = s[C_PAGE];
-#endif /* VPAGE */
-#ifdef VPGOFF
- td->c_cc[VPGOFF] = s[C_PGOFF];
-#endif /* VPGOFF */
-#ifdef VKILL2
- td->c_cc[VKILL2] = s[C_KILL2];
-#endif /* VKILL2 */
-#ifdef VMIN
- td->c_cc[VMIN] = s[C_MIN];
-#endif /* VMIN */
-#ifdef VTIME
- td->c_cc[VTIME] = s[C_TIME];
-#endif /* VTIME */
-} /* tty__setchar */
-
-
-/* tty_bind_char():
- * Rebind the editline functions
- */
-protected void
-tty_bind_char(EditLine *el, int force)
-{
-
- unsigned char *t_n = el->el_tty.t_c[ED_IO];
- unsigned char *t_o = el->el_tty.t_ed.c_cc;
- Char new[2], old[2];
- const ttymap_t *tp;
- el_action_t *map, *alt;
- const el_action_t *dmap, *dalt;
- new[1] = old[1] = '\0';
-
- map = el->el_map.key;
- alt = el->el_map.alt;
- if (el->el_map.type == MAP_VI) {
- dmap = el->el_map.vii;
- dalt = el->el_map.vic;
- } else {
- dmap = el->el_map.emacs;
- dalt = NULL;
- }
-
- for (tp = tty_map; tp->nch != (wint_t)-1; tp++) {
- new[0] = (Char)t_n[tp->nch];
- old[0] = (Char)t_o[tp->och];
- if (new[0] == old[0] && !force)
- continue;
- /* Put the old default binding back, and set the new binding */
- keymacro_clear(el, map, old);
- map[UC(old[0])] = dmap[UC(old[0])];
- keymacro_clear(el, map, new);
- /* MAP_VI == 1, MAP_EMACS == 0... */
- map[UC(new[0])] = tp->bind[el->el_map.type];
- if (dalt) {
- keymacro_clear(el, alt, old);
- alt[UC(old[0])] = dalt[UC(old[0])];
- keymacro_clear(el, alt, new);
- alt[UC(new[0])] = tp->bind[el->el_map.type + 1];
- }
- }
-}
-
-
-private tcflag_t *
-tty__get_flag(struct termios *t, int kind) {
- switch (kind) {
- case MD_INP:
- return &t->c_iflag;
- case MD_OUT:
- return &t->c_oflag;
- case MD_CTL:
- return &t->c_cflag;
- case MD_LIN:
- return &t->c_lflag;
- default:
- abort();
- /*NOTREACHED*/
- }
-}
-
-
-private tcflag_t
-tty_update_flag(EditLine *el, tcflag_t f, int mode, int kind)
-{
- f &= ~el->el_tty.t_t[mode][kind].t_clrmask;
- f |= el->el_tty.t_t[mode][kind].t_setmask;
- return f;
-}
-
-
-private void
-tty_update_flags(EditLine *el, int kind)
-{
- tcflag_t *tt, *ed, *ex;
- tt = tty__get_flag(&el->el_tty.t_ts, kind);
- ed = tty__get_flag(&el->el_tty.t_ed, kind);
- ex = tty__get_flag(&el->el_tty.t_ex, kind);
-
- if (*tt != *ex && (kind != MD_CTL || *tt != *ed)) {
- *ed = tty_update_flag(el, *tt, ED_IO, kind);
- *ex = tty_update_flag(el, *tt, EX_IO, kind);
- }
-}
-
-
-private void
-tty_update_char(EditLine *el, int mode, int c) {
- if (!((el->el_tty.t_t[mode][MD_CHAR].t_setmask & C_SH(c)))
- && (el->el_tty.t_c[TS_IO][c] != el->el_tty.t_c[EX_IO][c]))
- el->el_tty.t_c[mode][c] = el->el_tty.t_c[TS_IO][c];
- if (el->el_tty.t_t[mode][MD_CHAR].t_clrmask & C_SH(c))
- el->el_tty.t_c[mode][c] = el->el_tty.t_vdisable;
-}
-
-
-/* tty_rawmode():
- * Set terminal into 1 character at a time mode.
- */
-protected int
-tty_rawmode(EditLine *el)
-{
-
- if (el->el_tty.t_mode == ED_IO || el->el_tty.t_mode == QU_IO)
- return 0;
-
- if (el->el_flags & EDIT_DISABLED)
- return 0;
-
- if (tty_getty(el, &el->el_tty.t_ts) == -1) {
-#ifdef DEBUG_TTY
- (void) fprintf(el->el_errfile, "%s: tty_getty: %s\n", __func__,
- strerror(errno));
-#endif /* DEBUG_TTY */
- return -1;
- }
- /*
- * We always keep up with the eight bit setting and the speed of the
- * tty. But we only believe changes that are made to cooked mode!
- */
- el->el_tty.t_eight = tty__geteightbit(&el->el_tty.t_ts);
- el->el_tty.t_speed = tty__getspeed(&el->el_tty.t_ts);
-
- if (tty__getspeed(&el->el_tty.t_ex) != el->el_tty.t_speed ||
- tty__getspeed(&el->el_tty.t_ed) != el->el_tty.t_speed) {
- (void) cfsetispeed(&el->el_tty.t_ex, el->el_tty.t_speed);
- (void) cfsetospeed(&el->el_tty.t_ex, el->el_tty.t_speed);
- (void) cfsetispeed(&el->el_tty.t_ed, el->el_tty.t_speed);
- (void) cfsetospeed(&el->el_tty.t_ed, el->el_tty.t_speed);
- }
- if (tty__cooked_mode(&el->el_tty.t_ts)) {
- int i;
-
- for (i = MD_INP; i <= MD_LIN; i++)
- tty_update_flags(el, i);
-
- if (tty__gettabs(&el->el_tty.t_ex) == 0)
- el->el_tty.t_tabs = 0;
- else
- el->el_tty.t_tabs = EL_CAN_TAB ? 1 : 0;
-
- tty__getchar(&el->el_tty.t_ts, el->el_tty.t_c[TS_IO]);
- /*
- * Check if the user made any changes.
- * If he did, then propagate the changes to the
- * edit and execute data structures.
- */
- for (i = 0; i < C_NCC; i++)
- if (el->el_tty.t_c[TS_IO][i] !=
- el->el_tty.t_c[EX_IO][i])
- break;
-
- if (i != C_NCC) {
- /*
- * Propagate changes only to the unprotected
- * chars that have been modified just now.
- */
- for (i = 0; i < C_NCC; i++)
- tty_update_char(el, ED_IO, i);
-
- tty_bind_char(el, 0);
- tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]);
-
- for (i = 0; i < C_NCC; i++)
- tty_update_char(el, EX_IO, i);
-
- tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]);
- }
- }
- if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ed) == -1) {
-#ifdef DEBUG_TTY
- (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__,
- strerror(errno));
-#endif /* DEBUG_TTY */
- return -1;
- }
- el->el_tty.t_mode = ED_IO;
- return 0;
-}
-
-
-/* tty_cookedmode():
- * Set the tty back to normal mode
- */
-protected int
-tty_cookedmode(EditLine *el)
-{ /* set tty in normal setup */
-
- if (el->el_tty.t_mode == EX_IO)
- return 0;
-
- if (el->el_flags & EDIT_DISABLED)
- return 0;
-
- if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ex) == -1) {
-#ifdef DEBUG_TTY
- (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__,
- strerror(errno));
-#endif /* DEBUG_TTY */
- return -1;
- }
- el->el_tty.t_mode = EX_IO;
- return 0;
-}
-
-
-/* tty_quotemode():
- * Turn on quote mode
- */
-protected int
-tty_quotemode(EditLine *el)
-{
- if (el->el_tty.t_mode == QU_IO)
- return 0;
-
- el->el_tty.t_qu = el->el_tty.t_ed;
-
- tty_setup_flags(el, &el->el_tty.t_qu, QU_IO);
-
- if (tty_setty(el, TCSADRAIN, &el->el_tty.t_qu) == -1) {
-#ifdef DEBUG_TTY
- (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__,
- strerror(errno));
-#endif /* DEBUG_TTY */
- return -1;
- }
- el->el_tty.t_mode = QU_IO;
- return 0;
-}
-
-
-/* tty_noquotemode():
- * Turn off quote mode
- */
-protected int
-tty_noquotemode(EditLine *el)
-{
-
- if (el->el_tty.t_mode != QU_IO)
- return 0;
- if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ed) == -1) {
-#ifdef DEBUG_TTY
- (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__,
- strerror(errno));
-#endif /* DEBUG_TTY */
- return -1;
- }
- el->el_tty.t_mode = ED_IO;
- return 0;
-}
-
-
-/* tty_stty():
- * Stty builtin
- */
-protected int
-/*ARGSUSED*/
-tty_stty(EditLine *el, int argc __attribute__((__unused__)), const Char **argv)
-{
- const ttymodes_t *m;
- char x;
- int aflag = 0;
- const Char *s, *d;
- char name[EL_BUFSIZ];
- struct termios *tios = &el->el_tty.t_ex;
- int z = EX_IO;
-
- if (argv == NULL)
- return -1;
- strncpy(name, ct_encode_string(*argv++, &el->el_scratch), sizeof(name));
- name[sizeof(name) - 1] = '\0';
-
- while (argv && *argv && argv[0][0] == '-' && argv[0][2] == '\0')
- switch (argv[0][1]) {
- case 'a':
- aflag++;
- argv++;
- break;
- case 'd':
- argv++;
- tios = &el->el_tty.t_ed;
- z = ED_IO;
- break;
- case 'x':
- argv++;
- tios = &el->el_tty.t_ex;
- z = EX_IO;
- break;
- case 'q':
- argv++;
- tios = &el->el_tty.t_ts;
- z = QU_IO;
- break;
- default:
- (void) fprintf(el->el_errfile,
- "%s: Unknown switch `%lc'.\n",
- name, (wint_t)argv[0][1]);
- return -1;
- }
-
- if (!argv || !*argv) {
- int i = -1;
- size_t len = 0, st = 0, cu;
- for (m = ttymodes; m->m_name; m++) {
- if (m->m_type != i) {
- (void) fprintf(el->el_outfile, "%s%s",
- i != -1 ? "\n" : "",
- el->el_tty.t_t[z][m->m_type].t_name);
- i = m->m_type;
- st = len =
- strlen(el->el_tty.t_t[z][m->m_type].t_name);
- }
- if (i != -1) {
- x = (el->el_tty.t_t[z][i].t_setmask & m->m_value)
- ? '+' : '\0';
-
- if (el->el_tty.t_t[z][i].t_clrmask & m->m_value)
- x = '-';
- } else {
- x = '\0';
- }
-
- if (x != '\0' || aflag) {
-
- cu = strlen(m->m_name) + (x != '\0') + 1;
-
- if (len + cu >=
- (size_t)el->el_terminal.t_size.h) {
- (void) fprintf(el->el_outfile, "\n%*s",
- (int)st, "");
- len = st + cu;
- } else
- len += cu;
-
- if (x != '\0')
- (void) fprintf(el->el_outfile, "%c%s ",
- x, m->m_name);
- else
- (void) fprintf(el->el_outfile, "%s ",
- m->m_name);
- }
- }
- (void) fprintf(el->el_outfile, "\n");
- return 0;
- }
- while (argv && (s = *argv++)) {
- const Char *p;
- switch (*s) {
- case '+':
- case '-':
- x = (char)*s++;
- break;
- default:
- x = '\0';
- break;
- }
- d = s;
- p = Strchr(s, '=');
- for (m = ttymodes; m->m_name; m++)
- if ((p ? strncmp(m->m_name, ct_encode_string(d,
- &el->el_scratch), (size_t)(p - d)) :
- strcmp(m->m_name, ct_encode_string(d,
- &el->el_scratch))) == 0 &&
- (p == NULL || m->m_type == MD_CHAR))
- break;
-
- if (!m->m_name) {
- (void) fprintf(el->el_errfile,
- "%s: Invalid argument `" FSTR "'.\n", name, d);
- return -1;
- }
- if (p) {
- int c = ffs((int)m->m_value);
- int v = *++p ? parse__escape(&p) :
- el->el_tty.t_vdisable;
- assert(c != 0);
- c--;
- c = tty__getcharindex(c);
- assert(c != -1);
- tios->c_cc[c] = (cc_t)v;
- continue;
- }
- switch (x) {
- case '+':
- el->el_tty.t_t[z][m->m_type].t_setmask |= m->m_value;
- el->el_tty.t_t[z][m->m_type].t_clrmask &= ~m->m_value;
- break;
- case '-':
- el->el_tty.t_t[z][m->m_type].t_setmask &= ~m->m_value;
- el->el_tty.t_t[z][m->m_type].t_clrmask |= m->m_value;
- break;
- default:
- el->el_tty.t_t[z][m->m_type].t_setmask &= ~m->m_value;
- el->el_tty.t_t[z][m->m_type].t_clrmask &= ~m->m_value;
- break;
- }
- }
-
- tty_setup_flags(el, tios, z);
- if (el->el_tty.t_mode == z) {
- if (tty_setty(el, TCSADRAIN, tios) == -1) {
-#ifdef DEBUG_TTY
- (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n",
- __func__, strerror(errno));
-#endif /* DEBUG_TTY */
- return -1;
- }
- }
-
- return 0;
-}
-
-
-#ifdef notyet
-/* tty_printchar():
- * DEbugging routine to print the tty characters
- */
-private void
-tty_printchar(EditLine *el, unsigned char *s)
-{
- ttyperm_t *m;
- int i;
-
- for (i = 0; i < C_NCC; i++) {
- for (m = el->el_tty.t_t; m->m_name; m++)
- if (m->m_type == MD_CHAR && C_SH(i) == m->m_value)
- break;
- if (m->m_name)
- (void) fprintf(el->el_errfile, "%s ^%c ",
- m->m_name, s[i] + 'A' - 1);
- if (i % 5 == 0)
- (void) fprintf(el->el_errfile, "\n");
- }
- (void) fprintf(el->el_errfile, "\n");
-}
-#endif /* notyet */
-
-
-private void
-tty_setup_flags(EditLine *el, struct termios *tios, int mode)
-{
- int kind;
- for (kind = MD_INP; kind <= MD_LIN; kind++) {
- tcflag_t *f = tty__get_flag(tios, kind);
- *f = tty_update_flag(el, *f, mode, kind);
- }
-}
diff --git a/lib/libedit/tty.h b/lib/libedit/tty.h
deleted file mode 100644
index 9694393cbf22..000000000000
--- a/lib/libedit/tty.h
+++ /dev/null
@@ -1,482 +0,0 @@
-/* $NetBSD: tty.h,v 1.19 2016/02/27 18:13:21 christos Exp $ */
-
-/*-
- * 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.
- *
- * @(#)tty.h 8.1 (Berkeley) 6/4/93
- * $FreeBSD$
- */
-
-/*
- * el.tty.h: Local terminal header
- */
-#ifndef _h_el_tty
-#define _h_el_tty
-
-#include <termios.h>
-#include <unistd.h>
-
-/* Define our own since everyone gets it wrong! */
-#define CONTROL(A) ((A) & 037)
-
-/*
- * Aix compatible names
- */
-# if defined(VWERSE) && !defined(VWERASE)
-# define VWERASE VWERSE
-# endif /* VWERSE && !VWERASE */
-
-# if defined(VDISCRD) && !defined(VDISCARD)
-# define VDISCARD VDISCRD
-# endif /* VDISCRD && !VDISCARD */
-
-# if defined(VFLUSHO) && !defined(VDISCARD)
-# define VDISCARD VFLUSHO
-# endif /* VFLUSHO && VDISCARD */
-
-# if defined(VSTRT) && !defined(VSTART)
-# define VSTART VSTRT
-# endif /* VSTRT && ! VSTART */
-
-# if defined(VSTAT) && !defined(VSTATUS)
-# define VSTATUS VSTAT
-# endif /* VSTAT && ! VSTATUS */
-
-# ifndef ONLRET
-# define ONLRET 0
-# endif /* ONLRET */
-
-# ifndef TAB3
-# ifdef OXTABS
-# define TAB3 OXTABS
-# else
-# define TAB3 0
-# endif /* OXTABS */
-# endif /* !TAB3 */
-
-# if defined(OXTABS) && !defined(XTABS)
-# define XTABS OXTABS
-# endif /* OXTABS && !XTABS */
-
-# ifndef ONLCR
-# define ONLCR 0
-# endif /* ONLCR */
-
-# ifndef IEXTEN
-# define IEXTEN 0
-# endif /* IEXTEN */
-
-# ifndef ECHOCTL
-# define ECHOCTL 0
-# endif /* ECHOCTL */
-
-# ifndef PARENB
-# define PARENB 0
-# endif /* PARENB */
-
-# ifndef EXTPROC
-# define EXTPROC 0
-# endif /* EXTPROC */
-
-# ifndef FLUSHO
-# define FLUSHO 0
-# endif /* FLUSHO */
-
-
-# if defined(VDISABLE) && !defined(_POSIX_VDISABLE)
-# define _POSIX_VDISABLE VDISABLE
-# endif /* VDISABLE && ! _POSIX_VDISABLE */
-
-/*
- * Work around ISC's definition of IEXTEN which is
- * XCASE!
- */
-# ifdef ISC
-# if defined(IEXTEN) && defined(XCASE)
-# if IEXTEN == XCASE
-# undef IEXTEN
-# define IEXTEN 0
-# endif /* IEXTEN == XCASE */
-# endif /* IEXTEN && XCASE */
-# if defined(IEXTEN) && !defined(XCASE)
-# define XCASE IEXTEN
-# undef IEXTEN
-# define IEXTEN 0
-# endif /* IEXTEN && !XCASE */
-# endif /* ISC */
-
-/*
- * Work around convex weirdness where turning off IEXTEN makes us
- * lose all postprocessing!
- */
-#if defined(convex) || defined(__convex__)
-# if defined(IEXTEN) && IEXTEN != 0
-# undef IEXTEN
-# define IEXTEN 0
-# endif /* IEXTEN != 0 */
-#endif /* convex || __convex__ */
-
-/*
- * So that we don't lose job control.
- */
-#ifdef __SVR4
-# undef CSWTCH
-#endif
-
-#ifndef _POSIX_VDISABLE
-# define _POSIX_VDISABLE ((unsigned char) -1)
-#endif /* _POSIX_VDISABLE */
-
-#if !defined(CREPRINT) && defined(CRPRNT)
-# define CREPRINT CRPRNT
-#endif /* !CREPRINT && CRPRNT */
-#if !defined(CDISCARD) && defined(CFLUSH)
-# define CDISCARD CFLUSH
-#endif /* !CDISCARD && CFLUSH */
-
-#ifndef CINTR
-# define CINTR CONTROL('c')
-#endif /* CINTR */
-#ifndef CQUIT
-# define CQUIT 034 /* ^\ */
-#endif /* CQUIT */
-#ifndef CERASE
-# define CERASE 0177 /* ^? */
-#endif /* CERASE */
-#ifndef CKILL
-# define CKILL CONTROL('u')
-#endif /* CKILL */
-#ifndef CEOF
-# define CEOF CONTROL('d')
-#endif /* CEOF */
-#ifndef CEOL
-# define CEOL _POSIX_VDISABLE
-#endif /* CEOL */
-#ifndef CEOL2
-# define CEOL2 _POSIX_VDISABLE
-#endif /* CEOL2 */
-#ifndef CSWTCH
-# define CSWTCH _POSIX_VDISABLE
-#endif /* CSWTCH */
-#ifndef CDSWTCH
-# define CDSWTCH _POSIX_VDISABLE
-#endif /* CDSWTCH */
-#ifndef CERASE2
-# define CERASE2 _POSIX_VDISABLE
-#endif /* CERASE2 */
-#ifndef CSTART
-# define CSTART CONTROL('q')
-#endif /* CSTART */
-#ifndef CSTOP
-# define CSTOP CONTROL('s')
-#endif /* CSTOP */
-#ifndef CSUSP
-# define CSUSP CONTROL('z')
-#endif /* CSUSP */
-#ifndef CDSUSP
-# define CDSUSP CONTROL('y')
-#endif /* CDSUSP */
-
-#ifdef hpux
-
-# ifndef CREPRINT
-# define CREPRINT _POSIX_VDISABLE
-# endif /* CREPRINT */
-# ifndef CDISCARD
-# define CDISCARD _POSIX_VDISABLE
-# endif /* CDISCARD */
-# ifndef CLNEXT
-# define CLNEXT _POSIX_VDISABLE
-# endif /* CLNEXT */
-# ifndef CWERASE
-# define CWERASE _POSIX_VDISABLE
-# endif /* CWERASE */
-
-#else /* !hpux */
-
-# ifndef CREPRINT
-# define CREPRINT CONTROL('r')
-# endif /* CREPRINT */
-# ifndef CDISCARD
-# define CDISCARD CONTROL('o')
-# endif /* CDISCARD */
-# ifndef CLNEXT
-# define CLNEXT CONTROL('v')
-# endif /* CLNEXT */
-# ifndef CWERASE
-# define CWERASE CONTROL('w')
-# endif /* CWERASE */
-
-#endif /* hpux */
-
-#ifndef CSTATUS
-# define CSTATUS CONTROL('t')
-#endif /* CSTATUS */
-#ifndef CPAGE
-# define CPAGE ' '
-#endif /* CPAGE */
-#ifndef CPGOFF
-# define CPGOFF CONTROL('m')
-#endif /* CPGOFF */
-#ifndef CKILL2
-# define CKILL2 _POSIX_VDISABLE
-#endif /* CKILL2 */
-#ifndef CBRK
-# ifndef masscomp
-# define CBRK 0377
-# else
-# define CBRK '\0'
-# endif /* masscomp */
-#endif /* CBRK */
-#ifndef CMIN
-# define CMIN CEOF
-#endif /* CMIN */
-#ifndef CTIME
-# define CTIME CEOL
-#endif /* CTIME */
-
-/*
- * Fix for sun inconsistency. On termio VSUSP and the rest of the
- * ttychars > NCC are defined. So we undefine them.
- */
-#if defined(TERMIO) || defined(POSIX)
-# if defined(POSIX) && defined(NCCS)
-# define NUMCC NCCS
-# else
-# ifdef NCC
-# define NUMCC NCC
-# endif /* NCC */
-# endif /* POSIX && NCCS */
-# ifdef NUMCC
-# ifdef VINTR
-# if NUMCC <= VINTR
-# undef VINTR
-# endif /* NUMCC <= VINTR */
-# endif /* VINTR */
-# ifdef VQUIT
-# if NUMCC <= VQUIT
-# undef VQUIT
-# endif /* NUMCC <= VQUIT */
-# endif /* VQUIT */
-# ifdef VERASE
-# if NUMCC <= VERASE
-# undef VERASE
-# endif /* NUMCC <= VERASE */
-# endif /* VERASE */
-# ifdef VKILL
-# if NUMCC <= VKILL
-# undef VKILL
-# endif /* NUMCC <= VKILL */
-# endif /* VKILL */
-# ifdef VEOF
-# if NUMCC <= VEOF
-# undef VEOF
-# endif /* NUMCC <= VEOF */
-# endif /* VEOF */
-# ifdef VEOL
-# if NUMCC <= VEOL
-# undef VEOL
-# endif /* NUMCC <= VEOL */
-# endif /* VEOL */
-# ifdef VEOL2
-# if NUMCC <= VEOL2
-# undef VEOL2
-# endif /* NUMCC <= VEOL2 */
-# endif /* VEOL2 */
-# ifdef VSWTCH
-# if NUMCC <= VSWTCH
-# undef VSWTCH
-# endif /* NUMCC <= VSWTCH */
-# endif /* VSWTCH */
-# ifdef VDSWTCH
-# if NUMCC <= VDSWTCH
-# undef VDSWTCH
-# endif /* NUMCC <= VDSWTCH */
-# endif /* VDSWTCH */
-# ifdef VERASE2
-# if NUMCC <= VERASE2
-# undef VERASE2
-# endif /* NUMCC <= VERASE2 */
-# endif /* VERASE2 */
-# ifdef VSTART
-# if NUMCC <= VSTART
-# undef VSTART
-# endif /* NUMCC <= VSTART */
-# endif /* VSTART */
-# ifdef VSTOP
-# if NUMCC <= VSTOP
-# undef VSTOP
-# endif /* NUMCC <= VSTOP */
-# endif /* VSTOP */
-# ifdef VWERASE
-# if NUMCC <= VWERASE
-# undef VWERASE
-# endif /* NUMCC <= VWERASE */
-# endif /* VWERASE */
-# ifdef VSUSP
-# if NUMCC <= VSUSP
-# undef VSUSP
-# endif /* NUMCC <= VSUSP */
-# endif /* VSUSP */
-# ifdef VDSUSP
-# if NUMCC <= VDSUSP
-# undef VDSUSP
-# endif /* NUMCC <= VDSUSP */
-# endif /* VDSUSP */
-# ifdef VREPRINT
-# if NUMCC <= VREPRINT
-# undef VREPRINT
-# endif /* NUMCC <= VREPRINT */
-# endif /* VREPRINT */
-# ifdef VDISCARD
-# if NUMCC <= VDISCARD
-# undef VDISCARD
-# endif /* NUMCC <= VDISCARD */
-# endif /* VDISCARD */
-# ifdef VLNEXT
-# if NUMCC <= VLNEXT
-# undef VLNEXT
-# endif /* NUMCC <= VLNEXT */
-# endif /* VLNEXT */
-# ifdef VSTATUS
-# if NUMCC <= VSTATUS
-# undef VSTATUS
-# endif /* NUMCC <= VSTATUS */
-# endif /* VSTATUS */
-# ifdef VPAGE
-# if NUMCC <= VPAGE
-# undef VPAGE
-# endif /* NUMCC <= VPAGE */
-# endif /* VPAGE */
-# ifdef VPGOFF
-# if NUMCC <= VPGOFF
-# undef VPGOFF
-# endif /* NUMCC <= VPGOFF */
-# endif /* VPGOFF */
-# ifdef VKILL2
-# if NUMCC <= VKILL2
-# undef VKILL2
-# endif /* NUMCC <= VKILL2 */
-# endif /* VKILL2 */
-# ifdef VBRK
-# if NUMCC <= VBRK
-# undef VBRK
-# endif /* NUMCC <= VBRK */
-# endif /* VBRK */
-# ifdef VMIN
-# if NUMCC <= VMIN
-# undef VMIN
-# endif /* NUMCC <= VMIN */
-# endif /* VMIN */
-# ifdef VTIME
-# if NUMCC <= VTIME
-# undef VTIME
-# endif /* NUMCC <= VTIME */
-# endif /* VTIME */
-# endif /* NUMCC */
-#endif /* !POSIX */
-
-#define C_INTR 0
-#define C_QUIT 1
-#define C_ERASE 2
-#define C_KILL 3
-#define C_EOF 4
-#define C_EOL 5
-#define C_EOL2 6
-#define C_SWTCH 7
-#define C_DSWTCH 8
-#define C_ERASE2 9
-#define C_START 10
-#define C_STOP 11
-#define C_WERASE 12
-#define C_SUSP 13
-#define C_DSUSP 14
-#define C_REPRINT 15
-#define C_DISCARD 16
-#define C_LNEXT 17
-#define C_STATUS 18
-#define C_PAGE 19
-#define C_PGOFF 20
-#define C_KILL2 21
-#define C_BRK 22
-#define C_MIN 23
-#define C_TIME 24
-#define C_NCC 25
-#define C_SH(A) ((unsigned int)(1 << (A)))
-
-/*
- * Terminal dependend data structures
- */
-#define EX_IO 0 /* while we are executing */
-#define ED_IO 1 /* while we are editing */
-#define TS_IO 2 /* new mode from terminal */
-#define QU_IO 2 /* used only for quoted chars */
-#define NN_IO 3 /* The number of entries */
-
-/* Don't re-order */
-#define MD_INP 0
-#define MD_OUT 1
-#define MD_CTL 2
-#define MD_LIN 3
-#define MD_CHAR 4
-#define MD_NN 5
-
-typedef struct {
- const char *t_name;
- unsigned int t_setmask;
- unsigned int t_clrmask;
-} ttyperm_t[NN_IO][MD_NN];
-
-typedef unsigned char ttychar_t[NN_IO][C_NCC];
-
-protected int tty_init(EditLine *);
-protected void tty_end(EditLine *);
-protected int tty_stty(EditLine *, int, const Char **);
-protected int tty_rawmode(EditLine *);
-protected int tty_cookedmode(EditLine *);
-protected int tty_quotemode(EditLine *);
-protected int tty_noquotemode(EditLine *);
-protected void tty_bind_char(EditLine *, int);
-
-typedef struct {
- ttyperm_t t_t;
- ttychar_t t_c;
- struct termios t_or, t_ex, t_ed, t_ts;
- int t_tabs;
- int t_eight;
- speed_t t_speed;
- unsigned char t_mode;
- unsigned char t_vdisable;
- unsigned char t_initialized;
-} el_tty_t;
-
-
-#endif /* _h_el_tty */
diff --git a/lib/libedit/vi.c b/lib/libedit/vi.c
deleted file mode 100644
index 02d7e2990504..000000000000
--- a/lib/libedit/vi.c
+++ /dev/null
@@ -1,1158 +0,0 @@
-/* $NetBSD: vi.c,v 1.55 2016/03/02 19:24:20 christos Exp $ */
-
-/*-
- * 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.
- */
-
-#include "config.h"
-#if !defined(lint) && !defined(SCCSID)
-#if 0
-static char sccsid[] = "@(#)vi.c 8.1 (Berkeley) 6/4/93";
-#else
-__RCSID("$NetBSD: vi.c,v 1.55 2016/03/02 19:24:20 christos Exp $");
-#endif
-#endif /* not lint && not SCCSID */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * vi.c: Vi mode commands.
- */
-#include <sys/wait.h>
-#include <ctype.h>
-#include <limits.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "el.h"
-#include "common.h"
-#include "emacs.h"
-#include "vi.h"
-
-private el_action_t cv_action(EditLine *, wint_t);
-private el_action_t cv_paste(EditLine *, wint_t);
-
-/* cv_action():
- * Handle vi actions.
- */
-private el_action_t
-cv_action(EditLine *el, wint_t c)
-{
-
- if (el->el_chared.c_vcmd.action != NOP) {
- /* 'cc', 'dd' and (possibly) friends */
- if (c != (wint_t)el->el_chared.c_vcmd.action)
- return CC_ERROR;
-
- if (!(c & YANK))
- cv_undo(el);
- cv_yank(el, el->el_line.buffer,
- (int)(el->el_line.lastchar - el->el_line.buffer));
- el->el_chared.c_vcmd.action = NOP;
- el->el_chared.c_vcmd.pos = 0;
- if (!(c & YANK)) {
- el->el_line.lastchar = el->el_line.buffer;
- el->el_line.cursor = el->el_line.buffer;
- }
- if (c & INSERT)
- el->el_map.current = el->el_map.key;
-
- return CC_REFRESH;
- }
- el->el_chared.c_vcmd.pos = el->el_line.cursor;
- el->el_chared.c_vcmd.action = c;
- return CC_ARGHACK;
-}
-
-/* cv_paste():
- * Paste previous deletion before or after the cursor
- */
-private el_action_t
-cv_paste(EditLine *el, wint_t c)
-{
- c_kill_t *k = &el->el_chared.c_kill;
- size_t len = (size_t)(k->last - k->buf);
-
- if (k->buf == NULL || len == 0)
- return CC_ERROR;
-#ifdef DEBUG_PASTE
- (void) fprintf(el->el_errfile, "Paste: \"" FSTARSTR "\"\n", (int)len,
- k->buf);
-#endif
-
- cv_undo(el);
-
- if (!c && el->el_line.cursor < el->el_line.lastchar)
- el->el_line.cursor++;
-
- c_insert(el, (int)len);
- if (el->el_line.cursor + len > el->el_line.lastchar)
- return CC_ERROR;
- (void) memcpy(el->el_line.cursor, k->buf, len *
- sizeof(*el->el_line.cursor));
-
- return CC_REFRESH;
-}
-
-
-/* vi_paste_next():
- * Vi paste previous deletion to the right of the cursor
- * [p]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_paste_next(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- return cv_paste(el, 0);
-}
-
-
-/* vi_paste_prev():
- * Vi paste previous deletion to the left of the cursor
- * [P]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_paste_prev(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- return cv_paste(el, 1);
-}
-
-
-/* vi_prev_big_word():
- * Vi move to the previous space delimited word
- * [B]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_prev_big_word(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- if (el->el_line.cursor == el->el_line.buffer)
- return CC_ERROR;
-
- el->el_line.cursor = cv_prev_word(el->el_line.cursor,
- el->el_line.buffer,
- el->el_state.argument,
- cv__isWord);
-
- if (el->el_chared.c_vcmd.action != NOP) {
- cv_delfini(el);
- return CC_REFRESH;
- }
- return CC_CURSOR;
-}
-
-
-/* vi_prev_word():
- * Vi move to the previous word
- * [b]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_prev_word(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- if (el->el_line.cursor == el->el_line.buffer)
- return CC_ERROR;
-
- el->el_line.cursor = cv_prev_word(el->el_line.cursor,
- el->el_line.buffer,
- el->el_state.argument,
- cv__isword);
-
- if (el->el_chared.c_vcmd.action != NOP) {
- cv_delfini(el);
- return CC_REFRESH;
- }
- return CC_CURSOR;
-}
-
-
-/* vi_next_big_word():
- * Vi move to the next space delimited word
- * [W]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_next_big_word(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- if (el->el_line.cursor >= el->el_line.lastchar - 1)
- return CC_ERROR;
-
- el->el_line.cursor = cv_next_word(el, el->el_line.cursor,
- el->el_line.lastchar, el->el_state.argument, cv__isWord);
-
- if (el->el_map.type == MAP_VI)
- if (el->el_chared.c_vcmd.action != NOP) {
- cv_delfini(el);
- return CC_REFRESH;
- }
- return CC_CURSOR;
-}
-
-
-/* vi_next_word():
- * Vi move to the next word
- * [w]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_next_word(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- if (el->el_line.cursor >= el->el_line.lastchar - 1)
- return CC_ERROR;
-
- el->el_line.cursor = cv_next_word(el, el->el_line.cursor,
- el->el_line.lastchar, el->el_state.argument, cv__isword);
-
- if (el->el_map.type == MAP_VI)
- if (el->el_chared.c_vcmd.action != NOP) {
- cv_delfini(el);
- return CC_REFRESH;
- }
- return CC_CURSOR;
-}
-
-
-/* vi_change_case():
- * Vi change case of character under the cursor and advance one character
- * [~]
- */
-protected el_action_t
-vi_change_case(EditLine *el, wint_t c)
-{
- int i;
-
- if (el->el_line.cursor >= el->el_line.lastchar)
- return CC_ERROR;
- cv_undo(el);
- for (i = 0; i < el->el_state.argument; i++) {
-
- c = *el->el_line.cursor;
- if (Isupper(c))
- *el->el_line.cursor = Tolower(c);
- else if (Islower(c))
- *el->el_line.cursor = Toupper(c);
-
- if (++el->el_line.cursor >= el->el_line.lastchar) {
- el->el_line.cursor--;
- re_fastaddc(el);
- break;
- }
- re_fastaddc(el);
- }
- return CC_NORM;
-}
-
-
-/* vi_change_meta():
- * Vi change prefix command
- * [c]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_change_meta(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- /*
- * Delete with insert == change: first we delete and then we leave in
- * insert mode.
- */
- return cv_action(el, DELETE | INSERT);
-}
-
-
-/* vi_insert_at_bol():
- * Vi enter insert mode at the beginning of line
- * [I]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_insert_at_bol(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- el->el_line.cursor = el->el_line.buffer;
- cv_undo(el);
- el->el_map.current = el->el_map.key;
- return CC_CURSOR;
-}
-
-
-/* vi_replace_char():
- * Vi replace character under the cursor with the next character typed
- * [r]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_replace_char(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- if (el->el_line.cursor >= el->el_line.lastchar)
- return CC_ERROR;
-
- el->el_map.current = el->el_map.key;
- el->el_state.inputmode = MODE_REPLACE_1;
- cv_undo(el);
- return CC_ARGHACK;
-}
-
-
-/* vi_replace_mode():
- * Vi enter replace mode
- * [R]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_replace_mode(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- el->el_map.current = el->el_map.key;
- el->el_state.inputmode = MODE_REPLACE;
- cv_undo(el);
- return CC_NORM;
-}
-
-
-/* vi_substitute_char():
- * Vi replace character under the cursor and enter insert mode
- * [s]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_substitute_char(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- c_delafter(el, el->el_state.argument);
- el->el_map.current = el->el_map.key;
- return CC_REFRESH;
-}
-
-
-/* vi_substitute_line():
- * Vi substitute entire line
- * [S]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_substitute_line(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- cv_undo(el);
- cv_yank(el, el->el_line.buffer,
- (int)(el->el_line.lastchar - el->el_line.buffer));
- (void) em_kill_line(el, 0);
- el->el_map.current = el->el_map.key;
- return CC_REFRESH;
-}
-
-
-/* vi_change_to_eol():
- * Vi change to end of line
- * [C]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_change_to_eol(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- cv_undo(el);
- cv_yank(el, el->el_line.cursor,
- (int)(el->el_line.lastchar - el->el_line.cursor));
- (void) ed_kill_line(el, 0);
- el->el_map.current = el->el_map.key;
- return CC_REFRESH;
-}
-
-
-/* vi_insert():
- * Vi enter insert mode
- * [i]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_insert(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- el->el_map.current = el->el_map.key;
- cv_undo(el);
- return CC_NORM;
-}
-
-
-/* vi_add():
- * Vi enter insert mode after the cursor
- * [a]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_add(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- int ret;
-
- el->el_map.current = el->el_map.key;
- if (el->el_line.cursor < el->el_line.lastchar) {
- el->el_line.cursor++;
- if (el->el_line.cursor > el->el_line.lastchar)
- el->el_line.cursor = el->el_line.lastchar;
- ret = CC_CURSOR;
- } else
- ret = CC_NORM;
-
- cv_undo(el);
-
- return (el_action_t)ret;
-}
-
-
-/* vi_add_at_eol():
- * Vi enter insert mode at end of line
- * [A]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_add_at_eol(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- el->el_map.current = el->el_map.key;
- el->el_line.cursor = el->el_line.lastchar;
- cv_undo(el);
- return CC_CURSOR;
-}
-
-
-/* vi_delete_meta():
- * Vi delete prefix command
- * [d]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_delete_meta(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- return cv_action(el, DELETE);
-}
-
-
-/* vi_end_big_word():
- * Vi move to the end of the current space delimited word
- * [E]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_end_big_word(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- if (el->el_line.cursor == el->el_line.lastchar)
- return CC_ERROR;
-
- el->el_line.cursor = cv__endword(el->el_line.cursor,
- el->el_line.lastchar, el->el_state.argument, cv__isWord);
-
- if (el->el_chared.c_vcmd.action != NOP) {
- el->el_line.cursor++;
- cv_delfini(el);
- return CC_REFRESH;
- }
- return CC_CURSOR;
-}
-
-
-/* vi_end_word():
- * Vi move to the end of the current word
- * [e]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_end_word(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- if (el->el_line.cursor == el->el_line.lastchar)
- return CC_ERROR;
-
- el->el_line.cursor = cv__endword(el->el_line.cursor,
- el->el_line.lastchar, el->el_state.argument, cv__isword);
-
- if (el->el_chared.c_vcmd.action != NOP) {
- el->el_line.cursor++;
- cv_delfini(el);
- return CC_REFRESH;
- }
- return CC_CURSOR;
-}
-
-
-/* vi_undo():
- * Vi undo last change
- * [u]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_undo(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- c_undo_t un = el->el_chared.c_undo;
-
- if (un.len == -1)
- return CC_ERROR;
-
- /* switch line buffer and undo buffer */
- el->el_chared.c_undo.buf = el->el_line.buffer;
- el->el_chared.c_undo.len = el->el_line.lastchar - el->el_line.buffer;
- el->el_chared.c_undo.cursor =
- (int)(el->el_line.cursor - el->el_line.buffer);
- el->el_line.limit = un.buf + (el->el_line.limit - el->el_line.buffer);
- el->el_line.buffer = un.buf;
- el->el_line.cursor = un.buf + un.cursor;
- el->el_line.lastchar = un.buf + un.len;
-
- return CC_REFRESH;
-}
-
-
-/* vi_command_mode():
- * Vi enter command mode (use alternative key bindings)
- * [<ESC>]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_command_mode(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- /* [Esc] cancels pending action */
- el->el_chared.c_vcmd.action = NOP;
- el->el_chared.c_vcmd.pos = 0;
-
- el->el_state.doingarg = 0;
-
- el->el_state.inputmode = MODE_INSERT;
- el->el_map.current = el->el_map.alt;
-#ifdef VI_MOVE
- if (el->el_line.cursor > el->el_line.buffer)
- el->el_line.cursor--;
-#endif
- return CC_CURSOR;
-}
-
-
-/* vi_zero():
- * Vi move to the beginning of line
- * [0]
- */
-protected el_action_t
-vi_zero(EditLine *el, wint_t c)
-{
-
- if (el->el_state.doingarg)
- return ed_argument_digit(el, c);
-
- el->el_line.cursor = el->el_line.buffer;
- if (el->el_chared.c_vcmd.action != NOP) {
- cv_delfini(el);
- return CC_REFRESH;
- }
- return CC_CURSOR;
-}
-
-
-/* vi_delete_prev_char():
- * Vi move to previous character (backspace)
- * [^H] in insert mode only
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_delete_prev_char(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- if (el->el_line.cursor <= el->el_line.buffer)
- return CC_ERROR;
-
- c_delbefore1(el);
- el->el_line.cursor--;
- return CC_REFRESH;
-}
-
-
-/* vi_list_or_eof():
- * Vi list choices for completion or indicate end of file if empty line
- * [^D]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_list_or_eof(EditLine *el, wint_t c)
-{
-
- if (el->el_line.cursor == el->el_line.lastchar) {
- if (el->el_line.cursor == el->el_line.buffer) {
- terminal_writec(el, c); /* then do a EOF */
- return CC_EOF;
- } else {
- /*
- * Here we could list completions, but it is an
- * error right now
- */
- terminal_beep(el);
- return CC_ERROR;
- }
- } else {
-#ifdef notyet
- re_goto_bottom(el);
- *el->el_line.lastchar = '\0'; /* just in case */
- return CC_LIST_CHOICES;
-#else
- /*
- * Just complain for now.
- */
- terminal_beep(el);
- return CC_ERROR;
-#endif
- }
-}
-
-
-/* vi_kill_line_prev():
- * Vi cut from beginning of line to cursor
- * [^U]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_kill_line_prev(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- Char *kp, *cp;
-
- cp = el->el_line.buffer;
- kp = el->el_chared.c_kill.buf;
- while (cp < el->el_line.cursor)
- *kp++ = *cp++; /* copy it */
- el->el_chared.c_kill.last = kp;
- c_delbefore(el, (int)(el->el_line.cursor - el->el_line.buffer));
- el->el_line.cursor = el->el_line.buffer; /* zap! */
- return CC_REFRESH;
-}
-
-
-/* vi_search_prev():
- * Vi search history previous
- * [?]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_search_prev(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- return cv_search(el, ED_SEARCH_PREV_HISTORY);
-}
-
-
-/* vi_search_next():
- * Vi search history next
- * [/]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_search_next(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- return cv_search(el, ED_SEARCH_NEXT_HISTORY);
-}
-
-
-/* vi_repeat_search_next():
- * Vi repeat current search in the same search direction
- * [n]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_repeat_search_next(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- if (el->el_search.patlen == 0)
- return CC_ERROR;
- else
- return cv_repeat_srch(el, el->el_search.patdir);
-}
-
-
-/* vi_repeat_search_prev():
- * Vi repeat current search in the opposite search direction
- * [N]
- */
-/*ARGSUSED*/
-protected el_action_t
-vi_repeat_search_prev(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- if (el->el_search.patlen == 0)
- return CC_ERROR;
- else
- return (cv_repeat_srch(el,
- el->el_search.patdir == ED_SEARCH_PREV_HISTORY ?
- ED_SEARCH_NEXT_HISTORY : ED_SEARCH_PREV_HISTORY));
-}
-
-
-/* vi_next_char():
- * Vi move to the character specified next
- * [f]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_next_char(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- return cv_csearch(el, CHAR_FWD, -1, el->el_state.argument, 0);
-}
-
-
-/* vi_prev_char():
- * Vi move to the character specified previous
- * [F]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_prev_char(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- return cv_csearch(el, CHAR_BACK, -1, el->el_state.argument, 0);
-}
-
-
-/* vi_to_next_char():
- * Vi move up to the character specified next
- * [t]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_to_next_char(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- return cv_csearch(el, CHAR_FWD, -1, el->el_state.argument, 1);
-}
-
-
-/* vi_to_prev_char():
- * Vi move up to the character specified previous
- * [T]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_to_prev_char(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- return cv_csearch(el, CHAR_BACK, -1, el->el_state.argument, 1);
-}
-
-
-/* vi_repeat_next_char():
- * Vi repeat current character search in the same search direction
- * [;]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_repeat_next_char(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- return cv_csearch(el, el->el_search.chadir, el->el_search.chacha,
- el->el_state.argument, el->el_search.chatflg);
-}
-
-
-/* vi_repeat_prev_char():
- * Vi repeat current character search in the opposite search direction
- * [,]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_repeat_prev_char(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- el_action_t r;
- int dir = el->el_search.chadir;
-
- r = cv_csearch(el, -dir, el->el_search.chacha,
- el->el_state.argument, el->el_search.chatflg);
- el->el_search.chadir = dir;
- return r;
-}
-
-
-/* vi_match():
- * Vi go to matching () {} or []
- * [%]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_match(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- const Char match_chars[] = STR("()[]{}");
- Char *cp;
- size_t delta, i, count;
- Char o_ch, c_ch;
-
- *el->el_line.lastchar = '\0'; /* just in case */
-
- i = Strcspn(el->el_line.cursor, match_chars);
- o_ch = el->el_line.cursor[i];
- if (o_ch == 0)
- return CC_ERROR;
- delta = (size_t)(Strchr(match_chars, o_ch) - match_chars);
- c_ch = match_chars[delta ^ 1];
- count = 1;
- delta = 1 - (delta & 1) * 2;
-
- for (cp = &el->el_line.cursor[i]; count; ) {
- cp += delta;
- if (cp < el->el_line.buffer || cp >= el->el_line.lastchar)
- return CC_ERROR;
- if (*cp == o_ch)
- count++;
- else if (*cp == c_ch)
- count--;
- }
-
- el->el_line.cursor = cp;
-
- if (el->el_chared.c_vcmd.action != NOP) {
- /* NB posix says char under cursor should NOT be deleted
- for -ve delta - this is different to netbsd vi. */
- if (delta > 0)
- el->el_line.cursor++;
- cv_delfini(el);
- return CC_REFRESH;
- }
- return CC_CURSOR;
-}
-
-/* vi_undo_line():
- * Vi undo all changes to line
- * [U]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_undo_line(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- cv_undo(el);
- return hist_get(el);
-}
-
-/* vi_to_column():
- * Vi go to specified column
- * [|]
- * NB netbsd vi goes to screen column 'n', posix says nth character
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_to_column(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- el->el_line.cursor = el->el_line.buffer;
- el->el_state.argument--;
- return ed_next_char(el, 0);
-}
-
-/* vi_yank_end():
- * Vi yank to end of line
- * [Y]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_yank_end(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- cv_yank(el, el->el_line.cursor,
- (int)(el->el_line.lastchar - el->el_line.cursor));
- return CC_REFRESH;
-}
-
-/* vi_yank():
- * Vi yank
- * [y]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_yank(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- return cv_action(el, YANK);
-}
-
-/* vi_comment_out():
- * Vi comment out current command
- * [#]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_comment_out(EditLine *el, wint_t c __attribute__((__unused__)))
-{
-
- el->el_line.cursor = el->el_line.buffer;
- c_insert(el, 1);
- *el->el_line.cursor = '#';
- re_refresh(el);
- return ed_newline(el, 0);
-}
-
-/* vi_alias():
- * Vi include shell alias
- * [@]
- * NB: posix implies that we should enter insert mode, however
- * this is against historical precedent...
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_alias(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- char alias_name[3];
- const char *alias_text;
-
- if (el->el_chared.c_aliasfun == NULL)
- return CC_ERROR;
-
- alias_name[0] = '_';
- alias_name[2] = 0;
- if (el_getc(el, &alias_name[1]) != 1)
- return CC_ERROR;
-
- alias_text = (*el->el_chared.c_aliasfun)(el->el_chared.c_aliasarg,
- alias_name);
- if (alias_text != NULL)
- FUN(el,push)(el, ct_decode_string(alias_text, &el->el_scratch));
- return CC_NORM;
-}
-
-/* vi_to_history_line():
- * Vi go to specified history file line.
- * [G]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_to_history_line(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- int sv_event_no = el->el_history.eventno;
- el_action_t rval;
-
-
- if (el->el_history.eventno == 0) {
- (void) Strncpy(el->el_history.buf, el->el_line.buffer,
- EL_BUFSIZ);
- el->el_history.last = el->el_history.buf +
- (el->el_line.lastchar - el->el_line.buffer);
- }
-
- /* Lack of a 'count' means oldest, not 1 */
- if (!el->el_state.doingarg) {
- el->el_history.eventno = 0x7fffffff;
- hist_get(el);
- } else {
- /* This is brain dead, all the rest of this code counts
- * upwards going into the past. Here we need count in the
- * other direction (to match the output of fc -l).
- * I could change the world, but this seems to suffice.
- */
- el->el_history.eventno = 1;
- if (hist_get(el) == CC_ERROR)
- return CC_ERROR;
- el->el_history.eventno = 1 + el->el_history.ev.num
- - el->el_state.argument;
- if (el->el_history.eventno < 0) {
- el->el_history.eventno = sv_event_no;
- return CC_ERROR;
- }
- }
- rval = hist_get(el);
- if (rval == CC_ERROR)
- el->el_history.eventno = sv_event_no;
- return rval;
-}
-
-/* vi_histedit():
- * Vi edit history line with vi
- * [v]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_histedit(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- int fd;
- pid_t pid;
- ssize_t st;
- int status;
- char tempfile[] = "/tmp/histedit.XXXXXXXXXX";
- char *cp = NULL;
- size_t len;
- Char *line = NULL;
-
- if (el->el_state.doingarg) {
- if (vi_to_history_line(el, 0) == CC_ERROR)
- return CC_ERROR;
- }
-
- fd = mkstemp(tempfile);
- if (fd < 0)
- return CC_ERROR;
- len = (size_t)(el->el_line.lastchar - el->el_line.buffer);
-#define TMP_BUFSIZ (EL_BUFSIZ * MB_LEN_MAX)
- cp = el_malloc(TMP_BUFSIZ * sizeof(*cp));
- if (cp == NULL)
- goto error;
- line = el_malloc(len * sizeof(*line) + 1);
- if (line == NULL)
- goto error;
- Strncpy(line, el->el_line.buffer, len);
- line[len] = '\0';
- ct_wcstombs(cp, line, TMP_BUFSIZ - 1);
- cp[TMP_BUFSIZ - 1] = '\0';
- len = strlen(cp);
- write(fd, cp, len);
- write(fd, "\n", (size_t)1);
- pid = fork();
- switch (pid) {
- case -1:
- goto error;
- case 0:
- close(fd);
- execlp("vi", "vi", tempfile, (char *)NULL);
- exit(0);
- /*NOTREACHED*/
- default:
- while (waitpid(pid, &status, 0) != pid)
- continue;
- lseek(fd, (off_t)0, SEEK_SET);
- st = read(fd, cp, TMP_BUFSIZ - 1);
- if (st > 0) {
- cp[st] = '\0';
- len = (size_t)(el->el_line.limit - el->el_line.buffer);
- len = ct_mbstowcs(el->el_line.buffer, cp, len);
- if (len > 0 && el->el_line.buffer[len - 1] == '\n')
- --len;
- }
- else
- len = 0;
- el->el_line.cursor = el->el_line.buffer;
- el->el_line.lastchar = el->el_line.buffer + len;
- el_free(cp);
- el_free(line);
- break;
- }
-
- close(fd);
- unlink(tempfile);
- /* return CC_REFRESH; */
- return ed_newline(el, 0);
-error:
- el_free(line);
- el_free(cp);
- close(fd);
- unlink(tempfile);
- return CC_ERROR;
-}
-
-/* vi_history_word():
- * Vi append word from previous input line
- * [_]
- * Who knows where this one came from!
- * '_' in vi means 'entire current line', so 'cc' is a synonym for 'c_'
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_history_word(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- const Char *wp = HIST_FIRST(el);
- const Char *wep, *wsp;
- int len;
- Char *cp;
- const Char *lim;
-
- if (wp == NULL)
- return CC_ERROR;
-
- wep = wsp = NULL;
- do {
- while (Isspace(*wp))
- wp++;
- if (*wp == 0)
- break;
- wsp = wp;
- while (*wp && !Isspace(*wp))
- wp++;
- wep = wp;
- } while ((!el->el_state.doingarg || --el->el_state.argument > 0)
- && *wp != 0);
-
- if (wsp == NULL || (el->el_state.doingarg && el->el_state.argument != 0))
- return CC_ERROR;
-
- cv_undo(el);
- len = (int)(wep - wsp);
- if (el->el_line.cursor < el->el_line.lastchar)
- el->el_line.cursor++;
- c_insert(el, len + 1);
- cp = el->el_line.cursor;
- lim = el->el_line.limit;
- if (cp < lim)
- *cp++ = ' ';
- while (wsp < wep && cp < lim)
- *cp++ = *wsp++;
- el->el_line.cursor = cp;
-
- el->el_map.current = el->el_map.key;
- return CC_REFRESH;
-}
-
-/* vi_redo():
- * Vi redo last non-motion command
- * [.]
- */
-protected el_action_t
-/*ARGSUSED*/
-vi_redo(EditLine *el, wint_t c __attribute__((__unused__)))
-{
- c_redo_t *r = &el->el_chared.c_redo;
-
- if (!el->el_state.doingarg && r->count) {
- el->el_state.doingarg = 1;
- el->el_state.argument = r->count;
- }
-
- el->el_chared.c_vcmd.pos = el->el_line.cursor;
- el->el_chared.c_vcmd.action = r->action;
- if (r->pos != r->buf) {
- if (r->pos + 1 > r->lim)
- /* sanity */
- r->pos = r->lim - 1;
- r->pos[0] = 0;
- FUN(el,push)(el, r->buf);
- }
-
- el->el_state.thiscmd = r->cmd;
- el->el_state.thisch = r->ch;
- return (*el->el_map.func[r->cmd])(el, r->ch);
-}