libedit: Upgrade NetBSD version 2011-03-11
authorJohn Marino <draco@marino.st>
Thu, 10 May 2012 05:03:28 +0000 (07:03 +0200)
committerJohn Marino <draco@marino.st>
Thu, 10 May 2012 21:39:01 +0000 (23:39 +0200)
As NetBSD has properly packaged regular releases of their libedit
library (readline replacement), a new vendor branch has been created
for it.  Libedit was last synchronized with NetBSD 4 years ago, to
the week.

During that time, a new function was added to the DragonFly version
that still doesn't exist on NetBSD.  It is necessary to support GDB
7.x, so the addition of rl_completion_word_break_hook function has
been carried over to this update.

47 files changed:
lib/libedit/Makefile
lib/libedit/Makefile.inc [new file with mode: 0644]
lib/libedit/TEST/Makefile [deleted file]
lib/libedit/TEST/test.c [deleted file]
lib/libedit/chared.c [deleted file]
lib/libedit/chared.h [deleted file]
lib/libedit/common.c [deleted file]
lib/libedit/config.h [deleted file]
lib/libedit/el.c [deleted file]
lib/libedit/el.h [deleted file]
lib/libedit/emacs.c [deleted file]
lib/libedit/filecomplete.c [deleted file]
lib/libedit/filecomplete.h [deleted file]
lib/libedit/hist.c [deleted file]
lib/libedit/hist.h [deleted file]
lib/libedit/history.c [deleted file]
lib/libedit/key.c [deleted file]
lib/libedit/key.h [deleted file]
lib/libedit/libedit/Makefile [new file with mode: 0644]
lib/libedit/libedit/config.h [new file with mode: 0644]
lib/libedit/libedit/editline.3 [moved from lib/libedit/editline.3 with 82% similarity]
lib/libedit/libedit/editrc.5 [moved from lib/libedit/editrc.5 with 97% similarity]
lib/libedit/makelist [deleted file]
lib/libedit/map.c [deleted file]
lib/libedit/map.h [deleted file]
lib/libedit/parse.c [deleted file]
lib/libedit/parse.h [deleted file]
lib/libedit/prompt.c [deleted file]
lib/libedit/prompt.h [deleted file]
lib/libedit/read.c [deleted file]
lib/libedit/read.h [deleted file]
lib/libedit/readline.c [deleted file]
lib/libedit/readline/Makefile
lib/libedit/readline/readline.h [deleted file]
lib/libedit/refresh.c [deleted file]
lib/libedit/refresh.h [deleted file]
lib/libedit/search.c [deleted file]
lib/libedit/search.h [deleted file]
lib/libedit/sig.c [deleted file]
lib/libedit/sig.h [deleted file]
lib/libedit/sys.h [deleted file]
lib/libedit/term.c [deleted file]
lib/libedit/term.h [deleted file]
lib/libedit/tokenizer.c [deleted file]
lib/libedit/tty.c [deleted file]
lib/libedit/tty.h [deleted file]
lib/libedit/vi.c [deleted file]

index 6be5fa4..60a16e9 100644 (file)
@@ -1,79 +1,3 @@
-# @(#)Makefile 8.1 (Berkeley) 6/4/93
-# $FreeBSD: src/lib/libedit/Makefile,v 1.18.2.2 2002/07/23 10:20:19 ru Exp $
-# $DragonFly: src/lib/libedit/Makefile,v 1.6 2008/06/27 08:06:48 corecode Exp $
+SUBDIR= readline libedit
 
-LIB=   edit
-SHLIB_MAJOR=   5
-
-OSRCS= chared.c common.c el.c emacs.c fcns.c filecomplete.c help.c hist.c \
-       key.c map.c parse.c prompt.c read.c refresh.c search.c sig.c term.c \
-       tty.c vi.c
-
-DPADD= ${LIBNCURSES}
-LDADD= -lncurses
-
-WARNS?=        2
-
-MAN=   editline.3 editrc.5
-
-MLINKS=        editline.3 el_init.3 editline.3 el_end.3 editline.3 el_reset.3 \
-       editline.3 el_gets.3 editline.3 el_getc.3 editline.3 el_push.3 \
-       editline.3 el_parse.3 editline.3 el_set.3 editline.3 el_get.3 \
-       editline.3 el_source.3 editline.3 el_resize.3 editline.3 el_line.3 \
-       editline.3 el_insertstr.3 editline.3 el_deletestr.3 \
-       editline.3 history_init.3 editline.3 history_end.3 \
-       editline.3 history.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} tokenizer.c history.c
-# For protection
-SRCS=  editline.c tokenizer.c history.c readline.c
-
-SRCS+= common.h emacs.h fcns.h help.h vi.h
-
-CLEANFILES+=common.h editline.c emacs.h fcns.c fcns.h help.c help.h vi.h 
-CFLAGS+=-I. -I${.CURDIR}
-CFLAGS+=#-DDEBUG_TTY -DDEBUG_KEY -DDEBUG_READ -DDEBUG -DDEBUG_REFRESH
-CFLAGS+=#-DDEBUG_PASTE
-
-AHDR=vi.h emacs.h common.h
-ASRC=${.CURDIR}/vi.c ${.CURDIR}/emacs.c ${.CURDIR}/common.c
-
-SUBDIR=        readline
-
-vi.h: vi.c makelist
-       sh ${.CURDIR}/makelist -h ${.CURDIR}/vi.c > ${.TARGET}
-
-emacs.h: emacs.c makelist
-       sh ${.CURDIR}/makelist -h ${.CURDIR}/emacs.c > ${.TARGET}
-
-common.h: common.c makelist
-       sh ${.CURDIR}/makelist -h ${.CURDIR}/common.c > ${.TARGET}
-
-fcns.h: ${AHDR} makelist
-       sh ${.CURDIR}/makelist -fh ${AHDR} > ${.TARGET}
-
-fcns.c: ${AHDR} fcns.h help.h makelist
-       sh ${.CURDIR}/makelist -fc ${AHDR} > ${.TARGET}
-
-help.c: ${ASRC} makelist
-       sh ${.CURDIR}/makelist -bc ${ASRC} > ${.TARGET}
-
-help.h: ${ASRC} makelist
-       sh ${.CURDIR}/makelist -bh ${ASRC} > ${.TARGET}
-
-editline.c: ${OSRCS} makelist
-       sh ${.CURDIR}/makelist -e ${OSRCS} > ${.TARGET}
-
-beforedepend editline.o editline.po editline.So: \
-       vi.h emacs.h common.h fcns.h fcns.c help.h help.c
-
-# Not up to date
-#test.o:       ${.CURDIR}/TEST/test.c
-#
-#test: test.o libedit.a ${DPADD} ${LIBTERMCAP}
-#      ${CC} ${CFLAGS} ${.ALLSRC} -o ${.TARGET} libedit.a ${LDADD}
-
-.include <bsd.lib.mk>
+.include <bsd.subdir.mk>
diff --git a/lib/libedit/Makefile.inc b/lib/libedit/Makefile.inc
new file mode 100644 (file)
index 0000000..5035ab3
--- /dev/null
@@ -0,0 +1 @@
+BASEDIR=       ${.CURDIR}/${RELATIVE}../../../contrib/libedit
diff --git a/lib/libedit/TEST/Makefile b/lib/libedit/TEST/Makefile
deleted file mode 100644 (file)
index ae0c104..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-# $NetBSD: Makefile,v 1.2 2003/12/05 13:37:48 lukem Exp $
-# $DragonFly: src/lib/libedit/TEST/Makefile,v 1.2 2007/05/05 00:27:40 pavalos Exp $
-
-NOMAN=1
-PROG=test
-CFLAGS=-I${.CURDIR}/..
-LDADD+=-ledit -ltermcap
-DPADD+=${LIBEDIT} ${LIBTERMCAP}
-
-.ifdef DEBUG
-CFLAGS+=-DDEBUG
-.endif
-
-.include <bsd.prog.mk>
diff --git a/lib/libedit/TEST/test.c b/lib/libedit/TEST/test.c
deleted file mode 100644 (file)
index 3682527..0000000
+++ /dev/null
@@ -1,295 +0,0 @@
-/*-
- * 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.
- *
- * @(#)test.c  8.1 (Berkeley) 6/4/93
- * $NetBSD: test.c,v 1.18 2005/06/01 11:37:52 lukem Exp $
- * $DragonFly: src/lib/libedit/TEST/test.c,v 1.3 2005/11/13 11:58:30 corecode Exp $
- */
-
-#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 */
-
-/*
- * test.c: A little test program
- */
-#include <stdio.h>
-#include <string.h>
-#include <signal.h>
-#include <sys/wait.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <dirent.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[] = "Edit$ ";
-       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;
-
-       /*
-        * 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) {
-                       closedir(dd);
-                       if (el_insertstr(el, &dp->d_name[len]) == -1)
-                               return (CC_ERROR);
-                       else
-                               return (CC_REFRESH);
-               }
-       }
-
-       closedir(dd);
-       return (CC_ERROR);
-}
-
-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) 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, prompt);  /* 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", 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], (char *const *)(void *)(unsigned long)(const void *)(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/chared.c b/lib/libedit/chared.c
deleted file mode 100644 (file)
index 90eacf6..0000000
+++ /dev/null
@@ -1,769 +0,0 @@
-/*-
- * 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.c 8.1 (Berkeley) 6/4/93
- * $NetBSD: chared.c,v 1.25 2005/08/08 01:41:30 christos Exp $
- * $DragonFly: src/lib/libedit/chared.c,v 1.9 2008/09/30 16:57:05 swildner Exp $
- */
-
-#include "config.h"
-
-/*
- * chared.c: Character editor utilities
- */
-#include <stdlib.h>
-#include "el.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;
-       unsigned int size;
-
-       /* Save entire line for undo */
-       size = el->el_line.lastchar - el->el_line.buffer;
-       vu->len = size;
-       vu->cursor = el->el_line.cursor - el->el_line.buffer;
-       memcpy(vu->buf, el->el_line.buffer, size);
-
-       /* 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;
-
-       memcpy(k->buf, ptr, size +0u);
-       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, num +0u))
-                       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 = 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 = 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(int p)
-{
-       return (isalnum(p) || strchr("*?_-.[]~=", p) != NULL);
-}
-
-
-/* cv__isword():
- *     Return if p is part of a word according to vi
- */
-protected int
-cv__isword(int 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(int p)
-{
-       return (!isspace(p));
-}
-
-
-/* c__prev_word():
- *     Find the previous word
- */
-protected char *
-c__prev_word(char *p, char *low, int n, int (*wtest)(int))
-{
-       p--;
-
-       while (n--) {
-               while ((p >= low) && !(*wtest)((unsigned char) *p))
-                       p--;
-               while ((p >= low) && (*wtest)((unsigned char) *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)(int))
-{
-       while (n--) {
-               while ((p < high) && !(*wtest)((unsigned char) *p))
-                       p++;
-               while ((p < high) && (*wtest)((unsigned char) *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)(int))
-{
-       int test;
-
-       while (n--) {
-               test = (*wtest)((unsigned char) *p);
-               while ((p < high) && (*wtest)((unsigned char) *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((unsigned char) *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)(int))
-{
-       int test;
-
-       p--;
-       while (n--) {
-               while ((p > low) && isspace((unsigned char) *p))
-                       p--;
-               test = (*wtest)((unsigned char) *p);
-               while ((p >= low) && (*wtest)((unsigned char) *p) == test)
-                       p--;
-       }
-       p++;
-
-       /* p now points where we want it */
-       if (p < low)
-               return (low);
-       else
-               return (p);
-}
-
-
-#ifdef notdef
-/* c__number():
- *     Ignore character p points to, return number appearing after that.
- *     A '$' by itself means a big number; "$-" is for negative; '^' means 1.
- *     Return p pointing to last char used.
- */
-protected char *
-c__number(
-    char *p,   /* character position */
-    int *num,  /* Return value */
-    int dval)  /* dval is the number to subtract from like $-3 */
-{
-       int i;
-       int sign = 1;
-
-       if (*++p == '^') {
-               *num = 1;
-               return (p);
-       }
-       if (*p == '$') {
-               if (*++p != '-') {
-                       *num = 0x7fffffff;      /* Handle $ */
-                       return (--p);
-               }
-               sign = -1;                      /* Handle $- */
-               ++p;
-       }
-       for (i = 0; isdigit((unsigned char) *p); i = 10 * i + *p++ - '0')
-               continue;
-       *num = (sign < 0 ? dval - i : i);
-       return (--p);
-}
-#endif
-
-/* 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 = 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;
-}
-
-
-#ifdef notdef
-/* ce__endword():
- *     Go to the end of this word according to emacs
- */
-protected char *
-ce__endword(char *p, char *high, int n)
-{
-       p++;
-
-       while (n--) {
-               while ((p < high) && isspace((unsigned char) *p))
-                       p++;
-               while ((p < high) && !isspace((unsigned char) *p))
-                       p++;
-       }
-
-       p--;
-       return (p);
-}
-#endif
-
-
-/* cv__endword():
- *     Go to the end of this word according to vi
- */
-protected char *
-cv__endword(char *p, char *high, int n, int (*wtest)(int))
-{
-       int test;
-
-       p++;
-
-       while (n--) {
-               while ((p < high) && isspace((unsigned char) *p))
-                       p++;
-
-               test = (*wtest)((unsigned char) *p);
-               while ((p < high) && (*wtest)((unsigned char) *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              = (char *) el_malloc(EL_BUFSIZ);
-       if (el->el_line.buffer == NULL)
-               return (-1);
-
-       (void) memset(el->el_line.buffer, 0, EL_BUFSIZ);
-       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        = (char *) el_malloc(EL_BUFSIZ);
-       if (el->el_chared.c_undo.buf == NULL)
-               return (-1);
-       (void) memset(el->el_chared.c_undo.buf, 0, EL_BUFSIZ);
-       el->el_chared.c_undo.len        = -1;
-       el->el_chared.c_undo.cursor     = 0;
-       el->el_chared.c_redo.buf        = (char *) el_malloc(EL_BUFSIZ);
-       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        = (char *) el_malloc(EL_BUFSIZ);
-       if (el->el_chared.c_kill.buf == NULL)
-               return (-1);
-       (void) memset(el->el_chared.c_kill.buf, 0, EL_BUFSIZ);
-       el->el_chared.c_kill.mark       = el->el_line.buffer;
-       el->el_chared.c_kill.last       = el->el_chared.c_kill.buf;
-
-       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       = (char **) el_malloc(EL_MAXMACRO * sizeof(char *));
-       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((ptr_t)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 = 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);
-       if (!newbuffer)
-               return 0;
-
-       /* zero the newly added memory, leave old data in */
-       (void) memset(&newbuffer[sz], 0, newsz - sz);
-           
-       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);
-       if (!newbuffer)
-               return 0;
-
-       /* zero the newly added memory, leave old data in */
-       (void) memset(&newbuffer[sz], 0, newsz - sz);
-
-       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);
-       if (!newbuffer)
-               return 0;
-
-       /* zero the newly added memory, leave old data in */
-       (void) memset(&newbuffer[sz], 0, newsz - sz);
-       el->el_chared.c_undo.buf = newbuffer;
-
-       newbuffer = el_realloc(el->el_chared.c_redo.buf, newsz);
-       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];
-       return 1;
-}
-
-/* ch_end():
- *     Free the data structures used by the editor
- */
-protected void
-ch_end(EditLine *el)
-{
-       el_free((ptr_t) el->el_line.buffer);
-       el->el_line.buffer = NULL;
-       el->el_line.limit = NULL;
-       el_free((ptr_t) el->el_chared.c_undo.buf);
-       el->el_chared.c_undo.buf = NULL;
-       el_free((ptr_t) 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((ptr_t) el->el_chared.c_kill.buf);
-       el->el_chared.c_kill.buf = NULL;
-       ch_reset(el, 1);
-       el_free((ptr_t) el->el_chared.c_macro.macro);
-       el->el_chared.c_macro.macro = NULL;
-}
-
-
-/* el_insertstr():
- *     Insert string at cursorI
- */
-public int
-el_insertstr(EditLine *el, const char *s)
-{
-       size_t len;
-
-       if ((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;
-}
-
-/* c_gets():
- *     Get a string
- */
-protected int
-c_gets(EditLine *el, char *buf, const char *prompt)
-{
-       char ch;
-       int len;
-       char *cp = el->el_line.buffer;
-
-       if (prompt) {
-               len = strlen(prompt);
-               memcpy(cp, prompt, len + 0u);
-               cp += len;
-       }
-       len = 0;
-
-       for (;;) {
-               el->el_line.cursor = cp;
-               *cp = ' ';
-               el->el_line.lastchar = cp + 1;
-               re_refresh(el);
-
-               if (el_getc(el, &ch) != 1) {
-                       ed_end_of_file(el, 0);
-                       len = -1;
-                       break;
-               }
-
-               switch (ch) {
-
-               case 0010:      /* Delete and backspace */
-               case 0177:
-                       if (len <= 0) {
-                               len = -1;
-                               break;
-                       }
-                       cp--;
-                       continue;
-
-               case 0033:      /* ESC */
-               case '\r':      /* Newline */
-               case '\n':
-                       buf[len] = ch;
-                       break;
-
-               default:
-                       if (len >= EL_BUFSIZ - 16)
-                               term_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 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 (el->el_line.cursor - ptr - 1);
-       }
-}
diff --git a/lib/libedit/chared.h b/lib/libedit/chared.h
deleted file mode 100644 (file)
index ba7e25f..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-/*-
- * 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
- * $NetBSD: chared.h,v 1.17 2006/03/06 21:11:56 christos Exp $
- * $DragonFly: src/lib/libedit/chared.h,v 1.5 2007/05/05 00:27:39 pavalos Exp $
- */
-
-/*
- * el.chared.h: Character editor interface
- */
-#ifndef _h_el_chared
-#define        _h_el_chared
-
-#include <ctype.h>
-#include <string.h>
-
-#include "histedit.h"
-
-#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 {
-       int      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;
-
-/*
- * 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_chared_t;
-
-
-#define        STRQQ           "\"\""
-
-#define        isglob(a)       (strchr("*[]?", (a)) != NULL)
-#define        isword(a)       (isprint(a))
-
-#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
-
-#include "common.h"
-#include "vi.h"
-#include "emacs.h"
-#include "search.h"
-#include "fcns.h"
-
-
-protected int   cv__isword(int);
-protected int   cv__isWord(int);
-protected void  cv_delfini(EditLine *);
-protected char *cv__endword(char *, char *, int, int (*)(int));
-protected int   ce__isword(int);
-protected void  cv_undo(EditLine *);
-protected void  cv_yank(EditLine *, const char *, int);
-protected char *cv_next_word(EditLine*, char *, char *, int, int (*)(int));
-protected char *cv_prev_word(char *, char *, int, int (*)(int));
-protected char *c__next_word(char *, char *, int, int (*)(int));
-protected char *c__prev_word(char *, char *, int, int (*)(int));
-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_enlargebufs(EditLine *, size_t);
-protected void  ch_end(EditLine *);
-
-#endif /* _h_el_chared */
diff --git a/lib/libedit/common.c b/lib/libedit/common.c
deleted file mode 100644 (file)
index 50b8d34..0000000
+++ /dev/null
@@ -1,916 +0,0 @@
-/*-
- * 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.
- *
- * @(#)common.c 8.1 (Berkeley) 6/4/93
- * $NetBSD: common.c,v 1.19 2006/03/06 21:11:56 christos Exp $
- * $DragonFly: src/lib/libedit/common.c,v 1.6 2007/05/05 00:27:39 pavalos Exp $
- */
-
-#include "config.h"
-
-/*
- * common.c: Common Editor functions
- */
-#include "el.h"
-
-/* ed_end_of_file():
- *     Indicate end of file
- *     [^D]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_end_of_file(EditLine *el, int 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, int 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++ = 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++ = 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, int 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, 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, int c)
-{
-#ifdef notdef                  /* XXX */
-#define        EL      el->el_line
-       (void) fprintf(el->el_errlfile,
-           "\nD(b: %x(%s)  c: %x(%s) last: %x(%s) limit: %x(%s)\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 */
-                               term_writechar(el, c);
-                               return (CC_EOF);
-#endif
-                       } else {
-#ifdef KSHVI
-                               el->el_line.cursor--;
-#else
-                               return (CC_ERROR);
-#endif
-                       }
-               } else {
-                       if (el->el_line.cursor != el->el_line.buffer)
-                               el->el_line.cursor--;
-                       else
-                               return (CC_ERROR);
-               }
-       }
-       c_delafter(el, el->el_state.argument);  /* delete after dot */
-       if (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, int 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, int c __attribute__((__unused__)))
-{
-
-       el->el_line.cursor = el->el_line.lastchar;
-       if (el->el_map.type == MAP_VI) {
-#ifdef VI_MOVE
-               el->el_line.cursor--;
-#endif
-               if (el->el_chared.c_vcmd.action != NOP) {
-                       cv_delfini(el);
-                       return (CC_REFRESH);
-               }
-       }
-       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, int 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((unsigned char) *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, int 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] = 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, int 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, int 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, int 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, int c)
-{
-       int num;
-       char tc;
-
-       tty_quotemode(el);
-       num = el_getc(el, &tc);
-       c = (unsigned char) tc;
-       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, int 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, int 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, int 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__)), 
-             int 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__)), 
-            int 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__)), 
-                   int c __attribute__((__unused__)))
-{
-
-       return (CC_NORM);
-}
-
-
-/* ed_tty_sigquit():
- *     Tty quit character
- *     [^\]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_tty_sigquit(EditLine *el __attribute__((__unused__)), 
-              int 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__)), 
-              int 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__)), 
-                  int 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__)), 
-                   int c __attribute__((__unused__)))
-{
-
-       return (CC_NORM);
-}
-
-
-/* ed_newline():
- *     Execute command
- *     [^J]
- */
-protected el_action_t
-/*ARGSUSED*/
-ed_newline(EditLine *el, int 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, int 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, int c __attribute__((__unused__)))
-{
-
-       term_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__)), 
-            int 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, int 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__)), 
-                   int 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, int 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;
-                       return CC_ERROR;
-               }
-               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, int 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, int c __attribute__((__unused__)))
-{
-       const char *hp;
-       int h;
-       bool_t 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++;
-                       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, int c __attribute__((__unused__)))
-{
-       const char *hp;
-       int h;
-       bool_t 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, int 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, int 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, int c __attribute__((__unused__)))
-{
-       char tmpbuf[EL_BUFSIZ];
-       int tmplen;
-
-       tmplen = c_gets(el, tmpbuf, "\n: ");
-       term__putc('\n');
-
-       if (tmplen < 0 || (tmpbuf[tmplen] = 0, parse_line(el, tmpbuf)) == -1)
-               term_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 (file)
index 5671b01..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/* $DragonFly: src/lib/libedit/config.h,v 1.1 2005/11/13 11:58:30 corecode Exp $ */
-/* config.h.  Generated automatically by configure.  */
-/* #undef SUNOS */
-
-#define HAVE_SYS_CDEFS_H 1
-#define HAVE_TERMCAP_H 1
-#define HAVE_CURSES_H 1
-#define HAVE_NCURSES_H 1
-#define HAVE_TERM_H 1
-#define HAVE_VIS_H 1
-#define HAVE_ISSETUGID 1
-
-#define HAVE_STRLCAT 1
-#define HAVE_STRLCPY 1
-#define HAVE_FGETLN 1
-#define HAVE_STRVIS 1
-#define HAVE_STRUNVIS 1
-
-#include "sys.h"
diff --git a/lib/libedit/el.c b/lib/libedit/el.c
deleted file mode 100644 (file)
index fcbf073..0000000
+++ /dev/null
@@ -1,576 +0,0 @@
-/*-
- * 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.c     8.2 (Berkeley) 1/3/94
- * $NetBSD: el.c,v 1.45 2008/04/05 15:53:28 christos Exp $
- * $DragonFly: src/lib/libedit/el.c,v 1.7 2008/05/17 22:48:04 pavalos Exp $
- */
-
-#include "config.h"
-
-/*
- * el.c: EditLine interface functions
- */
-#include <sys/types.h>
-#include <sys/param.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include "el.h"
-
-/* el_init():
- *     Initialize editline and set default parameters.
- */
-public EditLine *
-el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr)
-{
-
-       EditLine *el = (EditLine *) el_malloc(sizeof(EditLine));
-
-       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 = fileno(fin);
-
-       if ((el->el_prog = el_strdup(prog)) == NULL) {
-               el_free(el);
-               return NULL;
-       }
-
-       /*
-         * Initialize all the modules. Order is important!!!
-         */
-       el->el_flags = 0;
-
-       if (term_init(el) == -1) {
-               el_free(el->el_prog);
-               el_free(el);
-               return NULL;
-       }
-       (void) key_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);
-
-       term_end(el);
-       key_end(el);
-       map_end(el);
-       tty_end(el);
-       ch_end(el);
-       search_end(el);
-       hist_end(el);
-       prompt_end(el);
-       sig_end(el);
-
-       el_free((ptr_t) el->el_prog);
-       el_free((ptr_t) 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
-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:
-               rv = prompt_set(el, va_arg(ap, el_pfunc_t), op);
-               break;
-
-       case EL_TERMINAL:
-               rv = term_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_GETTC:
-       case EL_ECHOTC:
-       case EL_SETTY:
-       {
-               const char *argv[20];
-               int i;
-
-               for (i = 1; i < 20; i++)
-                       if ((argv[i] = va_arg(ap, char *)) == NULL)
-                               break;
-
-               switch (op) {
-               case EL_BIND:
-                       argv[0] = "bind";
-                       rv = map_bind(el, i, argv);
-                       break;
-
-               case EL_TELLTC:
-                       argv[0] = "telltc";
-                       rv = term_telltc(el, i, argv);
-                       break;
-
-               case EL_SETTC:
-                       argv[0] = "settc";
-                       rv = term_settc(el, i, argv);
-                       break;
-
-               case EL_ECHOTC:
-                       argv[0] = "echotc";
-                       rv = term_echotc(el, i, argv);
-                       break;
-
-               case EL_SETTY:
-                       argv[0] = "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);
-               ptr_t ptr = va_arg(ap, char *);
-
-               rv = hist_set(el, func, ptr);
-               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;
-                       break;
-               case 2:
-                       el->el_errfile = fp;
-                       break;
-               default:
-                       rv = -1;
-                       break;
-               }
-               break;
-       }
-
-       case EL_REFRESH:
-               re_clear_display(el);
-               re_refresh(el);
-               term__flush();
-               break;
-
-       default:
-               rv = -1;
-               break;
-       }
-
-       va_end(ap);
-       return (rv);
-}
-
-
-/* el_get():
- *     retrieve the editline parameters
- */
-public int
-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:
-               rv = prompt_get(el, va_arg(ap, el_pfunc_t *), 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:
-               term_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 < sizeof(argv) / sizeof(argv[0]); i++)
-                       if ((argv[i] = va_arg(ap, char *)) == NULL)
-                               break;
-
-               switch (op) {
-               case EL_GETTC:
-                       argv[0] = name;
-                       rv = term_gettc(el, i, argv);
-                       break;
-
-               default:
-                       rv = -1;
-                       EL_ABORT((el->el_errfile, "Bad op %d\n", op));
-                       break;
-               }
-               break;
-       }
-
-#if 0 /* XXX */
-       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);
-                       ptr_t ptr = va_arg(ap, char *);
-                       rv = hist_set(el, func, ptr);
-               }
-               break;
-#endif /* XXX */
-
-       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));
-               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 LineInfo *
-el_line(EditLine *el)
-{
-
-       return (const LineInfo *) (void *) &el->el_line;
-}
-
-
-/* el_source():
- *     Source a file
- */
-public int
-el_source(EditLine *el, const char *fname)
-{
-       FILE *fp;
-       size_t len;
-       char *ptr;
-
-       fp = NULL;
-       if (fname == NULL) {
-#ifdef HAVE_ISSETUGID
-               static const char elpath[] = "/.editrc";
-               char path[MAXPATHLEN];
-
-               if (issetugid())
-                       return (-1);
-               if ((ptr = getenv("HOME")) == NULL)
-                       return (-1);
-               if (strlcpy(path, ptr, sizeof(path)) >= sizeof(path))
-                       return (-1);
-               if (strlcat(path, elpath, sizeof(path)) >= sizeof(path))
-                       return (-1);
-               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)
-               return (-1);
-
-       while ((ptr = fgetln(fp, &len)) != NULL) {
-               if (len > 0 && ptr[len - 1] == '\n')
-                       --len;
-               ptr[len] = '\0';
-               if (parse_line(el, ptr) == -1) {
-                       (void) fclose(fp);
-                       return (-1);
-               }
-       }
-
-       (void) fclose(fp);
-       return (0);
-}
-
-
-/* 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 (term_get_size(el, &lins, &cols))
-               term_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)
-{
-
-       term_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, "on") == 0) {
-               el->el_flags &= ~EDIT_DISABLED;
-               tty_rawmode(el);
-       } else if (strcmp(how, "off") == 0) {
-               tty_cookedmode(el);
-               el->el_flags |= EDIT_DISABLED;
-       }
-       else {
-               (void) fprintf(el->el_errfile, "edit: Bad value `%s'.\n", how);
-               return (-1);
-       }
-       return (0);
-}
diff --git a/lib/libedit/el.h b/lib/libedit/el.h
deleted file mode 100644 (file)
index 41cb2ef..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-/*-
- * 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
- * $NetBSD: el.h,v 1.17 2006/12/15 22:13:33 christos Exp $
- * $DragonFly: src/lib/libedit/el.h,v 1.3 2007/05/05 00:27:39 pavalos Exp $
- */
-
-/*
- * el.h: Internal structures.
- */
-#ifndef _h_el
-#define        _h_el
-/*
- * Local defaults
- */
-#define        KSHVI
-#define        VIDEFAULT
-#define        ANCHOR
-
-#include <stdio.h>
-#include <sys/types.h>
-
-#define        EL_BUFSIZ       1024            /* Maximum line size            */
-
-#define        HANDLE_SIGNALS  0x01
-#define        NO_TTY          0x02
-#define        EDIT_DISABLED   0x04
-#define        UNBUFFERED      0x08
-
-typedef int bool_t;                    /* True or not                  */
-
-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_strdup(a)    strdup(a)
-#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 "key.h"
-#include "term.h"
-#include "refresh.h"
-#include "chared.h"
-#include "common.h"
-#include "search.h"
-#include "hist.h"
-#include "map.h"
-#include "parse.h"
-#include "sig.h"
-#include "help.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_flags;     /* Various flags.               */
-       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_term_t         el_term;      /* 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_key_t          el_key;       /* 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      */
-};
-
-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/emacs.c b/lib/libedit/emacs.c
deleted file mode 100644 (file)
index e54a251..0000000
+++ /dev/null
@@ -1,502 +0,0 @@
-/*-
- * 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.
- *
- * @(#)emacs.c  8.1 (Berkeley) 6/4/93
- * $NetBSD: emacs.c,v 1.21 2006/03/06 21:11:56 christos Exp $
- * $DragonFly: src/lib/libedit/emacs.c,v 1.6 2007/05/05 00:27:39 pavalos Exp $
- */
-
-#include "config.h"
-
-/*
- * emacs.c: Emacs functions
- */
-#include "el.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, int 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 */
-                       term_writec(el, c);     /* then do an EOF */
-                       return (CC_EOF);
-               } else {
-                       /*
-                        * Here we could list completions, but it is an
-                        * error right now
-                        */
-                       term_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, int 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, 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, int 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, 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, int 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, int 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, 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, 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, int 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, int 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] = 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, int 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, int 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((unsigned char)*cp))
-                       *cp = toupper((unsigned char)*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, int 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((unsigned char)*cp)) {
-                       if (islower((unsigned char)*cp))
-                               *cp = toupper((unsigned char)*cp);
-                       cp++;
-                       break;
-               }
-       }
-       for (; cp < ep; cp++)
-               if (isupper((unsigned char)*cp))
-                       *cp = tolower((unsigned char)*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, int 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((unsigned char)*cp))
-                       *cp = tolower((unsigned char)*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, int 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, int 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, int 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, int 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, int 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, int 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, 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, int 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, int 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, int 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 (file)
index d3423f3..0000000
+++ /dev/null
@@ -1,537 +0,0 @@
-/*-
- * 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.
- *
- * $NetBSD: filecomplete.c,v 1.11 2008/04/29 06:53:01 martin Exp $
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdio.h>
-#include <dirent.h>
-#include <string.h>
-#include <pwd.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <limits.h>
-#include <errno.h>
-#include <fcntl.h>
-#ifdef HAVE_VIS_H
-#include <vis.h>
-#else
-#include "np/vis.h"
-#endif
-#ifdef HAVE_ALLOCA_H
-#include <alloca.h>
-#endif
-#include "el.h"
-#include "fcns.h"              /* for EL_NUM_FCNS */
-#include "histedit.h"
-#include "filecomplete.h"
-
-static char break_chars[] = { ' ', '\t', '\n', '"', '\\', '\'', '`', '@', '$',
-    '>', '<', '=', ';', '|', '&', '{', '(', '\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 callers's responsibility to free() returned string
- */
-char *
-fn_tilde_expand(const char *txt)
-{
-       struct passwd pwres, *pass;
-       char *temp;
-       size_t len = 0;
-       char pwbuf[1024];
-
-       if (txt[0] != '~')
-               return (strdup(txt));
-
-       temp = strchr(txt + 1, '/');
-       if (temp == NULL) {
-               temp = strdup(txt + 1);
-               if (temp == NULL)
-                       return NULL;
-       } else {
-               len = temp - txt + 1;   /* text until string after slash */
-               temp = malloc(len);
-               if (temp == NULL)
-                       return NULL;
-               (void)strncpy(temp, txt + 1, len - 2);
-               temp[len - 2] = '\0';
-       }
-       if (temp[0] == 0) {
-               if (getpwuid_r(getuid(), &pwres, pwbuf, sizeof(pwbuf), &pass) != 0)
-                       pass = NULL;
-       } else {
-               if (getpwnam_r(temp, &pwres, pwbuf, sizeof(pwbuf), &pass) != 0)
-                       pass = NULL;
-       }
-       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;
-
-       temp = malloc(strlen(pass->pw_dir) + 1 + strlen(txt) + 1);
-       if (temp == NULL)
-               return NULL;
-       (void)sprintf(temp, "%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 caller's responsibility to free 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 = realloc(filename, strlen(temp) + 1);
-                       if (nptr == NULL) {
-                               free(filename);
-                               return NULL;
-                       }
-                       filename = nptr;
-                       (void)strcpy(filename, temp);
-                       len = temp - text;      /* including last slash */
-                       nptr = realloc(dirname, len + 1);
-                       if (nptr == NULL) {
-                               free(filename);
-                               return NULL;
-                       }
-                       dirname = nptr;
-                       (void)strncpy(dirname, text, len);
-                       dirname[len] = '\0';
-               } else {
-                       if (*text == 0)
-                               filename = NULL;
-                       else {
-                               filename = strdup(text);
-                               if (filename == NULL)
-                                       return NULL;
-                       }
-                       dirname = NULL;
-               }
-
-               if (dir != NULL) {
-                       (void)closedir(dir);
-                       dir = NULL;
-               }
-
-               /* support for ``~user'' syntax */
-               free(dirpath);
-
-               if (dirname == NULL && (dirname = strdup("./")) == NULL)
-                       return NULL;
-
-               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 defined(__SVR4) || defined(__linux__)
-                   && strlen(entry->d_name) >= filename_len
-#else
-                   && entry->d_namlen >= filename_len
-#endif
-                   && strncmp(entry->d_name, filename,
-                       filename_len) == 0)
-                       break;
-       }
-
-       if (entry) {            /* match found */
-
-#if defined(__SVR4) || defined(__linux__)
-               len = strlen(entry->d_name);
-#else
-               len = entry->d_namlen;
-#endif
-
-               temp = malloc(strlen(dirname) + len + 1);
-               if (temp == NULL)
-                       return NULL;
-               (void)sprintf(temp, "%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)
-               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 = realloc(match_list,
-                           match_list_len * sizeof(char *));
-                       if (nmatch_list == NULL) {
-                               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 = malloc(max_equal + 1);
-       if (retstr == NULL) {
-               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, 'len' is number of strings in 'matches',
- * 'max' is maximum length of string in 'matches'.
- */
-void
-fn_display_match_list (EditLine *el, char **matches, int len, int max)
-{
-       int i, idx, limit, count;
-       int screenwidth = el->el_term.t_size.h;
-
-       /*
-        * Find out how many entries can be put on one line, count
-        * with two spaces between strings.
-        */
-       limit = screenwidth / (max + 2);
-       if (limit == 0)
-               limit = 1;
-
-       /* how many lines of output */
-       count = len / limit;
-       if (count * limit < len)
-               count++;
-
-       /* Sort the items if they are not already sorted. */
-       qsort(&matches[1], (size_t)(len - 1), sizeof(char *),
-           _fn_qsort_string_compare);
-
-       idx = 1;
-       for(; count > 0; count--) {
-               for(i = 0; i < limit && matches[idx]; i++, idx++)
-                       (void)fprintf(el->el_outfile, "%-*s  ", max,
-                           matches[idx]);
-               (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 *), int query_items,
-       int *completion_type, int *over, int *point, int *end)
-{
-       const LineInfo *li;
-       char *temp, **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 = el_line(el);
-       ctemp = (const char *) li->cursor;
-       while (ctemp > li->buffer
-           && !strchr(word_break, ctemp[-1])
-           && (!special_prefixes || !strchr(special_prefixes, ctemp[-1]) ) )
-               ctemp--;
-
-       len = li->cursor - ctemp;
-#if defined(__SSP__) || defined(__SSP_ALL__)
-       temp = malloc(len + 1);
-#else
-       temp = alloca(len + 1);
-#endif
-       (void)strncpy(temp, ctemp, len);
-       temp[len] = '\0';
-
-       /* these can be used by function called in completion_matches() */
-       /* or (*attempted_completion_function)() */
-       if (point != NULL)
-               *point = li->cursor - li->buffer;
-       if (end != NULL)
-               *end = li->lastchar - li->buffer;
-
-       if (attempted_completion_function) {
-               int cur_off = li->cursor - li->buffer;
-               matches = (*attempted_completion_function) (temp,
-                   (int)(cur_off - len), cur_off);
-       } else
-               matches = NULL;
-       if (!attempted_completion_function || 
-           (over != NULL && !*over && !matches))
-               matches = completion_matches(temp, complet_func);
-
-       if (over != NULL)
-               *over = 0;
-
-       if (matches) {
-               int i;
-               int 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') {
-                       el_deletestr(el, (int) len);
-                       el_insertstr(el, matches[0]);
-               }
-
-               if (what_to_do == '?')
-                       goto display_matches;
-
-               if (matches[2] == 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.
-                        */
-                       el_insertstr(el, (*append_char_function)(matches[0])); 
-               } 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_num = 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 %d 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)
-                               fn_display_match_list(el, matches, matches_num,
-                                       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 elements of array and the array itself */
-               for (i = 0; matches[i]; i++)
-                       free(matches[i]);
-               free(matches);
-               matches = NULL;
-       }
-#if defined(__SSP__) || defined(__SSP_ALL__)
-       free(temp);
-#endif
-       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, 100,
-           NULL, NULL, NULL, NULL);
-}
diff --git a/lib/libedit/filecomplete.h b/lib/libedit/filecomplete.h
deleted file mode 100644 (file)
index 8584ebe..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*-
- * 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.
- *
- * $NetBSD: filecomplete.h,v 1.6 2008/04/29 06:53:01 martin Exp $
- * $DragonFly: src/lib/libedit/filecomplete.h,v 1.3 2008/05/17 22:48:04 pavalos Exp $
- */
-#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 *), int,
-    int *, int *, int *, int *);
-
-void fn_display_match_list(EditLine *, char **, int, int);
-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 (file)
index daaa58c..0000000
+++ /dev/null
@@ -1,205 +0,0 @@
-/*-
- * 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.c  8.1 (Berkeley) 6/4/93
- * $NetBSD: hist.c,v 1.15 2003/11/01 23:36:39 christos Exp $"
- * $DragonFly: src/lib/libedit/hist.c,v 1.3 2005/11/13 11:58:30 corecode Exp $
- */
-
-#include "config.h"
-
-/*
- * hist.c: History access functions
- */
-#include <stdlib.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 = (char *) el_malloc(EL_BUFSIZ);
-       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((ptr_t) 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, ptr_t 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) strlcpy(el->el_line.buffer, hp,
-                       (size_t)(el->el_line.limit - el->el_line.buffer));
-       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;
-       HistEvent ev;
-
-       if (el->el_history.ref == NULL)
-               return (-1);
-
-       if (argc == 1 || strcmp(argv[1], "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, str);
-               return (0);
-       }
-
-       if (argc != 3)
-               return (-1);
-
-       num = (int)strtol(argv[2], NULL, 0);
-
-       if (strcmp(argv[1], "size") == 0)
-               return history(el->el_history.ref, &ev, H_SETSIZE, num);
-
-       if (strcmp(argv[1], "unique") == 0)
-               return 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 = realloc(el->el_history.buf, newsz);
-       if (!newbuf)
-               return 0;
-
-       (void) memset(&newbuf[oldsz], '\0', newsz - oldsz);
-
-       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;
-}
diff --git a/lib/libedit/hist.h b/lib/libedit/hist.h
deleted file mode 100644 (file)
index e64294a..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-/*-
- * 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
- * $NetBSD: hist.h,v 1.10 2003/08/07 16:44:31 agc Exp $
- * $DragonFly: src/lib/libedit/hist.h,v 1.4 2005/11/13 11:58:30 corecode Exp $
- */
-
-/*
- * el.hist.c: History functions
- */
-#ifndef _h_el_hist
-#define        _h_el_hist
-
-#include "histedit.h"
-
-typedef int (*hist_fun_t)(ptr_t, 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     */
-       ptr_t            ref;           /* Argument for history fcns    */
-       hist_fun_t       fun;           /* Event access                 */
-       HistEvent        ev;            /* Event cookie                 */
-} el_history_t;
-
-#define        HIST_FUN(el, fn, arg)   \
-    ((((*(el)->el_history.fun) ((el)->el_history.ref, &(el)->el_history.ev, \
-       fn, arg)) == -1) ? NULL : (el)->el_history.ev.str)
-
-#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)
-
-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, ptr_t);
-protected int          hist_command(EditLine *, int, const char **);
-protected int          hist_enlargebuf(EditLine *, size_t, size_t);
-
-#endif /* _h_el_hist */
diff --git a/lib/libedit/history.c b/lib/libedit/history.c
deleted file mode 100644 (file)
index 598c13f..0000000
+++ /dev/null
@@ -1,986 +0,0 @@
-/*-
- * 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.
- *
- * @(#)history.c       8.1 (Berkeley) 6/4/93
- * $NetBSD: history.c,v 1.32 2006/09/28 13:52:51 christos Exp $
- * $DragonFly: src/lib/libedit/history.c,v 1.7 2007/05/05 00:27:39 pavalos Exp $
- */
-
-#include "config.h"
-
-/*
- * hist.c: History access functions
- */
-#include <string.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#ifdef HAVE_VIS_H
-#include <vis.h>
-#else
-#include "np/vis.h"
-#endif
-#include <sys/stat.h>
-
-static const char hist_cookie[] = "_HiStOrY_V2_\n";
-
-#include "histedit.h"
-
-typedef int (*history_gfun_t)(ptr_t, HistEvent *);
-typedef int (*history_efun_t)(ptr_t, HistEvent *, const char *);
-typedef void (*history_vfun_t)(ptr_t, HistEvent *);
-typedef int (*history_sfun_t)(ptr_t, HistEvent *, const int);
-
-struct history {
-       ptr_t 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(History *, HistEvent *, int);
-private int history_getsize(History *, HistEvent *);
-private int history_setunique(History *, HistEvent *, int);
-private int history_getunique(History *, HistEvent *);
-private int history_set_fun(History *, History *);
-private int history_load(History *, const char *);
-private int history_save(History *, const char *);
-private int history_prev_event(History *, HistEvent *, int);
-private int history_next_event(History *, HistEvent *, int);
-private int history_next_string(History *, HistEvent *, const char *);
-private int history_prev_string(History *, HistEvent *, const char *);
-
-
-/***********************************************************************/
-
-/*
- * Builtin- history implementation
- */
-typedef struct hentry_t {
-       HistEvent ev;           /* What we return                */
-       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;              /* History flags                */
-#define H_UNIQUE       1       /* Store only unique elements   */
-} history_t;
-
-private int history_def_next(ptr_t, HistEvent *);
-private int history_def_first(ptr_t, HistEvent *);
-private int history_def_prev(ptr_t, HistEvent *);
-private int history_def_last(ptr_t, HistEvent *);
-private int history_def_curr(ptr_t, HistEvent *);
-private int history_def_set(ptr_t, HistEvent *, const int);
-private void history_def_clear(ptr_t, HistEvent *);
-private int history_def_enter(ptr_t, HistEvent *, const char *);
-private int history_def_add(ptr_t, HistEvent *, const char *);
-private int history_def_del(ptr_t, HistEvent *, const int);
-
-private int history_def_init(ptr_t *, HistEvent *, int);
-private int history_def_insert(history_t *, HistEvent *, const char *);
-private void history_def_delete(history_t *, HistEvent *, hentry_t *);
-
-#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[] = {
-       "OK",
-       "unknown error",
-       "malloc() failed",
-       "first event not found",
-       "last event not found",
-       "empty list",
-       "no next event",
-       "no previous event",
-       "current event is invalid",
-       "event not found",
-       "can't read history from file",
-       "can't write history",
-       "required parameter(s) not supplied",
-       "history size negative",
-       "function not allowed with other history-functions-set the default",
-       "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(ptr_t p, 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(ptr_t p, 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(ptr_t p, 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(ptr_t p, 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(ptr_t p, 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(ptr_t p, 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_def_add():
- *     Append string to element
- */
-private int
-history_def_add(ptr_t p, 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 = (char *) h_malloc(len);
-       if (s == NULL) {
-               he_seterrev(ev, _HE_MALLOC_FAILED);
-               return (-1);
-       }
-       (void) strlcpy(s, h->cursor->ev.str, len);
-       (void) strlcat(s, str, len);
-       h_free((ptr_t)evp->str);
-       evp->str = s;
-       *ev = h->cursor->ev;
-       return (0);
-}
-
-
-/* history_def_del():
- *     Delete element hp of the h list
- */
-/* ARGSUSED */
-private int
-history_def_del(ptr_t p, 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, 
-                  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;
-       hp->prev->next = hp->next;
-       hp->next->prev = hp->prev;
-       h_free((ptr_t) 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, HistEvent *ev, const char *str)
-{
-
-       h->cursor = (hentry_t *) h_malloc(sizeof(hentry_t));
-       if (h->cursor == NULL)
-               goto oomem;
-       if ((h->cursor->ev.str = h_strdup(str)) == NULL) {
-               h_free((ptr_t)h->cursor);
-               goto oomem;
-       }
-       h->cursor->ev.num = ++h->eventid;
-       h->cursor->next = h->list.next;
-       h->cursor->prev = &h->list;
-       h->list.next->prev = h->cursor;
-       h->list.next = h->cursor;
-       h->cur++;
-
-       *ev = h->cursor->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(ptr_t p, 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(ptr_t *p, HistEvent *ev __attribute__((__unused__)), int n)
-{
-       history_t *h = (history_t *) h_malloc(sizeof(history_t));
-       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 = (ptr_t) h;
-       return 0;
-}
-
-
-/* history_def_clear():
- *     Default history cleanup function
- */
-private void
-history_def_clear(ptr_t p, HistEvent *ev)
-{
-       history_t *h = (history_t *) p;
-
-       while (h->list.prev != &h->list)
-               history_def_delete(h, ev, h->list.prev);
-       h->eventid = 0;
-       h->cur = 0;
-}
-
-
-
-
-/************************************************************************/
-
-/* history_init():
- *     Initialization function.
- */
-public History *
-history_init(void)
-{
-       HistEvent ev;
-       History *h = (History *) h_malloc(sizeof(History));
-       if (h == NULL)
-               return NULL;
-
-       if (history_def_init(&h->h_ref, &ev, 0) == -1) {
-               h_free((ptr_t)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
-history_end(History *h)
-{
-       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(History *h, 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(History *h, 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(History *h, 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(History *h, 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(History *h, History *nh)
-{
-       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) {
-                       history_def_init(&h->h_ref, &ev, 0);
-                       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():
- *     History load function
- */
-private int
-history_load(History *h, const char *fname)
-{
-       FILE *fp;
-       char *line;
-       size_t sz, max_size;
-       char *ptr;
-       int i = -1;
-       HistEvent ev;
-
-       if ((fp = fopen(fname, "r")) == NULL)
-               return (i);
-
-       if ((line = fgetln(fp, &sz)) == NULL)
-               goto done;
-
-       if (strncmp(line, hist_cookie, sz) != 0)
-               goto done;
-
-       ptr = h_malloc(max_size = 1024);
-       if (ptr == NULL)
-               goto done;
-       for (i = 0; (line = fgetln(fp, &sz)) != NULL; i++) {
-               char c = line[sz];
-
-               if (sz != 0 && line[sz - 1] == '\n')
-                       line[--sz] = '\0';
-               else
-                       line[sz] = '\0';
-
-               if (max_size < sz) {
-                       char *nptr;
-                       max_size = (sz + 1024) & ~1023;
-                       nptr = h_realloc(ptr, max_size);
-                       if (nptr == NULL) {
-                               i = -1;
-                               goto oomem;
-                       }
-                       ptr = nptr;
-               }
-               (void) strunvis(ptr, line);
-               line[sz] = c;
-               if (HENTER(h, &ev, ptr) == -1) {
-                       h_free((ptr_t)ptr);
-                       return -1;
-               }
-       }
-oomem:
-       h_free((ptr_t)ptr);
-done:
-       (void) fclose(fp);
-       return (i);
-}
-
-
-/* history_save():
- *     History save function
- */
-private int
-history_save(History *h, const char *fname)
-{
-       FILE *fp;
-       HistEvent ev;
-       int i = -1, retval;
-       size_t len, max_size;
-       char *ptr;
-
-       if ((fp = fopen(fname, "w")) == NULL)
-               return (-1);
-
-       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);
-       if (ptr == NULL)
-               goto done;
-       for (i = 0, retval = HLAST(h, &ev);
-           retval != -1;
-           retval = HPREV(h, &ev), i++) {
-               len = strlen(ev.str) * 4;
-               if (len >= max_size) {
-                       char *nptr;
-                       max_size = (len + 1024) & ~1023;
-                       nptr = h_realloc(ptr, max_size);
-                       if (nptr == NULL) {
-                               i = -1;
-                               goto oomem;
-                       }
-                       ptr = nptr;
-               }
-               (void) strvis(ptr, ev.str, VIS_WHITE);
-               (void) fprintf(fp, "%s\n", ptr);
-       }
-oomem:
-       h_free((ptr_t)ptr);
-done:
-       (void) fclose(fp);
-       return (i);
-}
-
-
-/* history_prev_event():
- *     Find the previous event, with number given
- */
-private int
-history_prev_event(History *h, 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);
-}
-
-
-/* history_next_event():
- *     Find the next event, with number given
- */
-private int
-history_next_event(History *h, 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(History *h, 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(History *h, 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
-history(History *h, 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_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:
-       {
-               History hf;
-
-               hf.h_ref = va_arg(va, ptr_t);
-               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:
-               history_end(h);
-               retval = 0;
-               break;
-
-       default:
-               retval = -1;
-               he_seterrev(ev, _HE_UNKNOWN);
-               break;
-       }
-       va_end(va);
-       return (retval);
-}
diff --git a/lib/libedit/key.c b/lib/libedit/key.c
deleted file mode 100644 (file)
index d45342b..0000000
+++ /dev/null
@@ -1,701 +0,0 @@
-/*-
- * 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.c   8.1 (Berkeley) 6/4/93
- * $NetBSD: key.c,v 1.19 2006/03/23 20:22:51 christos Exp $
- * $DragonFly: src/lib/libedit/key.c,v 1.6 2007/05/05 00:27:39 pavalos Exp $
- */
-
-#include "config.h"
-
-/*
- * key.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_key.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_key.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 <string.h>
-#include <stdlib.h>
-
-#include "el.h"
-
-/*
- * The Nodes of the el->el_key.map.  The el->el_key.map is a linked list
- * of these node elements
- */
-struct key_node_t {
-       char            ch;             /* single character of key       */
-       int             type;           /* node type                     */
-       key_value_t     val;            /* command code or pointer to str,  */
-                                       /* if this is a leaf             */
-       struct key_node_t *next;        /* ptr to next char of this key  */
-       struct key_node_t *sibling;     /* ptr to another key with same prefix*/
-};
-
-private int             node_trav(EditLine *, key_node_t *, char *,
-    key_value_t *);
-private int             node__try(EditLine *, key_node_t *, const char *,
-    key_value_t *, int);
-private key_node_t     *node__get(int);
-private void            node__free(key_node_t *);
-private void            node__put(EditLine *, key_node_t *);
-private int             node__delete(EditLine *, key_node_t **, const char *);
-private int             node_lookup(EditLine *, const char *, key_node_t *,
-    int);
-private int             node_enum(EditLine *, key_node_t *, int);
-
-#define        KEY_BUFSIZ      EL_BUFSIZ
-
-
-/* key_init():
- *     Initialize the key maps
- */
-protected int
-key_init(EditLine *el)
-{
-
-       el->el_key.buf = (char *) el_malloc(KEY_BUFSIZ);
-       if (el->el_key.buf == NULL)
-               return (-1);
-       el->el_key.map = NULL;
-       key_reset(el);
-       return (0);
-}
-
-/* key_end():
- *     Free the key maps
- */
-protected void
-key_end(EditLine *el)
-{
-
-       el_free((ptr_t) el->el_key.buf);
-       el->el_key.buf = NULL;
-       node__free(el->el_key.map);
-}
-
-
-/* key_map_cmd():
- *     Associate cmd with a key value
- */
-protected key_value_t *
-key_map_cmd(EditLine *el, int cmd)
-{
-
-       el->el_key.val.cmd = (el_action_t) cmd;
-       return (&el->el_key.val);
-}
-
-
-/* key_map_str():
- *     Associate str with a key value
- */
-protected key_value_t *
-key_map_str(EditLine *el, char *str)
-{
-
-       el->el_key.val.str = str;
-       return (&el->el_key.val);
-}
-
-
-/* key_reset():
- *     Takes all nodes on el->el_key.map and puts them on free list.  Then
- *     initializes el->el_key.map with arrow keys
- *     [Always bind the ansi arrow keys?]
- */
-protected void
-key_reset(EditLine *el)
-{
-
-       node__put(el, el->el_key.map);
-       el->el_key.map = NULL;
-       return;
-}
-
-
-/* key_get():
- *     Calls the recursive function with entry point el->el_key.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
-key_get(EditLine *el, char *ch, key_value_t *val)
-{
-
-       return (node_trav(el, el->el_key.map, ch, val));
-}
-
-
-/* key_add():
- *      Adds key to the el->el_key.map and associates the value in val with it.
- *      If key is already is in el->el_key.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
-key_add(EditLine *el, const char *key, key_value_t *val, int ntype)
-{
-
-       if (key[0] == '\0') {
-               (void) fprintf(el->el_errfile,
-                   "key_add: Null extended-key not allowed.\n");
-               return;
-       }
-       if (ntype == XK_CMD && val->cmd == ED_SEQUENCE_LEAD_IN) {
-               (void) fprintf(el->el_errfile,
-                   "key_add: sequence-lead-in command not allowed\n");
-               return;
-       }
-       if (el->el_key.map == NULL)
-               /* tree is initially empty.  Set up new node to match key[0] */
-               el->el_key.map = node__get(key[0]);
-                       /* it is properly initialized */
-
-       /* Now recurse through el->el_key.map */
-       (void) node__try(el, el->el_key.map, key, val, ntype);
-       return;
-}
-
-
-/* key_clear():
- *
- */
-protected void
-key_clear(EditLine *el, el_action_t *map, const char *in)
-{
-
-       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) key_delete(el, in);
-}
-
-
-/* key_delete():
- *      Delete the key and all longer keys staring with key, if
- *      they exists.
- */
-protected int
-key_delete(EditLine *el, const char *key)
-{
-
-       if (key[0] == '\0') {
-               (void) fprintf(el->el_errfile,
-                   "key_delete: Null extended-key not allowed.\n");
-               return (-1);
-       }
-       if (el->el_key.map == NULL)
-               return (0);
-
-       (void) node__delete(el, &el->el_key.map, key);
-       return (0);
-}
-
-
-/* key_print():
- *     Print the binding associated with key key.
- *     Print entire el->el_key.map if null
- */
-protected void
-key_print(EditLine *el, const char *key)
-{
-
-       /* do nothing if el->el_key.map is empty and null key specified */
-       if (el->el_key.map == NULL && *key == 0)
-               return;
-
-       el->el_key.buf[0] = '"';
-       if (node_lookup(el, key, el->el_key.map, 1) <= -1)
-               /* key is not bound */
-               (void) fprintf(el->el_errfile, "Unbound extended key \"%s\"\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, key_node_t *ptr, char *ch, key_value_t *val)
-{
-
-       if (ptr->ch == *ch) {
-               /* match found */
-               if (ptr->next) {
-                       /* key not complete so get next char */
-                       if (el_getc(el, ch) != 1) {     /* if EOF or error */
-                               val->cmd = ED_END_OF_FILE;
-                               return (XK_CMD);
-                               /* PWP: Pretend we just read an end-of-file */
-                       }
-                       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, key_node_t *ptr, const char *str, key_value_t *val, int ntype)
-{
-
-       if (ptr->ch != *str) {
-               key_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_t) 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 = el_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, key_node_t **inptr, const char *str)
-{
-       key_node_t *ptr;
-       key_node_t *prev_ptr = NULL;
-
-       ptr = *inptr;
-
-       if (ptr->ch != *str) {
-               key_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, key_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_t) ptr->val.str);
-               break;
-       default:
-               EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ptr->type));
-               break;
-       }
-       el_free((ptr_t) ptr);
-}
-
-
-/* node__get():
- *     Returns pointer to a key_node_t for ch.
- */
-private key_node_t *
-node__get(int ch)
-{
-       key_node_t *ptr;
-
-       ptr = (key_node_t *) el_malloc((size_t) sizeof(key_node_t));
-       if (ptr == NULL)
-               return NULL;
-       ptr->ch = ch;
-       ptr->type = XK_NOD;
-       ptr->val.str = NULL;
-       ptr->next = NULL;
-       ptr->sibling = NULL;
-       return (ptr);
-}
-
-private void
-node__free(key_node_t *k)
-{
-       if (k == NULL)
-               return;
-       node__free(k->sibling);
-       node__free(k->next);
-       el_free((ptr_t) k);
-}
-
-/* node_lookup():
- *     look for the str starting at node ptr.
- *     Print if last node
- */
-private int
-node_lookup(EditLine *el, const char *str, key_node_t *ptr, int cnt)
-{
-       int ncnt;
-
-       if (ptr == NULL)
-               return (-1);    /* cannot have null ptr */
-
-       if (*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_key.buf.  Recurse */
-               if (ptr->ch == *str) {
-                       /* match found */
-                       ncnt = key__decode_char(el->el_key.buf, KEY_BUFSIZ, cnt,
-                           (unsigned char) ptr->ch);
-                       if (ptr->next != NULL)
-                               /* not yet at leaf */
-                               return (node_lookup(el, str + 1, ptr->next,
-                                   ncnt + 1));
-                       else {
-                           /* next node is null so key should be complete */
-                               if (str[1] == 0) {
-                                       el->el_key.buf[ncnt + 1] = '"';
-                                       el->el_key.buf[ncnt + 2] = '\0';
-                                       key_kprint(el, el->el_key.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, key_node_t *ptr, int cnt)
-{
-       int ncnt;
-
-       if (cnt >= KEY_BUFSIZ - 5) {    /* buffer too small */
-               el->el_key.buf[++cnt] = '"';
-               el->el_key.buf[++cnt] = '\0';
-               (void) fprintf(el->el_errfile,
-                   "Some extended keys too long for internal print buffer");
-               (void) fprintf(el->el_errfile, " \"%s...\"\n", el->el_key.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 */
-       ncnt = key__decode_char(el->el_key.buf, KEY_BUFSIZ, cnt,
-           (unsigned char)ptr->ch);
-       if (ptr->next == NULL) {
-               /* print this key and function */
-               el->el_key.buf[ncnt + 1] = '"';
-               el->el_key.buf[ncnt + 2] = '\0';
-               key_kprint(el, el->el_key.buf, &ptr->val, ptr->type);
-       } else
-               (void) node_enum(el, ptr->next, ncnt + 1);
-
-       /* go to sibling if there is one */
-       if (ptr->sibling)
-               (void) node_enum(el, ptr->sibling, cnt);
-       return (0);
-}
-
-
-/* key_kprint():
- *     Print the specified key and its associated
- *     function specified by val
- */
-protected void
-key_kprint(EditLine *el, const char *key, key_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) key__decode_str(val->str, unparsbuf,
-                           sizeof(unparsbuf), 
-                           ntype == XK_STR ? "\"\"" : "[]");
-                       (void) fprintf(el->el_outfile, fmt, key, unparsbuf);
-                       break;
-               case XK_CMD:
-                       for (fp = el->el_map.help; fp->name; fp++)
-                               if (val->cmd == fp->func) {
-                                       (void) fprintf(el->el_outfile, fmt,
-                                           key, fp->name);
-                                       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, key, "no input");
-}
-
-
-#define ADDC(c) \
-       if (b < eb) \
-               *b++ = c; \
-       else \
-               b++
-/* key__decode_char():
- *     Put a printable form of char in buf.
- */
-protected int
-key__decode_char(char *buf, int cnt, int off, int ch)
-{
-       char *sb = buf + off;
-       char *eb = buf + cnt;
-       char *b = sb;
-       if (ch == 0) {
-               ADDC('^');
-               ADDC('@');
-               return b - sb;
-       }
-       if (iscntrl(ch)) {
-               ADDC('^');
-               if (ch == '\177')
-                       ADDC('?');
-               else
-                       ADDC(ch | 0100);
-       } else if (ch == '^') {
-               ADDC('\\');
-               ADDC('^');
-       } else if (ch == '\\') {
-               ADDC('\\');
-               ADDC('\\');
-       } else if (ch == ' ' || (isprint(ch) && !isspace(ch))) {
-               ADDC(ch);
-       } else {
-               ADDC('\\');
-               ADDC((((unsigned int) ch >> 6) & 7) + '0');
-               ADDC((((unsigned int) ch >> 3) & 7) + '0');
-               ADDC((ch & 7) + '0');
-       }
-       return b - sb;
-}
-
-
-/* key__decode_str():
- *     Make a printable version of the ey
- */
-protected int
-key__decode_str(const char *str, char *buf, int 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('@');
-               if (sep[0] != '\0' && sep[1] != '\0') {
-                       ADDC(sep[1]);
-               }
-               goto done;
-       }
-       for (p = str; *p != 0; p++) {
-               if (iscntrl((unsigned char) *p)) {
-                       ADDC('^');
-                       if (*p == '\177') {
-                               ADDC('?');
-                       } else {
-                               ADDC(*p | 0100);
-                       }
-               } else if (*p == '^' || *p == '\\') {
-                       ADDC('\\');
-                       ADDC(*p);
-               } else if (*p == ' ' || (isprint((unsigned char) *p) &&
-                       !isspace((unsigned char) *p))) {
-                       ADDC(*p);
-               } else {
-                       ADDC('\\');
-                       ADDC((((unsigned int) *p >> 6) & 7) + '0');
-                       ADDC((((unsigned int) *p >> 3) & 7) + '0');
-                       ADDC((*p & 7) + '0');
-               }
-       }
-       if (sep[0] != '\0' && sep[1] != '\0') {
-               ADDC(sep[1]);
-       }
-done:
-       ADDC('\0');
-       if (b - buf >= len)
-           buf[len - 1] = '\0';
-       return b - buf;
-}
diff --git a/lib/libedit/key.h b/lib/libedit/key.h
deleted file mode 100644 (file)
index a89042c..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*-
- * 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
- * $NetBSD: key.h,v 1.10 2006/03/23 20:22:51 christos Exp $
- * $DragonFly: src/lib/libedit/key.h,v 1.5 2007/05/05 00:27:39 pavalos Exp $
- */
-
-/*
- * el.key.h: Key macro header
- */
-#ifndef _h_el_key
-#define        _h_el_key
-
-typedef union key_value_t {
-       el_action_t      cmd;   /* If it is a command the #     */
-       char            *str;   /* If it is a string...         */
-} key_value_t;
-
-typedef struct key_node_t key_node_t;
-
-typedef struct el_key_t {
-       char            *buf;   /* Key print buffer             */
-       key_node_t      *map;   /* Key map                      */
-       key_value_t      val;   /* Local conversion buffer      */
-} el_key_t;
-
-#define        XK_CMD  0
-#define        XK_STR  1
-#define        XK_NOD  2
-#define        XK_EXE  3
-
-#undef key_end
-#undef key_clear
-#undef key_print
-
-protected int           key_init(EditLine *);
-protected void          key_end(EditLine *);
-protected key_value_t  *key_map_cmd(EditLine *, int);
-protected key_value_t  *key_map_str(EditLine *, char *);
-protected void          key_reset(EditLine *);
-protected int           key_get(EditLine *, char *, key_value_t *);
-protected void          key_add(EditLine *, const char *, key_value_t *, int);
-protected void          key_clear(EditLine *, el_action_t *, const char *);
-protected int           key_delete(EditLine *, const char *);
-protected void          key_print(EditLine *, const char *);
-protected void          key_kprint(EditLine *, const char *, key_value_t *,
-    int);
-protected int           key__decode_str(const char *, char *, int,
-    const char *);
-protected int           key__decode_char(char *, int, int, int);
-
-#endif /* _h_el_key */
diff --git a/lib/libedit/libedit/Makefile b/lib/libedit/libedit/Makefile
new file mode 100644 (file)
index 0000000..4a6c37f
--- /dev/null
@@ -0,0 +1,115 @@
+# NETBSD's libedit (BSD replacement for GNU readline)
+.include       "../Makefile.inc"
+
+LIB=           edit
+SHLIB_MAJOR=   5               # NetBSD designates SHLIB_MAJOR as 3
+
+SRCDIR=        ${BASEDIR}/src
+.PATH:         ${SRCDIR}
+
+CFLAGS+=       -I${SRCDIR} -I${.CURDIR} -I${.OBJDIR}
+
+DPADD=         ${LIBNCURSES}
+LDADD=         -lncurses
+
+WARNS?=                2
+
+SRCS+=         chared.c \
+               common.c \
+               el.c \
+               hist.c \
+               emacs.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 \
+               fgetln.c \
+               strlcat.c \
+               strlcpy.c \
+               unvis.c \
+               vis.c \
+               wcsdup.c \
+               tokenizer.c \
+               history.c \
+               filecomplete.c \
+               readline.c
+
+SRCS+=         common.h emacs.h fcns.h help.h vi.h
+SRCS+=         fcns.c help.c
+
+MAN=           editline.3 editrc.5
+
+MLINKS=        editline.3 el_init.3 \
+               editline.3 el_end.3 \
+               editline.3 el_reset.3 \
+               editline.3 el_gets.3 \
+               editline.3 el_wgets.3 \
+               editline.3 el_getc.3 \
+               editline.3 el_wgetc.3 \
+               editline.3 el_push.3 \
+               editline.3 el_wpush.3 \
+               editline.3 el_parse.3 \
+               editline.3 el_wparse.3 \
+               editline.3 el_set.3 \
+               editline.3 el_wset.3 \
+               editline.3 el_get.3 \
+               editline.3 el_wget.3 \
+               editline.3 el_source.3 \
+               editline.3 el_resize.3 \
+               editline.3 el_line.3 \
+               editline.3 el_wline.3 \
+               editline.3 el_insertstr.3 \
+               editline.3 el_winsertstr.3 \
+               editline.3 el_deletestr.3 \
+               editline.3 el_wdeletestr.3 \
+               editline.3 history_init.3 \
+               editline.3 history_winit.3 \
+               editline.3 history_end.3 \
+               editline.3 history_wend.3 \
+               editline.3 history.3 \
+               editline.3 history_w.3 \
+               editline.3 tok_init.3 \
+               editline.3 tok_winit.3 \
+               editline.3 tok_end.3 \
+               editline.3 tok_wend.3 \
+               editline.3 tok_reset.3 \
+               editline.3 tok_wreset.3 \
+               editline.3 tok_line.3 \
+               editline.3 tok_wline.3 \
+               editline.3 tok_str.3 \
+               editline.3 tok_wstr.3
+
+CLEANFILES+=   common.h emacs.h fcns.c fcns.h help.c help.h vi.h editline.c
+AHDR=          vi.h emacs.h common.h
+ASRC=          ${SRCDIR}/vi.c ${SRCDIR}/emacs.c ${SRCDIR}/common.c
+
+vi.h:
+       AWK=awk sh ${SRCDIR}/makelist -h ${SRCDIR}/vi.c > ${.TARGET}
+
+emacs.h:
+       AWK=awk sh ${SRCDIR}/makelist -h ${SRCDIR}/emacs.c > ${.TARGET}
+
+common.h:
+       AWK=awk sh ${SRCDIR}/makelist -h ${SRCDIR}/common.c > ${.TARGET}
+
+fcns.h: ${AHDR}
+       AWK=awk sh ${SRCDIR}/makelist -fh ${AHDR} > ${.TARGET}
+
+help.h:
+       AWK=awk sh ${SRCDIR}/makelist -bh ${ASRC} > ${.TARGET}
+
+fcns.c: ${AHDR}
+       AWK=awk sh ${SRCDIR}/makelist -fc ${AHDR} > ${.TARGET}
+
+help.c: ${ASRC}
+       AWK=awk sh ${SRCDIR}/makelist -bc ${ASRC} > ${.TARGET}
+
+.include <bsd.lib.mk>
diff --git a/lib/libedit/libedit/config.h b/lib/libedit/libedit/config.h
new file mode 100644 (file)
index 0000000..75caf59
--- /dev/null
@@ -0,0 +1,292 @@
+/* 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 `fgetln' function. */
+#define HAVE_FGETLN 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 `tinfo' library (-ltinfo). */
+#define HAVE_LIBTINFO 1
+
+/* 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 you have the `wcsdup' function. */
+#define HAVE_WCSDUP 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-20120311"
+
+/* 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-20120311"
+
+/* 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 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"
+#define SCCSID
+/* #undef LIBC_SCCS */
+#define lint
+
similarity index 82%
rename from lib/libedit/editline.3
rename to lib/libedit/libedit/editline.3
index 06e5af2..9d06fbc 100644 (file)
@@ -1,3 +1,5 @@
+.\"    $NetBSD: editline.3,v 1.75 2011/02/27 01:51:37 christos Exp $
+.\"
 .\" Copyright (c) 1997-2003 The NetBSD Foundation, Inc.
 .\" All rights reserved.
 .\"
@@ -24,9 +26,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.\" $NetBSD: editline.3,v 1.57 2008/04/30 13:10:51 martin Exp $
-.\"
-.Dd April 5, 2008
+.Dd February 26, 2011
 .Dt EDITLINE 3
 .Os
 .Sh NAME
 .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_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
 .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 el_line "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
+.Ft HistoryW *
+.Fn history_winit
 .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
@@ -124,6 +173,9 @@ which is created by
 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
@@ -157,6 +209,14 @@ 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_getc
 Read a character from the tty.
 .Fa ch
@@ -217,12 +277,30 @@ are supported, along with the required argument list:
 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 ,
@@ -256,66 +334,43 @@ reading command input:
 and
 .Dv SIGWINCH .
 Otherwise, the current signal handlers will be used.
-.It Dv EL_BIND , Xo
-.Fa "const char *" ,
-.Fa "..." ,
-.Dv NULL
-.Xc
+.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 , Xo
-.Fa "const char *" ,
-.Fa "..." ,
-.Dv NULL
-.Xc
+.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 , Xo
-.Fa "const char *" ,
-.Fa "..." ,
-.Dv NULL
-.Xc
+.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 , Xo
-.Fa "const char *" ,
-.Fa "..." ,
-.Dv NULL
-.Xc
+.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 , Xo
-.Fa "const char *" ,
-.Fa "..." ,
-.Dv NULL
-.Xc
+.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 , Xo
-.Fa "const char *name" ,
-.Fa "const char *help" ,
-.Fa "unsigned char (*func)(EditLine *e, int ch)"
-.Xc
+.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
@@ -357,10 +412,8 @@ Beep, and flush tty.
 .It Dv CC_FATAL
 Fatal error, reset tty to known state.
 .El
-.It Dv EL_HIST , Xo
-.Fa "History *(*func)(History *, int op, ...)" ,
-.Fa "const char *ptr"
-.Xc
+.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
@@ -389,7 +442,8 @@ This function is called internally by
 and
 .Fn el_getc .
 The builtin function can be set or restored with the special function
-name ``EL_BUILTIN_GETCFN''.
+name
+.Dq Dv EL_BUILTIN_GETCFN .
 .It Dv EL_CLIENTDATA , Fa "void *data"
 Register
 .Fa data
@@ -431,11 +485,23 @@ The following values for
 are supported, along with actual type of
 .Fa result :
 .Bl -tag -width 4n
-.It Dv EL_PROMPT , Fa "char *(*f)(EditLine *)"
-Return a pointer to the function that displays the prompt.
-.It Dv EL_RPROMPT , Fa "char *(*f)(EditLine *)"
-Return a pointer to the function that displays the rightside prompt.
-.It Dv EL_EDITOR , Fa "const char *"
+.It Dv EL_PROMPT , Fa "char *(*f)(EditLine *)" , Fa "char *c"
+Return a pointer to the function that displays the prompt in
+.Fa f .
+If
+.Fa c
+is not
+.Dv NULL ,
+return the start/stop literal prompt character in it.
+.It Dv EL_RPROMPT , Fa "char *(*f)(EditLine *)" , Fa "char *c"
+Return a pointer to the function that displays the prompt in
+.Fa f .
+If
+.Fa c
+is not
+.Dv NULL ,
+return the start/stop literal prompt character in it.
+.It Dv EL_EDITOR , Fa "const char **"
 Return the name of the editor, which will be one of
 .Dq emacs
 or
@@ -459,7 +525,8 @@ above).
 Return 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
-``EL_BUILTIN_GETCFN'' in the case of the default builtin function.
+.Dq Dv EL_BUILTIN_GETCFN
+in the case of the default builtin function.
 .It Dv EL_CLIENTDATA , Fa "void **data"
 Retrieve
 .Fa data
@@ -598,18 +665,11 @@ assumed to be created with
 .Fn history_init .
 .It Dv H_CLEAR
 Clear the history.
-.It Dv H_FUNC , Xo
-.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"
-.Xc
+.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.
@@ -801,6 +861,7 @@ Luke Mewburn wrote this manual and implemented
 and
 .Dv EL_RPROMPT .
 Jaromir Dolecek implemented the readline emulation.
+Johny Mattsson implemented wide-character support.
 .Sh BUGS
 At this time, it is the responsibility of the caller to
 check the result of the
similarity index 97%
rename from lib/libedit/editrc.5
rename to lib/libedit/libedit/editrc.5
index 5734531..28256b5 100644 (file)
@@ -1,3 +1,5 @@
+.\"    $NetBSD: editrc.5,v 1.25 2011/04/25 22:47:27 wiz Exp $
+.\"
 .\" Copyright (c) 1997-2000 The NetBSD Foundation, Inc.
 .\" All rights reserved.
 .\"
@@ -24,8 +26,6 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.\" $NetBSD: editrc.5,v 1.21 2008/04/30 13:10:51 martin Exp $
-.\"
 .Dd October 18, 2003
 .Dt EDITRC 5
 .Os
@@ -87,16 +87,8 @@ shell.
 .Pp
 The following builtin commands are available:
 .Bl -tag -width 4n
-.It Ic bind Xo
-.Op Fl a
-.Op Fl e
-.Op Fl k
-.Op Fl l
-.Op Fl r
-.Op Fl s
-.Op Fl v
-.Op Ar key Op Ar command
-.Xc
+.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 Op Ar command Oc
 Without options, list all bound keys, and the editor command to which
 each is bound.
 If
@@ -192,11 +184,7 @@ if it has any, notably
 .Sq \e
 and
 .Sq ^ .
-.It Ic echotc Xo
-.Op Fl sv
-.Ar arg
-.Ar ...
-.Xc
+.It Ic echotc Oo Fl sv Oc Ar arg Ar ...
 Exercise terminal capabilities given in
 .Ar arg Ar ... .
 If
@@ -206,7 +194,8 @@ is
 .Sq cols ,
 .Sq lines ,
 .Sq rows ,
-.Sq meta or
+.Sq meta ,
+or
 .Sq tabs ,
 the value of that capability is printed, with
 .Dq yes
@@ -252,16 +241,8 @@ to
 as defined in
 .Xr termcap 5 .
 No sanity checking is done.
-.It Ic setty Xo
-.Op Fl a
-.Op Fl d
-.Op Fl q
-.Op Fl x
-.Op Ar +mode
-.Op Ar -mode
-.Op Ar mode
-.Op Ar char=c
-.Xc
+.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
 won't allow the user to change.
diff --git a/lib/libedit/makelist b/lib/libedit/makelist
deleted file mode 100644 (file)
index 8272bbc..0000000
+++ /dev/null
@@ -1,250 +0,0 @@
-#!/bin/sh -
-#
-# 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
-# $NetBSD: makelist,v 1.11 2005/10/22 16:45:03 christos Exp $
-# $DragonFly: src/lib/libedit/makelist,v 1.6 2008/11/12 21:44:59 swildner Exp $
-
-# makelist.sh: Automatically generate header files...
-
-AWK=awk
-USAGE="Usage: $0 -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
-#
--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 *, int);\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 \"sys.h\"\n#include \"el.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","\"" fname "\",", uname ",");
-               ok = 1;
-           }
-       }
-       /^ \*/ {
-           if (ok) {
-               printf("      \"");
-               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 *, int);");
-           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 \"sys.h\"\n#include \"el.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 (file)
index 2030cca..0000000
+++ /dev/null
@@ -1,1417 +0,0 @@
-/*-
- * 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.c   8.1 (Berkeley) 6/4/93
- * $NetBSD: map.c,v 1.24 2006/04/09 01:36:51 christos Exp $
- * $DragonFly: src/lib/libedit/map.c,v 1.7 2007/05/05 00:27:39 pavalos Exp $
- */
-
-#include "config.h"
-
-/*
- * map.c: Editor function definitions
- */
-#include <stdlib.h>
-#include "el.h"
-
-#define        N_KEYS 256
-
-private void   map_print_key(EditLine *, el_action_t *, const char *);
-private void   map_print_some_keys(EditLine *, el_action_t *, int, int);
-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 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_action_t *)el_malloc(sizeof(el_action_t) * N_KEYS);
-       if (el->el_map.alt == NULL)
-               return (-1);
-       el->el_map.key = (el_action_t *)el_malloc(sizeof(el_action_t) * 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_bindings_t *) el_malloc(sizeof(el_bindings_t) *
-           EL_NUM_FCNS);
-       if (el->el_map.help == NULL)
-               return (-1);
-       (void) memcpy(el->el_map.help, help__get(),
-           sizeof(el_bindings_t) * EL_NUM_FCNS);
-       el->el_map.func = (el_func_t *)el_malloc(sizeof(el_func_t) *
-           EL_NUM_FCNS);
-       if (el->el_map.func == NULL)
-               return (-1);
-       memcpy(el->el_map.func, func__get(), sizeof(el_func_t) * 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((ptr_t) el->el_map.alt);
-       el->el_map.alt = NULL;
-       el_free((ptr_t) 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((ptr_t) el->el_map.help);
-       el->el_map.help = NULL;
-       el_free((ptr_t) 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;
-                       key_add(el, buf, key_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;
-
-       key_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);
-       term_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;
-       key_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;
-       key_add(el, buf, key_map_cmd(el, EM_EXCHANGE_MARK), XK_CMD);
-
-       tty_bind_char(el, 1);
-       term_bind_arrow(el);
-}
-
-
-/* map_set_editor():
- *     Set the editor
- */
-protected int
-map_set_editor(EditLine *el, char *editor)
-{
-
-       if (strcmp(editor, "emacs") == 0) {
-               map_init_emacs(el);
-               return (0);
-       }
-       if (strcmp(editor, "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 = "emacs";
-               return (0);
-       case MAP_VI:
-               *editor = "vi";
-               return (0);
-    &n