aboutsummaryrefslogtreecommitdiff
path: root/lib/libedit
diff options
context:
space:
mode:
authorBaptiste Daroussin <bapt@FreeBSD.org>2019-09-13 06:50:02 +0000
committerBaptiste Daroussin <bapt@FreeBSD.org>2019-09-13 06:50:02 +0000
commit8156570000617c7545fcbad43189d59935b908be (patch)
treea375896e1913a156cff32c903eaed965d35e6962 /lib/libedit
parentbbcce8d0c4d7fa8c4acec26bb9c4105ea1e72299 (diff)
downloadsrc-8156570000617c7545fcbad43189d59935b908be.tar.gz
src-8156570000617c7545fcbad43189d59935b908be.zip
Update libedit to a snapshot from 2019-09-10
This version bring many fixes regarding unicode support It also adds proper support for filename completion (we do not need our custom patches anymore) Improves the libreadline compatibility Note that the same work was done by Yuichiro Naito in https://reviews.freebsd.org/D21196 the main difference is in this case we have reimported libedit in contrib to fix a long standing mess in the previous merges which prevented a proper update workflow. (discussed long ago with pfg@) The only difference with upstream libedit is we have added a compatibility shim for the _elf_fn_sh_complete function which we previously added to support quoting in filename completion and is not needed anymore. This was added to continue supported old /bin/sh binaries and not break backward compatibility (as discussed with jilles@) Reviewed by: Yuichiro Naito <naito.yuichiro_gmail.com> MFC after: 3 weeks Differential Revision: https://reviews.freebsd.org/D21584
Notes
Notes: svn path=/head/; revision=352275
Diffstat (limited to 'lib/libedit')
-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