summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <vva@eagle.mysql.r18.ru>2004-08-24 20:41:41 +0500
committerunknown <vva@eagle.mysql.r18.ru>2004-08-24 20:41:41 +0500
commitaf043308a9988c247b044345f15bbfaa4acd5466 (patch)
tree4ee77f533257aa0e91c1a8078b6b2183641fa68e
parentde225e637a65366aab0ad5fd8b08f24af8ee8f67 (diff)
downloadmariadb-git-af043308a9988c247b044345f15bbfaa4acd5466.tar.gz
upgrade to libedit-2.6.7
(fixed Bug #4462 libedit compile failure) BitKeeper/etc/ignore: change config.h -> config.h to commit cmd-line-utils/libedit/config.h cmd-line-utils/libedit/Makefile.am: upgrade to libedit-2.6.7 cmd-line-utils/libedit/chared.c: upgrade to libedit-2.6.7 cmd-line-utils/libedit/chared.h: upgrade to libedit-2.6.7 cmd-line-utils/libedit/common.c: upgrade to libedit-2.6.7 cmd-line-utils/libedit/el.c: upgrade to libedit-2.6.7 cmd-line-utils/libedit/el.h: upgrade to libedit-2.6.7 cmd-line-utils/libedit/emacs.c: upgrade to libedit-2.6.7 cmd-line-utils/libedit/hist.c: upgrade to libedit-2.6.7 cmd-line-utils/libedit/hist.h: upgrade to libedit-2.6.7 cmd-line-utils/libedit/histedit.h: upgrade to libedit-2.6.7 cmd-line-utils/libedit/history.c: upgrade to libedit-2.6.7 cmd-line-utils/libedit/key.c: upgrade to libedit-2.6.7 cmd-line-utils/libedit/key.h: upgrade to libedit-2.6.7 cmd-line-utils/libedit/makelist.sh: upgrade to libedit-2.6.7 cmd-line-utils/libedit/map.c: upgrade to libedit-2.6.7 cmd-line-utils/libedit/map.h: upgrade to libedit-2.6.7 cmd-line-utils/libedit/parse.c: upgrade to libedit-2.6.7 cmd-line-utils/libedit/prompt.c: upgrade to libedit-2.6.7 cmd-line-utils/libedit/read.c: upgrade to libedit-2.6.7 cmd-line-utils/libedit/readline.c: upgrade to libedit-2.6.7 cmd-line-utils/libedit/readline/readline.h: upgrade to libedit-2.6.7 cmd-line-utils/libedit/refresh.c: upgrade to libedit-2.6.7 cmd-line-utils/libedit/search.c: upgrade to libedit-2.6.7 cmd-line-utils/libedit/search.h: upgrade to libedit-2.6.7 cmd-line-utils/libedit/sig.c: upgrade to libedit-2.6.7 cmd-line-utils/libedit/sig.h: upgrade to libedit-2.6.7 cmd-line-utils/libedit/sys.h: upgrade to libedit-2.6.7 cmd-line-utils/libedit/term.c: upgrade to libedit-2.6.7 cmd-line-utils/libedit/tokenizer.c: upgrade to libedit-2.6.7 cmd-line-utils/libedit/tokenizer.h: upgrade to libedit-2.6.7 cmd-line-utils/libedit/tty.c: upgrade to libedit-2.6.7 cmd-line-utils/libedit/tty.h: upgrade to libedit-2.6.7 cmd-line-utils/libedit/vi.c: upgrade to libedit-2.6.7 configure.in: change liblibedit.a to correct libedit.a
-rw-r--r--.bzrignore2
-rw-r--r--cmd-line-utils/libedit/Makefile.am34
-rw-r--r--cmd-line-utils/libedit/chared.c282
-rw-r--r--cmd-line-utils/libedit/chared.h43
-rw-r--r--cmd-line-utils/libedit/common.c165
-rw-r--r--cmd-line-utils/libedit/el.c78
-rw-r--r--cmd-line-utils/libedit/el.h19
-rw-r--r--cmd-line-utils/libedit/emacs.c16
-rw-r--r--cmd-line-utils/libedit/hist.c63
-rw-r--r--cmd-line-utils/libedit/hist.h6
-rw-r--r--cmd-line-utils/libedit/histedit.h15
-rw-r--r--cmd-line-utils/libedit/history.c197
-rw-r--r--cmd-line-utils/libedit/key.c18
-rw-r--r--cmd-line-utils/libedit/key.h10
-rw-r--r--cmd-line-utils/libedit/makelist.sh4
-rw-r--r--cmd-line-utils/libedit/map.c302
-rw-r--r--cmd-line-utils/libedit/map.h2
-rw-r--r--cmd-line-utils/libedit/parse.c14
-rw-r--r--cmd-line-utils/libedit/prompt.c12
-rw-r--r--cmd-line-utils/libedit/read.c123
-rw-r--r--cmd-line-utils/libedit/readline.c240
-rw-r--r--cmd-line-utils/libedit/readline/readline.h24
-rw-r--r--cmd-line-utils/libedit/refresh.c51
-rw-r--r--cmd-line-utils/libedit/search.c141
-rw-r--r--cmd-line-utils/libedit/search.h6
-rw-r--r--cmd-line-utils/libedit/sig.c18
-rw-r--r--cmd-line-utils/libedit/sig.h7
-rw-r--r--cmd-line-utils/libedit/sys.h66
-rw-r--r--cmd-line-utils/libedit/term.c52
-rw-r--r--cmd-line-utils/libedit/tokenizer.c61
-rw-r--r--cmd-line-utils/libedit/tokenizer.h2
-rw-r--r--cmd-line-utils/libedit/tty.c17
-rw-r--r--cmd-line-utils/libedit/tty.h10
-rw-r--r--cmd-line-utils/libedit/vi.c735
-rw-r--r--configure.in2
35 files changed, 1745 insertions, 1092 deletions
diff --git a/.bzrignore b/.bzrignore
index 1a756801461..87735d5bf18 100644
--- a/.bzrignore
+++ b/.bzrignore
@@ -258,7 +258,7 @@ cmd-line-utils/libedit/common.h
cmd-line-utils/libedit/makelist
comon.h
config.cache
-config.h
+./config.h
config.h.in
config.log
config.status
diff --git a/cmd-line-utils/libedit/Makefile.am b/cmd-line-utils/libedit/Makefile.am
index eb6b930c0b2..c532884ca7d 100644
--- a/cmd-line-utils/libedit/Makefile.am
+++ b/cmd-line-utils/libedit/Makefile.am
@@ -7,28 +7,30 @@ AHDR=vi.h emacs.h common.h
INCLUDES = -I$(top_srcdir)/include -I$(srcdir)/../.. -I..
-noinst_LIBRARIES = liblibedit.a
+noinst_LIBRARIES = libedit.a
-liblibedit_a_SOURCES = chared.c el.c fgetln.c history.c map.c \
- prompt.c readline.c search.c \
- strlcpy.c tokenizer.c vi.c common.c \
- emacs.c hist.c key.c parse.c read.c \
- refresh.c sig.c term.c tty.c help.c \
- fcns.c
+libedit_a_SOURCES = chared.c el.c history.c map.c prompt.c readline.c \
+ search.c tokenizer.c vi.c common.c emacs.c \
+ hist.c key.c parse.c read.c refresh.c sig.c term.c \
+ tty.c help.c fcns.c
+
+EXTRA_libedit_a_SOURCES = np/unvis.c np/strlcpy.c np/vis.c np/strlcat.c \
+ np/fgetln.c
+
+libedit_a_LIBADD = @LIBEDIT_LOBJECTS@
+libedit_a_DEPENDENCIES = @LIBEDIT_LOBJECTS@
pkginclude_HEADERS = readline/readline.h
-noinst_HEADERS = chared.h el.h histedit.h key.h \
- parse.h refresh.h sig.h sys.h \
- tokenizer.h compat.h compat_conf.h fgetln.h \
- hist.h map.h prompt.h search.h \
- strlcpy.h libedit_term.h tty.h
+noinst_HEADERS = chared.h el.h histedit.h key.h parse.h refresh.h sig.h \
+ sys.h tokenizer.h config.h hist.h map.h prompt.h \
+ search.h tty.h
-EXTRA_DIST = makelist.sh
+EXTRA_DIST = makelist.sh np/unvis.c np/strlcpy.c np/vis.c np/strlcat.c np/fgetln.c
-CLEANFILES = makelist
+CLEANFILES = makelist common.h emacs.h vi.h fcns.h help.h fcns.c help.c
-DEFS = -DUNDEF_THREADS_HACK -DHAVE_CONFIG_H -DNO_KILL_INTR
+DEFS = -DUNDEF_THREADS_HACK -DHAVE_CONFIG_H -DNO_KILL_INTR '-D__RCSID(x)=' '-D__COPYRIGHT(x)=' '-D__RENAME(x)=' '-D_DIAGASSERT(x)='
SUFFIXES = .sh
@@ -73,13 +75,11 @@ fcns.c: ${AHDR} fcns.h makelist
chared.o: vi.h emacs.h common.h help.h fcns.h
el.o: vi.h emacs.h common.h help.h fcns.h
-fgetln.o: vi.h emacs.h common.h help.h fcns.h
history.o: vi.h emacs.h common.h help.h fcns.h
map.o: vi.h emacs.h common.h help.h fcns.h
prompt.o: vi.h emacs.h common.h help.h fcns.h
readline.o: vi.h emacs.h common.h help.h fcns.h
search.o: vi.h emacs.h common.h help.h fcns.h
-strlcpy.o: vi.h emacs.h common.h help.h fcns.h
tokenizer.o: vi.h emacs.h common.h help.h fcns.h
vi.o: vi.h emacs.h common.h help.h fcns.h
common.o: vi.h emacs.h common.h help.h fcns.h
diff --git a/cmd-line-utils/libedit/chared.c b/cmd-line-utils/libedit/chared.c
index 6ac051c3bb0..559e714d9fd 100644
--- a/cmd-line-utils/libedit/chared.c
+++ b/cmd-line-utils/libedit/chared.c
@@ -1,4 +1,4 @@
-/* $NetBSD: chared.c,v 1.14 2001/05/17 01:02:17 christos Exp $ */
+/* $NetBSD: chared.c,v 1.18 2002/11/20 16:50:08 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -36,13 +36,18 @@
* SUCH DAMAGE.
*/
-#include "compat.h"
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#if 0
+static char sccsid[] = "@(#)chared.c 8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: chared.c,v 1.18 2002/11/20 16:50:08 christos Exp $");
+#endif
+#endif /* not lint && not SCCSID */
/*
* chared.c: Character editor utilities
*/
-#include "sys.h"
-
#include <stdlib.h>
#include "el.h"
@@ -53,17 +58,36 @@
* Handle state for the vi undo command
*/
protected void
-cv_undo(EditLine *el,int action, size_t size, char *ptr)
+cv_undo(EditLine *el)
{
c_undo_t *vu = &el->el_chared.c_undo;
- vu->action = action;
- vu->ptr = ptr;
- vu->isize = size;
- (void) memcpy(vu->buf, vu->ptr, size);
-#ifdef DEBUG_UNDO
- (void) fprintf(el->el_errfile, "Undo buffer \"%s\" size = +%d -%d\n",
- vu->ptr, vu->isize, vu->dsize);
-#endif
+ c_redo_t *r = &el->el_chared.c_redo;
+ uint 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;
}
@@ -75,8 +99,10 @@ c_insert(EditLine *el, int num)
{
char *cp;
- if (el->el_line.lastchar + num >= el->el_line.limit)
- return; /* can't go past end of buffer */
+ 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 */
@@ -97,12 +123,14 @@ 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;
- if (el->el_map.current != el->el_map.emacs)
- cv_undo(el, INSERT, (size_t)num, el->el_line.cursor);
-
for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++)
*cp = cp[num];
@@ -121,13 +149,14 @@ 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;
- if (el->el_map.current != el->el_map.emacs)
- cv_undo(el, INSERT, (size_t)num,
- el->el_line.cursor - num);
-
for (cp = el->el_line.cursor - num;
cp <= el->el_line.lastchar;
cp++)
@@ -144,7 +173,7 @@ c_delbefore(EditLine *el, int num)
protected int
ce__isword(int p)
{
- return (isalpha(p) || isdigit(p) || strchr("*?_-.[]~=", p) != NULL);
+ return (isalnum(p) || strchr("*?_-.[]~=", p) != NULL);
}
@@ -154,6 +183,20 @@ ce__isword(int p)
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));
}
@@ -216,7 +259,7 @@ cv_next_word(EditLine *el, char *p, char *high, int n, int (*wtest)(int))
* vi historically deletes with cw only the word preserving the
* trailing whitespace! This is not what 'w' does..
*/
- if (el->el_chared.c_vcmd.action != (DELETE|INSERT))
+ if (n || el->el_chared.c_vcmd.action != (DELETE|INSERT))
while ((p < high) && isspace((unsigned char) *p))
p++;
}
@@ -233,26 +276,19 @@ cv_next_word(EditLine *el, char *p, char *high, int n, int (*wtest)(int))
* Find the previous word vi style
*/
protected char *
-cv_prev_word(EditLine *el, char *p, char *low, int n, int (*wtest)(int))
+cv_prev_word(char *p, char *low, int n, int (*wtest)(int))
{
int test;
+ p--;
while (n--) {
- p--;
- /*
- * vi historically deletes with cb only the word preserving the
- * leading whitespace! This is not what 'b' does..
- */
- if (el->el_chared.c_vcmd.action != (DELETE|INSERT))
- while ((p > low) && isspace((unsigned char) *p))
- p--;
+ while ((p > low) && isspace((unsigned char) *p))
+ p--;
test = (*wtest)((unsigned char) *p);
while ((p >= low) && (*wtest)((unsigned char) *p) == test)
p--;
- p++;
- while (isspace((unsigned char) *p))
- p++;
}
+ p++;
/* p now points where we want it */
if (p < low)
@@ -303,47 +339,34 @@ protected void
cv_delfini(EditLine *el)
{
int size;
- int oaction;
+ int action = el->el_chared.c_vcmd.action;
- if (el->el_chared.c_vcmd.action & INSERT)
+ if (action & INSERT)
el->el_map.current = el->el_map.key;
- oaction = el->el_chared.c_vcmd.action;
- el->el_chared.c_vcmd.action = NOP;
-
if (el->el_chared.c_vcmd.pos == 0)
+ /* sanity */
return;
-
- if (el->el_line.cursor > el->el_chared.c_vcmd.pos) {
- size = (int) (el->el_line.cursor - el->el_chared.c_vcmd.pos);
- c_delbefore(el, size);
- el->el_line.cursor = el->el_chared.c_vcmd.pos;
- re_refresh_cursor(el);
- } else if (el->el_line.cursor < el->el_chared.c_vcmd.pos) {
- size = (int)(el->el_chared.c_vcmd.pos - el->el_line.cursor);
- c_delafter(el, size);
- } else {
+ size = el->el_line.cursor - el->el_chared.c_vcmd.pos;
+ if (size == 0)
size = 1;
- c_delafter(el, size);
- }
- switch (oaction) {
- case DELETE|INSERT:
- el->el_chared.c_undo.action = DELETE|INSERT;
- break;
- case DELETE:
- el->el_chared.c_undo.action = INSERT;
- break;
- case NOP:
- case INSERT:
- default:
- EL_ABORT((el->el_errfile, "Bad oaction %d\n", oaction));
- break;
+ 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_undo.ptr = el->el_line.cursor;
- el->el_chared.c_undo.dsize = size;
+ el->el_chared.c_vcmd.action = NOP;
}
@@ -373,21 +396,19 @@ ce__endword(char *p, char *high, int n)
* Go to the end of this word according to vi
*/
protected char *
-cv__endword(char *p, char *high, int n)
+cv__endword(char *p, char *high, int n, int (*wtest)(int))
{
+ int test;
+
p++;
while (n--) {
while ((p < high) && isspace((unsigned char) *p))
p++;
- if (isalnum((unsigned char) *p))
- while ((p < high) && isalnum((unsigned char) *p))
- p++;
- else
- while ((p < high) && !(isspace((unsigned char) *p) ||
- isalnum((unsigned char) *p)))
- p++;
+ test = (*wtest)((unsigned char) *p);
+ while ((p < high) && (*wtest)((unsigned char) *p) == test)
+ p++;
}
p--;
return (p);
@@ -406,20 +427,23 @@ ch_init(EditLine *el)
(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 - 2];
+ 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.action = NOP;
- el->el_chared.c_undo.isize = 0;
- el->el_chared.c_undo.dsize = 0;
- el->el_chared.c_undo.ptr = el->el_line.buffer;
+ 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_vcmd.ins = el->el_line.buffer;
el->el_chared.c_kill.buf = (char *) el_malloc(EL_BUFSIZ);
if (el->el_chared.c_kill.buf == NULL)
@@ -454,14 +478,11 @@ ch_reset(EditLine *el)
el->el_line.cursor = el->el_line.buffer;
el->el_line.lastchar = el->el_line.buffer;
- el->el_chared.c_undo.action = NOP;
- el->el_chared.c_undo.isize = 0;
- el->el_chared.c_undo.dsize = 0;
- el->el_chared.c_undo.ptr = 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_vcmd.ins = el->el_line.buffer;
el->el_chared.c_kill.mark = el->el_line.buffer;
@@ -516,7 +537,8 @@ ch_enlargebufs(el, addlen)
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);
- el->el_line.limit = &newbuffer[newsz - EL_LEAVE];
+ /* don't set new size until all buffers are enlarged */
+ el->el_line.limit = &newbuffer[sz - EL_LEAVE];
/*
* Reallocate kill buffer.
@@ -545,14 +567,22 @@ ch_enlargebufs(el, addlen)
/* zero the newly added memory, leave old data in */
(void) memset(&newbuffer[sz], 0, newsz - sz);
-
- el->el_chared.c_undo.ptr = el->el_line.buffer +
- (el->el_chared.c_undo.ptr - oldbuf);
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 = &newbuffer[newsz - EL_LEAVE];
return 1;
}
@@ -567,6 +597,11 @@ ch_end(EditLine *el)
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;
el_free((ptr_t) el->el_chared.c_macro.macro);
@@ -619,51 +654,64 @@ el_deletestr(EditLine *el, int n)
* Get a string
*/
protected int
-c_gets(EditLine *el, char *buf)
+c_gets(EditLine *el, char *buf, const char *prompt)
{
char ch;
- int len = 0;
+ 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;
+ }
- for (ch = 0; ch == 0;) {
- if (el_getc(el, &ch) != 1)
- return (ed_end_of_file(el, 0));
switch (ch) {
+
case 0010: /* Delete and backspace */
case 0177:
- if (len > 1) {
- *el->el_line.cursor-- = '\0';
- el->el_line.lastchar = el->el_line.cursor;
- buf[len--] = '\0';
- } else {
- el->el_line.buffer[0] = '\0';
- el->el_line.lastchar = el->el_line.buffer;
- el->el_line.cursor = el->el_line.buffer;
- return (CC_REFRESH);
+ if (len <= 0) {
+ len = -1;
+ break;
}
- re_refresh(el);
- ch = 0;
- break;
+ cp--;
+ continue;
case 0033: /* ESC */
case '\r': /* Newline */
case '\n':
+ buf[len] = ch;
break;
default:
- if (len >= EL_BUFSIZ)
+ if (len >= EL_BUFSIZ - 16)
term_beep(el);
else {
buf[len++] = ch;
- *el->el_line.cursor++ = ch;
- el->el_line.lastchar = el->el_line.cursor;
+ *cp++ = ch;
}
- re_refresh(el);
- ch = 0;
- break;
+ continue;
}
+ break;
}
- buf[len] = ch;
- return (len);
+
+ el->el_line.buffer[0] = '\0';
+ el->el_line.lastchar = el->el_line.buffer;
+ el->el_line.cursor = el->el_line.buffer;
+ return len;
}
diff --git a/cmd-line-utils/libedit/chared.h b/cmd-line-utils/libedit/chared.h
index 2eb9ad32886..d2e6f742413 100644
--- a/cmd-line-utils/libedit/chared.h
+++ b/cmd-line-utils/libedit/chared.h
@@ -1,4 +1,4 @@
-/* $NetBSD: chared.h,v 1.6 2001/01/10 07:45:41 jdolecek Exp $ */
+/* $NetBSD: chared.h,v 1.11 2002/11/20 16:50:08 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -71,23 +71,31 @@ typedef struct c_macro_t {
} c_macro_t;
/*
- * Undo information for both vi and emacs
+ * Undo information for vi - no undo in emacs (yet)
*/
typedef struct c_undo_t {
- int action;
- size_t isize;
- size_t dsize;
- char *ptr;
- char *buf;
+ 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;
- char *ins;
} c_vcmd_t;
/*
@@ -106,6 +114,7 @@ typedef struct c_kill_t {
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;
@@ -120,10 +129,10 @@ typedef struct el_chared_t {
#define NOP 0x00
#define DELETE 0x01
#define INSERT 0x02
-#define CHANGE 0x04
+#define YANK 0x04
-#define CHAR_FWD 0
-#define CHAR_BACK 1
+#define CHAR_FWD (+1)
+#define CHAR_BACK (-1)
#define MODE_INSERT 0
#define MODE_REPLACE 1
@@ -137,23 +146,25 @@ typedef struct el_chared_t {
protected int cv__isword(int);
+protected int cv__isWord(int);
protected void cv_delfini(EditLine *);
-protected char *cv__endword(char *, char *, int);
+protected char *cv__endword(char *, char *, int, int (*)(int));
protected int ce__isword(int);
-protected void cv_undo(EditLine *, int, size_t, char *);
+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(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_delafter(EditLine *, int);
-protected int c_gets(EditLine *, char *);
+protected int c_gets(EditLine *, char *, const char *);
protected int c_hpos(EditLine *);
protected int ch_init(EditLine *);
protected void ch_reset(EditLine *);
-protected int ch_enlargebufs __P((EditLine *, size_t));
+protected int ch_enlargebufs(EditLine *, size_t);
protected void ch_end(EditLine *);
#endif /* _h_el_chared */
diff --git a/cmd-line-utils/libedit/common.c b/cmd-line-utils/libedit/common.c
index 9ac6af9ac1b..f290057568a 100644
--- a/cmd-line-utils/libedit/common.c
+++ b/cmd-line-utils/libedit/common.c
@@ -1,4 +1,4 @@
-/* $NetBSD: common.c,v 1.10 2001/01/10 07:45:41 jdolecek Exp $ */
+/* $NetBSD: common.c,v 1.14 2002/11/20 16:50:08 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -36,12 +36,18 @@
* SUCH DAMAGE.
*/
-#include "compat.h"
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#if 0
+static char sccsid[] = "@(#)common.c 8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: common.c,v 1.14 2002/11/20 16:50:08 christos Exp $");
+#endif
+#endif /* not lint && not SCCSID */
/*
* common.c: Common Editor functions
*/
-#include "sys.h"
#include "el.h"
/* ed_end_of_file():
@@ -66,7 +72,7 @@ ed_end_of_file(EditLine *el, int c __attribute__((unused)))
protected el_action_t
ed_insert(EditLine *el, int c)
{
- int i;
+ int count = el->el_state.argument;
if (c == '\0')
return (CC_ERROR);
@@ -74,42 +80,28 @@ ed_insert(EditLine *el, int c)
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) el->el_state.argument))
+ if (!ch_enlargebufs(el, (size_t) count))
return CC_ERROR; /* error allocating more */
}
- if (el->el_state.argument == 1) {
- if (el->el_state.inputmode != MODE_INSERT) {
- el->el_chared.c_undo.buf[el->el_chared.c_undo.isize++] =
- *el->el_line.cursor;
- el->el_chared.c_undo.buf[el->el_chared.c_undo.isize] =
- '\0';
- c_delafter(el, 1);
- }
- c_insert(el, 1);
+ 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;
- el->el_state.doingarg = 0; /* just in case */
re_fastaddc(el); /* fast refresh for one char. */
} else {
- if (el->el_state.inputmode != MODE_INSERT) {
- for (i = 0; i < el->el_state.argument; i++)
- el->el_chared.c_undo.buf[el->el_chared.c_undo.isize++] =
- el->el_line.cursor[i];
-
- el->el_chared.c_undo.buf[el->el_chared.c_undo.isize] =
- '\0';
- c_delafter(el, el->el_state.argument);
- }
- c_insert(el, el->el_state.argument);
+ if (el->el_state.inputmode != MODE_REPLACE_1)
+ c_insert(el, el->el_state.argument);
- while (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)
- (void) vi_command_mode(el, 0);
+ return vi_command_mode(el, 0);
return (CC_NORM);
}
@@ -229,7 +221,7 @@ ed_move_to_end(EditLine *el, int c __attribute__((unused)))
#ifdef VI_MOVE
el->el_line.cursor--;
#endif
- if (el->el_chared.c_vcmd.action & DELETE) {
+ if (el->el_chared.c_vcmd.action != NOP) {
cv_delfini(el);
return (CC_REFRESH);
}
@@ -253,7 +245,7 @@ ed_move_to_beg(EditLine *el, int c __attribute__((unused)))
/* 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 & DELETE) {
+ if (el->el_chared.c_vcmd.action != NOP) {
cv_delfini(el);
return (CC_REFRESH);
}
@@ -295,16 +287,20 @@ 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 >= 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 > el->el_line.lastchar)
- el->el_line.cursor = el->el_line.lastchar;
+ 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 & DELETE) {
+ if (el->el_chared.c_vcmd.action != NOP) {
cv_delfini(el);
return (CC_REFRESH);
}
@@ -330,7 +326,7 @@ ed_prev_word(EditLine *el, int c __attribute__((unused)))
ce__isword);
if (el->el_map.type == MAP_VI)
- if (el->el_chared.c_vcmd.action & DELETE) {
+ if (el->el_chared.c_vcmd.action != NOP) {
cv_delfini(el);
return (CC_REFRESH);
}
@@ -353,7 +349,7 @@ ed_prev_char(EditLine *el, int c __attribute__((unused)))
el->el_line.cursor = el->el_line.buffer;
if (el->el_map.type == MAP_VI)
- if (el->el_chared.c_vcmd.action & DELETE) {
+ if (el->el_chared.c_vcmd.action != NOP) {
cv_delfini(el);
return (CC_REFRESH);
}
@@ -405,25 +401,9 @@ ed_digit(EditLine *el, int c)
(el->el_state.argument * 10) + (c - '0');
}
return (CC_ARGHACK);
- } else {
- if (el->el_line.lastchar + 1 >= el->el_line.limit) {
- if (!ch_enlargebufs(el, 1))
- return (CC_ERROR);
- }
-
- if (el->el_state.inputmode != MODE_INSERT) {
- el->el_chared.c_undo.buf[el->el_chared.c_undo.isize++] =
- *el->el_line.cursor;
- el->el_chared.c_undo.buf[el->el_chared.c_undo.isize] =
- '\0';
- c_delafter(el, 1);
- }
- c_insert(el, 1);
- *el->el_line.cursor++ = c;
- el->el_state.doingarg = 0;
- re_fastaddc(el);
}
- return (CC_NORM);
+
+ return ed_insert(el, c);
}
@@ -457,12 +437,11 @@ ed_argument_digit(EditLine *el, int c)
*/
protected el_action_t
/*ARGSUSED*/
-ed_unassigned(EditLine *el, int c __attribute__((unused)))
+ed_unassigned(EditLine *el __attribute__((unused)),
+ int c __attribute__((unused)))
{
- term_beep(el);
- term__flush();
- return (CC_NORM);
+ return (CC_ERROR);
}
@@ -490,7 +469,7 @@ ed_tty_sigint(EditLine *el __attribute__((unused)),
*/
protected el_action_t
/*ARGSUSED*/
-ed_tty_dsusp(EditLine *el __attribute__((unused)),
+ed_tty_dsusp(EditLine *el __attribute__((unused)),
int c __attribute__((unused)))
{
@@ -504,7 +483,7 @@ ed_tty_dsusp(EditLine *el __attribute__((unused)),
*/
protected el_action_t
/*ARGSUSED*/
-ed_tty_flush_output(EditLine *el __attribute__((unused)),
+ed_tty_flush_output(EditLine *el __attribute__((unused)),
int c __attribute__((unused)))
{
@@ -518,7 +497,7 @@ ed_tty_flush_output(EditLine *el __attribute__((unused)),
*/
protected el_action_t
/*ARGSUSED*/
-ed_tty_sigquit(EditLine *el __attribute__((unused)),
+ed_tty_sigquit(EditLine *el __attribute__((unused)),
int c __attribute__((unused)))
{
@@ -532,7 +511,7 @@ ed_tty_sigquit(EditLine *el __attribute__((unused)),
*/
protected el_action_t
/*ARGSUSED*/
-ed_tty_sigtstp(EditLine *el __attribute__((unused)),
+ed_tty_sigtstp(EditLine *el __attribute__((unused)),
int c __attribute__((unused)))
{
@@ -546,7 +525,7 @@ ed_tty_sigtstp(EditLine *el __attribute__((unused)),
*/
protected el_action_t
/*ARGSUSED*/
-ed_tty_stop_output(EditLine *el __attribute__((unused)),
+ed_tty_stop_output(EditLine *el __attribute__((unused)),
int c __attribute__((unused)))
{
@@ -560,7 +539,7 @@ ed_tty_stop_output(EditLine *el __attribute__((unused)),
*/
protected el_action_t
/*ARGSUSED*/
-ed_tty_start_output(EditLine *el __attribute__((unused)),
+ed_tty_start_output(EditLine *el __attribute__((unused)),
int c __attribute__((unused)))
{
@@ -580,8 +559,6 @@ ed_newline(EditLine *el, int c __attribute__((unused)))
re_goto_bottom(el);
*el->el_line.lastchar++ = '\n';
*el->el_line.lastchar = '\0';
- if (el->el_map.type == MAP_VI)
- el->el_chared.c_vcmd.ins = el->el_line.buffer;
return (CC_NEWLINE);
}
@@ -627,7 +604,7 @@ ed_clear_screen(EditLine *el, int c __attribute__((unused)))
*/
protected el_action_t
/*ARGSUSED*/
-ed_redisplay(EditLine *el __attribute__((unused)),
+ed_redisplay(EditLine *el __attribute__((unused)),
int c __attribute__((unused)))
{
@@ -655,7 +632,7 @@ ed_start_over(EditLine *el, int c __attribute__((unused)))
*/
protected el_action_t
/*ARGSUSED*/
-ed_sequence_lead_in(EditLine *el __attribute__((unused)),
+ed_sequence_lead_in(EditLine *el __attribute__((unused)),
int c __attribute__((unused)))
{
@@ -672,8 +649,9 @@ protected el_action_t
ed_prev_history(EditLine *el, int c __attribute__((unused)))
{
char beep = 0;
+ int sv_event = el->el_history.eventno;
- el->el_chared.c_undo.action = NOP;
+ 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
@@ -686,15 +664,17 @@ ed_prev_history(EditLine *el, int c __attribute__((unused)))
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);
}
- re_refresh(el);
if (beep)
- return (CC_ERROR);
- else
- return (CC_NORM); /* was CC_UP_HIST */
+ return CC_REFRESH_BEEP;
+ return CC_REFRESH;
}
@@ -706,17 +686,22 @@ 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.action = NOP;
+ 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;
- return (CC_ERROR);/* make it beep */
+ beep = CC_REFRESH_BEEP;
}
- return (hist_get(el));
+ rval = hist_get(el);
+ if (rval == CC_REFRESH)
+ return beep;
+ return rval;
+
}
@@ -733,7 +718,7 @@ ed_search_prev_history(EditLine *el, int c __attribute__((unused)))
bool_t found = 0;
el->el_chared.c_vcmd.action = NOP;
- el->el_chared.c_undo.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
@@ -801,7 +786,7 @@ ed_search_next_history(EditLine *el, int c __attribute__((unused)))
bool_t found = 0;
el->el_chared.c_vcmd.action = NOP;
- el->el_chared.c_undo.action = NOP;
+ el->el_chared.c_undo.len = -1;
*el->el_line.lastchar = '\0'; /* just in case */
if (el->el_history.eventno == 0)
@@ -930,25 +915,13 @@ ed_command(EditLine *el, int c __attribute__((unused)))
char tmpbuf[EL_BUFSIZ];
int tmplen;
- el->el_line.buffer[0] = '\0';
- el->el_line.lastchar = el->el_line.buffer;
- el->el_line.cursor = el->el_line.buffer;
-
- c_insert(el, 3); /* prompt + ": " */
- *el->el_line.cursor++ = '\n';
- *el->el_line.cursor++ = ':';
- *el->el_line.cursor++ = ' ';
- re_refresh(el);
+ tmplen = c_gets(el, tmpbuf, "\n: ");
+ term__putc('\n');
- tmplen = c_gets(el, tmpbuf);
- tmpbuf[tmplen] = '\0';
-
- el->el_line.buffer[0] = '\0';
- el->el_line.lastchar = el->el_line.buffer;
- el->el_line.cursor = el->el_line.buffer;
+ if (tmplen < 0 || (tmpbuf[tmplen] = 0, parse_line(el, tmpbuf)) == -1)
+ term_beep(el);
- if (parse_line(el, tmpbuf) == -1)
- return (CC_ERROR);
- else
- return (CC_REFRESH);
+ el->el_map.current = el->el_map.key;
+ re_clear_display(el);
+ return CC_REFRESH;
}
diff --git a/cmd-line-utils/libedit/el.c b/cmd-line-utils/libedit/el.c
index 76b17aba0cf..aa4b5c6896b 100644
--- a/cmd-line-utils/libedit/el.c
+++ b/cmd-line-utils/libedit/el.c
@@ -1,4 +1,4 @@
-/* $NetBSD: el.c,v 1.21 2001/01/05 22:45:30 christos Exp $ */
+/* $NetBSD: el.c,v 1.30 2002/11/12 00:00:23 thorpej Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -36,13 +36,18 @@
* SUCH DAMAGE.
*/
-#include "compat.h"
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#if 0
+static char sccsid[] = "@(#)el.c 8.2 (Berkeley) 1/3/94";
+#else
+__RCSID("$NetBSD: el.c,v 1.30 2002/11/12 00:00:23 thorpej Exp $");
+#endif
+#endif /* not lint && not SCCSID */
/*
* el.c: EditLine interface functions
*/
-#include "sys.h"
-
#include <sys/types.h>
#include <sys/param.h>
#include <string.h>
@@ -58,9 +63,6 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr)
{
EditLine *el = (EditLine *) el_malloc(sizeof(EditLine));
-#ifdef DEBUG
- char *tty;
-#endif
if (el == NULL)
return (NULL);
@@ -77,7 +79,11 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr)
*/
el->el_flags = 0;
- (void) term_init(el);
+ if (term_init(el) == -1) {
+ free(el->el_prog);
+ el_free(el);
+ return NULL;
+ }
(void) key_init(el);
(void) map_init(el);
if (tty_init(el) == -1)
@@ -87,6 +93,7 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr)
(void) hist_init(el);
(void) prompt_init(el);
(void) sig_init(el);
+ (void) read_init(el);
return (el);
}
@@ -138,11 +145,12 @@ public int
el_set(EditLine *el, int op, ...)
{
va_list va;
- int rv;
- va_start(va, op);
+ int rv = 0;
if (el == NULL)
return (-1);
+ va_start(va, op);
+
switch (op) {
case EL_PROMPT:
case EL_RPROMPT:
@@ -162,7 +170,6 @@ el_set(EditLine *el, int op, ...)
el->el_flags |= HANDLE_SIGNALS;
else
el->el_flags &= ~HANDLE_SIGNALS;
- rv = 0;
break;
case EL_BIND:
@@ -239,8 +246,20 @@ el_set(EditLine *el, int op, ...)
rv = 0;
break;
+ case EL_GETCFN:
+ {
+ el_rfunc_t rc = va_arg(va, el_rfunc_t);
+ rv = el_read_setfn(el, rc);
+ break;
+ }
+
+ case EL_CLIENTDATA:
+ el->el_data = va_arg(va, void *);
+ break;
+
default:
rv = -1;
+ break;
}
va_end(va);
@@ -261,11 +280,11 @@ el_get(EditLine *el, int op, void *ret)
switch (op) {
case EL_PROMPT:
case EL_RPROMPT:
- rv = prompt_get(el, (el_pfunc_t *) & ret, op);
+ rv = prompt_get(el, (void *) &ret, op);
break;
case EL_EDITOR:
- rv = map_get_editor(el, (const char **) &ret);
+ rv = map_get_editor(el, (void *) &ret);
break;
case EL_SIGNAL:
@@ -349,6 +368,16 @@ el_get(EditLine *el, int op, void *ret)
break;
#endif /* XXX */
+ case EL_GETCFN:
+ *((el_rfunc_t *)ret) = el_read_getfn(el);
+ rv = 0;
+ break;
+
+ case EL_CLIENTDATA:
+ *((void **)ret) = el->el_data;
+ rv = 0;
+ break;
+
default:
rv = -1;
}
@@ -367,15 +396,6 @@ el_line(EditLine *el)
return (const LineInfo *) (void *) &el->el_line;
}
-static const char elpath[] = "/.editrc";
-
-#if defined(MAXPATHLEN)
-#define LIBEDIT_MAXPATHLEN MAXPATHLEN
-#elif defined(PATH_MAX)
-#define LIBEDIT_MAXPATHLEN PATH_MAX
-#else
-#define LIBEDIT_MAXPATHLEN 1024
-#endif
/* el_source():
* Source a file
@@ -385,10 +405,14 @@ el_source(EditLine *el, const char *fname)
{
FILE *fp;
size_t len;
- char *ptr, path[LIBEDIT_MAXPATHLEN];
+ 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)
@@ -398,6 +422,14 @@ el_source(EditLine *el, const char *fname)
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");
diff --git a/cmd-line-utils/libedit/el.h b/cmd-line-utils/libedit/el.h
index 7cf17e8f069..9e1731c5857 100644
--- a/cmd-line-utils/libedit/el.h
+++ b/cmd-line-utils/libedit/el.h
@@ -1,4 +1,4 @@
-/* $NetBSD: el.h,v 1.8 2001/01/06 14:44:50 jdolecek Exp $ */
+/* $NetBSD: el.h,v 1.13 2002/11/15 14:32:33 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -72,7 +72,7 @@ typedef struct el_line_t {
char *buffer; /* Input line */
char *cursor; /* Cursor position */
char *lastchar; /* Last character */
- const char *limit; /* Max position */
+ const char *limit; /* Max position */
} el_line_t;
/*
@@ -84,6 +84,8 @@ typedef struct el_state_t {
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;
/*
@@ -96,7 +98,7 @@ typedef struct el_state_t {
#include "tty.h"
#include "prompt.h"
#include "key.h"
-#include "libedit_term.h"
+#include "term.h"
#include "refresh.h"
#include "chared.h"
#include "common.h"
@@ -106,6 +108,7 @@ typedef struct el_state_t {
#include "parse.h"
#include "sig.h"
#include "help.h"
+#include "read.h"
struct editline {
char *el_prog; /* the program name */
@@ -116,6 +119,7 @@ struct editline {
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 */
@@ -129,13 +133,18 @@ struct editline {
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) (void) (fprintf(el->el_errfile, "%s, %d: ", \
- __FILE__, __LINE__), fprintf a, abort())
+#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
diff --git a/cmd-line-utils/libedit/emacs.c b/cmd-line-utils/libedit/emacs.c
index bb5ffb2a9f6..d58d1620693 100644
--- a/cmd-line-utils/libedit/emacs.c
+++ b/cmd-line-utils/libedit/emacs.c
@@ -1,4 +1,4 @@
-/* $NetBSD: emacs.c,v 1.9 2001/01/10 07:45:41 jdolecek Exp $ */
+/* $NetBSD: emacs.c,v 1.12 2002/11/15 14:32:33 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -36,12 +36,18 @@
* SUCH DAMAGE.
*/
-#include "compat.h"
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#if 0
+static char sccsid[] = "@(#)emacs.c 8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: emacs.c,v 1.12 2002/11/15 14:32:33 christos Exp $");
+#endif
+#endif /* not lint && not SCCSID */
/*
* emacs.c: Emacs functions
*/
-#include "sys.h"
#include "el.h"
/* em_delete_or_list():
@@ -209,7 +215,7 @@ em_copy_region(EditLine *el, int c __attribute__((unused)))
{
char *kp, *cp;
- if (el->el_chared.c_kill.mark)
+ if (!el->el_chared.c_kill.mark)
return (CC_ERROR);
if (el->el_chared.c_kill.mark > el->el_line.cursor) {
@@ -265,7 +271,7 @@ em_next_word(EditLine *el, int c __attribute__((unused)))
ce__isword);
if (el->el_map.type == MAP_VI)
- if (el->el_chared.c_vcmd.action & DELETE) {
+ if (el->el_chared.c_vcmd.action != NOP) {
cv_delfini(el);
return (CC_REFRESH);
}
diff --git a/cmd-line-utils/libedit/hist.c b/cmd-line-utils/libedit/hist.c
index 2b20c7d14dc..59c2f39dd34 100644
--- a/cmd-line-utils/libedit/hist.c
+++ b/cmd-line-utils/libedit/hist.c
@@ -1,4 +1,4 @@
-/* $NetBSD: hist.c,v 1.9 2001/05/17 01:02:17 christos Exp $ */
+/* $NetBSD: hist.c,v 1.12 2003/01/21 18:40:23 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -36,12 +36,18 @@
* SUCH DAMAGE.
*/
-#include "compat.h"
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#if 0
+static char sccsid[] = "@(#)hist.c 8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: hist.c,v 1.12 2003/01/21 18:40:23 christos Exp $");
+#endif
+#endif /* not lint && not SCCSID */
/*
* hist.c: History access functions
*/
-#include "sys.h"
#include <stdlib.h>
#include "el.h"
@@ -126,18 +132,16 @@ hist_get(EditLine *el)
el->el_history.eventno = h;
return (CC_ERROR);
}
- (void) strncpy(el->el_line.buffer, hp,
+ (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) {
- if (el->el_line.lastchar[-1] == '\n')
- el->el_line.lastchar--;
- if (el->el_line.lastchar[-1] == ' ')
- el->el_line.lastchar--;
- if (el->el_line.lastchar < el->el_line.buffer)
- el->el_line.lastchar = 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;
@@ -149,22 +153,41 @@ hist_get(EditLine *el)
}
-/* hist_list()
- * List history entries
+/* hist_command()
+ * process a history command
*/
protected int
/*ARGSUSED*/
-hist_list(EditLine *el, int argc __attribute__((unused)),
- const char **argv __attribute__((unused)))
+hist_command(EditLine *el, int argc, const char **argv)
{
const char *str;
+ int num;
+ HistEvent ev;
if (el->el_history.ref == NULL)
return (-1);
- 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 == 0 || strcmp(argv[0], "list") == 1) {
+ /* 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 != 2)
+ return (-1);
+
+ num = (int)strtol(argv[1], NULL, 0);
+
+ if (strcmp(argv[0], "size") == 0)
+ return history(el->el_history.ref, &ev, H_SETSIZE, num);
+
+ if (strcmp(argv[0], "unique") == 0)
+ return history(el->el_history.ref, &ev, H_SETUNIQUE, num);
+
+ return -1;
}
/* hist_enlargebuf()
diff --git a/cmd-line-utils/libedit/hist.h b/cmd-line-utils/libedit/hist.h
index e650b6a55a9..b713281b382 100644
--- a/cmd-line-utils/libedit/hist.h
+++ b/cmd-line-utils/libedit/hist.h
@@ -1,4 +1,4 @@
-/* $NetBSD: hist.h,v 1.6 2001/01/10 07:45:41 jdolecek Exp $ */
+/* $NetBSD: hist.h,v 1.9 2003/01/21 18:40:23 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -66,7 +66,7 @@ typedef struct el_history_t {
#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_EVENT(el, num) HIST_FUN(el, H_EVENT, num)
+#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)
@@ -74,7 +74,7 @@ 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_list(EditLine *, int, const char **);
+protected int hist_command(EditLine *, int, const char **);
protected int hist_enlargebuf(EditLine *, size_t, size_t);
#endif /* _h_el_hist */
diff --git a/cmd-line-utils/libedit/histedit.h b/cmd-line-utils/libedit/histedit.h
index 0b8d175cef1..3137bd680a7 100644
--- a/cmd-line-utils/libedit/histedit.h
+++ b/cmd-line-utils/libedit/histedit.h
@@ -1,4 +1,4 @@
-/* $NetBSD: histedit.h,v 1.16 2000/09/04 22:06:30 lukem Exp $ */
+/* $NetBSD: histedit.h,v 1.21 2003/01/21 18:40:24 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -44,6 +44,9 @@
#ifndef _HISTEDIT_H_
#define _HISTEDIT_H_
+#define LIBEDIT_MAJOR 2
+#define LIBEDIT_MINOR 6
+
#include <sys/types.h>
#include <stdio.h>
@@ -90,7 +93,7 @@ void el_end(EditLine *);
*/
const char *el_gets(EditLine *, int *);
int el_getc(EditLine *, char *);
-void el_push(EditLine *, const char *);
+void el_push(EditLine *, char *);
/*
* Beep!
@@ -126,6 +129,10 @@ int el_get(EditLine *, int, void *);
#define EL_HIST 10 /* , hist_fun_t, const char *); */
#define EL_EDITMODE 11 /* , int); */
#define EL_RPROMPT 12 /* , el_pfunc_t); */
+#define EL_GETCFN 13 /* , el_rfunc_t); */
+#define EL_CLIENTDATA 14 /* , void *); */
+
+#define EL_BUILTIN_GETCFN (NULL)
/*
* Source named file or $PWD/.editrc or $HOME/.editrc
@@ -174,7 +181,7 @@ int history(History *, HistEvent *, int, ...);
#define H_PREV 5 /* , void); */
#define H_NEXT 6 /* , void); */
#define H_CURR 8 /* , const int); */
-#define H_SET 7 /* , void); */
+#define H_SET 7 /* , int); */
#define H_ADD 9 /* , const char *); */
#define H_ENTER 10 /* , const char *); */
#define H_APPEND 11 /* , const char *); */
@@ -186,5 +193,7 @@ int history(History *, HistEvent *, int, ...);
#define H_LOAD 17 /* , const char *); */
#define H_SAVE 18 /* , const char *); */
#define H_CLEAR 19 /* , void); */
+#define H_SETUNIQUE 20 /* , int); */
+#define H_GETUNIQUE 21 /* , void); */
#endif /* _HISTEDIT_H_ */
diff --git a/cmd-line-utils/libedit/history.c b/cmd-line-utils/libedit/history.c
index bae50787b94..ad47a5572e4 100644
--- a/cmd-line-utils/libedit/history.c
+++ b/cmd-line-utils/libedit/history.c
@@ -1,4 +1,4 @@
-/* $NetBSD: history.c,v 1.17 2001/03/20 00:08:31 christos Exp $ */
+/* $NetBSD: history.c,v 1.22 2003/01/21 18:40:24 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -36,18 +36,25 @@
* SUCH DAMAGE.
*/
-#include "compat.h"
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#if 0
+static char sccsid[] = "@(#)history.c 8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: history.c,v 1.22 2003/01/21 18:40:24 christos Exp $");
+#endif
+#endif /* not lint && not SCCSID */
/*
* hist.c: History access functions
*/
-#include "sys.h"
-
#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>
@@ -73,6 +80,7 @@ struct history {
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)
@@ -87,9 +95,17 @@ struct history {
#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 *);
@@ -108,15 +124,17 @@ typedef struct hentry_t {
HistEvent ev; /* What we return */
struct hentry_t *next; /* Next entry */
struct hentry_t *prev; /* Previous entry */
-} hentry_t;
+} 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 */
+ 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 */
-} history_t;
+ int flags; /* History flags */
+#define H_UNIQUE 1 /* Store only unique elements */
+} history_t;
private int history_def_first(ptr_t, HistEvent *);
private int history_def_last(ptr_t, HistEvent *);
@@ -126,13 +144,19 @@ private int history_def_curr(ptr_t, HistEvent *);
private int history_def_set(ptr_t, HistEvent *, const int n);
private int history_def_enter(ptr_t, HistEvent *, const char *);
private int history_def_add(ptr_t, HistEvent *, const char *);
-private void history_def_init(ptr_t *, HistEvent *, int);
+private int history_def_init(ptr_t *, HistEvent *, int);
private void history_def_clear(ptr_t, HistEvent *);
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_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) {\
@@ -326,20 +350,20 @@ 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(h->cursor->ev.str) + strlen(str) + 1;
+ len = strlen(evp->str) + strlen(str) + 1;
s = (char *) h_malloc(len);
- if (!s) {
+ if (s == NULL) {
he_seterrev(ev, _HE_MALLOC_FAILED);
return (-1);
}
(void) strlcpy(s, h->cursor->ev.str, len);
(void) strlcat(s, str, len);
- /* LINTED const cast */
- h_free((ptr_t) h->cursor->ev.str);
- h->cursor->ev.str = s;
+ h_free((ptr_t)evp->str);
+ evp->str = s;
*ev = h->cursor->ev;
return (0);
}
@@ -350,16 +374,14 @@ history_def_add(ptr_t p, HistEvent *ev, const char *str)
*/
/* ARGSUSED */
private void
-history_def_delete(history_t *h,
- HistEvent *ev __attribute__((unused)), hentry_t *hp)
+history_def_delete(history_t *h, HistEvent *ev __attribute__((unused)), hentry_t *hp)
{
-
+ HistEventPrivate *evp = (void *)&hp->ev;
if (hp == &h->list)
abort();
hp->prev->next = hp->next;
hp->next->prev = hp->prev;
- /* LINTED const cast */
- h_free((ptr_t) hp->ev.str);
+ h_free((ptr_t) evp->str);
h_free(hp);
h->cur--;
}
@@ -373,11 +395,11 @@ history_def_insert(history_t *h, HistEvent *ev, const char *str)
{
h->cursor = (hentry_t *) h_malloc(sizeof(hentry_t));
- if (h->cursor)
- h->cursor->ev.str = strdup(str);
- if (!h->cursor || !h->cursor->ev.str) {
- he_seterrev(ev, _HE_MALLOC_FAILED);
- return (-1);
+ if (h->cursor == NULL)
+ goto oomem;
+ if ((h->cursor->ev.str = strdup(str)) == NULL) {
+ h_free((ptr_t)h->cursor);
+ goto oomem;
}
h->cursor->ev.num = ++h->eventid;
h->cursor->next = h->list.next;
@@ -388,6 +410,9 @@ history_def_insert(history_t *h, HistEvent *ev, const char *str)
*ev = h->cursor->ev;
return (0);
+oomem:
+ he_seterrev(ev, _HE_MALLOC_FAILED);
+ return (-1);
}
@@ -399,6 +424,10 @@ 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 */
@@ -406,10 +435,10 @@ history_def_enter(ptr_t p, HistEvent *ev, const char *str)
* Always keep at least one entry.
* This way we don't have to check for the empty list.
*/
- while (h->cur - 1 > h->max)
+ while (h->cur > h->max && h->cur > 0)
history_def_delete(h, ev, h->list.prev);
- return (0);
+ return (1);
}
@@ -417,10 +446,12 @@ history_def_enter(ptr_t p, HistEvent *ev, const char *str)
* Default history initialization function
*/
/* ARGSUSED */
-private void
+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;
@@ -431,7 +462,9 @@ history_def_init(ptr_t *p, HistEvent *ev __attribute__((unused)), int n)
h->list.ev.str = NULL;
h->list.ev.num = 0;
h->cursor = &h->list;
+ h->flags = 0;
*p = (ptr_t) h;
+ return 0;
}
@@ -460,10 +493,15 @@ history_def_clear(ptr_t p, HistEvent *ev)
public History *
history_init(void)
{
- History *h = (History *) h_malloc(sizeof(History));
HistEvent ev;
+ History *h = (History *) h_malloc(sizeof(History));
+ if (h == NULL)
+ return NULL;
- history_def_init(&h->h_ref, &ev, 0);
+ 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;
@@ -519,18 +557,46 @@ history_setsize(History *h, HistEvent *ev, int num)
private int
history_getsize(History *h, HistEvent *ev)
{
- int retval = 0;
-
if (h->h_next != history_def_next) {
he_seterrev(ev, _HE_NOT_ALLOWED);
return (-1);
}
- retval = history_def_getsize(h->h_ref);
- if (retval < -1) {
+ ev->num = history_def_getsize(h->h_ref);
+ if (ev->num < -1) {
he_seterrev(ev, _HE_SIZE_NEGATIVE);
return (-1);
}
- ev->num = retval;
+ 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);
}
@@ -602,6 +668,8 @@ history_load(History *h, const char *fname)
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];
@@ -611,15 +679,24 @@ history_load(History *h, const char *fname)
line[sz] = '\0';
if (max_size < sz) {
+ char *nptr;
max_size = (sz + 1023) & ~1023;
- ptr = h_realloc(ptr, max_size);
+ nptr = h_realloc(ptr, max_size);
+ if (nptr == NULL) {
+ i = -1;
+ goto oomem;
+ }
+ ptr = nptr;
}
(void) strunvis(ptr, line);
line[sz] = c;
- HENTER(h, &ev, ptr);
+ if (HENTER(h, &ev, ptr) == -1) {
+ h_free((ptr_t)ptr);
+ return -1;
+ }
}
- h_free(ptr);
-
+oomem:
+ h_free((ptr_t)ptr);
done:
(void) fclose(fp);
return (i);
@@ -634,28 +711,40 @@ history_save(History *h, const char *fname)
{
FILE *fp;
HistEvent ev;
- int i = 0, retval;
+ int i = -1, retval;
size_t len, max_size;
char *ptr;
if ((fp = fopen(fname, "w")) == NULL)
return (-1);
- (void) fchmod(fileno(fp), S_IRUSR|S_IWUSR);
- (void) fputs(hist_cookie, fp);
+ 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);
- for (retval = HLAST(h, &ev);
+ if (ptr == NULL)
+ goto done;
+ for (i = 0, retval = HLAST(h, &ev);
retval != -1;
retval = HPREV(h, &ev), i++) {
len = strlen(ev.str) * 4 + 1;
if (len >= max_size) {
- max_size = (len + 1023) & ~1023;
- ptr = h_realloc(ptr, max_size);
+ char *nptr;
+ max_size = (len + 1023) & 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", ev.str);
+ (void) fprintf(fp, "%s\n", ptr);
}
- h_free(ptr);
+oomem:
+ h_free((ptr_t)ptr);
+done:
(void) fclose(fp);
return (i);
}
@@ -754,6 +843,14 @@ history(History *h, HistEvent *ev, int fun, ...)
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);
diff --git a/cmd-line-utils/libedit/key.c b/cmd-line-utils/libedit/key.c
index 629c6aeeb9c..e1e64e328ad 100644
--- a/cmd-line-utils/libedit/key.c
+++ b/cmd-line-utils/libedit/key.c
@@ -1,4 +1,4 @@
-/* $NetBSD: key.c,v 1.12 2001/05/17 01:02:17 christos Exp $ */
+/* $NetBSD: key.c,v 1.13 2002/03/18 16:00:55 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -36,7 +36,14 @@
* SUCH DAMAGE.
*/
-#include "compat.h"
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#if 0
+static char sccsid[] = "@(#)key.c 8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: key.c,v 1.13 2002/03/18 16:00:55 christos Exp $");
+#endif
+#endif /* not lint && not SCCSID */
/*
* key.c: This module contains the procedures for maintaining
@@ -59,7 +66,6 @@
* 1) It is not possible to have one key that is a
* substr of another.
*/
-#include "sys.h"
#include <string.h>
#include <stdlib.h>
@@ -85,8 +91,8 @@ private int node__try(EditLine *, key_node_t *, const char *,
private key_node_t *node__get(int);
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_lookup(EditLine *, const char *, key_node_t *,
+ int);
private int node_enum(EditLine *, key_node_t *, int);
private int key__decode_char(char *, int, int);
@@ -640,7 +646,7 @@ key__decode_char(char *buf, int cnt, int ch)
protected char *
key__decode_str(const char *str, char *buf, const char *sep)
{
- char *b;
+ char *b;
const char *p;
b = buf;
diff --git a/cmd-line-utils/libedit/key.h b/cmd-line-utils/libedit/key.h
index e95731d9df5..80d8626b894 100644
--- a/cmd-line-utils/libedit/key.h
+++ b/cmd-line-utils/libedit/key.h
@@ -1,4 +1,4 @@
-/* $NetBSD: key.h,v 1.5 2001/01/23 15:55:30 jdolecek Exp $ */
+/* $NetBSD: key.h,v 1.6 2002/03/18 16:00:55 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -62,10 +62,6 @@ typedef struct el_key_t {
#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);
@@ -76,8 +72,8 @@ 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 void key_kprint(EditLine *, const char *, key_value_t *,
+ int);
protected char *key__decode_str(const char *, char *, const char *);
#endif /* _h_el_key */
diff --git a/cmd-line-utils/libedit/makelist.sh b/cmd-line-utils/libedit/makelist.sh
index 13d37512591..fbce06fcc50 100644
--- a/cmd-line-utils/libedit/makelist.sh
+++ b/cmd-line-utils/libedit/makelist.sh
@@ -1,5 +1,5 @@
#!/bin/sh -
-# $NetBSD: makelist,v 1.7 2001/01/09 19:22:31 jdolecek Exp $
+# $NetBSD: makelist,v 1.8 2003/03/10 21:21:10 christos Exp $
#
# Copyright (c) 1992, 1993
# The Regents of the University of California. All rights reserved.
@@ -87,7 +87,6 @@ case $FLAG in
cat $FILES | $AWK '
BEGIN {
printf("/* Automatically generated file, do not edit */\n");
- printf("#include \"compat.h\"\n");
printf("#include \"sys.h\"\n#include \"el.h\"\n");
printf("private const struct el_bindings_t el_func_help[] = {\n");
low = "abcdefghijklmnopqrstuvwxyz_";
@@ -170,7 +169,6 @@ case $FLAG in
cat $FILES | $AWK '/el_action_t/ { print $3 }' | sort | $AWK '
BEGIN {
printf("/* Automatically generated file, do not edit */\n");
- printf("#include \"compat.h\"\n");
printf("#include \"sys.h\"\n#include \"el.h\"\n");
printf("private const el_func_t el_func[] = {");
maxlen = 80;
diff --git a/cmd-line-utils/libedit/map.c b/cmd-line-utils/libedit/map.c
index 144ccf1ebe0..e044e875382 100644
--- a/cmd-line-utils/libedit/map.c
+++ b/cmd-line-utils/libedit/map.c
@@ -1,4 +1,4 @@
-/* $NetBSD: map.c,v 1.14 2001/01/09 17:22:09 jdolecek Exp $ */
+/* $NetBSD: map.c,v 1.18 2002/11/15 14:32:33 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -36,12 +36,18 @@
* SUCH DAMAGE.
*/
-#include "compat.h"
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#if 0
+static char sccsid[] = "@(#)map.c 8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: map.c,v 1.18 2002/11/15 14:32:33 christos Exp $");
+#endif
+#endif /* not lint && not SCCSID */
/*
* map.c: Editor function definitions
*/
-#include "sys.h"
#include <stdlib.h>
#include "el.h"
@@ -373,7 +379,7 @@ private const el_action_t el_map_vi_insert[] = {
/* 5 */ ED_MOVE_TO_END, /* ^E */
/* 6 */ ED_NEXT_CHAR, /* ^F */
/* 7 */ ED_UNASSIGNED, /* ^G */
- /* 8 */ ED_DELETE_PREV_CHAR, /* ^H */ /* BackSpace key */
+ /* 8 */ VI_DELETE_PREV_CHAR, /* ^H */ /* BackSpace key */
/* 9 */ ED_UNASSIGNED, /* ^I */ /* Tab Key */
/* 10 */ ED_NEWLINE, /* ^J */
/* 11 */ ED_KILL_LINE, /* ^K */
@@ -493,135 +499,135 @@ private const el_action_t el_map_vi_insert[] = {
/* 124 */ ED_INSERT, /* | */
/* 125 */ ED_INSERT, /* } */
/* 126 */ ED_INSERT, /* ~ */
- /* 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_UNASSIGNED, /* 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_UNASSIGNED, /* 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-^? */
+ /* 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[] = {
@@ -633,7 +639,7 @@ private const el_action_t el_map_vi_command[] = {
/* 5 */ ED_MOVE_TO_END, /* ^E */
/* 6 */ ED_UNASSIGNED, /* ^F */
/* 7 */ ED_UNASSIGNED, /* ^G */
- /* 8 */ ED_PREV_CHAR, /* ^H */
+ /* 8 */ ED_DELETE_PREV_CHAR, /* ^H */
/* 9 */ ED_UNASSIGNED, /* ^I */
/* 10 */ ED_NEWLINE, /* ^J */
/* 11 */ ED_KILL_LINE, /* ^K */
@@ -660,9 +666,9 @@ private const el_action_t el_map_vi_command[] = {
/* 32 */ ED_NEXT_CHAR, /* SPACE */
/* 33 */ ED_UNASSIGNED, /* ! */
/* 34 */ ED_UNASSIGNED, /* " */
- /* 35 */ ED_UNASSIGNED, /* # */
+ /* 35 */ VI_COMMENT_OUT, /* # */
/* 36 */ ED_MOVE_TO_END, /* $ */
- /* 37 */ ED_UNASSIGNED, /* % */
+ /* 37 */ VI_MATCH, /* % */
/* 38 */ ED_UNASSIGNED, /* & */
/* 39 */ ED_UNASSIGNED, /* ' */
/* 40 */ ED_UNASSIGNED, /* ( */
@@ -671,7 +677,7 @@ private const el_action_t el_map_vi_command[] = {
/* 43 */ ED_NEXT_HISTORY, /* + */
/* 44 */ VI_REPEAT_PREV_CHAR, /* , */
/* 45 */ ED_PREV_HISTORY, /* - */
- /* 46 */ ED_UNASSIGNED, /* . */
+ /* 46 */ VI_REDO, /* . */
/* 47 */ VI_SEARCH_PREV, /* / */
/* 48 */ VI_ZERO, /* 0 */
/* 49 */ ED_ARGUMENT_DIGIT, /* 1 */
@@ -689,14 +695,14 @@ private const el_action_t el_map_vi_command[] = {
/* 61 */ ED_UNASSIGNED, /* = */
/* 62 */ ED_UNASSIGNED, /* > */
/* 63 */ VI_SEARCH_NEXT, /* ? */
- /* 64 */ ED_UNASSIGNED, /* @ */
+ /* 64 */ VI_ALIAS, /* @ */
/* 65 */ VI_ADD_AT_EOL, /* A */
- /* 66 */ VI_PREV_SPACE_WORD, /* B */
+ /* 66 */ VI_PREV_BIG_WORD, /* B */
/* 67 */ VI_CHANGE_TO_EOL, /* C */
/* 68 */ ED_KILL_LINE, /* D */
- /* 69 */ VI_TO_END_WORD, /* E */
+ /* 69 */ VI_END_BIG_WORD, /* E */
/* 70 */ VI_PREV_CHAR, /* F */
- /* 71 */ ED_UNASSIGNED, /* G */
+ /* 71 */ VI_TO_HISTORY_LINE, /* G */
/* 72 */ ED_UNASSIGNED, /* H */
/* 73 */ VI_INSERT_AT_BOL, /* I */
/* 74 */ ED_SEARCH_NEXT_HISTORY, /* J */
@@ -710,17 +716,17 @@ private const el_action_t el_map_vi_command[] = {
/* 82 */ VI_REPLACE_MODE, /* R */
/* 83 */ VI_SUBSTITUTE_LINE, /* S */
/* 84 */ VI_TO_PREV_CHAR, /* T */
- /* 85 */ ED_UNASSIGNED, /* U */
+ /* 85 */ VI_UNDO_LINE, /* U */
/* 86 */ ED_UNASSIGNED, /* V */
- /* 87 */ VI_NEXT_SPACE_WORD, /* W */
+ /* 87 */ VI_NEXT_BIG_WORD, /* W */
/* 88 */ ED_DELETE_PREV_CHAR, /* X */
- /* 89 */ ED_UNASSIGNED, /* Y */
+ /* 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 */ ED_UNASSIGNED, /* _ */
+ /* 95 */ VI_HISTORY_WORD, /* _ */
/* 96 */ ED_UNASSIGNED, /* ` */
/* 97 */ VI_ADD, /* a */
/* 98 */ VI_PREV_WORD, /* b */
@@ -743,13 +749,13 @@ private const el_action_t el_map_vi_command[] = {
/* 115 */ VI_SUBSTITUTE_CHAR, /* s */
/* 116 */ VI_TO_NEXT_CHAR, /* t */
/* 117 */ VI_UNDO, /* u */
- /* 118 */ ED_UNASSIGNED, /* v */
+ /* 118 */ VI_HISTEDIT, /* v */
/* 119 */ VI_NEXT_WORD, /* w */
/* 120 */ ED_DELETE_NEXT_CHAR, /* x */
- /* 121 */ ED_UNASSIGNED, /* y */
+ /* 121 */ VI_YANK, /* y */
/* 122 */ ED_UNASSIGNED, /* z */
/* 123 */ ED_UNASSIGNED, /* { */
- /* 124 */ ED_UNASSIGNED, /* | */
+ /* 124 */ VI_TO_COLUMN, /* | */
/* 125 */ ED_UNASSIGNED, /* } */
/* 126 */ VI_CHANGE_CASE, /* ~ */
/* 127 */ ED_DELETE_PREV_CHAR, /* ^? */
diff --git a/cmd-line-utils/libedit/map.h b/cmd-line-utils/libedit/map.h
index 6033eaf1a87..3c9948ccf88 100644
--- a/cmd-line-utils/libedit/map.h
+++ b/cmd-line-utils/libedit/map.h
@@ -1,4 +1,4 @@
-/* $NetBSD: map.h,v 1.6 2001/01/09 17:22:09 jdolecek Exp $ */
+/* $NetBSD: map.h,v 1.7 2002/03/18 16:00:56 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
diff --git a/cmd-line-utils/libedit/parse.c b/cmd-line-utils/libedit/parse.c
index b6d077793af..b113353d464 100644
--- a/cmd-line-utils/libedit/parse.c
+++ b/cmd-line-utils/libedit/parse.c
@@ -1,4 +1,4 @@
-/* $NetBSD: parse.c,v 1.14 2001/01/23 15:55:30 jdolecek Exp $ */
+/* $NetBSD: parse.c,v 1.16 2003/01/21 18:40:24 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -36,7 +36,14 @@
* SUCH DAMAGE.
*/
-#include "compat.h"
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#if 0
+static char sccsid[] = "@(#)parse.c 8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: parse.c,v 1.16 2003/01/21 18:40:24 christos Exp $");
+#endif
+#endif /* not lint && not SCCSID */
/*
* parse.c: parse an editline extended command
@@ -51,7 +58,6 @@
* settc
* setty
*/
-#include "sys.h"
#include "el.h"
#include "tokenizer.h"
#include <stdlib.h>
@@ -63,7 +69,7 @@ private const struct {
{ "bind", map_bind },
{ "echotc", term_echotc },
{ "edit", el_editmode },
- { "history", hist_list },
+ { "history", hist_command },
{ "telltc", term_telltc },
{ "settc", term_settc },
{ "setty", tty_stty },
diff --git a/cmd-line-utils/libedit/prompt.c b/cmd-line-utils/libedit/prompt.c
index fb7d9d35936..03d8309a991 100644
--- a/cmd-line-utils/libedit/prompt.c
+++ b/cmd-line-utils/libedit/prompt.c
@@ -1,4 +1,4 @@
-/* $NetBSD: prompt.c,v 1.8 2001/01/10 07:45:41 jdolecek Exp $ */
+/* $NetBSD: prompt.c,v 1.9 2002/03/18 16:00:56 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -36,12 +36,18 @@
* SUCH DAMAGE.
*/
-#include "compat.h"
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#if 0
+static char sccsid[] = "@(#)prompt.c 8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: prompt.c,v 1.9 2002/03/18 16:00:56 christos Exp $");
+#endif
+#endif /* not lint && not SCCSID */
/*
* prompt.c: Prompt printing functions
*/
-#include "sys.h"
#include <stdio.h>
#include "el.h"
diff --git a/cmd-line-utils/libedit/read.c b/cmd-line-utils/libedit/read.c
index ffec4671271..7567a81e875 100644
--- a/cmd-line-utils/libedit/read.c
+++ b/cmd-line-utils/libedit/read.c
@@ -1,4 +1,4 @@
-/* $NetBSD: read.c,v 1.19 2001/01/10 07:45:41 jdolecek Exp $ */
+/* $NetBSD: read.c,v 1.24 2002/11/20 16:50:08 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -36,13 +36,19 @@
* SUCH DAMAGE.
*/
-#include "compat.h"
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#if 0
+static char sccsid[] = "@(#)read.c 8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: read.c,v 1.24 2002/11/20 16:50:08 christos Exp $");
+#endif
+#endif /* not lint && not SCCSID */
/*
* read.c: Clean this junk up! This is horrible code.
* Terminal read functions
*/
-#include "sys.h"
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
@@ -52,12 +58,44 @@
private int read__fixio(int, int);
private int read_preread(EditLine *);
-private int read_getcmd(EditLine *, el_action_t *, char *);
private int read_char(EditLine *, char *);
+private int read_getcmd(EditLine *, el_action_t *, char *);
+
+/* read_init():
+ * Initialize the read stuff
+ */
+protected int
+read_init(EditLine *el)
+{
+ /* builtin read_char */
+ el->el_read.read_char = read_char;
+ return 0;
+}
+
+
+/* el_read_setfn():
+ * Set the read char function to the one provided.
+ * If it is set to EL_BUILTIN_GETCFN, then reset to the builtin one.
+ */
+protected int
+el_read_setfn(EditLine *el, el_rfunc_t rc)
+{
+ el->el_read.read_char = (rc == EL_BUILTIN_GETCFN) ? read_char : rc;
+ return 0;
+}
+
+
+/* el_read_getfn():
+ * return the current read char function, or EL_BUILTIN_GETCFN
+ * if it is the default one
+ */
+protected el_rfunc_t
+el_read_getfn(EditLine *el)
+{
+ return (el->el_read.read_char == read_char) ?
+ EL_BUILTIN_GETCFN : el->el_read.read_char;
+}
-#ifndef MIN
-#define MIN(A,B) ((A) < (B) ? (A) : (B))
-#endif
#ifdef DEBUG_EDIT
private void
@@ -83,7 +121,11 @@ read_debug(EditLine *el)
*/
/* ARGSUSED */
private int
-read__fixio(int fd __attribute__((unused)), int e)
+read__fixio(int fd
+#if !(defined(TRY_AGAIN) && (defined(FIONBIO) || (defined(F_SETFL) && defined(O_NDELAY))))
+ __attribute__((unused))
+#endif /* !(defined(TRY_AGAIN) && (defined(FIONBIO) || (defined(F_SETFL) && defined(O_NDELAY)))) */
+, int e)
{
switch (e) {
@@ -178,14 +220,13 @@ read_preread(EditLine *el)
* Push a macro
*/
public void
-el_push(EditLine *el, const char *str)
+el_push(EditLine *el, char *str)
{
c_macro_t *ma = &el->el_chared.c_macro;
if (str != NULL && ma->level + 1 < EL_MAXMACRO) {
ma->level++;
- /* LINTED const cast */
- ma->macro[ma->level] = (char *) str;
+ ma->macro[ma->level] = str;
} else {
term_beep(el);
term__flush();
@@ -199,10 +240,10 @@ el_push(EditLine *el, const char *str)
private int
read_getcmd(EditLine *el, el_action_t *cmdnum, char *ch)
{
- el_action_t cmd = ED_UNASSIGNED;
+ el_action_t cmd;
int num;
- while (cmd == ED_UNASSIGNED || cmd == ED_SEQUENCE_LEAD_IN) {
+ do {
if ((num = el_getc(el, ch)) != 1) /* if EOF or error */
return (num);
@@ -241,7 +282,7 @@ read_getcmd(EditLine *el, el_action_t *cmdnum, char *ch)
}
if (el->el_map.alt == NULL)
el->el_map.current = el->el_map.key;
- }
+ } while (cmd == ED_SEQUENCE_LEAD_IN);
*cmdnum = cmd;
return (OKCMD);
}
@@ -307,7 +348,7 @@ el_getc(EditLine *el, char *cp)
#ifdef DEBUG_READ
(void) fprintf(el->el_errfile, "Reading a character\n");
#endif /* DEBUG_READ */
- num_read = read_char(el, cp);
+ num_read = (*el->el_read.read_char)(el, cp);
#ifdef DEBUG_READ
(void) fprintf(el->el_errfile, "Got it %c\n", *cp);
#endif /* DEBUG_READ */
@@ -333,7 +374,7 @@ el_gets(EditLine *el, int *nread)
char *cp = el->el_line.buffer;
size_t idx;
- while (read_char(el, cp) == 1) {
+ while ((*el->el_read.read_char)(el, cp) == 1) {
/* make sure there is space for next character */
if (cp + 1 >= el->el_line.limit) {
idx = (cp - el->el_line.buffer);
@@ -352,6 +393,11 @@ el_gets(EditLine *el, int *nread)
*nread = el->el_line.cursor - el->el_line.buffer;
return (el->el_line.buffer);
}
+
+ /* This is relatively cheap, and things go terribly wrong if
+ we have the wrong size. */
+ el_resize(el);
+
re_clear_display(el); /* reset the display stuff */
ch_reset(el);
@@ -378,7 +424,7 @@ el_gets(EditLine *el, int *nread)
term__flush();
- while (read_char(el, cp) == 1) {
+ while ((*el->el_read.read_char)(el, cp) == 1) {
/* make sure there is space next character */
if (cp + 1 >= el->el_line.limit) {
idx = (cp - el->el_line.buffer);
@@ -386,6 +432,8 @@ el_gets(EditLine *el, int *nread)
break;
cp = &el->el_line.buffer[idx];
}
+ if (*cp == 4) /* ought to be stty eof */
+ break;
cp++;
if (cp[-1] == '\r' || cp[-1] == '\n')
break;
@@ -397,6 +445,7 @@ el_gets(EditLine *el, int *nread)
*nread = el->el_line.cursor - el->el_line.buffer;
return (el->el_line.buffer);
}
+
for (num = OKCMD; num == OKCMD;) { /* while still editing this
* line */
#ifdef DEBUG_EDIT
@@ -410,7 +459,7 @@ el_gets(EditLine *el, int *nread)
#endif /* DEBUG_READ */
break;
}
- if ((int) cmdnum >= el->el_map.nfunc) { /* BUG CHECK command */
+ if ((uint)cmdnum >= (uint)(el->el_map.nfunc)) { /* BUG CHECK command */
#ifdef DEBUG_EDIT
(void) fprintf(el->el_errfile,
"ERROR: illegal command from key 0%o\r\n", ch);
@@ -432,7 +481,24 @@ el_gets(EditLine *el, int *nread)
"Error command = %d\n", cmdnum);
}
#endif /* DEBUG_READ */
+ /* vi redo needs these way down the levels... */
+ el->el_state.thiscmd = cmdnum;
+ el->el_state.thisch = ch;
+ if (el->el_map.type == MAP_VI &&
+ el->el_map.current == el->el_map.key &&
+ el->el_chared.c_redo.pos < el->el_chared.c_redo.lim) {
+ if (cmdnum == VI_DELETE_PREV_CHAR &&
+ el->el_chared.c_redo.pos != el->el_chared.c_redo.buf
+ && isprint(el->el_chared.c_redo.pos[-1]))
+ el->el_chared.c_redo.pos--;
+ else
+ *el->el_chared.c_redo.pos++ = ch;
+ }
retval = (*el->el_map.func[cmdnum]) (el, ch);
+#ifdef DEBUG_READ
+ (void) fprintf(el->el_errfile,
+ "Returned state %d\n", retval );
+#endif /* DEBUG_READ */
/* save the last command here */
el->el_state.lastcmd = cmdnum;
@@ -440,8 +506,6 @@ el_gets(EditLine *el, int *nread)
/* use any return value */
switch (retval) {
case CC_CURSOR:
- el->el_state.argument = 1;
- el->el_state.doingarg = 0;
re_refresh_cursor(el);
break;
@@ -451,26 +515,20 @@ el_gets(EditLine *el, int *nread)
/* FALLTHROUGH */
case CC_REFRESH:
- el->el_state.argument = 1;
- el->el_state.doingarg = 0;
re_refresh(el);
break;
case CC_REFRESH_BEEP:
- el->el_state.argument = 1;
- el->el_state.doingarg = 0;
re_refresh(el);
term_beep(el);
break;
case CC_NORM: /* normal char */
- el->el_state.argument = 1;
- el->el_state.doingarg = 0;
break;
case CC_ARGHACK: /* Suggested by Rich Salz */
/* <rsalz@pineapple.bbn.com> */
- break; /* keep going... */
+ continue; /* keep going... */
case CC_EOF: /* end of file typed */
num = 0;
@@ -489,8 +547,6 @@ el_gets(EditLine *el, int *nread)
re_clear_display(el); /* reset the display stuff */
ch_reset(el); /* reset the input pointers */
re_refresh(el); /* print the prompt again */
- el->el_state.argument = 1;
- el->el_state.doingarg = 0;
break;
case CC_ERROR:
@@ -499,17 +555,18 @@ el_gets(EditLine *el, int *nread)
(void) fprintf(el->el_errfile,
"*** editor ERROR ***\r\n\n");
#endif /* DEBUG_READ */
- el->el_state.argument = 1;
- el->el_state.doingarg = 0;
term_beep(el);
term__flush();
break;
}
+ el->el_state.argument = 1;
+ el->el_state.doingarg = 0;
+ el->el_chared.c_vcmd.action = NOP;
}
- /* make sure the tty is set up correctly */
- (void) tty_cookedmode(el);
term__flush(); /* flush any buffered output */
+ /* make sure the tty is set up correctly */
+ (void) tty_cookedmode(el);
if (el->el_flags & HANDLE_SIGNALS)
sig_clr(el);
if (nread)
diff --git a/cmd-line-utils/libedit/readline.c b/cmd-line-utils/libedit/readline.c
index 9069b46d1f8..13b0369de96 100644
--- a/cmd-line-utils/libedit/readline.c
+++ b/cmd-line-utils/libedit/readline.c
@@ -1,4 +1,4 @@
-/* $NetBSD: readline.c,v 1.19 2001/01/10 08:10:45 jdolecek Exp $ */
+/* $NetBSD: readline.c,v 1.28 2003/03/10 01:14:54 christos Exp $ */
/*-
* Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -36,7 +36,11 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-#include "compat.h"
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+__RCSID("$NetBSD: readline.c,v 1.28 2003/03/10 01:14:54 christos Exp $");
+#endif /* not lint && not SCCSID */
+
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
@@ -47,14 +51,13 @@
#include <stdlib.h>
#include <unistd.h>
#include <limits.h>
+#ifdef HAVE_ALLOCA_H
+#include <alloca.h>
+#endif
#include "histedit.h"
#include "readline/readline.h"
-#include "sys.h"
#include "el.h"
#include "fcns.h" /* for EL_NUM_FCNS */
-#ifdef HAVE_ALLOCA_H
-#include <alloca.h>
-#endif
/* for rl_complete() */
#define TAB '\r'
@@ -65,7 +68,11 @@
/* readline compatibility stuff - look at readline sources/documentation */
/* to see what these variables mean */
const char *rl_library_version = "EditLine wrapper";
-const char *rl_readline_name = "";
+static char empty[] = { '\0' };
+static char expand_chars[] = { ' ', '\t', '\n', '=', '(', '\0' };
+static char break_chars[] = { ' ', '\t', '\n', '"', '\\', '\'', '`', '@', '$',
+ '>', '<', '=', ';', '|', '&', '{', '(', '\0' };
+char *rl_readline_name = empty;
FILE *rl_instream = NULL;
FILE *rl_outstream = NULL;
int rl_point = 0;
@@ -77,12 +84,12 @@ int history_length = 0;
int max_input_history = 0;
char history_expansion_char = '!';
char history_subst_char = '^';
-const char *history_no_expand_chars = " \t\n=(";
+char *history_no_expand_chars = expand_chars;
Function *history_inhibit_expansion_function = NULL;
int rl_inhibit_completion = 0;
int rl_attempted_completion_over = 0;
-const char *rl_basic_word_break_characters = " \t\n\"\\'`@$><=;|&{(";
+char *rl_basic_word_break_characters = break_chars;
char *rl_completer_word_break_characters = NULL;
char *rl_completer_quote_characters = NULL;
CPFunction *rl_completion_entry_function = NULL;
@@ -215,6 +222,11 @@ rl_initialize(void)
/* for proper prompt printing in readline() */
el_rl_prompt = strdup("");
+ if (el_rl_prompt == NULL) {
+ history_end(h);
+ el_end(e);
+ return -1;
+ }
el_set(e, EL_PROMPT, _get_prompt);
el_set(e, EL_SIGNAL, 1);
@@ -250,8 +262,8 @@ rl_initialize(void)
* and rl_line_buffer directly.
*/
li = el_line(e);
- /* LINTED const cast */
- rl_line_buffer = (char *) li->buffer;
+ /* a cheesy way to get rid of const cast. */
+ rl_line_buffer = memchr(li->buffer, *li->buffer, 1);
rl_point = rl_end = 0;
return (0);
@@ -268,6 +280,7 @@ readline(const char *prompt)
HistEvent ev;
int count;
const char *ret;
+ char *buf;
if (e == NULL || h == NULL)
rl_initialize();
@@ -278,28 +291,28 @@ readline(const char *prompt)
if (strcmp(el_rl_prompt, prompt) != 0) {
free(el_rl_prompt);
el_rl_prompt = strdup(prompt);
+ if (el_rl_prompt == NULL)
+ return NULL;
}
/* get one line from input stream */
ret = el_gets(e, &count);
if (ret && count > 0) {
- char *foo;
int lastidx;
- foo = strdup(ret);
+ buf = strdup(ret);
+ if (buf == NULL)
+ return NULL;
lastidx = count - 1;
- if (foo[lastidx] == '\n')
- foo[lastidx] = '\0';
-
- ret = foo;
+ if (buf[lastidx] == '\n')
+ buf[lastidx] = '\0';
} else
- ret = NULL;
+ buf = NULL;
history(h, &ev, H_GETSIZE);
history_length = ev.num;
- /* LINTED const cast */
- return (char *) ret;
+ return buf;
}
/*
@@ -333,6 +346,8 @@ _rl_compat_sub(const char *str, const char *what, const char *with,
size_t size, i;
result = malloc((size = 16));
+ if (result == NULL)
+ return NULL;
temp = str;
with_len = strlen(with);
what_len = strlen(what);
@@ -343,8 +358,14 @@ _rl_compat_sub(const char *str, const char *what, const char *with,
i = new - temp;
add = i + with_len;
if (i + add + 1 >= size) {
+ char *nresult;
size += add + 1;
- result = realloc(result, size);
+ nresult = realloc(result, size);
+ if (nresult == NULL) {
+ free(result);
+ return NULL;
+ }
+ result = nresult;
}
(void) strncpy(&result[len], temp, i);
len += i;
@@ -354,8 +375,14 @@ _rl_compat_sub(const char *str, const char *what, const char *with,
} else {
add = strlen(temp);
if (len + add + 1 >= size) {
+ char *nresult;
size += add + 1;
- result = realloc(result, size);
+ nresult = realloc(result, size);
+ if (nresult == NULL) {
+ free(result);
+ return NULL;
+ }
+ result = nresult;
}
(void) strcpy(&result[len], temp); /* safe */
len += add;
@@ -392,7 +419,7 @@ _history_expand_command(const char *command, size_t cmdlen, char **result)
*result = NULL;
- cmd = (char*) alloca(cmdlen + 1);
+ cmd = alloca(cmdlen + 1);
(void) strncpy(cmd, command, cmdlen);
cmd[cmdlen] = 0;
@@ -425,7 +452,7 @@ _history_expand_command(const char *command, size_t cmdlen, char **result)
return (-1);
prefix = 0;
}
- search = (char*) alloca(len + 1);
+ search = alloca(len + 1);
(void) strncpy(search, &cmd[idx], len);
search[len] = '\0';
@@ -498,6 +525,8 @@ _history_expand_command(const char *command, size_t cmdlen, char **result)
cmd++;
line = strdup(event_data);
+ if (line == NULL)
+ return 0;
for (; *cmd; cmd++) {
if (*cmd == ':')
continue;
@@ -515,7 +544,7 @@ _history_expand_command(const char *command, size_t cmdlen, char **result)
g_on = 2;
else if (*cmd == 's' || *cmd == '&') {
char *what, *with, delim;
- size_t len, from_len;
+ unsigned int len, from_len;
size_t size;
if (*cmd == '&' && (from == NULL || to == NULL))
@@ -524,23 +553,36 @@ _history_expand_command(const char *command, size_t cmdlen, char **result)
delim = *(++cmd), cmd++;
size = 16;
what = realloc(from, size);
+ if (what == NULL) {
+ free(from);
+ return 0;
+ }
len = 0;
for (; *cmd && *cmd != delim; cmd++) {
if (*cmd == '\\'
&& *(cmd + 1) == delim)
cmd++;
- if (len >= size)
- what = realloc(what,
+ if (len >= size) {
+ char *nwhat;
+ nwhat = realloc(what,
(size <<= 1));
+ if (nwhat == NULL) {
+ free(what);
+ return 0;
+ }
+ what = nwhat;
+ }
what[len++] = *cmd;
}
what[len] = '\0';
from = what;
if (*what == '\0') {
free(what);
- if (search)
+ if (search) {
from = strdup(search);
- else {
+ if (from == NULL)
+ return 0;
+ } else {
from = NULL;
return (-1);
}
@@ -551,12 +593,22 @@ _history_expand_command(const char *command, size_t cmdlen, char **result)
size = 16;
with = realloc(to, size);
+ if (with == NULL) {
+ free(to);
+ return -1;
+ }
len = 0;
from_len = strlen(from);
for (; *cmd && *cmd != delim; cmd++) {
if (len + from_len + 1 >= size) {
+ char *nwith;
size += from_len + 1;
- with = realloc(with, size);
+ nwith = realloc(with, size);
+ if (nwith == NULL) {
+ free(with);
+ return -1;
+ }
+ with = nwith;
}
if (*cmd == '&') {
/* safe */
@@ -575,8 +627,10 @@ _history_expand_command(const char *command, size_t cmdlen, char **result)
tempcmd = _rl_compat_sub(line, from, to,
(g_on) ? 1 : 0);
- free(line);
- line = tempcmd;
+ if (tempcmd) {
+ free(line);
+ line = tempcmd;
+ }
g_on = 0;
}
}
@@ -622,14 +676,21 @@ _history_expand_command(const char *command, size_t cmdlen, char **result)
}
cmdsize = 1, cmdlen = 0;
- tempcmd = malloc(cmdsize);
+ if ((tempcmd = malloc(cmdsize)) == NULL)
+ return 0;
for (i = start; start <= i && i <= end; i++) {
int arr_len;
arr_len = strlen(arr[i]);
if (cmdlen + arr_len + 1 >= cmdsize) {
+ char *ntempcmd;
cmdsize += arr_len + 1;
- tempcmd = realloc(tempcmd, cmdsize);
+ ntempcmd = realloc(tempcmd, cmdsize);
+ if (ntempcmd == NULL) {
+ free(tempcmd);
+ return 0;
+ }
+ tempcmd = ntempcmd;
}
(void) strcpy(&tempcmd[cmdlen], arr[i]); /* safe */
cmdlen += arr_len;
@@ -662,10 +723,12 @@ history_expand(char *str, char **output)
rl_initialize();
*output = strdup(str); /* do it early */
+ if (*output == NULL)
+ return 0;
if (str[0] == history_subst_char) {
/* ^foo^foo2^ is equivalent to !!:s^foo^foo2^ */
- temp = (char*) alloca(4 + strlen(str) + 1);
+ temp = alloca(4 + strlen(str) + 1);
temp[0] = temp[1] = history_expansion_char;
temp[2] = ':';
temp[3] = 's';
@@ -674,8 +737,14 @@ history_expand(char *str, char **output)
}
#define ADD_STRING(what, len) \
{ \
- if (idx + len + 1 > size) \
- result = realloc(result, (size += len + 1)); \
+ if (idx + len + 1 > size) { \
+ char *nresult = realloc(result, (size += len + 1));\
+ if (nresult == NULL) { \
+ free(*output); \
+ return 0; \
+ } \
+ result = nresult; \
+ } \
(void)strncpy(&result[idx], what, len); \
idx += len; \
result[idx] = '\0'; \
@@ -789,11 +858,21 @@ history_tokenize(const char *str)
}
if (result_idx + 2 >= size) {
+ char **nresult;
size <<= 1;
- result = realloc(result, size * sizeof(char *));
+ nresult = realloc(result, size * sizeof(char *));
+ if (nresult == NULL) {
+ free(result);
+ return NULL;
+ }
+ result = nresult;
}
len = i - start;
temp = malloc(len + 1);
+ if (temp == NULL) {
+ free(result);
+ return NULL;
+ }
(void) strncpy(temp, &str[start], len);
temp[len] = '\0';
result[result_idx++] = temp;
@@ -1158,11 +1237,15 @@ tilde_expand(char *txt)
return (strdup(txt));
temp = strchr(txt + 1, '/');
- if (temp == NULL)
+ if (temp == NULL) {
temp = strdup(txt + 1);
- else {
+ 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';
}
@@ -1176,6 +1259,8 @@ tilde_expand(char *txt)
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);
@@ -1200,28 +1285,45 @@ filename_completion_function(const char *text, int state)
size_t len;
if (state == 0 || dir == NULL) {
- if (dir != NULL) {
- closedir(dir);
- dir = NULL;
- }
temp = strrchr(text, '/');
if (temp) {
+ char *nptr;
temp++;
- filename = realloc(filename, strlen(temp) + 1);
+ 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 */
- dirname = realloc(dirname, len + 1);
+ nptr = realloc(dirname, len + 1);
+ if (nptr == NULL) {
+ free(filename);
+ return NULL;
+ }
+ dirname = nptr;
(void) strncpy(dirname, text, len);
dirname[len] = '\0';
} else {
filename = strdup(text);
+ if (filename == NULL)
+ return NULL;
dirname = NULL;
}
/* support for ``~user'' syntax */
if (dirname && *dirname == '~') {
+ char *nptr;
temp = tilde_expand(dirname);
- dirname = realloc(dirname, strlen(temp) + 1);
+ if (temp == NULL)
+ return NULL;
+ nptr = realloc(dirname, strlen(temp) + 1);
+ if (nptr == NULL) {
+ free(dirname);
+ return NULL;
+ }
+ dirname = nptr;
(void) strcpy(dirname, temp); /* safe */
free(temp); /* no longer needed */
}
@@ -1230,6 +1332,10 @@ filename_completion_function(const char *text, int state)
if (filename_len == 0)
return (NULL); /* no expansion possible */
+ if (dir != NULL) {
+ (void)closedir(dir);
+ dir = NULL;
+ }
dir = opendir(dirname ? dirname : ".");
if (!dir)
return (NULL); /* cannot open the directory */
@@ -1239,7 +1345,7 @@ filename_completion_function(const char *text, int state)
/* otherwise, get first entry where first */
/* filename_len characters are equal */
if (entry->d_name[0] == filename[0]
-#ifdef HAVE_DIRENT_H
+#if defined(__SVR4) || defined(__linux__)
&& strlen(entry->d_name) >= filename_len
#else
&& entry->d_namlen >= filename_len
@@ -1252,21 +1358,26 @@ filename_completion_function(const char *text, int state)
if (entry) { /* match found */
struct stat stbuf;
-#ifdef HAVE_DIRENT_H
+#if defined(__SVR4) || defined(__linux__)
len = strlen(entry->d_name) +
#else
len = entry->d_namlen +
#endif
((dirname) ? strlen(dirname) : 0) + 1 + 1;
temp = malloc(len);
+ if (temp == NULL)
+ return NULL;
(void) sprintf(temp, "%s%s",
dirname ? dirname : "", entry->d_name); /* safe */
/* test, if it's directory */
if (stat(temp, &stbuf) == 0 && S_ISDIR(stbuf.st_mode))
strcat(temp, "/"); /* safe */
- } else
+ } else {
+ (void)closedir(dir);
+ dir = NULL;
temp = NULL;
+ }
return (temp);
}
@@ -1331,16 +1442,24 @@ completion_matches(const char *text, CPFunction *genfunc)
matches = 0;
match_list_len = 1;
while ((retstr = (*genfunc) (text, matches)) != NULL) {
- if (matches + 1 >= match_list_len) {
+ /* allow for list terminator here */
+ if (matches + 2 >= match_list_len) {
+ char **nmatch_list;
match_list_len <<= 1;
- match_list = realloc(match_list,
+ 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 (char **) NULL; /* nothing found */
+ return NULL; /* nothing found */
/* find least denominator and insert it to match_list[0] */
which = 2;
@@ -1354,14 +1473,15 @@ completion_matches(const char *text, CPFunction *genfunc)
}
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 */
- if (matches + 1 >= match_list_len)
- match_list = realloc(match_list,
- (match_list_len + 1) * sizeof(char *));
match_list[matches + 1] = (char *) NULL;
return (match_list);
@@ -1374,10 +1494,8 @@ static int
_rl_qsort_string_compare(i1, i2)
const void *i1, *i2;
{
- /*LINTED const castaway*/
- const char *s1 = ((const char **)i1)[0];
- /*LINTED const castaway*/
- const char *s2 = ((const char **)i2)[0];
+ const char *s1 = ((const char * const *)i1)[0];
+ const char *s2 = ((const char * const *)i2)[0];
return strcasecmp(s1, s2);
}
@@ -1459,7 +1577,7 @@ rl_complete_internal(int what_to_do)
ctemp--;
len = li->cursor - ctemp;
- temp = (char*) alloca(len + 1);
+ temp = alloca(len + 1);
(void) strncpy(temp, ctemp, len);
temp[len] = '\0';
diff --git a/cmd-line-utils/libedit/readline/readline.h b/cmd-line-utils/libedit/readline/readline.h
index 930c32d6f1c..7485dde4052 100644
--- a/cmd-line-utils/libedit/readline/readline.h
+++ b/cmd-line-utils/libedit/readline/readline.h
@@ -39,18 +39,6 @@
#define _READLINE_H_
#include <sys/types.h>
-#if HAVE_SYS_CDEFS_H
-#include <sys/cdefs.h>
-#endif
-#ifndef __BEGIN_DECLS
-#if defined(__cplusplus)
-#define __BEGIN_DECLS extern "C" {
-#define __END_DECLS }
-#else
-#define __BEGIN_DECLS
-#define __END_DECLS
-#endif
-#endif
/* list of readline stuff supported by editline library's readline wrapper */
@@ -66,16 +54,18 @@ typedef struct _hist_entry {
} HIST_ENTRY;
/* global variables used by readline enabled applications */
-__BEGIN_DECLS
+#ifdef __cplusplus
+extern "C" {
+#endif
extern const char *rl_library_version;
-extern const char *rl_readline_name;
+extern char *rl_readline_name;
extern FILE *rl_instream;
extern FILE *rl_outstream;
extern char *rl_line_buffer;
extern int rl_point, rl_end;
extern int history_base, history_length;
extern int max_input_history;
-extern const char *rl_basic_word_break_characters;
+extern char *rl_basic_word_break_characters;
extern char *rl_completer_word_break_characters;
extern char *rl_completer_quote_characters;
extern CPFunction *rl_completion_entry_function;
@@ -121,6 +111,8 @@ void rl_display_match_list(char **, int, int);
int rl_insert(int, int);
void rl_reset_terminal(const char *);
int rl_bind_key(int, int (*)(int, int));
-__END_DECLS
+#ifdef __cplusplus
+}
+#endif
#endif /* _READLINE_H_ */
diff --git a/cmd-line-utils/libedit/refresh.c b/cmd-line-utils/libedit/refresh.c
index 534e7e12304..e71bdba2b61 100644
--- a/cmd-line-utils/libedit/refresh.c
+++ b/cmd-line-utils/libedit/refresh.c
@@ -1,4 +1,4 @@
-/* $NetBSD: refresh.c,v 1.17 2001/04/13 00:53:11 lukem Exp $ */
+/* $NetBSD: refresh.c,v 1.24 2003/03/10 21:18:49 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -36,12 +36,18 @@
* SUCH DAMAGE.
*/
-#include "compat.h"
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#if 0
+static char sccsid[] = "@(#)refresh.c 8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: refresh.c,v 1.24 2003/03/10 21:18:49 christos Exp $");
+#endif
+#endif /* not lint && not SCCSID */
/*
* refresh.c: Lower level screen refreshing functions
*/
-#include "sys.h"
#include <stdio.h>
#include <ctype.h>
#include <unistd.h>
@@ -51,28 +57,28 @@
private void re_addc(EditLine *, int);
private void re_update_line(EditLine *, char *, char *, int);
-private void re_insert (EditLine *, char *, int, int, char *, int);
-private void re_delete(EditLine *, char *, int, int, int);
+private void re_insert (EditLine *el, char *, int, int, char *, int);
+private void re_delete(EditLine *el, char *, int, int, int);
private void re_fastputc(EditLine *, int);
private void re__strncopy(char *, char *, size_t);
private void re__copy_and_pad(char *, const char *, size_t);
#ifdef DEBUG_REFRESH
-private void re_printstr(EditLine *, char *, char *, char *);
+private void re_printstr(EditLine *, const char *, char *, char *);
#define __F el->el_errfile
#define ELRE_ASSERT(a, b, c) do \
- if (a) { \
+ if (/*CONSTCOND*/ a) { \
(void) fprintf b; \
c; \
} \
- while (0)
+ while (/*CONSTCOND*/0)
#define ELRE_DEBUG(a, b) ELRE_ASSERT(a,b,;)
/* re_printstr():
* Print a string on the debugging pty
*/
private void
-re_printstr(EditLine *el, char *str, char *f, char *t)
+re_printstr(EditLine *el, const char *str, char *f, char *t)
{
ELRE_DEBUG(1, (__F, "%s:\"", str));
@@ -203,6 +209,14 @@ re_refresh(EditLine *el)
el->el_refresh.r_cursor.h = 0;
el->el_refresh.r_cursor.v = 0;
+ if (el->el_line.cursor >= el->el_line.lastchar) {
+ if (el->el_map.current == el->el_map.alt
+ && el->el_line.lastchar != el->el_line.buffer)
+ el->el_line.cursor = el->el_line.lastchar - 1;
+ else
+ el->el_line.cursor = el->el_line.lastchar;
+ }
+
cur.h = -1; /* set flag in case I'm not set */
cur.v = 0;
@@ -312,7 +326,6 @@ re_goto_bottom(EditLine *el)
{
term_move_to_line(el, el->el_refresh.r_oldcv);
- term__putc('\r');
term__putc('\n');
re_clear_display(el);
term__flush();
@@ -325,7 +338,7 @@ re_goto_bottom(EditLine *el)
*/
private void
/*ARGSUSED*/
-re_insert(EditLine *el __attribute__((unused)),
+re_insert(EditLine *el __attribute__((unused)),
char *d, int dat, int dlen, char *s, int num)
{
char *a, *b;
@@ -369,7 +382,7 @@ re_insert(EditLine *el __attribute__((unused)),
*/
private void
/*ARGSUSED*/
-re_delete(EditLine *el __attribute__((unused)),
+re_delete(EditLine *el __attribute__((unused)),
char *d, int dat, int dlen, int num)
{
char *a, *b;
@@ -905,7 +918,7 @@ re_update_line(EditLine *el, char *old, char *new, int i)
private void
re__copy_and_pad(char *dst, const char *src, size_t width)
{
- unsigned int i;
+ size_t i;
for (i = 0; i < width; i++) {
if (*src == '\0')
@@ -929,6 +942,14 @@ re_refresh_cursor(EditLine *el)
char *cp, c;
int h, v, th;
+ if (el->el_line.cursor >= el->el_line.lastchar) {
+ if (el->el_map.current == el->el_map.alt
+ && el->el_line.lastchar != el->el_line.buffer)
+ el->el_line.cursor = el->el_line.lastchar - 1;
+ else
+ el->el_line.cursor = el->el_line.lastchar;
+ }
+
/* first we must find where the cursor is... */
h = el->el_prompt.p_pos.h;
v = el->el_prompt.p_pos.v;
@@ -1051,8 +1072,8 @@ re_fastaddc(EditLine *el)
re_fastputc(el, c);
} else {
re_fastputc(el, '\\');
- re_fastputc(el, (int) ((((unsigned int) c >> 6) & 7) + '0'));
- re_fastputc(el, (int) ((((unsigned int) c >> 3) & 7) + '0'));
+ re_fastputc(el, (int)(((((unsigned int)c) >> 6) & 3) + '0'));
+ re_fastputc(el, (int)(((((unsigned int)c) >> 3) & 7) + '0'));
re_fastputc(el, (c & 7) + '0');
}
term__flush();
diff --git a/cmd-line-utils/libedit/search.c b/cmd-line-utils/libedit/search.c
index bdc3a1e8bb9..48049687875 100644
--- a/cmd-line-utils/libedit/search.c
+++ b/cmd-line-utils/libedit/search.c
@@ -1,4 +1,4 @@
-/* $NetBSD: search.c,v 1.11 2001/01/23 15:55:31 jdolecek Exp $ */
+/* $NetBSD: search.c,v 1.14 2002/11/20 16:50:08 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -36,16 +36,19 @@
* SUCH DAMAGE.
*/
-#include "compat.h"
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#if 0
+static char sccsid[] = "@(#)search.c 8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: search.c,v 1.14 2002/11/20 16:50:08 christos Exp $");
+#endif
+#endif /* not lint && not SCCSID */
/*
* search.c: History and character search functions
*/
-#include "sys.h"
#include <stdlib.h>
-#if HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
#if defined(REGEX)
#include <regex.h>
#elif defined(REGEXP)
@@ -73,7 +76,8 @@ search_init(EditLine *el)
el->el_search.patlen = 0;
el->el_search.patdir = -1;
el->el_search.chacha = '\0';
- el->el_search.chadir = -1;
+ el->el_search.chadir = CHAR_FWD;
+ el->el_search.chatflg = 0;
return (0);
}
@@ -445,29 +449,23 @@ cv_search(EditLine *el, int dir)
char tmpbuf[EL_BUFSIZ];
int tmplen;
- tmplen = 0;
-#ifdef ANCHOR
- tmpbuf[tmplen++] = '.';
- tmpbuf[tmplen++] = '*';
-#endif
-
- el->el_line.buffer[0] = '\0';
- el->el_line.lastchar = el->el_line.buffer;
- el->el_line.cursor = el->el_line.buffer;
- el->el_search.patdir = dir;
-
- c_insert(el, 2); /* prompt + '\n' */
- *el->el_line.cursor++ = '\n';
- *el->el_line.cursor++ = dir == ED_SEARCH_PREV_HISTORY ? '/' : '?';
- re_refresh(el);
-
#ifdef ANCHOR
+ tmpbuf[0] = '.';
+ tmpbuf[1] = '*';
#define LEN 2
#else
#define LEN 0
#endif
+ tmplen = LEN;
- tmplen = c_gets(el, &tmpbuf[LEN]) + LEN;
+ el->el_search.patdir = dir;
+
+ tmplen = c_gets(el, &tmpbuf[LEN],
+ dir == ED_SEARCH_PREV_HISTORY ? "\n/" : "\n?" );
+ if (tmplen == -1)
+ return CC_REFRESH;
+
+ tmplen += LEN;
ch = tmpbuf[tmplen];
tmpbuf[tmplen] = '\0';
@@ -476,9 +474,6 @@ cv_search(EditLine *el, int dir)
* Use the old pattern, but wild-card it.
*/
if (el->el_search.patlen == 0) {
- el->el_line.buffer[0] = '\0';
- el->el_line.lastchar = el->el_line.buffer;
- el->el_line.cursor = el->el_line.buffer;
re_refresh(el);
return (CC_ERROR);
}
@@ -509,19 +504,15 @@ cv_search(EditLine *el, int dir)
el->el_state.lastcmd = (el_action_t) dir; /* avoid c_setpat */
el->el_line.cursor = el->el_line.lastchar = el->el_line.buffer;
if ((dir == ED_SEARCH_PREV_HISTORY ? ed_search_prev_history(el, 0) :
- ed_search_next_history(el, 0)) == CC_ERROR) {
+ ed_search_next_history(el, 0)) == CC_ERROR) {
re_refresh(el);
return (CC_ERROR);
- } else {
- if (ch == 0033) {
- re_refresh(el);
- *el->el_line.lastchar++ = '\n';
- *el->el_line.lastchar = '\0';
- re_goto_bottom(el);
- return (CC_NEWLINE);
- } else
- return (CC_REFRESH);
}
+ if (ch == 0033) {
+ re_refresh(el);
+ return ed_newline(el, 0);
+ }
+ return (CC_REFRESH);
}
@@ -578,69 +569,53 @@ cv_repeat_srch(EditLine *el, int c)
}
-/* cv_csearch_back():
- * Vi character search reverse
+/* cv_csearch():
+ * Vi character search
*/
protected el_action_t
-cv_csearch_back(EditLine *el, int ch, int count, int tflag)
+cv_csearch(EditLine *el, int direction, int ch, int count, int tflag)
{
char *cp;
- cp = el->el_line.cursor;
- while (count--) {
- if (*cp == ch)
- cp--;
- while (cp > el->el_line.buffer && *cp != ch)
- cp--;
- }
-
- if (cp < el->el_line.buffer || (cp == el->el_line.buffer && *cp != ch))
- return (CC_ERROR);
-
- if (*cp == ch && tflag)
- cp++;
-
- el->el_line.cursor = cp;
+ if (ch == 0)
+ return CC_ERROR;
- if (el->el_chared.c_vcmd.action & DELETE) {
- el->el_line.cursor++;
- cv_delfini(el);
- return (CC_REFRESH);
+ if (ch == -1) {
+ char c;
+ if (el_getc(el, &c) != 1)
+ return ed_end_of_file(el, 0);
+ ch = c;
}
- re_refresh_cursor(el);
- return (CC_NORM);
-}
-
-/* cv_csearch_fwd():
- * Vi character search forward
- */
-protected el_action_t
-cv_csearch_fwd(EditLine *el, int ch, int count, int tflag)
-{
- char *cp;
+ /* Save for ';' and ',' commands */
+ el->el_search.chacha = ch;
+ el->el_search.chadir = direction;
+ el->el_search.chatflg = tflag;
cp = el->el_line.cursor;
while (count--) {
if (*cp == ch)
- cp++;
- while (cp < el->el_line.lastchar && *cp != ch)
- cp++;
+ cp += direction;
+ for (;;cp += direction) {
+ if (cp >= el->el_line.lastchar)
+ return CC_ERROR;
+ if (cp < el->el_line.buffer)
+ return CC_ERROR;
+ if (*cp == ch)
+ break;
+ }
}
- if (cp >= el->el_line.lastchar)
- return (CC_ERROR);
-
- if (*cp == ch && tflag)
- cp--;
+ if (tflag)
+ cp -= direction;
el->el_line.cursor = cp;
- if (el->el_chared.c_vcmd.action & DELETE) {
- el->el_line.cursor++;
+ if (el->el_chared.c_vcmd.action != NOP) {
+ if (direction > 0)
+ el->el_line.cursor++;
cv_delfini(el);
- return (CC_REFRESH);
+ return CC_REFRESH;
}
- re_refresh_cursor(el);
- return (CC_NORM);
+ return CC_CURSOR;
}
diff --git a/cmd-line-utils/libedit/search.h b/cmd-line-utils/libedit/search.h
index 676bbe2e35b..a7363072a4c 100644
--- a/cmd-line-utils/libedit/search.h
+++ b/cmd-line-utils/libedit/search.h
@@ -1,4 +1,4 @@
-/* $NetBSD: search.h,v 1.5 2000/09/04 22:06:32 lukem Exp $ */
+/* $NetBSD: search.h,v 1.6 2002/11/15 14:32:34 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -52,6 +52,7 @@ typedef struct el_search_t {
int patdir; /* Direction of the last search */
int chadir; /* Character search direction */
char chacha; /* Character we are looking for */
+ char chatflg; /* 0 if f, 1 if t */
} el_search_t;
@@ -64,7 +65,6 @@ protected el_action_t ce_inc_search(EditLine *, int);
protected el_action_t cv_search(EditLine *, int);
protected el_action_t ce_search_line(EditLine *, char *, int);
protected el_action_t cv_repeat_srch(EditLine *, int);
-protected el_action_t cv_csearch_back(EditLine *, int, int, int);
-protected el_action_t cv_csearch_fwd(EditLine *, int, int, int);
+protected el_action_t cv_csearch(EditLine *, int, int, int, int);
#endif /* _h_el_search */
diff --git a/cmd-line-utils/libedit/sig.c b/cmd-line-utils/libedit/sig.c
index bfb3d5c93f9..3730067ed5f 100644
--- a/cmd-line-utils/libedit/sig.c
+++ b/cmd-line-utils/libedit/sig.c
@@ -1,4 +1,4 @@
-/* $NetBSD: sig.c,v 1.8 2001/01/09 17:31:04 jdolecek Exp $ */
+/* $NetBSD: sig.c,v 1.10 2003/03/10 00:58:05 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -36,14 +36,20 @@
* SUCH DAMAGE.
*/
-#include "compat.h"
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#if 0
+static char sccsid[] = "@(#)sig.c 8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: sig.c,v 1.10 2003/03/10 00:58:05 christos Exp $");
+#endif
+#endif /* not lint && not SCCSID */
/*
* sig.c: Signal handling stuff.
* our policy is to trap all signals, set a good state
* and pass the ball to our caller.
*/
-#include "sys.h"
#include "el.h"
#include <stdlib.h>
@@ -115,9 +121,9 @@ sig_init(EditLine *el)
#undef _DO
(void) sigprocmask(SIG_BLOCK, &nset, &oset);
-#define SIGSIZE (sizeof(sighdl) / sizeof(sighdl[0]) * sizeof(libedit_sig_t))
+#define SIGSIZE (sizeof(sighdl) / sizeof(sighdl[0]) * sizeof(el_signalhandler_t))
- el->el_signal = (el_signal_t) el_malloc(SIGSIZE);
+ el->el_signal = (el_signalhandler_t *) el_malloc(SIGSIZE);
if (el->el_signal == NULL)
return (-1);
for (i = 0; sighdl[i] != -1; i++)
@@ -157,7 +163,7 @@ sig_set(EditLine *el)
(void) sigprocmask(SIG_BLOCK, &nset, &oset);
for (i = 0; sighdl[i] != -1; i++) {
- libedit_sig_t s;
+ el_signalhandler_t s;
/* This could happen if we get interrupted */
if ((s = signal(sighdl[i], sig_handler)) != sig_handler)
el->el_signal[i] = s;
diff --git a/cmd-line-utils/libedit/sig.h b/cmd-line-utils/libedit/sig.h
index 399e3a69437..8effea8e121 100644
--- a/cmd-line-utils/libedit/sig.h
+++ b/cmd-line-utils/libedit/sig.h
@@ -1,4 +1,4 @@
-/* $NetBSD: sig.h,v 1.3 2000/09/04 22:06:32 lukem Exp $ */
+/* $NetBSD: sig.h,v 1.4 2003/03/10 00:58:05 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -62,9 +62,8 @@
_DO(SIGCONT) \
_DO(SIGWINCH)
-typedef RETSIGTYPE (*libedit_sig_t)();
-typedef libedit_sig_t *el_signal_t;
-
+typedef void (*el_signalhandler_t)(int);
+typedef el_signalhandler_t *el_signal_t;
protected void sig_end(EditLine*);
protected int sig_init(EditLine*);
diff --git a/cmd-line-utils/libedit/sys.h b/cmd-line-utils/libedit/sys.h
index d9007243456..a7477d2c5ba 100644
--- a/cmd-line-utils/libedit/sys.h
+++ b/cmd-line-utils/libedit/sys.h
@@ -1,4 +1,4 @@
-/* $NetBSD: sys.h,v 1.4 2000/09/04 22:06:32 lukem Exp $ */
+/* $NetBSD: sys.h,v 1.6 2003/03/10 00:57:38 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -44,6 +44,10 @@
#ifndef _h_sys
#define _h_sys
+#ifdef HAVE_SYS_CDEFS_H
+#include <sys/cdefs.h>
+#endif
+
#ifndef public
# define public /* Externally visible functions/variables */
#endif
@@ -57,10 +61,6 @@
/* When we want to hide everything */
#endif
-#if HAVE_SYS_CDEFS_H
-#include <sys/cdefs.h>
-#endif
-
#ifndef _PTR_T
# define _PTR_T
typedef void *ptr_t;
@@ -73,22 +73,58 @@ typedef void *ioctl_t;
#include <stdio.h>
+#ifndef HAVE_STRLCAT
+#define strlcat libedit_strlcat
+size_t strlcat(char *dst, const char *src, size_t size);
+#endif
+
+#ifndef HAVE_STRLCPY
+#define strlcpy libedit_strlcpy
+size_t strlcpy(char *dst, const char *src, size_t size);
+#endif
+
+#ifndef HAVE_FGETLN
+#define fgetln libedit_fgetln
+char *fgetln(FILE *fp, size_t *len);
+#endif
+
#define REGEX /* Use POSIX.2 regular expression functions */
#undef REGEXP /* Use UNIX V8 regular expression functions */
-#if defined(__sun__) && defined(__SVR4)
+#ifdef notdef
# undef REGEX
# undef REGEXP
# include <malloc.h>
-typedef void (*sig_t)(int);
-#endif
-
-#ifndef __P
-#ifdef __STDC__
-#define __P(x) x
-#else
-#define __P(x) ()
-#endif
+# ifdef __GNUC__
+/*
+ * Broken hdrs.
+ */
+extern int tgetent(const char *bp, char *name);
+extern int tgetflag(const char *id);
+extern int tgetnum(const char *id);
+extern char *tgetstr(const char *id, char **area);
+extern char *tgoto(const char *cap, int col, int row);
+extern int tputs(const char *str, int affcnt, int (*putc)(int));
+extern char *getenv(const char *);
+extern int fprintf(FILE *, const char *, ...);
+extern int sigsetmask(int);
+extern int sigblock(int);
+extern int fputc(int, FILE *);
+extern int fgetc(FILE *);
+extern int fflush(FILE *);
+extern int tolower(int);
+extern int toupper(int);
+extern int errno, sys_nerr;
+extern char *sys_errlist[];
+extern void perror(const char *);
+# include <string.h>
+# define strerror(e) sys_errlist[e]
+# endif
+# ifdef SABER
+extern ptr_t memcpy(ptr_t, const ptr_t, size_t);
+extern ptr_t memset(ptr_t, int, size_t);
+# endif
+extern char *fgetline(FILE *, int *);
#endif
#endif /* _h_sys */
diff --git a/cmd-line-utils/libedit/term.c b/cmd-line-utils/libedit/term.c
index bcda9ac1216..f5fb93394d8 100644
--- a/cmd-line-utils/libedit/term.c
+++ b/cmd-line-utils/libedit/term.c
@@ -1,4 +1,4 @@
-/* $NetBSD: term.c,v 1.32 2001/01/23 15:55:31 jdolecek Exp $ */
+/* $NetBSD: term.c,v 1.35 2002/03/18 16:00:59 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -36,31 +36,44 @@
* SUCH DAMAGE.
*/
-#include "compat.h"
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#if 0
+static char sccsid[] = "@(#)term.c 8.2 (Berkeley) 4/30/95";
+#else
+__RCSID("$NetBSD: term.c,v 1.35 2002/03/18 16:00:59 christos Exp $");
+#endif
+#endif /* not lint && not SCCSID */
/*
* term.c: Editor/termcap-curses interface
* We have to declare a static variable here, since the
* termcap putchar routine does not take an argument!
*/
-
-#include "sys.h"
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
-#if defined(HAVE_TERMCAP_H)
+#ifdef HAVE_TERMCAP_H
#include <termcap.h>
-#elif defined(HAVE_CURSES_H) && defined(HAVE_TERM_H) /* For HPUX11 */
+#endif
+#ifdef HAVE_CURSES_H
#include <curses.h>
+#endif
+#ifdef HAVE_NCURSES_H
+#include <ncurses.h>
+#endif
+
+#include "el.h"
+
+/* Solaris's term.h does horrid things. */
+#if (defined(HAVE_TERM_H) && !defined(SUNOS))
#include <term.h>
#endif
#include <sys/types.h>
#include <sys/ioctl.h>
-#include "el.h"
-
/*
* IMPORTANT NOTE: these routines are allowed to look at the current screen
* and the current possition assuming that it is correct. If this is not
@@ -340,8 +353,7 @@ term_init(EditLine *el)
return (-1);
(void) memset(el->el_term.t_val, 0, T_val * sizeof(int));
term_outfile = el->el_outfile;
- if (term_set(el, NULL) == -1)
- return (-1);
+ (void) term_set(el, NULL);
term_init_arrow(el);
return (0);
}
@@ -637,7 +649,7 @@ mc_again:
* from col 0
*/
if (EL_CAN_TAB ?
- ((unsigned int)-del > (((unsigned int) where >> 3) +
+ (((unsigned int)-del) > (((unsigned int) where >> 3) +
(where & 07)))
: (-del > where)) {
term__putc('\r'); /* do a CR */
@@ -897,7 +909,7 @@ term_set(EditLine *el, const char *term)
memset(el->el_term.t_cap, 0, TC_BUFSIZE);
- i = tgetent(el->el_term.t_cap, (char*) term);
+ i = tgetent(el->el_term.t_cap, term);
if (i <= 0) {
if (i == -1)
@@ -927,7 +939,7 @@ term_set(EditLine *el, const char *term)
Val(T_co) = tgetnum("co");
Val(T_li) = tgetnum("li");
for (t = tstr; t->name != NULL; t++)
- term_alloc(el, t, tgetstr((char*) t->name, &area));
+ term_alloc(el, t, tgetstr(t->name, &area));
}
if (Val(T_co) < 2)
@@ -1067,8 +1079,6 @@ term_reset_arrow(EditLine *el)
static const char stOH[] = {033, 'O', 'H', '\0'};
static const char stOF[] = {033, 'O', 'F', '\0'};
- term_init_arrow(el); /* Init arrow struct */
-
key_add(el, strA, &arrow[A_K_UP].fun, arrow[A_K_UP].type);
key_add(el, strB, &arrow[A_K_DN].fun, arrow[A_K_DN].type);
key_add(el, strC, &arrow[A_K_RT].fun, arrow[A_K_RT].type);
@@ -1237,8 +1247,7 @@ term__flush(void)
*/
protected int
/*ARGSUSED*/
-term_telltc(EditLine *el, int
- argc __attribute__((unused)),
+term_telltc(EditLine *el, int argc __attribute__((unused)),
const char **argv __attribute__((unused)))
{
const struct termcapstr *t;
@@ -1274,7 +1283,8 @@ term_telltc(EditLine *el, int
*/
protected int
/*ARGSUSED*/
-term_settc(EditLine *el, int argc __attribute__((unused)), const char **argv)
+term_settc(EditLine *el, int argc __attribute__((unused)),
+ const char **argv __attribute__((unused)))
{
const struct termcapstr *ts;
const struct termcapval *tv;
@@ -1350,7 +1360,9 @@ term_settc(EditLine *el, int argc __attribute__((unused)), const char **argv)
*/
protected int
/*ARGSUSED*/
-term_echotc(EditLine *el, int argc __attribute__((unused)), const char **argv)
+term_echotc(EditLine *el __attribute__((unused)),
+ int argc __attribute__((unused)),
+ const char **argv __attribute__((unused)))
{
char *cap, *scap, *ep;
int arg_need, arg_cols, arg_rows;
@@ -1429,7 +1441,7 @@ term_echotc(EditLine *el, int argc __attribute__((unused)), const char **argv)
break;
}
if (t->name == NULL)
- scap = tgetstr((char*) *argv, &area);
+ scap = tgetstr(*argv, &area);
if (!scap || scap[0] == '\0') {
if (!silent)
(void) fprintf(el->el_errfile,
diff --git a/cmd-line-utils/libedit/tokenizer.c b/cmd-line-utils/libedit/tokenizer.c
index 7a7e5b5ed75..f6892d9954c 100644
--- a/cmd-line-utils/libedit/tokenizer.c
+++ b/cmd-line-utils/libedit/tokenizer.c
@@ -1,4 +1,4 @@
-/* $NetBSD: tokenizer.c,v 1.7 2001/01/04 15:56:32 christos Exp $ */
+/* $NetBSD: tokenizer.c,v 1.11 2002/10/27 20:24:29 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -36,12 +36,18 @@
* SUCH DAMAGE.
*/
-#include "compat.h"
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#if 0
+static char sccsid[] = "@(#)tokenizer.c 8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: tokenizer.c,v 1.11 2002/10/27 20:24:29 christos Exp $");
+#endif
+#endif /* not lint && not SCCSID */
/*
* tokenize.c: Bourne shell like tokenizer
*/
-#include "sys.h"
#include <string.h>
#include <stdlib.h>
#include "tokenizer.h"
@@ -66,7 +72,7 @@ typedef enum {
struct tokenizer {
char *ifs; /* In field separator */
int argc, amax; /* Current and maximum number of args */
- const char **argv; /* Argument list */
+ char **argv; /* Argument list */
char *wptr, *wmax; /* Space and limit on the word buffer */
char *wstart; /* Beginning of next word */
char *wspace; /* Space of word buffer */
@@ -103,16 +109,29 @@ tok_init(const char *ifs)
{
Tokenizer *tok = (Tokenizer *) tok_malloc(sizeof(Tokenizer));
+ if (tok == NULL)
+ return NULL;
tok->ifs = strdup(ifs ? ifs : IFS);
+ if (tok->ifs == NULL) {
+ tok_free((ptr_t)tok);
+ return NULL;
+ }
tok->argc = 0;
tok->amax = AINCR;
- tok->argv = (const char **) tok_malloc(sizeof(char *) * tok->amax);
- if (tok->argv == NULL)
- return (NULL);
+ tok->argv = (char **) tok_malloc(sizeof(char *) * tok->amax);
+ if (tok->argv == NULL) {
+ tok_free((ptr_t)tok->ifs);
+ tok_free((ptr_t)tok);
+ return NULL;
+ }
tok->argv[0] = NULL;
tok->wspace = (char *) tok_malloc(WINCR);
- if (tok->wspace == NULL)
- return (NULL);
+ if (tok->wspace == NULL) {
+ tok_free((ptr_t)tok->argv);
+ tok_free((ptr_t)tok->ifs);
+ tok_free((ptr_t)tok);
+ return NULL;
+ }
tok->wmax = tok->wspace + WINCR;
tok->wstart = tok->wspace;
tok->wptr = tok->wspace;
@@ -268,7 +287,7 @@ tok_line(Tokenizer *tok, const char *line, int *argc, const char ***argv)
switch (tok->quote) {
case Q_none:
tok_finish(tok);
- *argv = tok->argv;
+ *argv = (const char **)tok->argv;
*argc = tok->argc;
return (0);
@@ -301,7 +320,7 @@ tok_line(Tokenizer *tok, const char *line, int *argc, const char ***argv)
return (3);
}
tok_finish(tok);
- *argv = tok->argv;
+ *argv = (const char **)tok->argv;
*argc = tok->argc;
return (0);
@@ -363,25 +382,25 @@ tok_line(Tokenizer *tok, const char *line, int *argc, const char ***argv)
if (tok->wptr >= tok->wmax - 4) {
size_t size = tok->wmax - tok->wspace + WINCR;
char *s = (char *) tok_realloc(tok->wspace, size);
- /* SUPPRESS 22 */
- int offs = s - tok->wspace;
if (s == NULL)
return (-1);
- if (offs != 0) {
+ if (s != tok->wspace) {
int i;
- for (i = 0; i < tok->argc; i++)
- tok->argv[i] = tok->argv[i] + offs;
- tok->wptr = tok->wptr + offs;
- tok->wstart = tok->wstart + offs;
- tok->wmax = s + size;
+ for (i = 0; i < tok->argc; i++) {
+ tok->argv[i] =
+ (tok->argv[i] - tok->wspace) + s;
+ }
+ tok->wptr = (tok->wptr - tok->wspace) + s;
+ tok->wstart = (tok->wstart - tok->wspace) + s;
tok->wspace = s;
}
+ tok->wmax = s + size;
}
if (tok->argc >= tok->amax - 4) {
- const char **p;
+ char **p;
tok->amax += AINCR;
- p = (const char **) tok_realloc(tok->argv,
+ p = (char **) tok_realloc(tok->argv,
tok->amax * sizeof(char *));
if (p == NULL)
return (-1);
diff --git a/cmd-line-utils/libedit/tokenizer.h b/cmd-line-utils/libedit/tokenizer.h
index 14919fd3f84..7cc7a3346e4 100644
--- a/cmd-line-utils/libedit/tokenizer.h
+++ b/cmd-line-utils/libedit/tokenizer.h
@@ -1,4 +1,4 @@
-/* $NetBSD: tokenizer.h,v 1.4 2000/09/04 22:06:33 lukem Exp $ */
+/* $NetBSD: tokenizer.h,v 1.5 2002/03/18 16:01:00 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
diff --git a/cmd-line-utils/libedit/tty.c b/cmd-line-utils/libedit/tty.c
index 2c7b502136d..5253fdf87a7 100644
--- a/cmd-line-utils/libedit/tty.c
+++ b/cmd-line-utils/libedit/tty.c
@@ -1,4 +1,4 @@
-/* $NetBSD: tty.c,v 1.15 2001/05/17 01:02:17 christos Exp $ */
+/* $NetBSD: tty.c,v 1.16 2002/03/18 16:01:01 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -36,12 +36,18 @@
* SUCH DAMAGE.
*/
-#include "compat.h"
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+#if 0
+static char sccsid[] = "@(#)tty.c 8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: tty.c,v 1.16 2002/03/18 16:01:01 christos Exp $");
+#endif
+#endif /* not lint && not SCCSID */
/*
* tty.c: tty interface stuff
*/
-#include "sys.h"
#include "tty.h"
#include "el.h"
@@ -54,7 +60,7 @@ typedef struct ttymodes_t {
typedef struct ttymap_t {
int nch, och; /* Internal and termio rep of chars */
el_action_t bind[3]; /* emacs, vi, and vi-cmd */
-} ttymap_t;
+} ttymap_t;
private const ttyperm_t ttyperm = {
@@ -1039,9 +1045,8 @@ tty_stty(EditLine *el, int argc __attribute__((unused)), const char **argv)
{
const ttymodes_t *m;
char x;
- const char *d;
int aflag = 0;
- const char *s;
+ const char *s, *d;
const char *name;
int z = EX_IO;
diff --git a/cmd-line-utils/libedit/tty.h b/cmd-line-utils/libedit/tty.h
index 5fdcfadf0dc..e9597fceb2b 100644
--- a/cmd-line-utils/libedit/tty.h
+++ b/cmd-line-utils/libedit/tty.h
@@ -1,4 +1,4 @@
-/* $NetBSD: tty.h,v 1.8 2000/09/04 22:06:33 lukem Exp $ */
+/* $NetBSD: tty.h,v 1.9 2002/03/18 16:01:01 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -453,16 +453,16 @@
#define MD_NN 5
typedef struct {
- const char *t_name;
- u_int t_setmask;
- u_int t_clrmask;
+ const char *t_name;
+ u_int t_setmask;
+ u_int t_clrmask;
} ttyperm_t[NN_IO][MD_NN];
typedef unsigned char ttychar_t[NN_IO][C_NCC];
protected int tty_init(EditLine *);
protected void tty_end(EditLine *);
-protected int tty_stty(EditLine *, int, const char**);
+protected int tty_stty(EditLine *, int, const char **);
protected int tty_rawmode(EditLine *);
protected int tty_cookedmode(EditLine *);
protected int tty_quotemode(EditLine *);
diff --git a/cmd-line-utils/libedit/vi.c b/cmd-line-utils/libedit/vi.c
index 296e11eb4d9..5380872cf65 100644
--- a/cmd-line-utils/libedit/vi.c
+++ b/cmd-line-utils/libedit/vi.c
@@ -1,4 +1,4 @@
-/* $NetBSD: vi.c,v 1.8 2000/09/04 22:06:33 lukem Exp $ */
+/* $NetBSD: vi.c,v 1.16 2003/03/10 11:09:25 dsl Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -36,12 +36,22 @@
* SUCH DAMAGE.
*/
-#include "compat.h"
+#include "config.h"
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/wait.h>
+
+#if !defined(lint) && !defined(SCCSID)
+#if 0
+static char sccsid[] = "@(#)vi.c 8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: vi.c,v 1.16 2003/03/10 11:09:25 dsl Exp $");
+#endif
+#endif /* not lint && not SCCSID */
/*
* vi.c: Vi mode commands.
*/
-#include "sys.h"
#include "el.h"
private el_action_t cv_action(EditLine *, int);
@@ -53,22 +63,18 @@ private el_action_t cv_paste(EditLine *, int);
private el_action_t
cv_action(EditLine *el, int c)
{
- char *cp, *kp;
- if (el->el_chared.c_vcmd.action & DELETE) {
+ if (el->el_chared.c_vcmd.action != NOP) {
+ /* 'cc', 'dd' and (possibly) friends */
+ if (c != el->el_chared.c_vcmd.action)
+ return CC_ERROR;
+
+ if (!(c & YANK))
+ cv_undo(el);
+ cv_yank(el, el->el_line.buffer,
+ el->el_line.lastchar - el->el_line.buffer);
el->el_chared.c_vcmd.action = NOP;
el->el_chared.c_vcmd.pos = 0;
-
- el->el_chared.c_undo.isize = 0;
- el->el_chared.c_undo.dsize = 0;
- kp = el->el_chared.c_undo.buf;
- for (cp = el->el_line.buffer; cp < el->el_line.lastchar; cp++) {
- *kp++ = *cp;
- el->el_chared.c_undo.dsize++;
- }
-
- el->el_chared.c_undo.action = INSERT;
- el->el_chared.c_undo.ptr = el->el_line.buffer;
el->el_line.lastchar = el->el_line.buffer;
el->el_line.cursor = el->el_line.buffer;
if (c & INSERT)
@@ -79,25 +85,8 @@ cv_action(EditLine *el, int c)
el->el_chared.c_vcmd.pos = el->el_line.cursor;
el->el_chared.c_vcmd.action = c;
return (CC_ARGHACK);
-
-#ifdef notdef
- /*
- * I don't think that this is needed. But we keep it for now
- */
- else
- if (el_chared.c_vcmd.action == NOP) {
- el->el_chared.c_vcmd.pos = el->el_line.cursor;
- el->el_chared.c_vcmd.action = c;
- return (CC_ARGHACK);
- } else {
- el->el_chared.c_vcmd.action = 0;
- el->el_chared.c_vcmd.pos = 0;
- return (CC_ERROR);
- }
-#endif
}
-
/* cv_paste():
* Paste previous deletion before or after the cursor
*/
@@ -105,23 +94,25 @@ private el_action_t
cv_paste(EditLine *el, int c)
{
char *ptr;
- c_undo_t *un = &el->el_chared.c_undo;
+ c_kill_t *k = &el->el_chared.c_kill;
+ int len = k->last - k->buf;
+ if (k->buf == NULL || len == 0)
+ return (CC_ERROR);
#ifdef DEBUG_PASTE
- (void) fprintf(el->el_errfile, "Paste: %x \"%s\" +%d -%d\n",
- un->action, un->buf, un->isize, un->dsize);
+ (void) fprintf(el->el_errfile, "Paste: \"%.*s\"\n", len, k->buf);
#endif
- if (un->isize == 0)
- return (CC_ERROR);
+
+ cv_undo(el);
if (!c && el->el_line.cursor < el->el_line.lastchar)
el->el_line.cursor++;
ptr = el->el_line.cursor;
- c_insert(el, (int) un->isize);
- if (el->el_line.cursor + un->isize > el->el_line.lastchar)
+ c_insert(el, len);
+ if (el->el_line.cursor + len > el->el_line.lastchar)
return (CC_ERROR);
- (void) memcpy(ptr, un->buf, un->isize);
+ (void) memcpy(ptr, k->buf, len +0u);
return (CC_REFRESH);
}
@@ -152,24 +143,24 @@ vi_paste_prev(EditLine *el, int c __attribute__((unused)))
}
-/* vi_prev_space_word():
+/* vi_prev_big_word():
* Vi move to the previous space delimited word
* [B]
*/
protected el_action_t
/*ARGSUSED*/
-vi_prev_space_word(EditLine *el, int c __attribute__((unused)))
+vi_prev_big_word(EditLine *el, int c __attribute__((unused)))
{
if (el->el_line.cursor == el->el_line.buffer)
return (CC_ERROR);
- el->el_line.cursor = cv_prev_word(el, el->el_line.cursor,
+ el->el_line.cursor = cv_prev_word(el->el_line.cursor,
el->el_line.buffer,
el->el_state.argument,
- cv__isword);
+ cv__isWord);
- if (el->el_chared.c_vcmd.action & DELETE) {
+ if (el->el_chared.c_vcmd.action != NOP) {
cv_delfini(el);
return (CC_REFRESH);
}
@@ -179,7 +170,7 @@ vi_prev_space_word(EditLine *el, int c __attribute__((unused)))
/* vi_prev_word():
* Vi move to the previous word
- * [B]
+ * [b]
*/
protected el_action_t
/*ARGSUSED*/
@@ -189,12 +180,12 @@ vi_prev_word(EditLine *el, int c __attribute__((unused)))
if (el->el_line.cursor == el->el_line.buffer)
return (CC_ERROR);
- el->el_line.cursor = cv_prev_word(el, el->el_line.cursor,
+ el->el_line.cursor = cv_prev_word(el->el_line.cursor,
el->el_line.buffer,
el->el_state.argument,
- ce__isword);
+ cv__isword);
- if (el->el_chared.c_vcmd.action & DELETE) {
+ if (el->el_chared.c_vcmd.action != NOP) {
cv_delfini(el);
return (CC_REFRESH);
}
@@ -202,25 +193,23 @@ vi_prev_word(EditLine *el, int c __attribute__((unused)))
}
-/* vi_next_space_word():
+/* vi_next_big_word():
* Vi move to the next space delimited word
* [W]
*/
protected el_action_t
/*ARGSUSED*/
-vi_next_space_word(EditLine *el, int c __attribute__((unused)))
+vi_next_big_word(EditLine *el, int c __attribute__((unused)))
{
- if (el->el_line.cursor == el->el_line.lastchar)
+ if (el->el_line.cursor >= el->el_line.lastchar - 1)
return (CC_ERROR);
el->el_line.cursor = cv_next_word(el, el->el_line.cursor,
- el->el_line.lastchar,
- el->el_state.argument,
- cv__isword);
+ el->el_line.lastchar, el->el_state.argument, cv__isWord);
if (el->el_map.type == MAP_VI)
- if (el->el_chared.c_vcmd.action & DELETE) {
+ if (el->el_chared.c_vcmd.action != NOP) {
cv_delfini(el);
return (CC_REFRESH);
}
@@ -237,16 +226,14 @@ protected el_action_t
vi_next_word(EditLine *el, int c __attribute__((unused)))
{
- if (el->el_line.cursor == el->el_line.lastchar)
+ if (el->el_line.cursor >= el->el_line.lastchar - 1)
return (CC_ERROR);
el->el_line.cursor = cv_next_word(el, el->el_line.cursor,
- el->el_line.lastchar,
- el->el_state.argument,
- ce__isword);
+ el->el_line.lastchar, el->el_state.argument, cv__isword);
if (el->el_map.type == MAP_VI)
- if (el->el_chared.c_vcmd.action & DELETE) {
+ if (el->el_chared.c_vcmd.action != NOP) {
cv_delfini(el);
return (CC_REFRESH);
}
@@ -261,19 +248,27 @@ vi_next_word(EditLine *el, int c __attribute__((unused)))
protected el_action_t
vi_change_case(EditLine *el, int c)
{
+ int i;
- if (el->el_line.cursor < el->el_line.lastchar) {
- c = *el->el_line.cursor;
+ if (el->el_line.cursor >= el->el_line.lastchar)
+ return (CC_ERROR);
+ cv_undo(el);
+ for (i = 0; i < el->el_state.argument; i++) {
+
+ c = *(unsigned char *)el->el_line.cursor;
if (isupper(c))
- *el->el_line.cursor++ = tolower(c);
+ *el->el_line.cursor = tolower(c);
else if (islower(c))
- *el->el_line.cursor++ = toupper(c);
- else
- el->el_line.cursor++;
+ *el->el_line.cursor = toupper(c);
+
+ if (++el->el_line.cursor >= el->el_line.lastchar) {
+ el->el_line.cursor--;
+ re_fastaddc(el);
+ break;
+ }
re_fastaddc(el);
- return (CC_NORM);
}
- return (CC_ERROR);
+ return CC_NORM;
}
@@ -304,11 +299,7 @@ vi_insert_at_bol(EditLine *el, int c __attribute__((unused)))
{
el->el_line.cursor = el->el_line.buffer;
- el->el_chared.c_vcmd.ins = el->el_line.cursor;
-
- el->el_chared.c_undo.ptr = el->el_line.cursor;
- el->el_chared.c_undo.action = DELETE;
-
+ cv_undo(el);
el->el_map.current = el->el_map.key;
return (CC_CURSOR);
}
@@ -323,13 +314,13 @@ protected el_action_t
vi_replace_char(EditLine *el, int c __attribute__((unused)))
{
+ if (el->el_line.cursor >= el->el_line.lastchar)
+ return CC_ERROR;
+
el->el_map.current = el->el_map.key;
el->el_state.inputmode = MODE_REPLACE_1;
- el->el_chared.c_undo.action = CHANGE;
- el->el_chared.c_undo.ptr = el->el_line.cursor;
- el->el_chared.c_undo.isize = 0;
- el->el_chared.c_undo.dsize = 0;
- return (CC_NORM);
+ cv_undo(el);
+ return (CC_ARGHACK);
}
@@ -344,17 +335,14 @@ vi_replace_mode(EditLine *el, int c __attribute__((unused)))
el->el_map.current = el->el_map.key;
el->el_state.inputmode = MODE_REPLACE;
- el->el_chared.c_undo.action = CHANGE;
- el->el_chared.c_undo.ptr = el->el_line.cursor;
- el->el_chared.c_undo.isize = 0;
- el->el_chared.c_undo.dsize = 0;
+ cv_undo(el);
return (CC_NORM);
}
/* vi_substitute_char():
* Vi replace character under the cursor and enter insert mode
- * [r]
+ * [s]
*/
protected el_action_t
/*ARGSUSED*/
@@ -376,6 +364,9 @@ protected el_action_t
vi_substitute_line(EditLine *el, int c __attribute__((unused)))
{
+ cv_undo(el);
+ cv_yank(el, el->el_line.buffer,
+ el->el_line.lastchar - el->el_line.buffer);
(void) em_kill_line(el, 0);
el->el_map.current = el->el_map.key;
return (CC_REFRESH);
@@ -391,6 +382,9 @@ protected el_action_t
vi_change_to_eol(EditLine *el, int c __attribute__((unused)))
{
+ cv_undo(el);
+ cv_yank(el, el->el_line.cursor,
+ el->el_line.lastchar - el->el_line.cursor);
(void) ed_kill_line(el, 0);
el->el_map.current = el->el_map.key;
return (CC_REFRESH);
@@ -407,11 +401,7 @@ vi_insert(EditLine *el, int c __attribute__((unused)))
{
el->el_map.current = el->el_map.key;
-
- el->el_chared.c_vcmd.ins = el->el_line.cursor;
- el->el_chared.c_undo.ptr = el->el_line.cursor;
- el->el_chared.c_undo.action = DELETE;
-
+ cv_undo(el);
return (CC_NORM);
}
@@ -435,9 +425,7 @@ vi_add(EditLine *el, int c __attribute__((unused)))
} else
ret = CC_NORM;
- el->el_chared.c_vcmd.ins = el->el_line.cursor;
- el->el_chared.c_undo.ptr = el->el_line.cursor;
- el->el_chared.c_undo.action = DELETE;
+ cv_undo(el);
return (ret);
}
@@ -454,11 +442,7 @@ vi_add_at_eol(EditLine *el, int c __attribute__((unused)))
el->el_map.current = el->el_map.key;
el->el_line.cursor = el->el_line.lastchar;
-
- /* Mark where insertion begins */
- el->el_chared.c_vcmd.ins = el->el_line.lastchar;
- el->el_chared.c_undo.ptr = el->el_line.lastchar;
- el->el_chared.c_undo.action = DELETE;
+ cv_undo(el);
return (CC_CURSOR);
}
@@ -476,22 +460,22 @@ vi_delete_meta(EditLine *el, int c __attribute__((unused)))
}
-/* vi_end_word():
+/* vi_end_big_word():
* Vi move to the end of the current space delimited word
* [E]
*/
protected el_action_t
/*ARGSUSED*/
-vi_end_word(EditLine *el, int c __attribute__((unused)))
+vi_end_big_word(EditLine *el, int c __attribute__((unused)))
{
if (el->el_line.cursor == el->el_line.lastchar)
return (CC_ERROR);
el->el_line.cursor = cv__endword(el->el_line.cursor,
- el->el_line.lastchar, el->el_state.argument);
+ el->el_line.lastchar, el->el_state.argument, cv__isWord);
- if (el->el_chared.c_vcmd.action & DELETE) {
+ if (el->el_chared.c_vcmd.action != NOP) {
el->el_line.cursor++;
cv_delfini(el);
return (CC_REFRESH);
@@ -500,22 +484,22 @@ vi_end_word(EditLine *el, int c __attribute__((unused)))
}
-/* vi_to_end_word():
+/* vi_end_word():
* Vi move to the end of the current word
* [e]
*/
protected el_action_t
/*ARGSUSED*/
-vi_to_end_word(EditLine *el, int c __attribute__((unused)))
+vi_end_word(EditLine *el, int c __attribute__((unused)))
{
if (el->el_line.cursor == el->el_line.lastchar)
return (CC_ERROR);
el->el_line.cursor = cv__endword(el->el_line.cursor,
- el->el_line.lastchar, el->el_state.argument);
+ el->el_line.lastchar, el->el_state.argument, cv__isword);
- if (el->el_chared.c_vcmd.action & DELETE) {
+ if (el->el_chared.c_vcmd.action != NOP) {
el->el_line.cursor++;
cv_delfini(el);
return (CC_REFRESH);
@@ -532,100 +516,19 @@ protected el_action_t
/*ARGSUSED*/
vi_undo(EditLine *el, int c __attribute__((unused)))
{
- char *cp, *kp;
- char temp;
- int i, size;
- c_undo_t *un = &el->el_chared.c_undo;
-
-#ifdef DEBUG_UNDO
- (void) fprintf(el->el_errfile, "Undo: %x \"%s\" +%d -%d\n",
- un->action, un->buf, un->isize, un->dsize);
-#endif
- switch (un->action) {
- case DELETE:
- if (un->dsize == 0)
- return (CC_NORM);
-
- (void) memcpy(un->buf, un->ptr, un->dsize);
- for (cp = un->ptr; cp <= el->el_line.lastchar; cp++)
- *cp = cp[un->dsize];
-
- el->el_line.lastchar -= un->dsize;
- el->el_line.cursor = un->ptr;
-
- un->action = INSERT;
- un->isize = un->dsize;
- un->dsize = 0;
- break;
+ c_undo_t un = el->el_chared.c_undo;
- case DELETE | INSERT:
- size = un->isize - un->dsize;
- if (size > 0)
- i = un->dsize;
- else
- i = un->isize;
- cp = un->ptr;
- kp = un->buf;
- while (i-- > 0) {
- temp = *kp;
- *kp++ = *cp;
- *cp++ = temp;
- }
- if (size > 0) {
- el->el_line.cursor = cp;
- c_insert(el, size);
- while (size-- > 0 && cp < el->el_line.lastchar) {
- temp = *kp;
- *kp++ = *cp;
- *cp++ = temp;
- }
- } else if (size < 0) {
- size = -size;
- for (; cp <= el->el_line.lastchar; cp++) {
- *kp++ = *cp;
- *cp = cp[size];
- }
- el->el_line.lastchar -= size;
- }
- el->el_line.cursor = un->ptr;
- i = un->dsize;
- un->dsize = un->isize;
- un->isize = i;
- break;
-
- case INSERT:
- if (un->isize == 0)
- return (CC_NORM);
-
- el->el_line.cursor = un->ptr;
- c_insert(el, (int) un->isize);
- (void) memcpy(un->ptr, un->buf, un->isize);
- un->action = DELETE;
- un->dsize = un->isize;
- un->isize = 0;
- break;
+ if (un.len == -1)
+ return CC_ERROR;
- case CHANGE:
- if (un->isize == 0)
- return (CC_NORM);
-
- el->el_line.cursor = un->ptr;
- size = (int) (el->el_line.cursor - el->el_line.lastchar);
- if (size < (int)un->isize)
- size = un->isize;
- cp = un->ptr;
- kp = un->buf;
- for (i = 0; i < size; i++) {
- temp = *kp;
- *kp++ = *cp;
- *cp++ = temp;
- }
- un->dsize = 0;
- break;
-
- default:
- return (CC_ERROR);
- }
+ /* switch line buffer and undo buffer */
+ el->el_chared.c_undo.buf = el->el_line.buffer;
+ el->el_chared.c_undo.len = el->el_line.lastchar - el->el_line.buffer;
+ el->el_chared.c_undo.cursor = el->el_line.cursor - el->el_line.buffer;
+ el->el_line.limit = un.buf + (el->el_line.limit - el->el_line.buffer);
+ el->el_line.buffer = un.buf;
+ el->el_line.cursor = un.buf + un.cursor;
+ el->el_line.lastchar = un.buf + un.len;
return (CC_REFRESH);
}
@@ -639,22 +542,12 @@ protected el_action_t
/*ARGSUSED*/
vi_command_mode(EditLine *el, int c __attribute__((unused)))
{
- int size;
/* [Esc] cancels pending action */
- el->el_chared.c_vcmd.ins = 0;
el->el_chared.c_vcmd.action = NOP;
el->el_chared.c_vcmd.pos = 0;
el->el_state.doingarg = 0;
- size = el->el_chared.c_undo.ptr - el->el_line.cursor;
- if (size < 0)
- size = -size;
- if (el->el_chared.c_undo.action == (INSERT | DELETE) ||
- el->el_chared.c_undo.action == DELETE)
- el->el_chared.c_undo.dsize = size;
- else
- el->el_chared.c_undo.isize = size;
el->el_state.inputmode = MODE_INSERT;
el->el_map.current = el->el_map.alt;
@@ -674,41 +567,37 @@ protected el_action_t
vi_zero(EditLine *el, int c)
{
- 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');
- return (CC_ARGHACK);
- } else {
- el->el_line.cursor = el->el_line.buffer;
- if (el->el_chared.c_vcmd.action & DELETE) {
- cv_delfini(el);
- return (CC_REFRESH);
- }
- return (CC_CURSOR);
+ if (el->el_state.doingarg)
+ return ed_argument_digit(el, c);
+
+ el->el_line.cursor = el->el_line.buffer;
+ if (el->el_chared.c_vcmd.action != NOP) {
+ cv_delfini(el);
+ return (CC_REFRESH);
}
+ return (CC_CURSOR);
}
/* vi_delete_prev_char():
* Vi move to previous character (backspace)
- * [^H]
+ * [^H] in insert mode only
*/
protected el_action_t
/*ARGSUSED*/
vi_delete_prev_char(EditLine *el, int c __attribute__((unused)))
{
+ char *cp;
- if (el->el_chared.c_vcmd.ins == 0)
+ cp = el->el_line.cursor;
+ if (cp <= el->el_line.buffer)
return (CC_ERROR);
- if (el->el_chared.c_vcmd.ins >
- el->el_line.cursor - el->el_state.argument)
- return (CC_ERROR);
-
- c_delbefore(el, el->el_state.argument);
- el->el_line.cursor -= el->el_state.argument;
+ /* do the delete here so we dont mess up the undo and paste buffers */
+ el->el_line.cursor = --cp;
+ for (; cp < el->el_line.lastchar; cp++)
+ cp[0] = cp[1];
+ el->el_line.lastchar = cp - 1;
return (CC_REFRESH);
}
@@ -829,16 +718,7 @@ protected el_action_t
/*ARGSUSED*/
vi_next_char(EditLine *el, int c __attribute__((unused)))
{
- char ch;
-
- if (el_getc(el, &ch) != 1)
- return (ed_end_of_file(el, 0));
-
- el->el_search.chadir = CHAR_FWD;
- el->el_search.chacha = ch;
-
- return (cv_csearch_fwd(el, ch, el->el_state.argument, 0));
-
+ return cv_csearch(el, CHAR_FWD, -1, el->el_state.argument, 0);
}
@@ -850,15 +730,7 @@ protected el_action_t
/*ARGSUSED*/
vi_prev_char(EditLine *el, int c __attribute__((unused)))
{
- char ch;
-
- if (el_getc(el, &ch) != 1)
- return (ed_end_of_file(el, 0));
-
- el->el_search.chadir = CHAR_BACK;
- el->el_search.chacha = ch;
-
- return (cv_csearch_back(el, ch, el->el_state.argument, 0));
+ return cv_csearch(el, CHAR_BACK, -1, el->el_state.argument, 0);
}
@@ -870,13 +742,7 @@ protected el_action_t
/*ARGSUSED*/
vi_to_next_char(EditLine *el, int c __attribute__((unused)))
{
- char ch;
-
- if (el_getc(el, &ch) != 1)
- return (ed_end_of_file(el, 0));
-
- return (cv_csearch_fwd(el, ch, el->el_state.argument, 1));
-
+ return cv_csearch(el, CHAR_FWD, -1, el->el_state.argument, 1);
}
@@ -888,12 +754,7 @@ protected el_action_t
/*ARGSUSED*/
vi_to_prev_char(EditLine *el, int c __attribute__((unused)))
{
- char ch;
-
- if (el_getc(el, &ch) != 1)
- return (ed_end_of_file(el, 0));
-
- return (cv_csearch_back(el, ch, el->el_state.argument, 1));
+ return cv_csearch(el, CHAR_BACK, -1, el->el_state.argument, 1);
}
@@ -906,14 +767,8 @@ protected el_action_t
vi_repeat_next_char(EditLine *el, int c __attribute__((unused)))
{
- if (el->el_search.chacha == 0)
- return (CC_ERROR);
-
- return (el->el_search.chadir == CHAR_FWD
- ? cv_csearch_fwd(el, el->el_search.chacha,
- el->el_state.argument, 0)
- : cv_csearch_back(el, el->el_search.chacha,
- el->el_state.argument, 0));
+ return cv_csearch(el, el->el_search.chadir, el->el_search.chacha,
+ el->el_state.argument, el->el_search.chatflg);
}
@@ -925,11 +780,343 @@ protected el_action_t
/*ARGSUSED*/
vi_repeat_prev_char(EditLine *el, int c __attribute__((unused)))
{
+ el_action_t r;
+ int dir = el->el_search.chadir;
- if (el->el_search.chacha == 0)
- return (CC_ERROR);
+ r = cv_csearch(el, -dir, el->el_search.chacha,
+ el->el_state.argument, el->el_search.chatflg);
+ el->el_search.chadir = dir;
+ return r;
+}
+
+
+/* vi_match():
+ * Vi go to matching () {} or []
+ * [%]
+ */
+protected el_action_t
+/*ARGSUSED*/
+vi_match(EditLine *el, int c __attribute__((unused)))
+{
+ const char match_chars[] = "()[]{}";
+ char *cp;
+ int delta, i, count;
+ char o_ch, c_ch;
+
+ *el->el_line.lastchar = '\0'; /* just in case */
+
+ i = strcspn(el->el_line.cursor, match_chars);
+ o_ch = el->el_line.cursor[i];
+ if (o_ch == 0)
+ return CC_ERROR;
+ delta = strchr(match_chars, o_ch) - match_chars;
+ c_ch = match_chars[delta ^ 1];
+ count = 1;
+ delta = 1 - (delta & 1) * 2;
+
+ for (cp = &el->el_line.cursor[i]; count; ) {
+ cp += delta;
+ if (cp < el->el_line.buffer || cp >= el->el_line.lastchar)
+ return CC_ERROR;
+ if (*cp == o_ch)
+ count++;
+ else if (*cp == c_ch)
+ count--;
+ }
+
+ el->el_line.cursor = cp;
+
+ if (el->el_chared.c_vcmd.action != NOP) {
+ /* NB posix says char under cursor should NOT be deleted
+ for -ve delta - this is different to netbsd vi. */
+ if (delta > 0)
+ el->el_line.cursor++;
+ cv_delfini(el);
+ return (CC_REFRESH);
+ }
+ return (CC_CURSOR);
+}
+
+/* vi_undo_line():
+ * Vi undo all changes to line
+ * [U]
+ */
+protected el_action_t
+/*ARGSUSED*/
+vi_undo_line(EditLine *el, int c __attribute__((unused)))
+{
+
+ cv_undo(el);
+ return hist_get(el);
+}
+
+/* vi_to_column():
+ * Vi go to specified column
+ * [|]
+ * NB netbsd vi goes to screen column 'n', posix says nth character
+ */
+protected el_action_t
+/*ARGSUSED*/
+vi_to_column(EditLine *el, int c __attribute__((unused)))
+{
+
+ el->el_line.cursor = el->el_line.buffer;
+ el->el_state.argument--;
+ return ed_next_char(el, 0);
+}
+
+/* vi_yank_end():
+ * Vi yank to end of line
+ * [Y]
+ */
+protected el_action_t
+/*ARGSUSED*/
+vi_yank_end(EditLine *el, int c __attribute__((unused)))
+{
+
+ cv_yank(el, el->el_line.cursor,
+ el->el_line.lastchar - el->el_line.cursor);
+ return CC_REFRESH;
+}
+
+/* vi_yank():
+ * Vi yank
+ * [y]
+ */
+protected el_action_t
+/*ARGSUSED*/
+vi_yank(EditLine *el, int c __attribute__((unused)))
+{
+
+ return cv_action(el, YANK);
+}
+
+/* vi_comment_out():
+ * Vi comment out current command
+ * [c]
+ */
+protected el_action_t
+/*ARGSUSED*/
+vi_comment_out(EditLine *el, int c __attribute__((unused)))
+{
+
+ el->el_line.cursor = el->el_line.buffer;
+ c_insert(el, 1);
+ *el->el_line.cursor = '#';
+ re_refresh(el);
+ return ed_newline(el, 0);
+}
+
+/* vi_alias():
+ * Vi include shell alias
+ * [@]
+ * NB: posix impiles that we should enter insert mode, however
+ * this is against historical precedent...
+ */
+protected el_action_t
+/*ARGSUSED*/
+vi_alias(EditLine *el __attribute__((unused)), int c __attribute__((unused)))
+{
+#ifdef __weak_extern
+ char alias_name[3];
+ char *alias_text;
+ extern char *get_alias_text(const char *);
+ __weak_extern(get_alias_text);
+
+ if (get_alias_text == 0) {
+ return CC_ERROR;
+ }
+
+ alias_name[0] = '_';
+ alias_name[2] = 0;
+ if (el_getc(el, &alias_name[1]) != 1)
+ return CC_ERROR;
+
+ alias_text = get_alias_text(alias_name);
+ if (alias_text != NULL)
+ el_push(el, alias_text);
+ return CC_NORM;
+#else
+ return CC_ERROR;
+#endif
+}
+
+/* vi_to_history_line():
+ * Vi go to specified history file line.
+ * [G]
+ */
+protected el_action_t
+/*ARGSUSED*/
+vi_to_history_line(EditLine *el, int c __attribute__((unused)))
+{
+ int sv_event_no = el->el_history.eventno;
+ el_action_t rval;
+
+
+ if (el->el_history.eventno == 0) {
+ (void) strncpy(el->el_history.buf, el->el_line.buffer,
+ EL_BUFSIZ);
+ el->el_history.last = el->el_history.buf +
+ (el->el_line.lastchar - el->el_line.buffer);
+ }
+
+ /* Lack of a 'count' means oldest, not 1 */
+ if (!el->el_state.doingarg) {
+ el->el_history.eventno = 0x7fffffff;
+ hist_get(el);
+ } else {
+ /* This is brain dead, all the rest of this code counts
+ * upwards going into the past. Here we need count in the
+ * other direction (to match the output of fc -l).
+ * I could change the world, but this seems to suffice.
+ */
+ el->el_history.eventno = 1;
+ if (hist_get(el) == CC_ERROR)
+ return CC_ERROR;
+ el->el_history.eventno = 1 + el->el_history.ev.num
+ - el->el_state.argument;
+ if (el->el_history.eventno < 0) {
+ el->el_history.eventno = sv_event_no;
+ return CC_ERROR;
+ }
+ }
+ rval = hist_get(el);
+ if (rval == CC_ERROR)
+ el->el_history.eventno = sv_event_no;
+ return rval;
+}
+
+/* vi_histedit():
+ * Vi edit history line with vi
+ * [v]
+ */
+protected el_action_t
+/*ARGSUSED*/
+vi_histedit(EditLine *el, int c __attribute__((unused)))
+{
+ int fd;
+ pid_t pid;
+ int st;
+ char tempfile[] = "/tmp/histedit.XXXXXXXXXX";
+ char *cp;
+
+ if (el->el_state.doingarg) {
+ if (vi_to_history_line(el, 0) == CC_ERROR)
+ return CC_ERROR;
+ }
+
+ fd = mkstemp(tempfile);
+ if (fd < 0)
+ return CC_ERROR;
+ cp = el->el_line.buffer;
+ write(fd, cp, el->el_line.lastchar - cp +0u);
+ write(fd, "\n", 1);
+ pid = fork();
+ switch (pid) {
+ case -1:
+ close(fd);
+ unlink(tempfile);
+ return CC_ERROR;
+ case 0:
+ close(fd);
+ execlp("vi", "vi", tempfile, 0);
+ exit(0);
+ /*NOTREACHED*/
+ default:
+ while (waitpid(pid, &st, 0) != pid)
+ continue;
+ lseek(fd, 0ll, SEEK_SET);
+ st = read(fd, cp, el->el_line.limit - cp +0u);
+ if (st > 0 && cp[st - 1] == '\n')
+ st--;
+ el->el_line.cursor = cp;
+ el->el_line.lastchar = cp + st;
+ break;
+ }
+
+ close(fd);
+ unlink(tempfile);
+ /* return CC_REFRESH; */
+ return ed_newline(el, 0);
+}
+
+/* vi_history_word():
+ * Vi append word from previous input line
+ * [_]
+ * Who knows where this one came from!
+ * '_' in vi means 'entire current line', so 'cc' is a synonym for 'c_'
+ */
+protected el_action_t
+/*ARGSUSED*/
+vi_history_word(EditLine *el, int c __attribute__((unused)))
+{
+ const char *wp = HIST_FIRST(el);
+ const char *wep, *wsp;
+ int len;
+ char *cp;
+ const char *lim;
+
+ if (wp == NULL)
+ return CC_ERROR;
+
+ wep = wsp = 0;
+ do {
+ while (isspace((unsigned char)*wp))
+ wp++;
+ if (*wp == 0)
+ break;
+ wsp = wp;
+ while (*wp && !isspace((unsigned char)*wp))
+ wp++;
+ wep = wp;
+ } while ((!el->el_state.doingarg || --el->el_state.argument > 0) && *wp != 0);
+
+ if (wsp == 0 || (el->el_state.doingarg && el->el_state.argument != 0))
+ return CC_ERROR;
+
+ cv_undo(el);
+ len = wep - wsp;
+ if (el->el_line.cursor < el->el_line.lastchar)
+ el->el_line.cursor++;
+ c_insert(el, len + 1);
+ cp = el->el_line.cursor;
+ lim = el->el_line.limit;
+ if (cp < lim)
+ *cp++ = ' ';
+ while (wsp < wep && cp < lim)
+ *cp++ = *wsp++;
+ el->el_line.cursor = cp;
+
+ el->el_map.current = el->el_map.key;
+ return CC_REFRESH;
+}
+
+/* vi_redo():
+ * Vi redo last non-motion command
+ * [.]
+ */
+protected el_action_t
+/*ARGSUSED*/
+vi_redo(EditLine *el, int c __attribute__((unused)))
+{
+ c_redo_t *r = &el->el_chared.c_redo;
+
+ if (!el->el_state.doingarg && r->count) {
+ el->el_state.doingarg = 1;
+ el->el_state.argument = r->count;
+ }
+
+ el->el_chared.c_vcmd.pos = el->el_line.cursor;
+ el->el_chared.c_vcmd.action = r->action;
+ if (r->pos != r->buf) {
+ if (r->pos + 1 > r->lim)
+ /* sanity */
+ r->pos = r->lim - 1;
+ r->pos[0] = 0;
+ el_push(el, r->buf);
+ }
- return el->el_search.chadir == CHAR_BACK ?
- cv_csearch_fwd(el, el->el_search.chacha, el->el_state.argument, 0) :
- cv_csearch_back(el, el->el_search.chacha, el->el_state.argument, 0);
+ el->el_state.thiscmd = r->cmd;
+ el->el_state.thisch = r->ch;
+ return (*el->el_map.func[r->cmd])(el, r->ch);
}
diff --git a/configure.in b/configure.in
index 288454d2c6c..42ef9265902 100644
--- a/configure.in
+++ b/configure.in
@@ -2341,7 +2341,7 @@ then
readline_topdir="cmd-line-utils"
readline_basedir="libedit"
readline_dir="$readline_topdir/$readline_basedir"
- readline_link="\$(top_builddir)/cmd-line-utils/libedit/liblibedit.a"
+ readline_link="\$(top_builddir)/cmd-line-utils/libedit/libedit.a"
readline_h_ln_cmd="\$(LN) -s \$(top_builddir)/cmd-line-utils/libedit/readline readline"
compile_libedit=yes
AC_DEFINE_UNQUOTED(HAVE_HIST_ENTRY)