Commit 0e52a458 authored by vva@eagle.mysql.r18.ru's avatar vva@eagle.mysql.r18.ru

Merge vvagin@bk-internal.mysql.com:/home/bk/mysql-4.1

into eagle.mysql.r18.ru:/home/vva/work/BUG_libedit/mysql-4.1.clear
parents 06affe9b 3d944460
...@@ -258,7 +258,7 @@ cmd-line-utils/libedit/common.h ...@@ -258,7 +258,7 @@ cmd-line-utils/libedit/common.h
cmd-line-utils/libedit/makelist cmd-line-utils/libedit/makelist
comon.h comon.h
config.cache config.cache
config.h ./config.h
config.h.in config.h.in
config.log config.log
config.status config.status
......
...@@ -7,28 +7,30 @@ AHDR=vi.h emacs.h common.h ...@@ -7,28 +7,30 @@ AHDR=vi.h emacs.h common.h
INCLUDES = -I$(top_srcdir)/include -I$(srcdir)/../.. -I.. 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 \ libedit_a_SOURCES = chared.c el.c history.c map.c prompt.c readline.c \
prompt.c readline.c search.c \ search.c tokenizer.c vi.c common.c emacs.c \
strlcpy.c tokenizer.c vi.c common.c \ hist.c key.c parse.c read.c refresh.c sig.c term.c \
emacs.c hist.c key.c parse.c read.c \ tty.c help.c fcns.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 pkginclude_HEADERS = readline/readline.h
noinst_HEADERS = chared.h el.h histedit.h key.h \ noinst_HEADERS = chared.h el.h histedit.h key.h parse.h refresh.h sig.h \
parse.h refresh.h sig.h sys.h \ sys.h tokenizer.h config.h hist.h map.h prompt.h \
tokenizer.h compat.h compat_conf.h fgetln.h \ search.h tty.h
hist.h map.h prompt.h search.h \
strlcpy.h libedit_term.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 SUFFIXES = .sh
...@@ -73,13 +75,11 @@ fcns.c: ${AHDR} fcns.h makelist ...@@ -73,13 +75,11 @@ fcns.c: ${AHDR} fcns.h makelist
chared.o: vi.h emacs.h common.h help.h fcns.h chared.o: vi.h emacs.h common.h help.h fcns.h
el.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 history.o: vi.h emacs.h common.h help.h fcns.h
map.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 prompt.o: vi.h emacs.h common.h help.h fcns.h
readline.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 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 tokenizer.o: vi.h emacs.h common.h help.h fcns.h
vi.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 common.o: vi.h emacs.h common.h help.h fcns.h
......
/* $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 * Copyright (c) 1992, 1993
...@@ -36,13 +36,18 @@ ...@@ -36,13 +36,18 @@
* SUCH DAMAGE. * 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 * chared.c: Character editor utilities
*/ */
#include "sys.h"
#include <stdlib.h> #include <stdlib.h>
#include "el.h" #include "el.h"
...@@ -53,17 +58,36 @@ ...@@ -53,17 +58,36 @@
* Handle state for the vi undo command * Handle state for the vi undo command
*/ */
protected void 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; c_undo_t *vu = &el->el_chared.c_undo;
vu->action = action; c_redo_t *r = &el->el_chared.c_redo;
vu->ptr = ptr; uint size;
vu->isize = size;
(void) memcpy(vu->buf, vu->ptr, size); /* Save entire line for undo */
#ifdef DEBUG_UNDO size = el->el_line.lastchar - el->el_line.buffer;
(void) fprintf(el->el_errfile, "Undo buffer \"%s\" size = +%d -%d\n", vu->len = size;
vu->ptr, vu->isize, vu->dsize); vu->cursor = el->el_line.cursor - el->el_line.buffer;
#endif 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) ...@@ -75,8 +99,10 @@ c_insert(EditLine *el, int num)
{ {
char *cp; char *cp;
if (el->el_line.lastchar + num >= el->el_line.limit) if (el->el_line.lastchar + num >= el->el_line.limit) {
if (!ch_enlargebufs(el, num +0u))
return; /* can't go past end of buffer */ return; /* can't go past end of buffer */
}
if (el->el_line.cursor < el->el_line.lastchar) { if (el->el_line.cursor < el->el_line.lastchar) {
/* if I must move chars */ /* if I must move chars */
...@@ -97,12 +123,14 @@ c_delafter(EditLine *el, int num) ...@@ -97,12 +123,14 @@ c_delafter(EditLine *el, int num)
if (el->el_line.cursor + num > el->el_line.lastchar) if (el->el_line.cursor + num > el->el_line.lastchar)
num = el->el_line.lastchar - el->el_line.cursor; 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) { if (num > 0) {
char *cp; 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++) for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++)
*cp = cp[num]; *cp = cp[num];
...@@ -121,13 +149,14 @@ c_delbefore(EditLine *el, int num) ...@@ -121,13 +149,14 @@ c_delbefore(EditLine *el, int num)
if (el->el_line.cursor - num < el->el_line.buffer) if (el->el_line.cursor - num < el->el_line.buffer)
num = el->el_line.cursor - 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) { if (num > 0) {
char *cp; 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; for (cp = el->el_line.cursor - num;
cp <= el->el_line.lastchar; cp <= el->el_line.lastchar;
cp++) cp++)
...@@ -144,7 +173,7 @@ c_delbefore(EditLine *el, int num) ...@@ -144,7 +173,7 @@ c_delbefore(EditLine *el, int num)
protected int protected int
ce__isword(int p) ce__isword(int p)
{ {
return (isalpha(p) || isdigit(p) || strchr("*?_-.[]~=", p) != NULL); return (isalnum(p) || strchr("*?_-.[]~=", p) != NULL);
} }
...@@ -153,6 +182,20 @@ ce__isword(int p) ...@@ -153,6 +182,20 @@ ce__isword(int p)
*/ */
protected int protected int
cv__isword(int p) 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)); return (!isspace(p));
} }
...@@ -216,7 +259,7 @@ cv_next_word(EditLine *el, char *p, char *high, int n, int (*wtest)(int)) ...@@ -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 * vi historically deletes with cw only the word preserving the
* trailing whitespace! This is not what 'w' does.. * 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)) while ((p < high) && isspace((unsigned char) *p))
p++; p++;
} }
...@@ -233,26 +276,19 @@ cv_next_word(EditLine *el, char *p, char *high, int n, int (*wtest)(int)) ...@@ -233,26 +276,19 @@ cv_next_word(EditLine *el, char *p, char *high, int n, int (*wtest)(int))
* Find the previous word vi style * Find the previous word vi style
*/ */
protected char * 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; int test;
while (n--) {
p--; p--;
/* while (n--) {
* 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)) while ((p > low) && isspace((unsigned char) *p))
p--; p--;
test = (*wtest)((unsigned char) *p); test = (*wtest)((unsigned char) *p);
while ((p >= low) && (*wtest)((unsigned char) *p) == test) while ((p >= low) && (*wtest)((unsigned char) *p) == test)
p--; p--;
p++;
while (isspace((unsigned char) *p))
p++;
} }
p++;
/* p now points where we want it */ /* p now points where we want it */
if (p < low) if (p < low)
...@@ -303,47 +339,34 @@ protected void ...@@ -303,47 +339,34 @@ protected void
cv_delfini(EditLine *el) cv_delfini(EditLine *el)
{ {
int size; 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; 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) if (el->el_chared.c_vcmd.pos == 0)
/* sanity */
return; return;
size = el->el_line.cursor - el->el_chared.c_vcmd.pos;
if (el->el_line.cursor > el->el_chared.c_vcmd.pos) { if (size == 0)
size = (int) (el->el_line.cursor - el->el_chared.c_vcmd.pos); size = 1;
c_delbefore(el, size);
el->el_line.cursor = el->el_chared.c_vcmd.pos; el->el_line.cursor = el->el_chared.c_vcmd.pos;
re_refresh_cursor(el); if (action & YANK) {
} else if (el->el_line.cursor < el->el_chared.c_vcmd.pos) { if (size > 0)
size = (int)(el->el_chared.c_vcmd.pos - el->el_line.cursor); cv_yank(el, el->el_line.cursor, size);
c_delafter(el, size); else
cv_yank(el, el->el_line.cursor + size, -size);
} else { } else {
size = 1; if (size > 0) {
c_delafter(el, size); c_delafter(el, size);
re_refresh_cursor(el);
} else {
c_delbefore(el, -size);
el->el_line.cursor += 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_chared.c_vcmd.action = NOP;
el->el_chared.c_undo.ptr = el->el_line.cursor;
el->el_chared.c_undo.dsize = size;
} }
...@@ -373,20 +396,18 @@ ce__endword(char *p, char *high, int n) ...@@ -373,20 +396,18 @@ ce__endword(char *p, char *high, int n)
* Go to the end of this word according to vi * Go to the end of this word according to vi
*/ */
protected char * protected char *
cv__endword(char *p, char *high, int n) cv__endword(char *p, char *high, int n, int (*wtest)(int))
{ {
int test;
p++; p++;
while (n--) { while (n--) {
while ((p < high) && isspace((unsigned char) *p)) while ((p < high) && isspace((unsigned char) *p))
p++; p++;
if (isalnum((unsigned char) *p)) test = (*wtest)((unsigned char) *p);
while ((p < high) && isalnum((unsigned char) *p)) while ((p < high) && (*wtest)((unsigned char) *p) == test)
p++;
else
while ((p < high) && !(isspace((unsigned char) *p) ||
isalnum((unsigned char) *p)))
p++; p++;
} }
p--; p--;
...@@ -406,20 +427,23 @@ ch_init(EditLine *el) ...@@ -406,20 +427,23 @@ ch_init(EditLine *el)
(void) memset(el->el_line.buffer, 0, EL_BUFSIZ); (void) memset(el->el_line.buffer, 0, EL_BUFSIZ);
el->el_line.cursor = el->el_line.buffer; el->el_line.cursor = el->el_line.buffer;
el->el_line.lastchar = 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); el->el_chared.c_undo.buf = (char *) el_malloc(EL_BUFSIZ);
if (el->el_chared.c_undo.buf == NULL) if (el->el_chared.c_undo.buf == NULL)
return (-1); return (-1);
(void) memset(el->el_chared.c_undo.buf, 0, EL_BUFSIZ); (void) memset(el->el_chared.c_undo.buf, 0, EL_BUFSIZ);
el->el_chared.c_undo.action = NOP; el->el_chared.c_undo.len = -1;
el->el_chared.c_undo.isize = 0; el->el_chared.c_undo.cursor = 0;
el->el_chared.c_undo.dsize = 0; el->el_chared.c_redo.buf = (char *) el_malloc(EL_BUFSIZ);
el->el_chared.c_undo.ptr = el->el_line.buffer; 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.action = NOP;
el->el_chared.c_vcmd.pos = el->el_line.buffer; 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); el->el_chared.c_kill.buf = (char *) el_malloc(EL_BUFSIZ);
if (el->el_chared.c_kill.buf == NULL) if (el->el_chared.c_kill.buf == NULL)
...@@ -454,14 +478,11 @@ ch_reset(EditLine *el) ...@@ -454,14 +478,11 @@ ch_reset(EditLine *el)
el->el_line.cursor = el->el_line.buffer; el->el_line.cursor = el->el_line.buffer;
el->el_line.lastchar = el->el_line.buffer; el->el_line.lastchar = el->el_line.buffer;
el->el_chared.c_undo.action = NOP; el->el_chared.c_undo.len = -1;
el->el_chared.c_undo.isize = 0; el->el_chared.c_undo.cursor = 0;
el->el_chared.c_undo.dsize = 0;
el->el_chared.c_undo.ptr = el->el_line.buffer;
el->el_chared.c_vcmd.action = NOP; el->el_chared.c_vcmd.action = NOP;
el->el_chared.c_vcmd.pos = el->el_line.buffer; 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; el->el_chared.c_kill.mark = el->el_line.buffer;
...@@ -516,7 +537,8 @@ ch_enlargebufs(el, addlen) ...@@ -516,7 +537,8 @@ ch_enlargebufs(el, addlen)
el->el_line.buffer = newbuffer; el->el_line.buffer = newbuffer;
el->el_line.cursor = newbuffer + (el->el_line.cursor - oldbuf); el->el_line.cursor = newbuffer + (el->el_line.cursor - oldbuf);
el->el_line.lastchar = newbuffer + (el->el_line.lastchar - 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. * Reallocate kill buffer.
...@@ -545,14 +567,22 @@ ch_enlargebufs(el, addlen) ...@@ -545,14 +567,22 @@ ch_enlargebufs(el, addlen)
/* zero the newly added memory, leave old data in */ /* zero the newly added memory, leave old data in */
(void) memset(&newbuffer[sz], 0, newsz - sz); (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; 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)) if (!hist_enlargebuf(el, sz, newsz))
return 0; return 0;
/* Safe to set enlarged buffer size */
el->el_line.limit = &newbuffer[newsz - EL_LEAVE];
return 1; return 1;
} }
...@@ -567,6 +597,11 @@ ch_end(EditLine *el) ...@@ -567,6 +597,11 @@ ch_end(EditLine *el)
el->el_line.limit = NULL; el->el_line.limit = NULL;
el_free((ptr_t) el->el_chared.c_undo.buf); el_free((ptr_t) el->el_chared.c_undo.buf);
el->el_chared.c_undo.buf = NULL; 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_free((ptr_t) el->el_chared.c_kill.buf);
el->el_chared.c_kill.buf = NULL; el->el_chared.c_kill.buf = NULL;
el_free((ptr_t) el->el_chared.c_macro.macro); el_free((ptr_t) el->el_chared.c_macro.macro);
...@@ -619,51 +654,64 @@ el_deletestr(EditLine *el, int n) ...@@ -619,51 +654,64 @@ el_deletestr(EditLine *el, int n)
* Get a string * Get a string
*/ */
protected int protected int
c_gets(EditLine *el, char *buf) c_gets(EditLine *el, char *buf, const char *prompt)
{ {
char ch; 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) { switch (ch) {
case 0010: /* Delete and backspace */ case 0010: /* Delete and backspace */
case 0177: case 0177:
if (len > 1) { if (len <= 0) {
*el->el_line.cursor-- = '\0'; len = -1;
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);
}
re_refresh(el);
ch = 0;
break; break;
}
cp--;
continue;
case 0033: /* ESC */ case 0033: /* ESC */
case '\r': /* Newline */ case '\r': /* Newline */
case '\n': case '\n':
buf[len] = ch;
break; break;
default: default:
if (len >= EL_BUFSIZ) if (len >= EL_BUFSIZ - 16)
term_beep(el); term_beep(el);
else { else {
buf[len++] = ch; buf[len++] = ch;
*el->el_line.cursor++ = ch; *cp++ = ch;
el->el_line.lastchar = el->el_line.cursor;
} }
re_refresh(el); continue;
ch = 0;
break;
} }
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;
} }
......
/* $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 * Copyright (c) 1992, 1993
...@@ -71,23 +71,31 @@ typedef struct c_macro_t { ...@@ -71,23 +71,31 @@ typedef struct c_macro_t {
} 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 { typedef struct c_undo_t {
int action; int len; /* length of saved line */
size_t isize; int cursor; /* position of saved cursor */
size_t dsize; char *buf; /* full saved text */
char *ptr;
char *buf;
} c_undo_t; } 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 * Current action information for vi
*/ */
typedef struct c_vcmd_t { typedef struct c_vcmd_t {
int action; int action;
char *pos; char *pos;
char *ins;
} c_vcmd_t; } c_vcmd_t;
/* /*
...@@ -106,6 +114,7 @@ typedef struct c_kill_t { ...@@ -106,6 +114,7 @@ typedef struct c_kill_t {
typedef struct el_chared_t { typedef struct el_chared_t {
c_undo_t c_undo; c_undo_t c_undo;
c_kill_t c_kill; c_kill_t c_kill;
c_redo_t c_redo;
c_vcmd_t c_vcmd; c_vcmd_t c_vcmd;
c_macro_t c_macro; c_macro_t c_macro;
} el_chared_t; } el_chared_t;
...@@ -120,10 +129,10 @@ typedef struct el_chared_t { ...@@ -120,10 +129,10 @@ typedef struct el_chared_t {
#define NOP 0x00 #define NOP 0x00
#define DELETE 0x01 #define DELETE 0x01
#define INSERT 0x02 #define INSERT 0x02
#define CHANGE 0x04 #define YANK 0x04
#define CHAR_FWD 0 #define CHAR_FWD (+1)
#define CHAR_BACK 1 #define CHAR_BACK (-1)
#define MODE_INSERT 0 #define MODE_INSERT 0
#define MODE_REPLACE 1 #define MODE_REPLACE 1
...@@ -137,23 +146,25 @@ typedef struct el_chared_t { ...@@ -137,23 +146,25 @@ typedef struct el_chared_t {
protected int cv__isword(int); protected int cv__isword(int);
protected int cv__isWord(int);
protected void cv_delfini(EditLine *); 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 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_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__next_word(char *, char *, int, int (*)(int));
protected char *c__prev_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_insert(EditLine *, int);
protected void c_delbefore(EditLine *, int); protected void c_delbefore(EditLine *, int);
protected void c_delafter(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 c_hpos(EditLine *);
protected int ch_init(EditLine *); protected int ch_init(EditLine *);
protected void ch_reset(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 *); protected void ch_end(EditLine *);
#endif /* _h_el_chared */ #endif /* _h_el_chared */
/* $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 * Copyright (c) 1992, 1993
...@@ -36,12 +36,18 @@ ...@@ -36,12 +36,18 @@
* SUCH DAMAGE. * 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 * common.c: Common Editor functions
*/ */
#include "sys.h"
#include "el.h" #include "el.h"
/* ed_end_of_file(): /* ed_end_of_file():
...@@ -66,7 +72,7 @@ ed_end_of_file(EditLine *el, int c __attribute__((unused))) ...@@ -66,7 +72,7 @@ ed_end_of_file(EditLine *el, int c __attribute__((unused)))
protected el_action_t protected el_action_t
ed_insert(EditLine *el, int c) ed_insert(EditLine *el, int c)
{ {
int i; int count = el->el_state.argument;
if (c == '\0') if (c == '\0')
return (CC_ERROR); return (CC_ERROR);
...@@ -74,42 +80,28 @@ ed_insert(EditLine *el, int c) ...@@ -74,42 +80,28 @@ ed_insert(EditLine *el, int c)
if (el->el_line.lastchar + el->el_state.argument >= if (el->el_line.lastchar + el->el_state.argument >=
el->el_line.limit) { el->el_line.limit) {
/* end of buffer space, try to allocate more */ /* 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 */ return CC_ERROR; /* error allocating more */
} }
if (el->el_state.argument == 1) { if (count == 1) {
if (el->el_state.inputmode != MODE_INSERT) { 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_line.lastchar)
*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); c_insert(el, 1);
*el->el_line.cursor++ = c; *el->el_line.cursor++ = c;
el->el_state.doingarg = 0; /* just in case */
re_fastaddc(el); /* fast refresh for one char. */ re_fastaddc(el); /* fast refresh for one char. */
} else { } else {
if (el->el_state.inputmode != MODE_INSERT) { if (el->el_state.inputmode != MODE_REPLACE_1)
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); 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; *el->el_line.cursor++ = c;
re_refresh(el); re_refresh(el);
} }
if (el->el_state.inputmode == MODE_REPLACE_1) if (el->el_state.inputmode == MODE_REPLACE_1)
(void) vi_command_mode(el, 0); return vi_command_mode(el, 0);
return (CC_NORM); return (CC_NORM);
} }
...@@ -229,7 +221,7 @@ ed_move_to_end(EditLine *el, int c __attribute__((unused))) ...@@ -229,7 +221,7 @@ ed_move_to_end(EditLine *el, int c __attribute__((unused)))
#ifdef VI_MOVE #ifdef VI_MOVE
el->el_line.cursor--; el->el_line.cursor--;
#endif #endif
if (el->el_chared.c_vcmd.action & DELETE) { if (el->el_chared.c_vcmd.action != NOP) {
cv_delfini(el); cv_delfini(el);
return (CC_REFRESH); return (CC_REFRESH);
} }
...@@ -253,7 +245,7 @@ ed_move_to_beg(EditLine *el, int c __attribute__((unused))) ...@@ -253,7 +245,7 @@ ed_move_to_beg(EditLine *el, int c __attribute__((unused)))
/* We want FIRST non space character */ /* We want FIRST non space character */
while (isspace((unsigned char) *el->el_line.cursor)) while (isspace((unsigned char) *el->el_line.cursor))
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); cv_delfini(el);
return (CC_REFRESH); return (CC_REFRESH);
} }
...@@ -295,16 +287,20 @@ protected el_action_t ...@@ -295,16 +287,20 @@ protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_next_char(EditLine *el, int c __attribute__((unused))) 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); return (CC_ERROR);
el->el_line.cursor += el->el_state.argument; el->el_line.cursor += el->el_state.argument;
if (el->el_line.cursor > el->el_line.lastchar) if (el->el_line.cursor > lim)
el->el_line.cursor = el->el_line.lastchar; el->el_line.cursor = lim;
if (el->el_map.type == MAP_VI) 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); cv_delfini(el);
return (CC_REFRESH); return (CC_REFRESH);
} }
...@@ -330,7 +326,7 @@ ed_prev_word(EditLine *el, int c __attribute__((unused))) ...@@ -330,7 +326,7 @@ ed_prev_word(EditLine *el, int c __attribute__((unused)))
ce__isword); ce__isword);
if (el->el_map.type == MAP_VI) 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); cv_delfini(el);
return (CC_REFRESH); return (CC_REFRESH);
} }
...@@ -353,7 +349,7 @@ ed_prev_char(EditLine *el, int c __attribute__((unused))) ...@@ -353,7 +349,7 @@ ed_prev_char(EditLine *el, int c __attribute__((unused)))
el->el_line.cursor = el->el_line.buffer; el->el_line.cursor = el->el_line.buffer;
if (el->el_map.type == MAP_VI) if (el->el_map.type == MAP_VI)
if (el->el_chared.c_vcmd.action & DELETE) { if (el->el_chared.c_vcmd.action != NOP) {
cv_delfini(el); cv_delfini(el);
return (CC_REFRESH); return (CC_REFRESH);
} }
...@@ -405,25 +401,9 @@ ed_digit(EditLine *el, int c) ...@@ -405,25 +401,9 @@ ed_digit(EditLine *el, int c)
(el->el_state.argument * 10) + (c - '0'); (el->el_state.argument * 10) + (c - '0');
} }
return (CC_ARGHACK); 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) { return ed_insert(el, c);
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);
} }
...@@ -457,12 +437,11 @@ ed_argument_digit(EditLine *el, int c) ...@@ -457,12 +437,11 @@ ed_argument_digit(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_unassigned(EditLine *el, int c __attribute__((unused))) ed_unassigned(EditLine *el __attribute__((unused)),
int c __attribute__((unused)))
{ {
term_beep(el); return (CC_ERROR);
term__flush();
return (CC_NORM);
} }
...@@ -580,8 +559,6 @@ ed_newline(EditLine *el, int c __attribute__((unused))) ...@@ -580,8 +559,6 @@ ed_newline(EditLine *el, int c __attribute__((unused)))
re_goto_bottom(el); re_goto_bottom(el);
*el->el_line.lastchar++ = '\n'; *el->el_line.lastchar++ = '\n';
*el->el_line.lastchar = '\0'; *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); return (CC_NEWLINE);
} }
...@@ -672,8 +649,9 @@ protected el_action_t ...@@ -672,8 +649,9 @@ protected el_action_t
ed_prev_history(EditLine *el, int c __attribute__((unused))) ed_prev_history(EditLine *el, int c __attribute__((unused)))
{ {
char beep = 0; 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 */ *el->el_line.lastchar = '\0'; /* just in case */
if (el->el_history.eventno == 0) { /* save the current buffer if (el->el_history.eventno == 0) { /* save the current buffer
...@@ -686,15 +664,17 @@ ed_prev_history(EditLine *el, int c __attribute__((unused))) ...@@ -686,15 +664,17 @@ ed_prev_history(EditLine *el, int c __attribute__((unused)))
el->el_history.eventno += el->el_state.argument; el->el_history.eventno += el->el_state.argument;
if (hist_get(el) == CC_ERROR) { if (hist_get(el) == CC_ERROR) {
if (el->el_map.type == MAP_VI) {
el->el_history.eventno = sv_event;
return CC_ERROR;
}
beep = 1; beep = 1;
/* el->el_history.eventno was fixed by first call */ /* el->el_history.eventno was fixed by first call */
(void) hist_get(el); (void) hist_get(el);
} }
re_refresh(el);
if (beep) if (beep)
return (CC_ERROR); return CC_REFRESH_BEEP;
else return CC_REFRESH;
return (CC_NORM); /* was CC_UP_HIST */
} }
...@@ -706,17 +686,22 @@ protected el_action_t ...@@ -706,17 +686,22 @@ protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_next_history(EditLine *el, int c __attribute__((unused))) 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_line.lastchar = '\0'; /* just in case */
el->el_history.eventno -= el->el_state.argument; el->el_history.eventno -= el->el_state.argument;
if (el->el_history.eventno < 0) { if (el->el_history.eventno < 0) {
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))) ...@@ -733,7 +718,7 @@ ed_search_prev_history(EditLine *el, int c __attribute__((unused)))
bool_t found = 0; bool_t found = 0;
el->el_chared.c_vcmd.action = NOP; 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 */ *el->el_line.lastchar = '\0'; /* just in case */
if (el->el_history.eventno < 0) { if (el->el_history.eventno < 0) {
#ifdef DEBUG_EDIT #ifdef DEBUG_EDIT
...@@ -801,7 +786,7 @@ ed_search_next_history(EditLine *el, int c __attribute__((unused))) ...@@ -801,7 +786,7 @@ ed_search_next_history(EditLine *el, int c __attribute__((unused)))
bool_t found = 0; bool_t found = 0;
el->el_chared.c_vcmd.action = NOP; 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 */ *el->el_line.lastchar = '\0'; /* just in case */
if (el->el_history.eventno == 0) if (el->el_history.eventno == 0)
...@@ -930,25 +915,13 @@ ed_command(EditLine *el, int c __attribute__((unused))) ...@@ -930,25 +915,13 @@ ed_command(EditLine *el, int c __attribute__((unused)))
char tmpbuf[EL_BUFSIZ]; char tmpbuf[EL_BUFSIZ];
int tmplen; int tmplen;
el->el_line.buffer[0] = '\0'; tmplen = c_gets(el, tmpbuf, "\n: ");
el->el_line.lastchar = el->el_line.buffer; term__putc('\n');
el->el_line.cursor = el->el_line.buffer;
c_insert(el, 3); /* prompt + ": " */ if (tmplen < 0 || (tmpbuf[tmplen] = 0, parse_line(el, tmpbuf)) == -1)
*el->el_line.cursor++ = '\n'; term_beep(el);
*el->el_line.cursor++ = ':';
*el->el_line.cursor++ = ' ';
re_refresh(el);
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 (parse_line(el, tmpbuf) == -1) el->el_map.current = el->el_map.key;
return (CC_ERROR); re_clear_display(el);
else return CC_REFRESH;
return (CC_REFRESH);
} }
/* $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 * Copyright (c) 1992, 1993
...@@ -36,13 +36,18 @@ ...@@ -36,13 +36,18 @@
* SUCH DAMAGE. * 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 * el.c: EditLine interface functions
*/ */
#include "sys.h"
#include <sys/types.h> #include <sys/types.h>
#include <sys/param.h> #include <sys/param.h>
#include <string.h> #include <string.h>
...@@ -58,9 +63,6 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr) ...@@ -58,9 +63,6 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr)
{ {
EditLine *el = (EditLine *) el_malloc(sizeof(EditLine)); EditLine *el = (EditLine *) el_malloc(sizeof(EditLine));
#ifdef DEBUG
char *tty;
#endif
if (el == NULL) if (el == NULL)
return (NULL); return (NULL);
...@@ -77,7 +79,11 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr) ...@@ -77,7 +79,11 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr)
*/ */
el->el_flags = 0; 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) key_init(el);
(void) map_init(el); (void) map_init(el);
if (tty_init(el) == -1) if (tty_init(el) == -1)
...@@ -87,6 +93,7 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr) ...@@ -87,6 +93,7 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr)
(void) hist_init(el); (void) hist_init(el);
(void) prompt_init(el); (void) prompt_init(el);
(void) sig_init(el); (void) sig_init(el);
(void) read_init(el);
return (el); return (el);
} }
...@@ -138,11 +145,12 @@ public int ...@@ -138,11 +145,12 @@ public int
el_set(EditLine *el, int op, ...) el_set(EditLine *el, int op, ...)
{ {
va_list va; va_list va;
int rv; int rv = 0;
va_start(va, op);
if (el == NULL) if (el == NULL)
return (-1); return (-1);
va_start(va, op);
switch (op) { switch (op) {
case EL_PROMPT: case EL_PROMPT:
case EL_RPROMPT: case EL_RPROMPT:
...@@ -162,7 +170,6 @@ el_set(EditLine *el, int op, ...) ...@@ -162,7 +170,6 @@ el_set(EditLine *el, int op, ...)
el->el_flags |= HANDLE_SIGNALS; el->el_flags |= HANDLE_SIGNALS;
else else
el->el_flags &= ~HANDLE_SIGNALS; el->el_flags &= ~HANDLE_SIGNALS;
rv = 0;
break; break;
case EL_BIND: case EL_BIND:
...@@ -239,8 +246,20 @@ el_set(EditLine *el, int op, ...) ...@@ -239,8 +246,20 @@ el_set(EditLine *el, int op, ...)
rv = 0; rv = 0;
break; 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: default:
rv = -1; rv = -1;
break;
} }
va_end(va); va_end(va);
...@@ -261,11 +280,11 @@ el_get(EditLine *el, int op, void *ret) ...@@ -261,11 +280,11 @@ el_get(EditLine *el, int op, void *ret)
switch (op) { switch (op) {
case EL_PROMPT: case EL_PROMPT:
case EL_RPROMPT: case EL_RPROMPT:
rv = prompt_get(el, (el_pfunc_t *) & ret, op); rv = prompt_get(el, (void *) &ret, op);
break; break;
case EL_EDITOR: case EL_EDITOR:
rv = map_get_editor(el, (const char **) &ret); rv = map_get_editor(el, (void *) &ret);
break; break;
case EL_SIGNAL: case EL_SIGNAL:
...@@ -349,6 +368,16 @@ el_get(EditLine *el, int op, void *ret) ...@@ -349,6 +368,16 @@ el_get(EditLine *el, int op, void *ret)
break; break;
#endif /* XXX */ #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: default:
rv = -1; rv = -1;
} }
...@@ -367,15 +396,6 @@ el_line(EditLine *el) ...@@ -367,15 +396,6 @@ el_line(EditLine *el)
return (const LineInfo *) (void *) &el->el_line; 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(): /* el_source():
* Source a file * Source a file
...@@ -385,10 +405,14 @@ el_source(EditLine *el, const char *fname) ...@@ -385,10 +405,14 @@ el_source(EditLine *el, const char *fname)
{ {
FILE *fp; FILE *fp;
size_t len; size_t len;
char *ptr, path[LIBEDIT_MAXPATHLEN]; char *ptr;
fp = NULL; fp = NULL;
if (fname == NULL) { if (fname == NULL) {
#ifdef HAVE_ISSETUGID
static const char elpath[] = "/.editrc";
char path[MAXPATHLEN];
if (issetugid()) if (issetugid())
return (-1); return (-1);
if ((ptr = getenv("HOME")) == NULL) if ((ptr = getenv("HOME")) == NULL)
...@@ -398,6 +422,14 @@ el_source(EditLine *el, const char *fname) ...@@ -398,6 +422,14 @@ el_source(EditLine *el, const char *fname)
if (strlcat(path, elpath, sizeof(path)) >= sizeof(path)) if (strlcat(path, elpath, sizeof(path)) >= sizeof(path))
return (-1); return (-1);
fname = path; 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) if (fp == NULL)
fp = fopen(fname, "r"); fp = fopen(fname, "r");
......
/* $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 * Copyright (c) 1992, 1993
...@@ -84,6 +84,8 @@ typedef struct el_state_t { ...@@ -84,6 +84,8 @@ typedef struct el_state_t {
int argument; /* Numeric argument */ int argument; /* Numeric argument */
int metanext; /* Is the next char a meta char */ int metanext; /* Is the next char a meta char */
el_action_t lastcmd; /* Previous command */ el_action_t lastcmd; /* Previous command */
el_action_t thiscmd; /* this command */
char thisch; /* char that generated it */
} el_state_t; } el_state_t;
/* /*
...@@ -96,7 +98,7 @@ typedef struct el_state_t { ...@@ -96,7 +98,7 @@ typedef struct el_state_t {
#include "tty.h" #include "tty.h"
#include "prompt.h" #include "prompt.h"
#include "key.h" #include "key.h"
#include "libedit_term.h" #include "term.h"
#include "refresh.h" #include "refresh.h"
#include "chared.h" #include "chared.h"
#include "common.h" #include "common.h"
...@@ -106,6 +108,7 @@ typedef struct el_state_t { ...@@ -106,6 +108,7 @@ typedef struct el_state_t {
#include "parse.h" #include "parse.h"
#include "sig.h" #include "sig.h"
#include "help.h" #include "help.h"
#include "read.h"
struct editline { struct editline {
char *el_prog; /* the program name */ char *el_prog; /* the program name */
...@@ -116,6 +119,7 @@ struct editline { ...@@ -116,6 +119,7 @@ struct editline {
coord_t el_cursor; /* Cursor location */ coord_t el_cursor; /* Cursor location */
char **el_display; /* Real screen image = what is there */ char **el_display; /* Real screen image = what is there */
char **el_vdisplay; /* Virtual screen image = what we see */ char **el_vdisplay; /* Virtual screen image = what we see */
void *el_data; /* Client data */
el_line_t el_line; /* The current line information */ el_line_t el_line; /* The current line information */
el_state_t el_state; /* Current editor state */ el_state_t el_state; /* Current editor state */
el_term_t el_term; /* Terminal dependent stuff */ el_term_t el_term; /* Terminal dependent stuff */
...@@ -129,13 +133,18 @@ struct editline { ...@@ -129,13 +133,18 @@ struct editline {
el_history_t el_history; /* History stuff */ el_history_t el_history; /* History stuff */
el_search_t el_search; /* Search stuff */ el_search_t el_search; /* Search stuff */
el_signal_t el_signal; /* Signal handling 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 **); protected int el_editmode(EditLine *, int, const char **);
#ifdef DEBUG #ifdef DEBUG
#define EL_ABORT(a) (void) (fprintf(el->el_errfile, "%s, %d: ", \ #define EL_ABORT(a) do { \
__FILE__, __LINE__), fprintf a, abort()) fprintf(el->el_errfile, "%s, %d: ", \
__FILE__, __LINE__); \
fprintf a; \
abort(); \
} while( /*CONSTCOND*/0);
#else #else
#define EL_ABORT(a) abort() #define EL_ABORT(a) abort()
#endif #endif
......
/* $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 * Copyright (c) 1992, 1993
...@@ -36,12 +36,18 @@ ...@@ -36,12 +36,18 @@
* SUCH DAMAGE. * 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 * emacs.c: Emacs functions
*/ */
#include "sys.h"
#include "el.h" #include "el.h"
/* em_delete_or_list(): /* em_delete_or_list():
...@@ -209,7 +215,7 @@ em_copy_region(EditLine *el, int c __attribute__((unused))) ...@@ -209,7 +215,7 @@ em_copy_region(EditLine *el, int c __attribute__((unused)))
{ {
char *kp, *cp; char *kp, *cp;
if (el->el_chared.c_kill.mark) if (!el->el_chared.c_kill.mark)
return (CC_ERROR); return (CC_ERROR);
if (el->el_chared.c_kill.mark > el->el_line.cursor) { if (el->el_chared.c_kill.mark > el->el_line.cursor) {
...@@ -265,7 +271,7 @@ em_next_word(EditLine *el, int c __attribute__((unused))) ...@@ -265,7 +271,7 @@ em_next_word(EditLine *el, int c __attribute__((unused)))
ce__isword); ce__isword);
if (el->el_map.type == MAP_VI) 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); cv_delfini(el);
return (CC_REFRESH); return (CC_REFRESH);
} }
......
/* $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 * Copyright (c) 1992, 1993
...@@ -36,12 +36,18 @@ ...@@ -36,12 +36,18 @@
* SUCH DAMAGE. * 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 * hist.c: History access functions
*/ */
#include "sys.h"
#include <stdlib.h> #include <stdlib.h>
#include "el.h" #include "el.h"
...@@ -126,18 +132,16 @@ hist_get(EditLine *el) ...@@ -126,18 +132,16 @@ hist_get(EditLine *el)
el->el_history.eventno = h; el->el_history.eventno = h;
return (CC_ERROR); 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)); (size_t)(el->el_line.limit - el->el_line.buffer));
el->el_line.lastchar = el->el_line.buffer + strlen(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 > el->el_line.buffer
if (el->el_line.lastchar[-1] == '\n') && el->el_line.lastchar[-1] == '\n')
el->el_line.lastchar--; el->el_line.lastchar--;
if (el->el_line.lastchar[-1] == ' ') if (el->el_line.lastchar > el->el_line.buffer
&& el->el_line.lastchar[-1] == ' ')
el->el_line.lastchar--; el->el_line.lastchar--;
if (el->el_line.lastchar < el->el_line.buffer)
el->el_line.lastchar = el->el_line.buffer;
}
#ifdef KSHVI #ifdef KSHVI
if (el->el_map.type == MAP_VI) if (el->el_map.type == MAP_VI)
el->el_line.cursor = el->el_line.buffer; el->el_line.cursor = el->el_line.buffer;
...@@ -149,22 +153,41 @@ hist_get(EditLine *el) ...@@ -149,22 +153,41 @@ hist_get(EditLine *el)
} }
/* hist_list() /* hist_command()
* List history entries * process a history command
*/ */
protected int protected int
/*ARGSUSED*/ /*ARGSUSED*/
hist_list(EditLine *el, int argc __attribute__((unused)), hist_command(EditLine *el, int argc, const char **argv)
const char **argv __attribute__((unused)))
{ {
const char *str; const char *str;
int num;
HistEvent ev;
if (el->el_history.ref == NULL) if (el->el_history.ref == NULL)
return (-1); return (-1);
if (argc == 0 || strcmp(argv[0], "list") == 1) {
/* List history entries */
for (str = HIST_LAST(el); str != NULL; str = HIST_PREV(el)) for (str = HIST_LAST(el); str != NULL; str = HIST_PREV(el))
(void) fprintf(el->el_outfile, "%d %s", (void) fprintf(el->el_outfile, "%d %s",
el->el_history.ev.num, str); el->el_history.ev.num, str);
return (0); 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() /* hist_enlargebuf()
......
/* $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 * Copyright (c) 1992, 1993
...@@ -66,7 +66,7 @@ typedef struct el_history_t { ...@@ -66,7 +66,7 @@ typedef struct el_history_t {
#define HIST_FIRST(el) HIST_FUN(el, H_FIRST, NULL) #define HIST_FIRST(el) HIST_FUN(el, H_FIRST, NULL)
#define HIST_LAST(el) HIST_FUN(el, H_LAST, NULL) #define HIST_LAST(el) HIST_FUN(el, H_LAST, NULL)
#define HIST_PREV(el) HIST_FUN(el, H_PREV, 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_LOAD(el, fname) HIST_FUN(el, H_LOAD fname)
#define HIST_SAVE(el, fname) HIST_FUN(el, H_SAVE fname) #define HIST_SAVE(el, fname) HIST_FUN(el, H_SAVE fname)
...@@ -74,7 +74,7 @@ protected int hist_init(EditLine *); ...@@ -74,7 +74,7 @@ protected int hist_init(EditLine *);
protected void hist_end(EditLine *); protected void hist_end(EditLine *);
protected el_action_t hist_get(EditLine *); protected el_action_t hist_get(EditLine *);
protected int hist_set(EditLine *, hist_fun_t, ptr_t); 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); protected int hist_enlargebuf(EditLine *, size_t, size_t);
#endif /* _h_el_hist */ #endif /* _h_el_hist */
/* $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 * Copyright (c) 1992, 1993
...@@ -44,6 +44,9 @@ ...@@ -44,6 +44,9 @@
#ifndef _HISTEDIT_H_ #ifndef _HISTEDIT_H_
#define _HISTEDIT_H_ #define _HISTEDIT_H_
#define LIBEDIT_MAJOR 2
#define LIBEDIT_MINOR 6
#include <sys/types.h> #include <sys/types.h>
#include <stdio.h> #include <stdio.h>
...@@ -90,7 +93,7 @@ void el_end(EditLine *); ...@@ -90,7 +93,7 @@ void el_end(EditLine *);
*/ */
const char *el_gets(EditLine *, int *); const char *el_gets(EditLine *, int *);
int el_getc(EditLine *, char *); int el_getc(EditLine *, char *);
void el_push(EditLine *, const char *); void el_push(EditLine *, char *);
/* /*
* Beep! * Beep!
...@@ -126,6 +129,10 @@ int el_get(EditLine *, int, void *); ...@@ -126,6 +129,10 @@ int el_get(EditLine *, int, void *);
#define EL_HIST 10 /* , hist_fun_t, const char *); */ #define EL_HIST 10 /* , hist_fun_t, const char *); */
#define EL_EDITMODE 11 /* , int); */ #define EL_EDITMODE 11 /* , int); */
#define EL_RPROMPT 12 /* , el_pfunc_t); */ #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 * Source named file or $PWD/.editrc or $HOME/.editrc
...@@ -174,7 +181,7 @@ int history(History *, HistEvent *, int, ...); ...@@ -174,7 +181,7 @@ int history(History *, HistEvent *, int, ...);
#define H_PREV 5 /* , void); */ #define H_PREV 5 /* , void); */
#define H_NEXT 6 /* , void); */ #define H_NEXT 6 /* , void); */
#define H_CURR 8 /* , const int); */ #define H_CURR 8 /* , const int); */
#define H_SET 7 /* , void); */ #define H_SET 7 /* , int); */
#define H_ADD 9 /* , const char *); */ #define H_ADD 9 /* , const char *); */
#define H_ENTER 10 /* , const char *); */ #define H_ENTER 10 /* , const char *); */
#define H_APPEND 11 /* , const char *); */ #define H_APPEND 11 /* , const char *); */
...@@ -186,5 +193,7 @@ int history(History *, HistEvent *, int, ...); ...@@ -186,5 +193,7 @@ int history(History *, HistEvent *, int, ...);
#define H_LOAD 17 /* , const char *); */ #define H_LOAD 17 /* , const char *); */
#define H_SAVE 18 /* , const char *); */ #define H_SAVE 18 /* , const char *); */
#define H_CLEAR 19 /* , void); */ #define H_CLEAR 19 /* , void); */
#define H_SETUNIQUE 20 /* , int); */
#define H_GETUNIQUE 21 /* , void); */
#endif /* _HISTEDIT_H_ */ #endif /* _HISTEDIT_H_ */
/* $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 * Copyright (c) 1992, 1993
...@@ -36,18 +36,25 @@ ...@@ -36,18 +36,25 @@
* SUCH DAMAGE. * 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 * hist.c: History access functions
*/ */
#include "sys.h"
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h> #include <stdarg.h>
#ifdef HAVE_VIS_H #ifdef HAVE_VIS_H
#include <vis.h> #include <vis.h>
#else
#include "np/vis.h"
#endif #endif
#include <sys/stat.h> #include <sys/stat.h>
...@@ -73,6 +80,7 @@ struct history { ...@@ -73,6 +80,7 @@ struct history {
history_efun_t h_enter; /* Add an element */ history_efun_t h_enter; /* Add an element */
history_efun_t h_add; /* Append to an element */ history_efun_t h_add; /* Append to an element */
}; };
#define HNEXT(h, ev) (*(h)->h_next)((h)->h_ref, ev) #define HNEXT(h, ev) (*(h)->h_next)((h)->h_ref, ev)
#define HFIRST(h, ev) (*(h)->h_first)((h)->h_ref, ev) #define HFIRST(h, ev) (*(h)->h_first)((h)->h_ref, ev)
#define HPREV(h, ev) (*(h)->h_prev)((h)->h_ref, ev) #define HPREV(h, ev) (*(h)->h_prev)((h)->h_ref, ev)
...@@ -87,9 +95,17 @@ struct history { ...@@ -87,9 +95,17 @@ struct history {
#define h_realloc(a, b) realloc((a), (b)) #define h_realloc(a, b) realloc((a), (b))
#define h_free(a) free(a) #define h_free(a) free(a)
typedef struct {
int num;
char *str;
} HistEventPrivate;
private int history_setsize(History *, HistEvent *, int); private int history_setsize(History *, HistEvent *, int);
private int history_getsize(History *, HistEvent *); 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_set_fun(History *, History *);
private int history_load(History *, const char *); private int history_load(History *, const char *);
private int history_save(History *, const char *); private int history_save(History *, const char *);
...@@ -116,6 +132,8 @@ typedef struct history_t { ...@@ -116,6 +132,8 @@ typedef struct history_t {
int max; /* Maximum number of events */ int max; /* Maximum number of events */
int cur; /* Current number of events */ int cur; /* Current number of events */
int eventid; /* For generation of unique event id */ int eventid; /* For generation of unique event id */
int flags; /* History flags */
#define H_UNIQUE 1 /* Store only unique elements */
} history_t; } history_t;
private int history_def_first(ptr_t, HistEvent *); private int history_def_first(ptr_t, HistEvent *);
...@@ -126,13 +144,19 @@ private int history_def_curr(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_set(ptr_t, HistEvent *, const int n);
private int history_def_enter(ptr_t, HistEvent *, const char *); private int history_def_enter(ptr_t, HistEvent *, const char *);
private int history_def_add(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 void history_def_clear(ptr_t, HistEvent *);
private int history_def_insert(history_t *, HistEvent *, const char *); private int history_def_insert(history_t *, HistEvent *, const char *);
private void history_def_delete(history_t *, HistEvent *, hentry_t *); 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_setsize(p, num)(void) (((history_t *)p)->max = (num))
#define history_def_getsize(p) (((history_t *) p)->cur) #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_strerror(code) he_errlist[code]
#define he_seterrev(evp, code) {\ #define he_seterrev(evp, code) {\
...@@ -326,20 +350,20 @@ history_def_add(ptr_t p, HistEvent *ev, const char *str) ...@@ -326,20 +350,20 @@ history_def_add(ptr_t p, HistEvent *ev, const char *str)
history_t *h = (history_t *) p; history_t *h = (history_t *) p;
size_t len; size_t len;
char *s; char *s;
HistEventPrivate *evp = (void *)&h->cursor->ev;
if (h->cursor == &h->list) if (h->cursor == &h->list)
return (history_def_enter(p, ev, str)); 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); s = (char *) h_malloc(len);
if (!s) { if (s == NULL) {
he_seterrev(ev, _HE_MALLOC_FAILED); he_seterrev(ev, _HE_MALLOC_FAILED);
return (-1); return (-1);
} }
(void) strlcpy(s, h->cursor->ev.str, len); (void) strlcpy(s, h->cursor->ev.str, len);
(void) strlcat(s, str, len); (void) strlcat(s, str, len);
/* LINTED const cast */ h_free((ptr_t)evp->str);
h_free((ptr_t) h->cursor->ev.str); evp->str = s;
h->cursor->ev.str = s;
*ev = h->cursor->ev; *ev = h->cursor->ev;
return (0); return (0);
} }
...@@ -350,16 +374,14 @@ history_def_add(ptr_t p, HistEvent *ev, const char *str) ...@@ -350,16 +374,14 @@ history_def_add(ptr_t p, HistEvent *ev, const char *str)
*/ */
/* ARGSUSED */ /* ARGSUSED */
private void private void
history_def_delete(history_t *h, history_def_delete(history_t *h, HistEvent *ev __attribute__((unused)), hentry_t *hp)
HistEvent *ev __attribute__((unused)), hentry_t *hp)
{ {
HistEventPrivate *evp = (void *)&hp->ev;
if (hp == &h->list) if (hp == &h->list)
abort(); abort();
hp->prev->next = hp->next; hp->prev->next = hp->next;
hp->next->prev = hp->prev; hp->next->prev = hp->prev;
/* LINTED const cast */ h_free((ptr_t) evp->str);
h_free((ptr_t) hp->ev.str);
h_free(hp); h_free(hp);
h->cur--; h->cur--;
} }
...@@ -373,11 +395,11 @@ history_def_insert(history_t *h, HistEvent *ev, const char *str) ...@@ -373,11 +395,11 @@ history_def_insert(history_t *h, HistEvent *ev, const char *str)
{ {
h->cursor = (hentry_t *) h_malloc(sizeof(hentry_t)); h->cursor = (hentry_t *) h_malloc(sizeof(hentry_t));
if (h->cursor) if (h->cursor == NULL)
h->cursor->ev.str = strdup(str); goto oomem;
if (!h->cursor || !h->cursor->ev.str) { if ((h->cursor->ev.str = strdup(str)) == NULL) {
he_seterrev(ev, _HE_MALLOC_FAILED); h_free((ptr_t)h->cursor);
return (-1); goto oomem;
} }
h->cursor->ev.num = ++h->eventid; h->cursor->ev.num = ++h->eventid;
h->cursor->next = h->list.next; h->cursor->next = h->list.next;
...@@ -388,6 +410,9 @@ history_def_insert(history_t *h, HistEvent *ev, const char *str) ...@@ -388,6 +410,9 @@ history_def_insert(history_t *h, HistEvent *ev, const char *str)
*ev = h->cursor->ev; *ev = h->cursor->ev;
return (0); 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) ...@@ -399,6 +424,10 @@ history_def_enter(ptr_t p, HistEvent *ev, const char *str)
{ {
history_t *h = (history_t *) p; 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) if (history_def_insert(h, ev, str) == -1)
return (-1); /* error, keep error message */ return (-1); /* error, keep error message */
...@@ -406,10 +435,10 @@ history_def_enter(ptr_t p, HistEvent *ev, const char *str) ...@@ -406,10 +435,10 @@ history_def_enter(ptr_t p, HistEvent *ev, const char *str)
* Always keep at least one entry. * Always keep at least one entry.
* This way we don't have to check for the empty list. * 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); 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) ...@@ -417,10 +446,12 @@ history_def_enter(ptr_t p, HistEvent *ev, const char *str)
* Default history initialization function * Default history initialization function
*/ */
/* ARGSUSED */ /* ARGSUSED */
private void private int
history_def_init(ptr_t *p, HistEvent *ev __attribute__((unused)), int n) history_def_init(ptr_t *p, HistEvent *ev __attribute__((unused)), int n)
{ {
history_t *h = (history_t *) h_malloc(sizeof(history_t)); history_t *h = (history_t *) h_malloc(sizeof(history_t));
if (h == NULL)
return -1;
if (n <= 0) if (n <= 0)
n = 0; n = 0;
...@@ -431,7 +462,9 @@ history_def_init(ptr_t *p, HistEvent *ev __attribute__((unused)), int n) ...@@ -431,7 +462,9 @@ history_def_init(ptr_t *p, HistEvent *ev __attribute__((unused)), int n)
h->list.ev.str = NULL; h->list.ev.str = NULL;
h->list.ev.num = 0; h->list.ev.num = 0;
h->cursor = &h->list; h->cursor = &h->list;
h->flags = 0;
*p = (ptr_t) h; *p = (ptr_t) h;
return 0;
} }
...@@ -460,10 +493,15 @@ history_def_clear(ptr_t p, HistEvent *ev) ...@@ -460,10 +493,15 @@ history_def_clear(ptr_t p, HistEvent *ev)
public History * public History *
history_init(void) history_init(void)
{ {
History *h = (History *) h_malloc(sizeof(History));
HistEvent ev; 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_ent = -1;
h->h_next = history_def_next; h->h_next = history_def_next;
h->h_first = history_def_first; h->h_first = history_def_first;
...@@ -519,18 +557,46 @@ history_setsize(History *h, HistEvent *ev, int num) ...@@ -519,18 +557,46 @@ history_setsize(History *h, HistEvent *ev, int num)
private int private int
history_getsize(History *h, HistEvent *ev) history_getsize(History *h, HistEvent *ev)
{ {
int retval = 0;
if (h->h_next != history_def_next) { if (h->h_next != history_def_next) {
he_seterrev(ev, _HE_NOT_ALLOWED); he_seterrev(ev, _HE_NOT_ALLOWED);
return (-1); return (-1);
} }
retval = history_def_getsize(h->h_ref); ev->num = history_def_getsize(h->h_ref);
if (retval < -1) { if (ev->num < -1) {
he_seterrev(ev, _HE_SIZE_NEGATIVE); he_seterrev(ev, _HE_SIZE_NEGATIVE);
return (-1); 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); return (0);
} }
...@@ -602,6 +668,8 @@ history_load(History *h, const char *fname) ...@@ -602,6 +668,8 @@ history_load(History *h, const char *fname)
goto done; goto done;
ptr = h_malloc(max_size = 1024); ptr = h_malloc(max_size = 1024);
if (ptr == NULL)
goto done;
for (i = 0; (line = fgetln(fp, &sz)) != NULL; i++) { for (i = 0; (line = fgetln(fp, &sz)) != NULL; i++) {
char c = line[sz]; char c = line[sz];
...@@ -611,15 +679,24 @@ history_load(History *h, const char *fname) ...@@ -611,15 +679,24 @@ history_load(History *h, const char *fname)
line[sz] = '\0'; line[sz] = '\0';
if (max_size < sz) { if (max_size < sz) {
char *nptr;
max_size = (sz + 1023) & ~1023; 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); (void) strunvis(ptr, line);
line[sz] = c; 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: done:
(void) fclose(fp); (void) fclose(fp);
return (i); return (i);
...@@ -634,28 +711,40 @@ history_save(History *h, const char *fname) ...@@ -634,28 +711,40 @@ history_save(History *h, const char *fname)
{ {
FILE *fp; FILE *fp;
HistEvent ev; HistEvent ev;
int i = 0, retval; int i = -1, retval;
size_t len, max_size; size_t len, max_size;
char *ptr; char *ptr;
if ((fp = fopen(fname, "w")) == NULL) if ((fp = fopen(fname, "w")) == NULL)
return (-1); return (-1);
(void) fchmod(fileno(fp), S_IRUSR|S_IWUSR); if (fchmod(fileno(fp), S_IRUSR|S_IWUSR) == -1)
(void) fputs(hist_cookie, fp); goto done;
if (fputs(hist_cookie, fp) == EOF)
goto done;
ptr = h_malloc(max_size = 1024); 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 != -1;
retval = HPREV(h, &ev), i++) { retval = HPREV(h, &ev), i++) {
len = strlen(ev.str) * 4 + 1; len = strlen(ev.str) * 4 + 1;
if (len >= max_size) { if (len >= max_size) {
char *nptr;
max_size = (len + 1023) & ~1023; max_size = (len + 1023) & ~1023;
ptr = h_realloc(ptr, max_size); nptr = h_realloc(ptr, max_size);
if (nptr == NULL) {
i = -1;
goto oomem;
}
ptr = nptr;
} }
(void) strvis(ptr, ev.str, VIS_WHITE); (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); (void) fclose(fp);
return (i); return (i);
} }
...@@ -754,6 +843,14 @@ history(History *h, HistEvent *ev, int fun, ...) ...@@ -754,6 +843,14 @@ history(History *h, HistEvent *ev, int fun, ...)
retval = history_setsize(h, ev, va_arg(va, int)); retval = history_setsize(h, ev, va_arg(va, int));
break; 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: case H_ADD:
str = va_arg(va, const char *); str = va_arg(va, const char *);
retval = HADD(h, ev, str); retval = HADD(h, ev, str);
......
/* $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 * Copyright (c) 1992, 1993
...@@ -36,7 +36,14 @@ ...@@ -36,7 +36,14 @@
* SUCH DAMAGE. * 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 * key.c: This module contains the procedures for maintaining
...@@ -59,7 +66,6 @@ ...@@ -59,7 +66,6 @@
* 1) It is not possible to have one key that is a * 1) It is not possible to have one key that is a
* substr of another. * substr of another.
*/ */
#include "sys.h"
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
...@@ -85,8 +91,8 @@ private int node__try(EditLine *, key_node_t *, const char *, ...@@ -85,8 +91,8 @@ private int node__try(EditLine *, key_node_t *, const char *,
private key_node_t *node__get(int); private key_node_t *node__get(int);
private void node__put(EditLine *, key_node_t *); private void node__put(EditLine *, key_node_t *);
private int node__delete(EditLine *, key_node_t **, const char *); private int node__delete(EditLine *, key_node_t **, const char *);
private int node_lookup(EditLine *, const char *, private int node_lookup(EditLine *, const char *, key_node_t *,
key_node_t *, int); int);
private int node_enum(EditLine *, key_node_t *, int); private int node_enum(EditLine *, key_node_t *, int);
private int key__decode_char(char *, int, int); private int key__decode_char(char *, int, int);
......
/* $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 * Copyright (c) 1992, 1993
...@@ -62,10 +62,6 @@ typedef struct el_key_t { ...@@ -62,10 +62,6 @@ typedef struct el_key_t {
#define XK_NOD 2 #define XK_NOD 2
#define XK_EXE 3 #define XK_EXE 3
#undef key_end
#undef key_clear
#undef key_print
protected int key_init(EditLine *); protected int key_init(EditLine *);
protected void key_end(EditLine *); protected void key_end(EditLine *);
protected key_value_t *key_map_cmd(EditLine *, int); protected key_value_t *key_map_cmd(EditLine *, int);
...@@ -76,8 +72,8 @@ protected void key_add(EditLine *, const char *, key_value_t *, 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 void key_clear(EditLine *, el_action_t *, const char *);
protected int key_delete(EditLine *, const char *); protected int key_delete(EditLine *, const char *);
protected void key_print(EditLine *, const char *); protected void key_print(EditLine *, const char *);
protected void key_kprint(EditLine *, const char *, protected void key_kprint(EditLine *, const char *, key_value_t *,
key_value_t *, int); int);
protected char *key__decode_str(const char *, char *, const char *); protected char *key__decode_str(const char *, char *, const char *);
#endif /* _h_el_key */ #endif /* _h_el_key */
#!/bin/sh - #!/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 # Copyright (c) 1992, 1993
# The Regents of the University of California. All rights reserved. # The Regents of the University of California. All rights reserved.
...@@ -87,7 +87,6 @@ case $FLAG in ...@@ -87,7 +87,6 @@ case $FLAG in
cat $FILES | $AWK ' cat $FILES | $AWK '
BEGIN { BEGIN {
printf("/* Automatically generated file, do not edit */\n"); printf("/* Automatically generated file, do not edit */\n");
printf("#include \"compat.h\"\n");
printf("#include \"sys.h\"\n#include \"el.h\"\n"); printf("#include \"sys.h\"\n#include \"el.h\"\n");
printf("private const struct el_bindings_t el_func_help[] = {\n"); printf("private const struct el_bindings_t el_func_help[] = {\n");
low = "abcdefghijklmnopqrstuvwxyz_"; low = "abcdefghijklmnopqrstuvwxyz_";
...@@ -170,7 +169,6 @@ case $FLAG in ...@@ -170,7 +169,6 @@ case $FLAG in
cat $FILES | $AWK '/el_action_t/ { print $3 }' | sort | $AWK ' cat $FILES | $AWK '/el_action_t/ { print $3 }' | sort | $AWK '
BEGIN { BEGIN {
printf("/* Automatically generated file, do not edit */\n"); printf("/* Automatically generated file, do not edit */\n");
printf("#include \"compat.h\"\n");
printf("#include \"sys.h\"\n#include \"el.h\"\n"); printf("#include \"sys.h\"\n#include \"el.h\"\n");
printf("private const el_func_t el_func[] = {"); printf("private const el_func_t el_func[] = {");
maxlen = 80; maxlen = 80;
......
/* $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 * Copyright (c) 1992, 1993
...@@ -36,12 +36,18 @@ ...@@ -36,12 +36,18 @@
* SUCH DAMAGE. * 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 * map.c: Editor function definitions
*/ */
#include "sys.h"
#include <stdlib.h> #include <stdlib.h>
#include "el.h" #include "el.h"
...@@ -373,7 +379,7 @@ private const el_action_t el_map_vi_insert[] = { ...@@ -373,7 +379,7 @@ private const el_action_t el_map_vi_insert[] = {
/* 5 */ ED_MOVE_TO_END, /* ^E */ /* 5 */ ED_MOVE_TO_END, /* ^E */
/* 6 */ ED_NEXT_CHAR, /* ^F */ /* 6 */ ED_NEXT_CHAR, /* ^F */
/* 7 */ ED_UNASSIGNED, /* ^G */ /* 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 */ /* 9 */ ED_UNASSIGNED, /* ^I */ /* Tab Key */
/* 10 */ ED_NEWLINE, /* ^J */ /* 10 */ ED_NEWLINE, /* ^J */
/* 11 */ ED_KILL_LINE, /* ^K */ /* 11 */ ED_KILL_LINE, /* ^K */
...@@ -493,135 +499,135 @@ private const el_action_t el_map_vi_insert[] = { ...@@ -493,135 +499,135 @@ private const el_action_t el_map_vi_insert[] = {
/* 124 */ ED_INSERT, /* | */ /* 124 */ ED_INSERT, /* | */
/* 125 */ ED_INSERT, /* } */ /* 125 */ ED_INSERT, /* } */
/* 126 */ ED_INSERT, /* ~ */ /* 126 */ ED_INSERT, /* ~ */
/* 127 */ ED_DELETE_PREV_CHAR, /* ^? */ /* 127 */ VI_DELETE_PREV_CHAR, /* ^? */
/* 128 */ ED_UNASSIGNED, /* M-^@ */ /* 128 */ ED_INSERT, /* M-^@ */
/* 129 */ ED_UNASSIGNED, /* M-^A */ /* 129 */ ED_INSERT, /* M-^A */
/* 130 */ ED_UNASSIGNED, /* M-^B */ /* 130 */ ED_INSERT, /* M-^B */
/* 131 */ ED_UNASSIGNED, /* M-^C */ /* 131 */ ED_INSERT, /* M-^C */
/* 132 */ ED_UNASSIGNED, /* M-^D */ /* 132 */ ED_INSERT, /* M-^D */
/* 133 */ ED_UNASSIGNED, /* M-^E */ /* 133 */ ED_INSERT, /* M-^E */
/* 134 */ ED_UNASSIGNED, /* M-^F */ /* 134 */ ED_INSERT, /* M-^F */
/* 135 */ ED_UNASSIGNED, /* M-^G */ /* 135 */ ED_INSERT, /* M-^G */
/* 136 */ ED_UNASSIGNED, /* M-^H */ /* 136 */ ED_INSERT, /* M-^H */
/* 137 */ ED_UNASSIGNED, /* M-^I */ /* 137 */ ED_INSERT, /* M-^I */
/* 138 */ ED_UNASSIGNED, /* M-^J */ /* 138 */ ED_INSERT, /* M-^J */
/* 139 */ ED_UNASSIGNED, /* M-^K */ /* 139 */ ED_INSERT, /* M-^K */
/* 140 */ ED_UNASSIGNED, /* M-^L */ /* 140 */ ED_INSERT, /* M-^L */
/* 141 */ ED_UNASSIGNED, /* M-^M */ /* 141 */ ED_INSERT, /* M-^M */
/* 142 */ ED_UNASSIGNED, /* M-^N */ /* 142 */ ED_INSERT, /* M-^N */
/* 143 */ ED_UNASSIGNED, /* M-^O */ /* 143 */ ED_INSERT, /* M-^O */
/* 144 */ ED_UNASSIGNED, /* M-^P */ /* 144 */ ED_INSERT, /* M-^P */
/* 145 */ ED_UNASSIGNED, /* M-^Q */ /* 145 */ ED_INSERT, /* M-^Q */
/* 146 */ ED_UNASSIGNED, /* M-^R */ /* 146 */ ED_INSERT, /* M-^R */
/* 147 */ ED_UNASSIGNED, /* M-^S */ /* 147 */ ED_INSERT, /* M-^S */
/* 148 */ ED_UNASSIGNED, /* M-^T */ /* 148 */ ED_INSERT, /* M-^T */
/* 149 */ ED_UNASSIGNED, /* M-^U */ /* 149 */ ED_INSERT, /* M-^U */
/* 150 */ ED_UNASSIGNED, /* M-^V */ /* 150 */ ED_INSERT, /* M-^V */
/* 151 */ ED_UNASSIGNED, /* M-^W */ /* 151 */ ED_INSERT, /* M-^W */
/* 152 */ ED_UNASSIGNED, /* M-^X */ /* 152 */ ED_INSERT, /* M-^X */
/* 153 */ ED_UNASSIGNED, /* M-^Y */ /* 153 */ ED_INSERT, /* M-^Y */
/* 154 */ ED_UNASSIGNED, /* M-^Z */ /* 154 */ ED_INSERT, /* M-^Z */
/* 155 */ ED_UNASSIGNED, /* M-^[ */ /* 155 */ ED_INSERT, /* M-^[ */
/* 156 */ ED_UNASSIGNED, /* M-^\ */ /* 156 */ ED_INSERT, /* M-^\ */
/* 157 */ ED_UNASSIGNED, /* M-^] */ /* 157 */ ED_INSERT, /* M-^] */
/* 158 */ ED_UNASSIGNED, /* M-^^ */ /* 158 */ ED_INSERT, /* M-^^ */
/* 159 */ ED_UNASSIGNED, /* M-^_ */ /* 159 */ ED_INSERT, /* M-^_ */
/* 160 */ ED_UNASSIGNED, /* M-SPACE */ /* 160 */ ED_INSERT, /* M-SPACE */
/* 161 */ ED_UNASSIGNED, /* M-! */ /* 161 */ ED_INSERT, /* M-! */
/* 162 */ ED_UNASSIGNED, /* M-" */ /* 162 */ ED_INSERT, /* M-" */
/* 163 */ ED_UNASSIGNED, /* M-# */ /* 163 */ ED_INSERT, /* M-# */
/* 164 */ ED_UNASSIGNED, /* M-$ */ /* 164 */ ED_INSERT, /* M-$ */
/* 165 */ ED_UNASSIGNED, /* M-% */ /* 165 */ ED_INSERT, /* M-% */
/* 166 */ ED_UNASSIGNED, /* M-& */ /* 166 */ ED_INSERT, /* M-& */
/* 167 */ ED_UNASSIGNED, /* M-' */ /* 167 */ ED_INSERT, /* M-' */
/* 168 */ ED_UNASSIGNED, /* M-( */ /* 168 */ ED_INSERT, /* M-( */
/* 169 */ ED_UNASSIGNED, /* M-) */ /* 169 */ ED_INSERT, /* M-) */
/* 170 */ ED_UNASSIGNED, /* M-* */ /* 170 */ ED_INSERT, /* M-* */
/* 171 */ ED_UNASSIGNED, /* M-+ */ /* 171 */ ED_INSERT, /* M-+ */
/* 172 */ ED_UNASSIGNED, /* M-, */ /* 172 */ ED_INSERT, /* M-, */
/* 173 */ ED_UNASSIGNED, /* M-- */ /* 173 */ ED_INSERT, /* M-- */
/* 174 */ ED_UNASSIGNED, /* M-. */ /* 174 */ ED_INSERT, /* M-. */
/* 175 */ ED_UNASSIGNED, /* M-/ */ /* 175 */ ED_INSERT, /* M-/ */
/* 176 */ ED_UNASSIGNED, /* M-0 */ /* 176 */ ED_INSERT, /* M-0 */
/* 177 */ ED_UNASSIGNED, /* M-1 */ /* 177 */ ED_INSERT, /* M-1 */
/* 178 */ ED_UNASSIGNED, /* M-2 */ /* 178 */ ED_INSERT, /* M-2 */
/* 179 */ ED_UNASSIGNED, /* M-3 */ /* 179 */ ED_INSERT, /* M-3 */
/* 180 */ ED_UNASSIGNED, /* M-4 */ /* 180 */ ED_INSERT, /* M-4 */
/* 181 */ ED_UNASSIGNED, /* M-5 */ /* 181 */ ED_INSERT, /* M-5 */
/* 182 */ ED_UNASSIGNED, /* M-6 */ /* 182 */ ED_INSERT, /* M-6 */
/* 183 */ ED_UNASSIGNED, /* M-7 */ /* 183 */ ED_INSERT, /* M-7 */
/* 184 */ ED_UNASSIGNED, /* M-8 */ /* 184 */ ED_INSERT, /* M-8 */
/* 185 */ ED_UNASSIGNED, /* M-9 */ /* 185 */ ED_INSERT, /* M-9 */
/* 186 */ ED_UNASSIGNED, /* M-: */ /* 186 */ ED_INSERT, /* M-: */
/* 187 */ ED_UNASSIGNED, /* M-; */ /* 187 */ ED_INSERT, /* M-; */
/* 188 */ ED_UNASSIGNED, /* M-< */ /* 188 */ ED_INSERT, /* M-< */
/* 189 */ ED_UNASSIGNED, /* M-= */ /* 189 */ ED_INSERT, /* M-= */
/* 190 */ ED_UNASSIGNED, /* M-> */ /* 190 */ ED_INSERT, /* M-> */
/* 191 */ ED_UNASSIGNED, /* M-? */ /* 191 */ ED_INSERT, /* M-? */
/* 192 */ ED_UNASSIGNED, /* M-@ */ /* 192 */ ED_INSERT, /* M-@ */
/* 193 */ ED_UNASSIGNED, /* M-A */ /* 193 */ ED_INSERT, /* M-A */
/* 194 */ ED_UNASSIGNED, /* M-B */ /* 194 */ ED_INSERT, /* M-B */
/* 195 */ ED_UNASSIGNED, /* M-C */ /* 195 */ ED_INSERT, /* M-C */
/* 196 */ ED_UNASSIGNED, /* M-D */ /* 196 */ ED_INSERT, /* M-D */
/* 197 */ ED_UNASSIGNED, /* M-E */ /* 197 */ ED_INSERT, /* M-E */
/* 198 */ ED_UNASSIGNED, /* M-F */ /* 198 */ ED_INSERT, /* M-F */
/* 199 */ ED_UNASSIGNED, /* M-G */ /* 199 */ ED_INSERT, /* M-G */
/* 200 */ ED_UNASSIGNED, /* M-H */ /* 200 */ ED_INSERT, /* M-H */
/* 201 */ ED_UNASSIGNED, /* M-I */ /* 201 */ ED_INSERT, /* M-I */
/* 202 */ ED_UNASSIGNED, /* M-J */ /* 202 */ ED_INSERT, /* M-J */
/* 203 */ ED_UNASSIGNED, /* M-K */ /* 203 */ ED_INSERT, /* M-K */
/* 204 */ ED_UNASSIGNED, /* M-L */ /* 204 */ ED_INSERT, /* M-L */
/* 205 */ ED_UNASSIGNED, /* M-M */ /* 205 */ ED_INSERT, /* M-M */
/* 206 */ ED_UNASSIGNED, /* M-N */ /* 206 */ ED_INSERT, /* M-N */
/* 207 */ ED_UNASSIGNED, /* M-O */ /* 207 */ ED_INSERT, /* M-O */
/* 208 */ ED_UNASSIGNED, /* M-P */ /* 208 */ ED_INSERT, /* M-P */
/* 209 */ ED_UNASSIGNED, /* M-Q */ /* 209 */ ED_INSERT, /* M-Q */
/* 210 */ ED_UNASSIGNED, /* M-R */ /* 210 */ ED_INSERT, /* M-R */
/* 211 */ ED_UNASSIGNED, /* M-S */ /* 211 */ ED_INSERT, /* M-S */
/* 212 */ ED_UNASSIGNED, /* M-T */ /* 212 */ ED_INSERT, /* M-T */
/* 213 */ ED_UNASSIGNED, /* M-U */ /* 213 */ ED_INSERT, /* M-U */
/* 214 */ ED_UNASSIGNED, /* M-V */ /* 214 */ ED_INSERT, /* M-V */
/* 215 */ ED_UNASSIGNED, /* M-W */ /* 215 */ ED_INSERT, /* M-W */
/* 216 */ ED_UNASSIGNED, /* M-X */ /* 216 */ ED_INSERT, /* M-X */
/* 217 */ ED_UNASSIGNED, /* M-Y */ /* 217 */ ED_INSERT, /* M-Y */
/* 218 */ ED_UNASSIGNED, /* M-Z */ /* 218 */ ED_INSERT, /* M-Z */
/* 219 */ ED_UNASSIGNED, /* M-[ */ /* 219 */ ED_INSERT, /* M-[ */
/* 220 */ ED_UNASSIGNED, /* M-\ */ /* 220 */ ED_INSERT, /* M-\ */
/* 221 */ ED_UNASSIGNED, /* M-] */ /* 221 */ ED_INSERT, /* M-] */
/* 222 */ ED_UNASSIGNED, /* M-^ */ /* 222 */ ED_INSERT, /* M-^ */
/* 223 */ ED_UNASSIGNED, /* M-_ */ /* 223 */ ED_INSERT, /* M-_ */
/* 224 */ ED_UNASSIGNED, /* M-` */ /* 224 */ ED_INSERT, /* M-` */
/* 225 */ ED_UNASSIGNED, /* M-a */ /* 225 */ ED_INSERT, /* M-a */
/* 226 */ ED_UNASSIGNED, /* M-b */ /* 226 */ ED_INSERT, /* M-b */
/* 227 */ ED_UNASSIGNED, /* M-c */ /* 227 */ ED_INSERT, /* M-c */
/* 228 */ ED_UNASSIGNED, /* M-d */ /* 228 */ ED_INSERT, /* M-d */
/* 229 */ ED_UNASSIGNED, /* M-e */ /* 229 */ ED_INSERT, /* M-e */
/* 230 */ ED_UNASSIGNED, /* M-f */ /* 230 */ ED_INSERT, /* M-f */
/* 231 */ ED_UNASSIGNED, /* M-g */ /* 231 */ ED_INSERT, /* M-g */
/* 232 */ ED_UNASSIGNED, /* M-h */ /* 232 */ ED_INSERT, /* M-h */
/* 233 */ ED_UNASSIGNED, /* M-i */ /* 233 */ ED_INSERT, /* M-i */
/* 234 */ ED_UNASSIGNED, /* M-j */ /* 234 */ ED_INSERT, /* M-j */
/* 235 */ ED_UNASSIGNED, /* M-k */ /* 235 */ ED_INSERT, /* M-k */
/* 236 */ ED_UNASSIGNED, /* M-l */ /* 236 */ ED_INSERT, /* M-l */
/* 237 */ ED_UNASSIGNED, /* M-m */ /* 237 */ ED_INSERT, /* M-m */
/* 238 */ ED_UNASSIGNED, /* M-n */ /* 238 */ ED_INSERT, /* M-n */
/* 239 */ ED_UNASSIGNED, /* M-o */ /* 239 */ ED_INSERT, /* M-o */
/* 240 */ ED_UNASSIGNED, /* M-p */ /* 240 */ ED_INSERT, /* M-p */
/* 241 */ ED_UNASSIGNED, /* M-q */ /* 241 */ ED_INSERT, /* M-q */
/* 242 */ ED_UNASSIGNED, /* M-r */ /* 242 */ ED_INSERT, /* M-r */
/* 243 */ ED_UNASSIGNED, /* M-s */ /* 243 */ ED_INSERT, /* M-s */
/* 244 */ ED_UNASSIGNED, /* M-t */ /* 244 */ ED_INSERT, /* M-t */
/* 245 */ ED_UNASSIGNED, /* M-u */ /* 245 */ ED_INSERT, /* M-u */
/* 246 */ ED_UNASSIGNED, /* M-v */ /* 246 */ ED_INSERT, /* M-v */
/* 247 */ ED_UNASSIGNED, /* M-w */ /* 247 */ ED_INSERT, /* M-w */
/* 248 */ ED_UNASSIGNED, /* M-x */ /* 248 */ ED_INSERT, /* M-x */
/* 249 */ ED_UNASSIGNED, /* M-y */ /* 249 */ ED_INSERT, /* M-y */
/* 250 */ ED_UNASSIGNED, /* M-z */ /* 250 */ ED_INSERT, /* M-z */
/* 251 */ ED_UNASSIGNED, /* M-{ */ /* 251 */ ED_INSERT, /* M-{ */
/* 252 */ ED_UNASSIGNED, /* M-| */ /* 252 */ ED_INSERT, /* M-| */
/* 253 */ ED_UNASSIGNED, /* M-} */ /* 253 */ ED_INSERT, /* M-} */
/* 254 */ ED_UNASSIGNED, /* M-~ */ /* 254 */ ED_INSERT, /* M-~ */
/* 255 */ ED_UNASSIGNED /* M-^? */ /* 255 */ ED_INSERT /* M-^? */
}; };
private const el_action_t el_map_vi_command[] = { private const el_action_t el_map_vi_command[] = {
...@@ -633,7 +639,7 @@ 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 */ /* 5 */ ED_MOVE_TO_END, /* ^E */
/* 6 */ ED_UNASSIGNED, /* ^F */ /* 6 */ ED_UNASSIGNED, /* ^F */
/* 7 */ ED_UNASSIGNED, /* ^G */ /* 7 */ ED_UNASSIGNED, /* ^G */
/* 8 */ ED_PREV_CHAR, /* ^H */ /* 8 */ ED_DELETE_PREV_CHAR, /* ^H */
/* 9 */ ED_UNASSIGNED, /* ^I */ /* 9 */ ED_UNASSIGNED, /* ^I */
/* 10 */ ED_NEWLINE, /* ^J */ /* 10 */ ED_NEWLINE, /* ^J */
/* 11 */ ED_KILL_LINE, /* ^K */ /* 11 */ ED_KILL_LINE, /* ^K */
...@@ -660,9 +666,9 @@ private const el_action_t el_map_vi_command[] = { ...@@ -660,9 +666,9 @@ private const el_action_t el_map_vi_command[] = {
/* 32 */ ED_NEXT_CHAR, /* SPACE */ /* 32 */ ED_NEXT_CHAR, /* SPACE */
/* 33 */ ED_UNASSIGNED, /* ! */ /* 33 */ ED_UNASSIGNED, /* ! */
/* 34 */ ED_UNASSIGNED, /* " */ /* 34 */ ED_UNASSIGNED, /* " */
/* 35 */ ED_UNASSIGNED, /* # */ /* 35 */ VI_COMMENT_OUT, /* # */
/* 36 */ ED_MOVE_TO_END, /* $ */ /* 36 */ ED_MOVE_TO_END, /* $ */
/* 37 */ ED_UNASSIGNED, /* % */ /* 37 */ VI_MATCH, /* % */
/* 38 */ ED_UNASSIGNED, /* & */ /* 38 */ ED_UNASSIGNED, /* & */
/* 39 */ ED_UNASSIGNED, /* ' */ /* 39 */ ED_UNASSIGNED, /* ' */
/* 40 */ ED_UNASSIGNED, /* ( */ /* 40 */ ED_UNASSIGNED, /* ( */
...@@ -671,7 +677,7 @@ private const el_action_t el_map_vi_command[] = { ...@@ -671,7 +677,7 @@ private const el_action_t el_map_vi_command[] = {
/* 43 */ ED_NEXT_HISTORY, /* + */ /* 43 */ ED_NEXT_HISTORY, /* + */
/* 44 */ VI_REPEAT_PREV_CHAR, /* , */ /* 44 */ VI_REPEAT_PREV_CHAR, /* , */
/* 45 */ ED_PREV_HISTORY, /* - */ /* 45 */ ED_PREV_HISTORY, /* - */
/* 46 */ ED_UNASSIGNED, /* . */ /* 46 */ VI_REDO, /* . */
/* 47 */ VI_SEARCH_PREV, /* / */ /* 47 */ VI_SEARCH_PREV, /* / */
/* 48 */ VI_ZERO, /* 0 */ /* 48 */ VI_ZERO, /* 0 */
/* 49 */ ED_ARGUMENT_DIGIT, /* 1 */ /* 49 */ ED_ARGUMENT_DIGIT, /* 1 */
...@@ -689,14 +695,14 @@ private const el_action_t el_map_vi_command[] = { ...@@ -689,14 +695,14 @@ private const el_action_t el_map_vi_command[] = {
/* 61 */ ED_UNASSIGNED, /* = */ /* 61 */ ED_UNASSIGNED, /* = */
/* 62 */ ED_UNASSIGNED, /* > */ /* 62 */ ED_UNASSIGNED, /* > */
/* 63 */ VI_SEARCH_NEXT, /* ? */ /* 63 */ VI_SEARCH_NEXT, /* ? */
/* 64 */ ED_UNASSIGNED, /* @ */ /* 64 */ VI_ALIAS, /* @ */
/* 65 */ VI_ADD_AT_EOL, /* A */ /* 65 */ VI_ADD_AT_EOL, /* A */
/* 66 */ VI_PREV_SPACE_WORD, /* B */ /* 66 */ VI_PREV_BIG_WORD, /* B */
/* 67 */ VI_CHANGE_TO_EOL, /* C */ /* 67 */ VI_CHANGE_TO_EOL, /* C */
/* 68 */ ED_KILL_LINE, /* D */ /* 68 */ ED_KILL_LINE, /* D */
/* 69 */ VI_TO_END_WORD, /* E */ /* 69 */ VI_END_BIG_WORD, /* E */
/* 70 */ VI_PREV_CHAR, /* F */ /* 70 */ VI_PREV_CHAR, /* F */
/* 71 */ ED_UNASSIGNED, /* G */ /* 71 */ VI_TO_HISTORY_LINE, /* G */
/* 72 */ ED_UNASSIGNED, /* H */ /* 72 */ ED_UNASSIGNED, /* H */
/* 73 */ VI_INSERT_AT_BOL, /* I */ /* 73 */ VI_INSERT_AT_BOL, /* I */
/* 74 */ ED_SEARCH_NEXT_HISTORY, /* J */ /* 74 */ ED_SEARCH_NEXT_HISTORY, /* J */
...@@ -710,17 +716,17 @@ private const el_action_t el_map_vi_command[] = { ...@@ -710,17 +716,17 @@ private const el_action_t el_map_vi_command[] = {
/* 82 */ VI_REPLACE_MODE, /* R */ /* 82 */ VI_REPLACE_MODE, /* R */
/* 83 */ VI_SUBSTITUTE_LINE, /* S */ /* 83 */ VI_SUBSTITUTE_LINE, /* S */
/* 84 */ VI_TO_PREV_CHAR, /* T */ /* 84 */ VI_TO_PREV_CHAR, /* T */
/* 85 */ ED_UNASSIGNED, /* U */ /* 85 */ VI_UNDO_LINE, /* U */
/* 86 */ ED_UNASSIGNED, /* V */ /* 86 */ ED_UNASSIGNED, /* V */
/* 87 */ VI_NEXT_SPACE_WORD, /* W */ /* 87 */ VI_NEXT_BIG_WORD, /* W */
/* 88 */ ED_DELETE_PREV_CHAR, /* X */ /* 88 */ ED_DELETE_PREV_CHAR, /* X */
/* 89 */ ED_UNASSIGNED, /* Y */ /* 89 */ VI_YANK_END, /* Y */
/* 90 */ ED_UNASSIGNED, /* Z */ /* 90 */ ED_UNASSIGNED, /* Z */
/* 91 */ ED_SEQUENCE_LEAD_IN, /* [ */ /* 91 */ ED_SEQUENCE_LEAD_IN, /* [ */
/* 92 */ ED_UNASSIGNED, /* \ */ /* 92 */ ED_UNASSIGNED, /* \ */
/* 93 */ ED_UNASSIGNED, /* ] */ /* 93 */ ED_UNASSIGNED, /* ] */
/* 94 */ ED_MOVE_TO_BEG, /* ^ */ /* 94 */ ED_MOVE_TO_BEG, /* ^ */
/* 95 */ ED_UNASSIGNED, /* _ */ /* 95 */ VI_HISTORY_WORD, /* _ */
/* 96 */ ED_UNASSIGNED, /* ` */ /* 96 */ ED_UNASSIGNED, /* ` */
/* 97 */ VI_ADD, /* a */ /* 97 */ VI_ADD, /* a */
/* 98 */ VI_PREV_WORD, /* b */ /* 98 */ VI_PREV_WORD, /* b */
...@@ -743,13 +749,13 @@ private const el_action_t el_map_vi_command[] = { ...@@ -743,13 +749,13 @@ private const el_action_t el_map_vi_command[] = {
/* 115 */ VI_SUBSTITUTE_CHAR, /* s */ /* 115 */ VI_SUBSTITUTE_CHAR, /* s */
/* 116 */ VI_TO_NEXT_CHAR, /* t */ /* 116 */ VI_TO_NEXT_CHAR, /* t */
/* 117 */ VI_UNDO, /* u */ /* 117 */ VI_UNDO, /* u */
/* 118 */ ED_UNASSIGNED, /* v */ /* 118 */ VI_HISTEDIT, /* v */
/* 119 */ VI_NEXT_WORD, /* w */ /* 119 */ VI_NEXT_WORD, /* w */
/* 120 */ ED_DELETE_NEXT_CHAR, /* x */ /* 120 */ ED_DELETE_NEXT_CHAR, /* x */
/* 121 */ ED_UNASSIGNED, /* y */ /* 121 */ VI_YANK, /* y */
/* 122 */ ED_UNASSIGNED, /* z */ /* 122 */ ED_UNASSIGNED, /* z */
/* 123 */ ED_UNASSIGNED, /* { */ /* 123 */ ED_UNASSIGNED, /* { */
/* 124 */ ED_UNASSIGNED, /* | */ /* 124 */ VI_TO_COLUMN, /* | */
/* 125 */ ED_UNASSIGNED, /* } */ /* 125 */ ED_UNASSIGNED, /* } */
/* 126 */ VI_CHANGE_CASE, /* ~ */ /* 126 */ VI_CHANGE_CASE, /* ~ */
/* 127 */ ED_DELETE_PREV_CHAR, /* ^? */ /* 127 */ ED_DELETE_PREV_CHAR, /* ^? */
......
/* $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 * Copyright (c) 1992, 1993
......
/* $NetBSD: fgetln.c,v 1.1.1.1 1999/04/12 07:43:21 crooksa Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Christos Zoulas.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
char *
fgetln(fp, len)
FILE *fp;
size_t *len;
{
static char *buf = NULL;
static size_t bufsiz = 0;
char *ptr;
if (buf == NULL) {
bufsiz = BUFSIZ;
if ((buf = malloc(bufsiz)) == NULL)
return NULL;
}
if (fgets(buf, bufsiz, fp) == NULL)
return NULL;
*len = 0;
while ((ptr = strchr(&buf[*len], '\n')) == NULL) {
size_t nbufsiz = bufsiz + BUFSIZ;
char *nbuf = realloc(buf, nbufsiz);
if (nbuf == NULL) {
int oerrno = errno;
free(buf);
errno = oerrno;
buf = NULL;
return NULL;
} else
buf = nbuf;
*len = bufsiz;
if (fgets(&buf[bufsiz], BUFSIZ, fp) == NULL)
return buf;
bufsiz = nbufsiz;
}
*len = (ptr - buf) + 1;
return buf;
}
/*
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#if defined(LIBC_SCCS) && !defined(lint)
static char *rcsid = "$OpenBSD: strlcat.c,v 1.2 1999/06/17 16:28:58 millert Exp $";
#endif /* LIBC_SCCS and not lint */
#ifndef lint
static const char rcsid[] =
"$FreeBSD: src/lib/libc/string/strlcat.c,v 1.2.4.2 2001/07/09 23:30:06 obrien Exp $";
#endif
#include <sys/types.h>
#include <string.h>
/*
* Appends src to string dst of size siz (unlike strncat, siz is the
* full size of dst, not space left). At most siz-1 characters
* will be copied. Always NUL terminates (unless siz <= strlen(dst)).
* Returns strlen(initial dst) + strlen(src); if retval >= siz,
* truncation occurred.
*/
size_t strlcat(dst, src, siz)
char *dst;
const char *src;
size_t siz;
{
register char *d = dst;
register const char *s = src;
register size_t n = siz;
size_t dlen;
/* Find the end of dst and adjust bytes left but don't go past end */
while (n-- != 0 && *d != '\0')
d++;
dlen = d - dst;
n = siz - dlen;
if (n == 0)
return(dlen + strlen(s));
while (*s != '\0') {
if (n != 1) {
*d++ = *s;
n--;
}
s++;
}
*d = '\0';
return(dlen + (s - src)); /* count does not include NUL */
}
/* $OpenBSD: strlcpy.c,v 1.4 1999/05/01 18:56:41 millert Exp $ */
/*
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#if defined(LIBC_SCCS) && !defined(lint)
#if 0
static char *rcsid = "$OpenBSD: strlcpy.c,v 1.4 1999/05/01 18:56:41 millert Exp $";
#endif
#endif /* LIBC_SCCS and not lint */
#ifndef lint
static const char rcsid[] =
"$FreeBSD: src/lib/libc/string/strlcpy.c,v 1.2.4.1 2001/07/09 23:30:06 obrien Exp $";
#endif
#include <sys/types.h>
#include <string.h>
/*
* Copy src to string dst of size siz. At most siz-1 characters
* will be copied. Always NUL terminates (unless siz == 0).
* Returns strlen(src); if retval >= siz, truncation occurred.
*/
size_t strlcpy(dst, src, siz)
char *dst;
const char *src;
size_t siz;
{
register char *d = dst;
register const char *s = src;
register size_t n = siz;
/* Copy as many bytes as will fit */
if (n != 0 && --n != 0) {
do {
if ((*d++ = *s++) == 0)
break;
} while (--n != 0);
}
/* Not enough room in dst, add NUL and traverse rest of src */
if (n == 0) {
if (siz != 0)
*d = '\0'; /* NUL-terminate dst */
while (*s++)
;
}
return(s - src - 1); /* count does not include NUL */
}
/* $NetBSD: unvis.c,v 1.22 2002/03/23 17:38:27 christos Exp $ */
/*-
* Copyright (c) 1989, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
#if 0
static char sccsid[] = "@(#)unvis.c 8.1 (Berkeley) 6/4/93";
#else
__RCSID("$NetBSD: unvis.c,v 1.22 2002/03/23 17:38:27 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
#define __LIBC12_SOURCE__
#include <sys/types.h>
#include <assert.h>
#include <ctype.h>
#include <stdio.h>
#include "np/vis.h"
#ifdef __weak_alias
__weak_alias(strunvis,_strunvis)
__weak_alias(unvis,_unvis)
#endif
#ifdef __warn_references
__warn_references(unvis,
"warning: reference to compatibility unvis(); include <vis.h> for correct reference")
#endif
#if !HAVE_VIS_H
/*
* decode driven by state machine
*/
#define S_GROUND 0 /* haven't seen escape char */
#define S_START 1 /* start decoding special sequence */
#define S_META 2 /* metachar started (M) */
#define S_META1 3 /* metachar more, regular char (-) */
#define S_CTRL 4 /* control char started (^) */
#define S_OCTAL2 5 /* octal digit 2 */
#define S_OCTAL3 6 /* octal digit 3 */
#define S_HEX1 7 /* hex digit */
#define S_HEX2 8 /* hex digit 2 */
#define isoctal(c) (((u_char)(c)) >= '0' && ((u_char)(c)) <= '7')
#define xtod(c) (isdigit(c) ? (c - '0') : ((tolower(c) - 'a') + 10))
int
unvis(cp, c, astate, flag)
char *cp;
int c;
int *astate, flag;
{
return __unvis13(cp, (int)c, astate, flag);
}
/*
* unvis - decode characters previously encoded by vis
*/
int
__unvis13(cp, c, astate, flag)
char *cp;
int c;
int *astate, flag;
{
_DIAGASSERT(cp != NULL);
_DIAGASSERT(astate != NULL);
if (flag & UNVIS_END) {
if (*astate == S_OCTAL2 || *astate == S_OCTAL3
|| *astate == S_HEX2) {
*astate = S_GROUND;
return (UNVIS_VALID);
}
return (*astate == S_GROUND ? UNVIS_NOCHAR : UNVIS_SYNBAD);
}
switch (*astate) {
case S_GROUND:
*cp = 0;
if (c == '\\') {
*astate = S_START;
return (0);
}
if ((flag & VIS_HTTPSTYLE) && c == '%') {
*astate = S_HEX1;
return (0);
}
*cp = c;
return (UNVIS_VALID);
case S_START:
switch(c) {
case '\\':
*cp = c;
*astate = S_GROUND;
return (UNVIS_VALID);
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
*cp = (c - '0');
*astate = S_OCTAL2;
return (0);
case 'M':
*cp = (char)0200;
*astate = S_META;
return (0);
case '^':
*astate = S_CTRL;
return (0);
case 'n':
*cp = '\n';
*astate = S_GROUND;
return (UNVIS_VALID);
case 'r':
*cp = '\r';
*astate = S_GROUND;
return (UNVIS_VALID);
case 'b':
*cp = '\b';
*astate = S_GROUND;
return (UNVIS_VALID);
case 'a':
*cp = '\007';
*astate = S_GROUND;
return (UNVIS_VALID);
case 'v':
*cp = '\v';
*astate = S_GROUND;
return (UNVIS_VALID);
case 't':
*cp = '\t';
*astate = S_GROUND;
return (UNVIS_VALID);
case 'f':
*cp = '\f';
*astate = S_GROUND;
return (UNVIS_VALID);
case 's':
*cp = ' ';
*astate = S_GROUND;
return (UNVIS_VALID);
case 'E':
*cp = '\033';
*astate = S_GROUND;
return (UNVIS_VALID);
case '\n':
/*
* hidden newline
*/
*astate = S_GROUND;
return (UNVIS_NOCHAR);
case '$':
/*
* hidden marker
*/
*astate = S_GROUND;
return (UNVIS_NOCHAR);
}
*astate = S_GROUND;
return (UNVIS_SYNBAD);
case S_META:
if (c == '-')
*astate = S_META1;
else if (c == '^')
*astate = S_CTRL;
else {
*astate = S_GROUND;
return (UNVIS_SYNBAD);
}
return (0);
case S_META1:
*astate = S_GROUND;
*cp |= c;
return (UNVIS_VALID);
case S_CTRL:
if (c == '?')
*cp |= 0177;
else
*cp |= c & 037;
*astate = S_GROUND;
return (UNVIS_VALID);
case S_OCTAL2: /* second possible octal digit */
if (isoctal(c)) {
/*
* yes - and maybe a third
*/
*cp = (*cp << 3) + (c - '0');
*astate = S_OCTAL3;
return (0);
}
/*
* no - done with current sequence, push back passed char
*/
*astate = S_GROUND;
return (UNVIS_VALIDPUSH);
case S_OCTAL3: /* third possible octal digit */
*astate = S_GROUND;
if (isoctal(c)) {
*cp = (*cp << 3) + (c - '0');
return (UNVIS_VALID);
}
/*
* we were done, push back passed char
*/
return (UNVIS_VALIDPUSH);
case S_HEX1:
if (isxdigit(c)) {
*cp = xtod(c);
*astate = S_HEX2;
return (0);
}
/*
* no - done with current sequence, push back passed char
*/
*astate = S_GROUND;
return (UNVIS_VALIDPUSH);
case S_HEX2:
*astate = S_GROUND;
if (isxdigit(c)) {
*cp = xtod(c) | (*cp << 4);
return (UNVIS_VALID);
}
return (UNVIS_VALIDPUSH);
default:
/*
* decoder in unknown state - (probably uninitialized)
*/
*astate = S_GROUND;
return (UNVIS_SYNBAD);
}
}
/*
* strunvis - decode src into dst
*
* Number of chars decoded into dst is returned, -1 on error.
* Dst is null terminated.
*/
int
strunvisx(dst, src, flag)
char *dst;
const char *src;
int flag;
{
char c;
char *start = dst;
int state = 0;
_DIAGASSERT(src != NULL);
_DIAGASSERT(dst != NULL);
while ((c = *src++) != '\0') {
again:
switch (__unvis13(dst, c, &state, flag)) {
case UNVIS_VALID:
dst++;
break;
case UNVIS_VALIDPUSH:
dst++;
goto again;
case 0:
case UNVIS_NOCHAR:
break;
default:
return (-1);
}
}
if (__unvis13(dst, c, &state, UNVIS_END) == UNVIS_VALID)
dst++;
*dst = '\0';
return (dst - start);
}
int
strunvis(dst, src)
char *dst;
const char *src;
{
return strunvisx(dst, src, 0);
}
#endif
/* $NetBSD: vis.c,v 1.22 2002/03/23 17:38:27 christos Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
* Copyright (c) 1989, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
__RCSID("$NetBSD: vis.c,v 1.22 2002/03/23 17:38:27 christos Exp $");
#endif /* LIBC_SCCS and not lint */
#include "config.h"
#include <sys/types.h>
#include <assert.h>
#ifdef HAVE_ALLOCA_H
#include <alloca.h>
#endif
#include <stdlib.h>
#include "np/vis.h"
#ifdef __weak_alias
__weak_alias(strsvis,_strsvis)
__weak_alias(strsvisx,_strsvisx)
__weak_alias(strvis,_strvis)
__weak_alias(strvisx,_strvisx)
__weak_alias(svis,_svis)
__weak_alias(vis,_vis)
#endif
#if !HAVE_VIS_H
#include <ctype.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
#undef BELL
#if defined(__STDC__)
#define BELL '\a'
#else
#define BELL '\007'
#endif
#define isoctal(c) (((unsigned char)(c)) >= '0' && ((unsigned char)(c)) <= '7')
#define iswhite(c) (c == ' ' || c == '\t' || c == '\n')
#define issafe(c) (c == '\b' || c == BELL || c == '\r')
#define xtoa(c) "0123456789abcdef"[c]
#define MAXEXTRAS 5
#define MAKEEXTRALIST(flag, extra, orig) \
do { \
const char *o = orig; \
char *e; \
while (*o++) \
continue; \
extra = alloca((size_t)((o - orig) + MAXEXTRAS)); \
for (o = orig, e = extra; (*e++ = *o++) != '\0';) \
continue; \
e--; \
if (flag & VIS_SP) *e++ = ' '; \
if (flag & VIS_TAB) *e++ = '\t'; \
if (flag & VIS_NL) *e++ = '\n'; \
if ((flag & VIS_NOSLASH) == 0) *e++ = '\\'; \
*e = '\0'; \
} while (/*CONSTCOND*/0)
/*
* This is HVIS, the macro of vis used to HTTP style (RFC 1808)
*/
#define HVIS(dst, c, flag, nextc, extra) \
do \
if (!isascii(c) || !isalnum(c) || strchr("$-_.+!*'(),", c) != NULL) { \
*dst++ = '%'; \
*dst++ = xtoa(((unsigned int)c >> 4) & 0xf); \
*dst++ = xtoa((unsigned int)c & 0xf); \
} else { \
SVIS(dst, c, flag, nextc, extra); \
} \
while (/*CONSTCOND*/0)
/*
* This is SVIS, the central macro of vis.
* dst: Pointer to the destination buffer
* c: Character to encode
* flag: Flag word
* nextc: The character following 'c'
* extra: Pointer to the list of extra characters to be
* backslash-protected.
*/
#define SVIS(dst, c, flag, nextc, extra) \
do { \
int isextra, isc; \
isextra = strchr(extra, c) != NULL; \
if (!isextra && isascii(c) && (isgraph(c) || iswhite(c) || \
((flag & VIS_SAFE) && issafe(c)))) { \
*dst++ = c; \
break; \
} \
isc = 0; \
if (flag & VIS_CSTYLE) { \
switch (c) { \
case '\n': \
isc = 1; *dst++ = '\\'; *dst++ = 'n'; \
break; \
case '\r': \
isc = 1; *dst++ = '\\'; *dst++ = 'r'; \
break; \
case '\b': \
isc = 1; *dst++ = '\\'; *dst++ = 'b'; \
break; \
case BELL: \
isc = 1; *dst++ = '\\'; *dst++ = 'a'; \
break; \
case '\v': \
isc = 1; *dst++ = '\\'; *dst++ = 'v'; \
break; \
case '\t': \
isc = 1; *dst++ = '\\'; *dst++ = 't'; \
break; \
case '\f': \
isc = 1; *dst++ = '\\'; *dst++ = 'f'; \
break; \
case ' ': \
isc = 1; *dst++ = '\\'; *dst++ = 's'; \
break; \
case '\0': \
isc = 1; *dst++ = '\\'; *dst++ = '0'; \
if (isoctal(nextc)) { \
*dst++ = '0'; \
*dst++ = '0'; \
} \
} \
} \
if (isc) break; \
if (isextra || ((c & 0177) == ' ') || (flag & VIS_OCTAL)) { \
*dst++ = '\\'; \
*dst++ = (unsigned char)(((unsigned int)(unsigned char)c >> 6) & 03) + '0'; \
*dst++ = (unsigned char)(((unsigned int)(unsigned char)c >> 3) & 07) + '0'; \
*dst++ = (c & 07) + '0'; \
} else { \
if ((flag & VIS_NOSLASH) == 0) *dst++ = '\\'; \
if (c & 0200) { \
c &= 0177; *dst++ = 'M'; \
} \
if (iscntrl(c)) { \
*dst++ = '^'; \
if (c == 0177) \
*dst++ = '?'; \
else \
*dst++ = c + '@'; \
} else { \
*dst++ = '-'; *dst++ = c; \
} \
} \
} while (/*CONSTCOND*/0)
/*
* svis - visually encode characters, also encoding the characters
* pointed to by `extra'
*/
char *
svis(dst, c, flag, nextc, extra)
char *dst;
int c, flag, nextc;
const char *extra;
{
char *nextra;
_DIAGASSERT(dst != NULL);
_DIAGASSERT(extra != NULL);
MAKEEXTRALIST(flag, nextra, extra);
if (flag & VIS_HTTPSTYLE)
HVIS(dst, c, flag, nextc, nextra);
else
SVIS(dst, c, flag, nextc, nextra);
*dst = '\0';
return(dst);
}
/*
* strsvis, strsvisx - visually encode characters from src into dst
*
* Extra is a pointer to a \0-terminated list of characters to
* be encoded, too. These functions are useful e. g. to
* encode strings in such a way so that they are not interpreted
* by a shell.
*
* Dst must be 4 times the size of src to account for possible
* expansion. The length of dst, not including the trailing NULL,
* is returned.
*
* Strsvisx encodes exactly len bytes from src into dst.
* This is useful for encoding a block of data.
*/
int
strsvis(dst, src, flag, extra)
char *dst;
const char *src;
int flag;
const char *extra;
{
char c;
char *start;
char *nextra;
_DIAGASSERT(dst != NULL);
_DIAGASSERT(src != NULL);
_DIAGASSERT(extra != NULL);
MAKEEXTRALIST(flag, nextra, extra);
if (flag & VIS_HTTPSTYLE) {
for (start = dst; (c = *src++) != '\0'; /* empty */)
HVIS(dst, c, flag, *src, nextra);
} else {
for (start = dst; (c = *src++) != '\0'; /* empty */)
SVIS(dst, c, flag, *src, nextra);
}
*dst = '\0';
return (dst - start);
}
int
strsvisx(dst, src, len, flag, extra)
char *dst;
const char *src;
size_t len;
int flag;
const char *extra;
{
char c;
char *start;
char *nextra;
_DIAGASSERT(dst != NULL);
_DIAGASSERT(src != NULL);
_DIAGASSERT(extra != NULL);
MAKEEXTRALIST(flag, nextra, extra);
if (flag & VIS_HTTPSTYLE) {
for (start = dst; len > 0; len--) {
c = *src++;
HVIS(dst, c, flag, len ? *src : '\0', nextra);
}
} else {
for (start = dst; len > 0; len--) {
c = *src++;
SVIS(dst, c, flag, len ? *src : '\0', nextra);
}
}
*dst = '\0';
return (dst - start);
}
/*
* vis - visually encode characters
*/
char *
vis(dst, c, flag, nextc)
char *dst;
int c, flag, nextc;
{
char *extra;
_DIAGASSERT(dst != NULL);
MAKEEXTRALIST(flag, extra, "");
if (flag & VIS_HTTPSTYLE)
HVIS(dst, c, flag, nextc, extra);
else
SVIS(dst, c, flag, nextc, extra);
*dst = '\0';
return (dst);
}
/*
* strvis, strvisx - visually encode characters from src into dst
*
* Dst must be 4 times the size of src to account for possible
* expansion. The length of dst, not including the trailing NULL,
* is returned.
*
* Strvisx encodes exactly len bytes from src into dst.
* This is useful for encoding a block of data.
*/
int
strvis(dst, src, flag)
char *dst;
const char *src;
int flag;
{
char *extra;
MAKEEXTRALIST(flag, extra, "");
return (strsvis(dst, src, flag, extra));
}
int
strvisx(dst, src, len, flag)
char *dst;
const char *src;
size_t len;
int flag;
{
char *extra;
MAKEEXTRALIST(flag, extra, "");
return (strsvisx(dst, src, len, flag, extra));
}
#endif
/* $NetBSD: vis.h,v 1.12 2002/03/23 17:39:05 christos Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)vis.h 8.1 (Berkeley) 6/2/93
*/
#ifndef _VIS_H_
#define _VIS_H_
#ifdef HAVE_SYS_CDEFS_H
#include <sys/cdefs.h>
#endif
/*
* to select alternate encoding format
*/
#define VIS_OCTAL 0x01 /* use octal \ddd format */
#define VIS_CSTYLE 0x02 /* use \[nrft0..] where appropiate */
/*
* to alter set of characters encoded (default is to encode all
* non-graphic except space, tab, and newline).
*/
#define VIS_SP 0x04 /* also encode space */
#define VIS_TAB 0x08 /* also encode tab */
#define VIS_NL 0x10 /* also encode newline */
#define VIS_WHITE (VIS_SP | VIS_TAB | VIS_NL)
#define VIS_SAFE 0x20 /* only encode "unsafe" characters */
/*
* other
*/
#define VIS_NOSLASH 0x40 /* inhibit printing '\' */
#define VIS_HTTPSTYLE 0x80 /* http-style escape % HEX HEX */
/*
* unvis return codes
*/
#define UNVIS_VALID 1 /* character valid */
#define UNVIS_VALIDPUSH 2 /* character valid, push back passed char */
#define UNVIS_NOCHAR 3 /* valid sequence, no character produced */
#define UNVIS_SYNBAD -1 /* unrecognized escape sequence */
#define UNVIS_ERROR -2 /* decoder in unknown state (unrecoverable) */
/*
* unvis flags
*/
#define UNVIS_END 1 /* no more characters */
char *vis(char *, int, int, int);
char *svis(char *, int, int, int, const char *);
int strvis(char *, const char *, int);
int strsvis(char *, const char *, int, const char *);
int strvisx(char *, const char *, size_t, int);
int strsvisx(char *, const char *, size_t, int, const char *);
int strunvis(char *, const char *);
int strunvisx(char *, const char *, int);
#ifdef __LIBC12_SOURCE__
int unvis(char *, int, int *, int);
int __unvis13(char *, int, int *, int);
#else
int unvis(char *, int, int *, int) __RENAME(__unvis13);
#endif
#endif /* !_VIS_H_ */
/* $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 * Copyright (c) 1992, 1993
...@@ -36,7 +36,14 @@ ...@@ -36,7 +36,14 @@
* SUCH DAMAGE. * 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 * parse.c: parse an editline extended command
...@@ -51,7 +58,6 @@ ...@@ -51,7 +58,6 @@
* settc * settc
* setty * setty
*/ */
#include "sys.h"
#include "el.h" #include "el.h"
#include "tokenizer.h" #include "tokenizer.h"
#include <stdlib.h> #include <stdlib.h>
...@@ -63,7 +69,7 @@ private const struct { ...@@ -63,7 +69,7 @@ private const struct {
{ "bind", map_bind }, { "bind", map_bind },
{ "echotc", term_echotc }, { "echotc", term_echotc },
{ "edit", el_editmode }, { "edit", el_editmode },
{ "history", hist_list }, { "history", hist_command },
{ "telltc", term_telltc }, { "telltc", term_telltc },
{ "settc", term_settc }, { "settc", term_settc },
{ "setty", tty_stty }, { "setty", tty_stty },
......
/* $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 * Copyright (c) 1992, 1993
...@@ -36,12 +36,18 @@ ...@@ -36,12 +36,18 @@
* SUCH DAMAGE. * 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 * prompt.c: Prompt printing functions
*/ */
#include "sys.h"
#include <stdio.h> #include <stdio.h>
#include "el.h" #include "el.h"
......
/* $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 * Copyright (c) 1992, 1993
...@@ -36,13 +36,19 @@ ...@@ -36,13 +36,19 @@
* SUCH DAMAGE. * 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. * read.c: Clean this junk up! This is horrible code.
* Terminal read functions * Terminal read functions
*/ */
#include "sys.h"
#include <errno.h> #include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <stdlib.h> #include <stdlib.h>
...@@ -52,12 +58,44 @@ ...@@ -52,12 +58,44 @@
private int read__fixio(int, int); private int read__fixio(int, int);
private int read_preread(EditLine *); private int read_preread(EditLine *);
private int read_getcmd(EditLine *, el_action_t *, char *);
private int read_char(EditLine *, 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 #ifdef DEBUG_EDIT
private void private void
...@@ -83,7 +121,11 @@ read_debug(EditLine *el) ...@@ -83,7 +121,11 @@ read_debug(EditLine *el)
*/ */
/* ARGSUSED */ /* ARGSUSED */
private int 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) { switch (e) {
...@@ -178,14 +220,13 @@ read_preread(EditLine *el) ...@@ -178,14 +220,13 @@ read_preread(EditLine *el)
* Push a macro * Push a macro
*/ */
public void public void
el_push(EditLine *el, const char *str) el_push(EditLine *el, char *str)
{ {
c_macro_t *ma = &el->el_chared.c_macro; c_macro_t *ma = &el->el_chared.c_macro;
if (str != NULL && ma->level + 1 < EL_MAXMACRO) { if (str != NULL && ma->level + 1 < EL_MAXMACRO) {
ma->level++; ma->level++;
/* LINTED const cast */ ma->macro[ma->level] = str;
ma->macro[ma->level] = (char *) str;
} else { } else {
term_beep(el); term_beep(el);
term__flush(); term__flush();
...@@ -199,10 +240,10 @@ el_push(EditLine *el, const char *str) ...@@ -199,10 +240,10 @@ el_push(EditLine *el, const char *str)
private int private int
read_getcmd(EditLine *el, el_action_t *cmdnum, char *ch) read_getcmd(EditLine *el, el_action_t *cmdnum, char *ch)
{ {
el_action_t cmd = ED_UNASSIGNED; el_action_t cmd;
int num; int num;
while (cmd == ED_UNASSIGNED || cmd == ED_SEQUENCE_LEAD_IN) { do {
if ((num = el_getc(el, ch)) != 1) /* if EOF or error */ if ((num = el_getc(el, ch)) != 1) /* if EOF or error */
return (num); return (num);
...@@ -241,7 +282,7 @@ read_getcmd(EditLine *el, el_action_t *cmdnum, char *ch) ...@@ -241,7 +282,7 @@ read_getcmd(EditLine *el, el_action_t *cmdnum, char *ch)
} }
if (el->el_map.alt == NULL) if (el->el_map.alt == NULL)
el->el_map.current = el->el_map.key; el->el_map.current = el->el_map.key;
} } while (cmd == ED_SEQUENCE_LEAD_IN);
*cmdnum = cmd; *cmdnum = cmd;
return (OKCMD); return (OKCMD);
} }
...@@ -307,7 +348,7 @@ el_getc(EditLine *el, char *cp) ...@@ -307,7 +348,7 @@ el_getc(EditLine *el, char *cp)
#ifdef DEBUG_READ #ifdef DEBUG_READ
(void) fprintf(el->el_errfile, "Reading a character\n"); (void) fprintf(el->el_errfile, "Reading a character\n");
#endif /* DEBUG_READ */ #endif /* DEBUG_READ */
num_read = read_char(el, cp); num_read = (*el->el_read.read_char)(el, cp);
#ifdef DEBUG_READ #ifdef DEBUG_READ
(void) fprintf(el->el_errfile, "Got it %c\n", *cp); (void) fprintf(el->el_errfile, "Got it %c\n", *cp);
#endif /* DEBUG_READ */ #endif /* DEBUG_READ */
...@@ -333,7 +374,7 @@ el_gets(EditLine *el, int *nread) ...@@ -333,7 +374,7 @@ el_gets(EditLine *el, int *nread)
char *cp = el->el_line.buffer; char *cp = el->el_line.buffer;
size_t idx; 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 */ /* make sure there is space for next character */
if (cp + 1 >= el->el_line.limit) { if (cp + 1 >= el->el_line.limit) {
idx = (cp - el->el_line.buffer); idx = (cp - el->el_line.buffer);
...@@ -352,6 +393,11 @@ el_gets(EditLine *el, int *nread) ...@@ -352,6 +393,11 @@ el_gets(EditLine *el, int *nread)
*nread = el->el_line.cursor - el->el_line.buffer; *nread = el->el_line.cursor - el->el_line.buffer;
return (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 */ re_clear_display(el); /* reset the display stuff */
ch_reset(el); ch_reset(el);
...@@ -378,7 +424,7 @@ el_gets(EditLine *el, int *nread) ...@@ -378,7 +424,7 @@ el_gets(EditLine *el, int *nread)
term__flush(); term__flush();
while (read_char(el, cp) == 1) { while ((*el->el_read.read_char)(el, cp) == 1) {
/* make sure there is space next character */ /* make sure there is space next character */
if (cp + 1 >= el->el_line.limit) { if (cp + 1 >= el->el_line.limit) {
idx = (cp - el->el_line.buffer); idx = (cp - el->el_line.buffer);
...@@ -386,6 +432,8 @@ el_gets(EditLine *el, int *nread) ...@@ -386,6 +432,8 @@ el_gets(EditLine *el, int *nread)
break; break;
cp = &el->el_line.buffer[idx]; cp = &el->el_line.buffer[idx];
} }
if (*cp == 4) /* ought to be stty eof */
break;
cp++; cp++;
if (cp[-1] == '\r' || cp[-1] == '\n') if (cp[-1] == '\r' || cp[-1] == '\n')
break; break;
...@@ -397,6 +445,7 @@ el_gets(EditLine *el, int *nread) ...@@ -397,6 +445,7 @@ el_gets(EditLine *el, int *nread)
*nread = el->el_line.cursor - el->el_line.buffer; *nread = el->el_line.cursor - el->el_line.buffer;
return (el->el_line.buffer); return (el->el_line.buffer);
} }
for (num = OKCMD; num == OKCMD;) { /* while still editing this for (num = OKCMD; num == OKCMD;) { /* while still editing this
* line */ * line */
#ifdef DEBUG_EDIT #ifdef DEBUG_EDIT
...@@ -410,7 +459,7 @@ el_gets(EditLine *el, int *nread) ...@@ -410,7 +459,7 @@ el_gets(EditLine *el, int *nread)
#endif /* DEBUG_READ */ #endif /* DEBUG_READ */
break; 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 #ifdef DEBUG_EDIT
(void) fprintf(el->el_errfile, (void) fprintf(el->el_errfile,
"ERROR: illegal command from key 0%o\r\n", ch); "ERROR: illegal command from key 0%o\r\n", ch);
...@@ -432,7 +481,24 @@ el_gets(EditLine *el, int *nread) ...@@ -432,7 +481,24 @@ el_gets(EditLine *el, int *nread)
"Error command = %d\n", cmdnum); "Error command = %d\n", cmdnum);
} }
#endif /* DEBUG_READ */ #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); 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 */ /* save the last command here */
el->el_state.lastcmd = cmdnum; el->el_state.lastcmd = cmdnum;
...@@ -440,8 +506,6 @@ el_gets(EditLine *el, int *nread) ...@@ -440,8 +506,6 @@ el_gets(EditLine *el, int *nread)
/* use any return value */ /* use any return value */
switch (retval) { switch (retval) {
case CC_CURSOR: case CC_CURSOR:
el->el_state.argument = 1;
el->el_state.doingarg = 0;
re_refresh_cursor(el); re_refresh_cursor(el);
break; break;
...@@ -451,26 +515,20 @@ el_gets(EditLine *el, int *nread) ...@@ -451,26 +515,20 @@ el_gets(EditLine *el, int *nread)
/* FALLTHROUGH */ /* FALLTHROUGH */
case CC_REFRESH: case CC_REFRESH:
el->el_state.argument = 1;
el->el_state.doingarg = 0;
re_refresh(el); re_refresh(el);
break; break;
case CC_REFRESH_BEEP: case CC_REFRESH_BEEP:
el->el_state.argument = 1;
el->el_state.doingarg = 0;
re_refresh(el); re_refresh(el);
term_beep(el); term_beep(el);
break; break;
case CC_NORM: /* normal char */ case CC_NORM: /* normal char */
el->el_state.argument = 1;
el->el_state.doingarg = 0;
break; break;
case CC_ARGHACK: /* Suggested by Rich Salz */ case CC_ARGHACK: /* Suggested by Rich Salz */
/* <rsalz@pineapple.bbn.com> */ /* <rsalz@pineapple.bbn.com> */
break; /* keep going... */ continue; /* keep going... */
case CC_EOF: /* end of file typed */ case CC_EOF: /* end of file typed */
num = 0; num = 0;
...@@ -489,8 +547,6 @@ el_gets(EditLine *el, int *nread) ...@@ -489,8 +547,6 @@ el_gets(EditLine *el, int *nread)
re_clear_display(el); /* reset the display stuff */ re_clear_display(el); /* reset the display stuff */
ch_reset(el); /* reset the input pointers */ ch_reset(el); /* reset the input pointers */
re_refresh(el); /* print the prompt again */ re_refresh(el); /* print the prompt again */
el->el_state.argument = 1;
el->el_state.doingarg = 0;
break; break;
case CC_ERROR: case CC_ERROR:
...@@ -499,17 +555,18 @@ el_gets(EditLine *el, int *nread) ...@@ -499,17 +555,18 @@ el_gets(EditLine *el, int *nread)
(void) fprintf(el->el_errfile, (void) fprintf(el->el_errfile,
"*** editor ERROR ***\r\n\n"); "*** editor ERROR ***\r\n\n");
#endif /* DEBUG_READ */ #endif /* DEBUG_READ */
el->el_state.argument = 1;
el->el_state.doingarg = 0;
term_beep(el); term_beep(el);
term__flush(); term__flush();
break; break;
} }
el->el_state.argument = 1;
el->el_state.doingarg = 0;
el->el_chared.c_vcmd.action = NOP;
} }
term__flush(); /* flush any buffered output */
/* make sure the tty is set up correctly */ /* make sure the tty is set up correctly */
(void) tty_cookedmode(el); (void) tty_cookedmode(el);
term__flush(); /* flush any buffered output */
if (el->el_flags & HANDLE_SIGNALS) if (el->el_flags & HANDLE_SIGNALS)
sig_clr(el); sig_clr(el);
if (nread) if (nread)
......
/* $NetBSD: read.h,v 1.1 2001/09/27 19:29:50 christos Exp $ */
/*-
* Copyright (c) 2001 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Anthony Mallet.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*
* el.read.h: Character reading functions
*/
#ifndef _h_el_read
#define _h_el_read
typedef int (*el_rfunc_t)(EditLine *, char *);
typedef struct el_read_t {
el_rfunc_t read_char; /* Function to read a character */
} el_read_t;
protected int read_init(EditLine *);
protected int el_read_setfn(EditLine *, el_rfunc_t);
protected el_rfunc_t el_read_getfn(EditLine *);
#endif /* _h_el_read */
/* $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. * Copyright (c) 1997 The NetBSD Foundation, Inc.
...@@ -36,7 +36,11 @@ ...@@ -36,7 +36,11 @@
* POSSIBILITY OF SUCH DAMAGE. * 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/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <stdio.h> #include <stdio.h>
...@@ -47,14 +51,13 @@ ...@@ -47,14 +51,13 @@
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <limits.h> #include <limits.h>
#ifdef HAVE_ALLOCA_H
#include <alloca.h>
#endif
#include "histedit.h" #include "histedit.h"
#include "readline/readline.h" #include "readline/readline.h"
#include "sys.h"
#include "el.h" #include "el.h"
#include "fcns.h" /* for EL_NUM_FCNS */ #include "fcns.h" /* for EL_NUM_FCNS */
#ifdef HAVE_ALLOCA_H
#include <alloca.h>
#endif
/* for rl_complete() */ /* for rl_complete() */
#define TAB '\r' #define TAB '\r'
...@@ -65,7 +68,11 @@ ...@@ -65,7 +68,11 @@
/* readline compatibility stuff - look at readline sources/documentation */ /* readline compatibility stuff - look at readline sources/documentation */
/* to see what these variables mean */ /* to see what these variables mean */
const char *rl_library_version = "EditLine wrapper"; 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_instream = NULL;
FILE *rl_outstream = NULL; FILE *rl_outstream = NULL;
int rl_point = 0; int rl_point = 0;
...@@ -77,12 +84,12 @@ int history_length = 0; ...@@ -77,12 +84,12 @@ int history_length = 0;
int max_input_history = 0; int max_input_history = 0;
char history_expansion_char = '!'; char history_expansion_char = '!';
char history_subst_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; Function *history_inhibit_expansion_function = NULL;
int rl_inhibit_completion = 0; int rl_inhibit_completion = 0;
int rl_attempted_completion_over = 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_word_break_characters = NULL;
char *rl_completer_quote_characters = NULL; char *rl_completer_quote_characters = NULL;
CPFunction *rl_completion_entry_function = NULL; CPFunction *rl_completion_entry_function = NULL;
...@@ -215,6 +222,11 @@ rl_initialize(void) ...@@ -215,6 +222,11 @@ rl_initialize(void)
/* for proper prompt printing in readline() */ /* for proper prompt printing in readline() */
el_rl_prompt = strdup(""); 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_PROMPT, _get_prompt);
el_set(e, EL_SIGNAL, 1); el_set(e, EL_SIGNAL, 1);
...@@ -250,8 +262,8 @@ rl_initialize(void) ...@@ -250,8 +262,8 @@ rl_initialize(void)
* and rl_line_buffer directly. * and rl_line_buffer directly.
*/ */
li = el_line(e); li = el_line(e);
/* LINTED const cast */ /* a cheesy way to get rid of const cast. */
rl_line_buffer = (char *) li->buffer; rl_line_buffer = memchr(li->buffer, *li->buffer, 1);
rl_point = rl_end = 0; rl_point = rl_end = 0;
return (0); return (0);
...@@ -268,6 +280,7 @@ readline(const char *prompt) ...@@ -268,6 +280,7 @@ readline(const char *prompt)
HistEvent ev; HistEvent ev;
int count; int count;
const char *ret; const char *ret;
char *buf;
if (e == NULL || h == NULL) if (e == NULL || h == NULL)
rl_initialize(); rl_initialize();
...@@ -278,28 +291,28 @@ readline(const char *prompt) ...@@ -278,28 +291,28 @@ readline(const char *prompt)
if (strcmp(el_rl_prompt, prompt) != 0) { if (strcmp(el_rl_prompt, prompt) != 0) {
free(el_rl_prompt); free(el_rl_prompt);
el_rl_prompt = strdup(prompt); el_rl_prompt = strdup(prompt);
if (el_rl_prompt == NULL)
return NULL;
} }
/* get one line from input stream */ /* get one line from input stream */
ret = el_gets(e, &count); ret = el_gets(e, &count);
if (ret && count > 0) { if (ret && count > 0) {
char *foo;
int lastidx; int lastidx;
foo = strdup(ret); buf = strdup(ret);
if (buf == NULL)
return NULL;
lastidx = count - 1; lastidx = count - 1;
if (foo[lastidx] == '\n') if (buf[lastidx] == '\n')
foo[lastidx] = '\0'; buf[lastidx] = '\0';
ret = foo;
} else } else
ret = NULL; buf = NULL;
history(h, &ev, H_GETSIZE); history(h, &ev, H_GETSIZE);
history_length = ev.num; history_length = ev.num;
/* LINTED const cast */ return buf;
return (char *) ret;
} }
/* /*
...@@ -333,6 +346,8 @@ _rl_compat_sub(const char *str, const char *what, const char *with, ...@@ -333,6 +346,8 @@ _rl_compat_sub(const char *str, const char *what, const char *with,
size_t size, i; size_t size, i;
result = malloc((size = 16)); result = malloc((size = 16));
if (result == NULL)
return NULL;
temp = str; temp = str;
with_len = strlen(with); with_len = strlen(with);
what_len = strlen(what); what_len = strlen(what);
...@@ -343,8 +358,14 @@ _rl_compat_sub(const char *str, const char *what, const char *with, ...@@ -343,8 +358,14 @@ _rl_compat_sub(const char *str, const char *what, const char *with,
i = new - temp; i = new - temp;
add = i + with_len; add = i + with_len;
if (i + add + 1 >= size) { if (i + add + 1 >= size) {
char *nresult;
size += add + 1; 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); (void) strncpy(&result[len], temp, i);
len += i; len += i;
...@@ -354,8 +375,14 @@ _rl_compat_sub(const char *str, const char *what, const char *with, ...@@ -354,8 +375,14 @@ _rl_compat_sub(const char *str, const char *what, const char *with,
} else { } else {
add = strlen(temp); add = strlen(temp);
if (len + add + 1 >= size) { if (len + add + 1 >= size) {
char *nresult;
size += add + 1; 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 */ (void) strcpy(&result[len], temp); /* safe */
len += add; len += add;
...@@ -392,7 +419,7 @@ _history_expand_command(const char *command, size_t cmdlen, char **result) ...@@ -392,7 +419,7 @@ _history_expand_command(const char *command, size_t cmdlen, char **result)
*result = NULL; *result = NULL;
cmd = (char*) alloca(cmdlen + 1); cmd = alloca(cmdlen + 1);
(void) strncpy(cmd, command, cmdlen); (void) strncpy(cmd, command, cmdlen);
cmd[cmdlen] = 0; cmd[cmdlen] = 0;
...@@ -425,7 +452,7 @@ _history_expand_command(const char *command, size_t cmdlen, char **result) ...@@ -425,7 +452,7 @@ _history_expand_command(const char *command, size_t cmdlen, char **result)
return (-1); return (-1);
prefix = 0; prefix = 0;
} }
search = (char*) alloca(len + 1); search = alloca(len + 1);
(void) strncpy(search, &cmd[idx], len); (void) strncpy(search, &cmd[idx], len);
search[len] = '\0'; search[len] = '\0';
...@@ -498,6 +525,8 @@ _history_expand_command(const char *command, size_t cmdlen, char **result) ...@@ -498,6 +525,8 @@ _history_expand_command(const char *command, size_t cmdlen, char **result)
cmd++; cmd++;
line = strdup(event_data); line = strdup(event_data);
if (line == NULL)
return 0;
for (; *cmd; cmd++) { for (; *cmd; cmd++) {
if (*cmd == ':') if (*cmd == ':')
continue; continue;
...@@ -515,7 +544,7 @@ _history_expand_command(const char *command, size_t cmdlen, char **result) ...@@ -515,7 +544,7 @@ _history_expand_command(const char *command, size_t cmdlen, char **result)
g_on = 2; g_on = 2;
else if (*cmd == 's' || *cmd == '&') { else if (*cmd == 's' || *cmd == '&') {
char *what, *with, delim; char *what, *with, delim;
size_t len, from_len; unsigned int len, from_len;
size_t size; size_t size;
if (*cmd == '&' && (from == NULL || to == NULL)) if (*cmd == '&' && (from == NULL || to == NULL))
...@@ -524,23 +553,36 @@ _history_expand_command(const char *command, size_t cmdlen, char **result) ...@@ -524,23 +553,36 @@ _history_expand_command(const char *command, size_t cmdlen, char **result)
delim = *(++cmd), cmd++; delim = *(++cmd), cmd++;
size = 16; size = 16;
what = realloc(from, size); what = realloc(from, size);
if (what == NULL) {
free(from);
return 0;
}
len = 0; len = 0;
for (; *cmd && *cmd != delim; cmd++) { for (; *cmd && *cmd != delim; cmd++) {
if (*cmd == '\\' if (*cmd == '\\'
&& *(cmd + 1) == delim) && *(cmd + 1) == delim)
cmd++; cmd++;
if (len >= size) if (len >= size) {
what = realloc(what, char *nwhat;
nwhat = realloc(what,
(size <<= 1)); (size <<= 1));
if (nwhat == NULL) {
free(what);
return 0;
}
what = nwhat;
}
what[len++] = *cmd; what[len++] = *cmd;
} }
what[len] = '\0'; what[len] = '\0';
from = what; from = what;
if (*what == '\0') { if (*what == '\0') {
free(what); free(what);
if (search) if (search) {
from = strdup(search); from = strdup(search);
else { if (from == NULL)
return 0;
} else {
from = NULL; from = NULL;
return (-1); return (-1);
} }
...@@ -551,12 +593,22 @@ _history_expand_command(const char *command, size_t cmdlen, char **result) ...@@ -551,12 +593,22 @@ _history_expand_command(const char *command, size_t cmdlen, char **result)
size = 16; size = 16;
with = realloc(to, size); with = realloc(to, size);
if (with == NULL) {
free(to);
return -1;
}
len = 0; len = 0;
from_len = strlen(from); from_len = strlen(from);
for (; *cmd && *cmd != delim; cmd++) { for (; *cmd && *cmd != delim; cmd++) {
if (len + from_len + 1 >= size) { if (len + from_len + 1 >= size) {
char *nwith;
size += from_len + 1; size += from_len + 1;
with = realloc(with, size); nwith = realloc(with, size);
if (nwith == NULL) {
free(with);
return -1;
}
with = nwith;
} }
if (*cmd == '&') { if (*cmd == '&') {
/* safe */ /* safe */
...@@ -575,8 +627,10 @@ _history_expand_command(const char *command, size_t cmdlen, char **result) ...@@ -575,8 +627,10 @@ _history_expand_command(const char *command, size_t cmdlen, char **result)
tempcmd = _rl_compat_sub(line, from, to, tempcmd = _rl_compat_sub(line, from, to,
(g_on) ? 1 : 0); (g_on) ? 1 : 0);
if (tempcmd) {
free(line); free(line);
line = tempcmd; line = tempcmd;
}
g_on = 0; g_on = 0;
} }
} }
...@@ -622,14 +676,21 @@ _history_expand_command(const char *command, size_t cmdlen, char **result) ...@@ -622,14 +676,21 @@ _history_expand_command(const char *command, size_t cmdlen, char **result)
} }
cmdsize = 1, cmdlen = 0; cmdsize = 1, cmdlen = 0;
tempcmd = malloc(cmdsize); if ((tempcmd = malloc(cmdsize)) == NULL)
return 0;
for (i = start; start <= i && i <= end; i++) { for (i = start; start <= i && i <= end; i++) {
int arr_len; int arr_len;
arr_len = strlen(arr[i]); arr_len = strlen(arr[i]);
if (cmdlen + arr_len + 1 >= cmdsize) { if (cmdlen + arr_len + 1 >= cmdsize) {
char *ntempcmd;
cmdsize += arr_len + 1; 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 */ (void) strcpy(&tempcmd[cmdlen], arr[i]); /* safe */
cmdlen += arr_len; cmdlen += arr_len;
...@@ -662,10 +723,12 @@ history_expand(char *str, char **output) ...@@ -662,10 +723,12 @@ history_expand(char *str, char **output)
rl_initialize(); rl_initialize();
*output = strdup(str); /* do it early */ *output = strdup(str); /* do it early */
if (*output == NULL)
return 0;
if (str[0] == history_subst_char) { if (str[0] == history_subst_char) {
/* ^foo^foo2^ is equivalent to !!:s^foo^foo2^ */ /* ^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[0] = temp[1] = history_expansion_char;
temp[2] = ':'; temp[2] = ':';
temp[3] = 's'; temp[3] = 's';
...@@ -674,8 +737,14 @@ history_expand(char *str, char **output) ...@@ -674,8 +737,14 @@ history_expand(char *str, char **output)
} }
#define ADD_STRING(what, len) \ #define ADD_STRING(what, len) \
{ \ { \
if (idx + len + 1 > size) \ if (idx + len + 1 > size) { \
result = realloc(result, (size += len + 1)); \ char *nresult = realloc(result, (size += len + 1));\
if (nresult == NULL) { \
free(*output); \
return 0; \
} \
result = nresult; \
} \
(void)strncpy(&result[idx], what, len); \ (void)strncpy(&result[idx], what, len); \
idx += len; \ idx += len; \
result[idx] = '\0'; \ result[idx] = '\0'; \
...@@ -789,11 +858,21 @@ history_tokenize(const char *str) ...@@ -789,11 +858,21 @@ history_tokenize(const char *str)
} }
if (result_idx + 2 >= size) { if (result_idx + 2 >= size) {
char **nresult;
size <<= 1; 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; len = i - start;
temp = malloc(len + 1); temp = malloc(len + 1);
if (temp == NULL) {
free(result);
return NULL;
}
(void) strncpy(temp, &str[start], len); (void) strncpy(temp, &str[start], len);
temp[len] = '\0'; temp[len] = '\0';
result[result_idx++] = temp; result[result_idx++] = temp;
...@@ -1158,11 +1237,15 @@ tilde_expand(char *txt) ...@@ -1158,11 +1237,15 @@ tilde_expand(char *txt)
return (strdup(txt)); return (strdup(txt));
temp = strchr(txt + 1, '/'); temp = strchr(txt + 1, '/');
if (temp == NULL) if (temp == NULL) {
temp = strdup(txt + 1); temp = strdup(txt + 1);
else { if (temp == NULL)
return NULL;
} else {
len = temp - txt + 1; /* text until string after slash */ len = temp - txt + 1; /* text until string after slash */
temp = malloc(len); temp = malloc(len);
if (temp == NULL)
return NULL;
(void) strncpy(temp, txt + 1, len - 2); (void) strncpy(temp, txt + 1, len - 2);
temp[len - 2] = '\0'; temp[len - 2] = '\0';
} }
...@@ -1176,6 +1259,8 @@ tilde_expand(char *txt) ...@@ -1176,6 +1259,8 @@ tilde_expand(char *txt)
txt += len; txt += len;
temp = malloc(strlen(pass->pw_dir) + 1 + strlen(txt) + 1); temp = malloc(strlen(pass->pw_dir) + 1 + strlen(txt) + 1);
if (temp == NULL)
return NULL;
(void) sprintf(temp, "%s/%s", pass->pw_dir, txt); (void) sprintf(temp, "%s/%s", pass->pw_dir, txt);
return (temp); return (temp);
...@@ -1200,28 +1285,45 @@ filename_completion_function(const char *text, int state) ...@@ -1200,28 +1285,45 @@ filename_completion_function(const char *text, int state)
size_t len; size_t len;
if (state == 0 || dir == NULL) { if (state == 0 || dir == NULL) {
if (dir != NULL) {
closedir(dir);
dir = NULL;
}
temp = strrchr(text, '/'); temp = strrchr(text, '/');
if (temp) { if (temp) {
char *nptr;
temp++; 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); (void) strcpy(filename, temp);
len = temp - text; /* including last slash */ 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); (void) strncpy(dirname, text, len);
dirname[len] = '\0'; dirname[len] = '\0';
} else { } else {
filename = strdup(text); filename = strdup(text);
if (filename == NULL)
return NULL;
dirname = NULL; dirname = NULL;
} }
/* support for ``~user'' syntax */ /* support for ``~user'' syntax */
if (dirname && *dirname == '~') { if (dirname && *dirname == '~') {
char *nptr;
temp = tilde_expand(dirname); 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 */ (void) strcpy(dirname, temp); /* safe */
free(temp); /* no longer needed */ free(temp); /* no longer needed */
} }
...@@ -1230,6 +1332,10 @@ filename_completion_function(const char *text, int state) ...@@ -1230,6 +1332,10 @@ filename_completion_function(const char *text, int state)
if (filename_len == 0) if (filename_len == 0)
return (NULL); /* no expansion possible */ return (NULL); /* no expansion possible */
if (dir != NULL) {
(void)closedir(dir);
dir = NULL;
}
dir = opendir(dirname ? dirname : "."); dir = opendir(dirname ? dirname : ".");
if (!dir) if (!dir)
return (NULL); /* cannot open the directory */ return (NULL); /* cannot open the directory */
...@@ -1239,7 +1345,7 @@ filename_completion_function(const char *text, int state) ...@@ -1239,7 +1345,7 @@ filename_completion_function(const char *text, int state)
/* otherwise, get first entry where first */ /* otherwise, get first entry where first */
/* filename_len characters are equal */ /* filename_len characters are equal */
if (entry->d_name[0] == filename[0] if (entry->d_name[0] == filename[0]
#ifdef HAVE_DIRENT_H #if defined(__SVR4) || defined(__linux__)
&& strlen(entry->d_name) >= filename_len && strlen(entry->d_name) >= filename_len
#else #else
&& entry->d_namlen >= filename_len && entry->d_namlen >= filename_len
...@@ -1252,21 +1358,26 @@ filename_completion_function(const char *text, int state) ...@@ -1252,21 +1358,26 @@ filename_completion_function(const char *text, int state)
if (entry) { /* match found */ if (entry) { /* match found */
struct stat stbuf; struct stat stbuf;
#ifdef HAVE_DIRENT_H #if defined(__SVR4) || defined(__linux__)
len = strlen(entry->d_name) + len = strlen(entry->d_name) +
#else #else
len = entry->d_namlen + len = entry->d_namlen +
#endif #endif
((dirname) ? strlen(dirname) : 0) + 1 + 1; ((dirname) ? strlen(dirname) : 0) + 1 + 1;
temp = malloc(len); temp = malloc(len);
if (temp == NULL)
return NULL;
(void) sprintf(temp, "%s%s", (void) sprintf(temp, "%s%s",
dirname ? dirname : "", entry->d_name); /* safe */ dirname ? dirname : "", entry->d_name); /* safe */
/* test, if it's directory */ /* test, if it's directory */
if (stat(temp, &stbuf) == 0 && S_ISDIR(stbuf.st_mode)) if (stat(temp, &stbuf) == 0 && S_ISDIR(stbuf.st_mode))
strcat(temp, "/"); /* safe */ strcat(temp, "/"); /* safe */
} else } else {
(void)closedir(dir);
dir = NULL;
temp = NULL; temp = NULL;
}
return (temp); return (temp);
} }
...@@ -1331,16 +1442,24 @@ completion_matches(const char *text, CPFunction *genfunc) ...@@ -1331,16 +1442,24 @@ completion_matches(const char *text, CPFunction *genfunc)
matches = 0; matches = 0;
match_list_len = 1; match_list_len = 1;
while ((retstr = (*genfunc) (text, matches)) != NULL) { 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_len <<= 1;
match_list = realloc(match_list, nmatch_list = realloc(match_list,
match_list_len * sizeof(char *)); match_list_len * sizeof(char *));
if (nmatch_list == NULL) {
free(match_list);
return NULL;
}
match_list = nmatch_list;
} }
match_list[++matches] = retstr; match_list[++matches] = retstr;
} }
if (!match_list) if (!match_list)
return (char **) NULL; /* nothing found */ return NULL; /* nothing found */
/* find least denominator and insert it to match_list[0] */ /* find least denominator and insert it to match_list[0] */
which = 2; which = 2;
...@@ -1354,14 +1473,15 @@ completion_matches(const char *text, CPFunction *genfunc) ...@@ -1354,14 +1473,15 @@ completion_matches(const char *text, CPFunction *genfunc)
} }
retstr = malloc(max_equal + 1); retstr = malloc(max_equal + 1);
if (retstr == NULL) {
free(match_list);
return NULL;
}
(void) strncpy(retstr, match_list[1], max_equal); (void) strncpy(retstr, match_list[1], max_equal);
retstr[max_equal] = '\0'; retstr[max_equal] = '\0';
match_list[0] = retstr; match_list[0] = retstr;
/* add NULL as last pointer to the array */ /* 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; match_list[matches + 1] = (char *) NULL;
return (match_list); return (match_list);
...@@ -1374,10 +1494,8 @@ static int ...@@ -1374,10 +1494,8 @@ static int
_rl_qsort_string_compare(i1, i2) _rl_qsort_string_compare(i1, i2)
const void *i1, *i2; const void *i1, *i2;
{ {
/*LINTED const castaway*/ const char *s1 = ((const char * const *)i1)[0];
const char *s1 = ((const char **)i1)[0]; const char *s2 = ((const char * const *)i2)[0];
/*LINTED const castaway*/
const char *s2 = ((const char **)i2)[0];
return strcasecmp(s1, s2); return strcasecmp(s1, s2);
} }
...@@ -1459,7 +1577,7 @@ rl_complete_internal(int what_to_do) ...@@ -1459,7 +1577,7 @@ rl_complete_internal(int what_to_do)
ctemp--; ctemp--;
len = li->cursor - ctemp; len = li->cursor - ctemp;
temp = (char*) alloca(len + 1); temp = alloca(len + 1);
(void) strncpy(temp, ctemp, len); (void) strncpy(temp, ctemp, len);
temp[len] = '\0'; temp[len] = '\0';
......
...@@ -39,18 +39,6 @@ ...@@ -39,18 +39,6 @@
#define _READLINE_H_ #define _READLINE_H_
#include <sys/types.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 */ /* list of readline stuff supported by editline library's readline wrapper */
...@@ -66,16 +54,18 @@ typedef struct _hist_entry { ...@@ -66,16 +54,18 @@ typedef struct _hist_entry {
} HIST_ENTRY; } HIST_ENTRY;
/* global variables used by readline enabled applications */ /* global variables used by readline enabled applications */
__BEGIN_DECLS #ifdef __cplusplus
extern "C" {
#endif
extern const char *rl_library_version; extern const char *rl_library_version;
extern const char *rl_readline_name; extern char *rl_readline_name;
extern FILE *rl_instream; extern FILE *rl_instream;
extern FILE *rl_outstream; extern FILE *rl_outstream;
extern char *rl_line_buffer; extern char *rl_line_buffer;
extern int rl_point, rl_end; extern int rl_point, rl_end;
extern int history_base, history_length; extern int history_base, history_length;
extern int max_input_history; 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_word_break_characters;
extern char *rl_completer_quote_characters; extern char *rl_completer_quote_characters;
extern CPFunction *rl_completion_entry_function; extern CPFunction *rl_completion_entry_function;
...@@ -121,6 +111,8 @@ void rl_display_match_list(char **, int, int); ...@@ -121,6 +111,8 @@ void rl_display_match_list(char **, int, int);
int rl_insert(int, int); int rl_insert(int, int);
void rl_reset_terminal(const char *); void rl_reset_terminal(const char *);
int rl_bind_key(int, int (*)(int, int)); int rl_bind_key(int, int (*)(int, int));
__END_DECLS #ifdef __cplusplus
}
#endif
#endif /* _READLINE_H_ */ #endif /* _READLINE_H_ */
/* $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 * Copyright (c) 1992, 1993
...@@ -36,12 +36,18 @@ ...@@ -36,12 +36,18 @@
* SUCH DAMAGE. * 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 * refresh.c: Lower level screen refreshing functions
*/ */
#include "sys.h"
#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
#include <unistd.h> #include <unistd.h>
...@@ -51,28 +57,28 @@ ...@@ -51,28 +57,28 @@
private void re_addc(EditLine *, int); private void re_addc(EditLine *, int);
private void re_update_line(EditLine *, char *, char *, int); private void re_update_line(EditLine *, char *, char *, int);
private void re_insert (EditLine *, char *, int, int, char *, int); private void re_insert (EditLine *el, char *, int, int, char *, int);
private void re_delete(EditLine *, char *, int, int, int); private void re_delete(EditLine *el, char *, int, int, int);
private void re_fastputc(EditLine *, int); private void re_fastputc(EditLine *, int);
private void re__strncopy(char *, char *, size_t); private void re__strncopy(char *, char *, size_t);
private void re__copy_and_pad(char *, const char *, size_t); private void re__copy_and_pad(char *, const char *, size_t);
#ifdef DEBUG_REFRESH #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 __F el->el_errfile
#define ELRE_ASSERT(a, b, c) do \ #define ELRE_ASSERT(a, b, c) do \
if (a) { \ if (/*CONSTCOND*/ a) { \
(void) fprintf b; \ (void) fprintf b; \
c; \ c; \
} \ } \
while (0) while (/*CONSTCOND*/0)
#define ELRE_DEBUG(a, b) ELRE_ASSERT(a,b,;) #define ELRE_DEBUG(a, b) ELRE_ASSERT(a,b,;)
/* re_printstr(): /* re_printstr():
* Print a string on the debugging pty * Print a string on the debugging pty
*/ */
private void 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)); ELRE_DEBUG(1, (__F, "%s:\"", str));
...@@ -203,6 +209,14 @@ re_refresh(EditLine *el) ...@@ -203,6 +209,14 @@ re_refresh(EditLine *el)
el->el_refresh.r_cursor.h = 0; el->el_refresh.r_cursor.h = 0;
el->el_refresh.r_cursor.v = 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.h = -1; /* set flag in case I'm not set */
cur.v = 0; cur.v = 0;
...@@ -312,7 +326,6 @@ re_goto_bottom(EditLine *el) ...@@ -312,7 +326,6 @@ re_goto_bottom(EditLine *el)
{ {
term_move_to_line(el, el->el_refresh.r_oldcv); term_move_to_line(el, el->el_refresh.r_oldcv);
term__putc('\r');
term__putc('\n'); term__putc('\n');
re_clear_display(el); re_clear_display(el);
term__flush(); term__flush();
...@@ -905,7 +918,7 @@ re_update_line(EditLine *el, char *old, char *new, int i) ...@@ -905,7 +918,7 @@ re_update_line(EditLine *el, char *old, char *new, int i)
private void private void
re__copy_and_pad(char *dst, const char *src, size_t width) re__copy_and_pad(char *dst, const char *src, size_t width)
{ {
unsigned int i; size_t i;
for (i = 0; i < width; i++) { for (i = 0; i < width; i++) {
if (*src == '\0') if (*src == '\0')
...@@ -929,6 +942,14 @@ re_refresh_cursor(EditLine *el) ...@@ -929,6 +942,14 @@ re_refresh_cursor(EditLine *el)
char *cp, c; char *cp, c;
int h, v, th; 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... */ /* first we must find where the cursor is... */
h = el->el_prompt.p_pos.h; h = el->el_prompt.p_pos.h;
v = el->el_prompt.p_pos.v; v = el->el_prompt.p_pos.v;
...@@ -1051,8 +1072,8 @@ re_fastaddc(EditLine *el) ...@@ -1051,8 +1072,8 @@ re_fastaddc(EditLine *el)
re_fastputc(el, c); re_fastputc(el, c);
} else { } else {
re_fastputc(el, '\\'); re_fastputc(el, '\\');
re_fastputc(el, (int) ((((unsigned int) c >> 6) & 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, (int)(((((unsigned int)c) >> 3) & 7) + '0'));
re_fastputc(el, (c & 7) + '0'); re_fastputc(el, (c & 7) + '0');
} }
term__flush(); term__flush();
......
/* $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 * Copyright (c) 1992, 1993
...@@ -36,16 +36,19 @@ ...@@ -36,16 +36,19 @@
* SUCH DAMAGE. * 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 * search.c: History and character search functions
*/ */
#include "sys.h"
#include <stdlib.h> #include <stdlib.h>
#if HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#if defined(REGEX) #if defined(REGEX)
#include <regex.h> #include <regex.h>
#elif defined(REGEXP) #elif defined(REGEXP)
...@@ -73,7 +76,8 @@ search_init(EditLine *el) ...@@ -73,7 +76,8 @@ search_init(EditLine *el)
el->el_search.patlen = 0; el->el_search.patlen = 0;
el->el_search.patdir = -1; el->el_search.patdir = -1;
el->el_search.chacha = '\0'; el->el_search.chacha = '\0';
el->el_search.chadir = -1; el->el_search.chadir = CHAR_FWD;
el->el_search.chatflg = 0;
return (0); return (0);
} }
...@@ -445,29 +449,23 @@ cv_search(EditLine *el, int dir) ...@@ -445,29 +449,23 @@ cv_search(EditLine *el, int dir)
char tmpbuf[EL_BUFSIZ]; char tmpbuf[EL_BUFSIZ];
int tmplen; 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 #ifdef ANCHOR
tmpbuf[0] = '.';
tmpbuf[1] = '*';
#define LEN 2 #define LEN 2
#else #else
#define LEN 0 #define LEN 0
#endif #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]; ch = tmpbuf[tmplen];
tmpbuf[tmplen] = '\0'; tmpbuf[tmplen] = '\0';
...@@ -476,9 +474,6 @@ cv_search(EditLine *el, int dir) ...@@ -476,9 +474,6 @@ cv_search(EditLine *el, int dir)
* Use the old pattern, but wild-card it. * Use the old pattern, but wild-card it.
*/ */
if (el->el_search.patlen == 0) { 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); re_refresh(el);
return (CC_ERROR); return (CC_ERROR);
} }
...@@ -512,16 +507,12 @@ cv_search(EditLine *el, int dir) ...@@ -512,16 +507,12 @@ cv_search(EditLine *el, int dir)
ed_search_next_history(el, 0)) == CC_ERROR) { ed_search_next_history(el, 0)) == CC_ERROR) {
re_refresh(el); re_refresh(el);
return (CC_ERROR); return (CC_ERROR);
} else { }
if (ch == 0033) { if (ch == 0033) {
re_refresh(el); re_refresh(el);
*el->el_line.lastchar++ = '\n'; return ed_newline(el, 0);
*el->el_line.lastchar = '\0';
re_goto_bottom(el);
return (CC_NEWLINE);
} else
return (CC_REFRESH);
} }
return (CC_REFRESH);
} }
...@@ -578,69 +569,53 @@ cv_repeat_srch(EditLine *el, int c) ...@@ -578,69 +569,53 @@ cv_repeat_srch(EditLine *el, int c)
} }
/* cv_csearch_back(): /* cv_csearch():
* Vi character search reverse * Vi character search
*/ */
protected el_action_t 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; char *cp;
cp = el->el_line.cursor; if (ch == 0)
while (count--) { return CC_ERROR;
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 (el->el_chared.c_vcmd.action & DELETE) { if (ch == -1) {
el->el_line.cursor++; char c;
cv_delfini(el); if (el_getc(el, &c) != 1)
return (CC_REFRESH); return ed_end_of_file(el, 0);
ch = c;
} }
re_refresh_cursor(el);
return (CC_NORM);
}
/* cv_csearch_fwd(): /* Save for ';' and ',' commands */
* Vi character search forward el->el_search.chacha = ch;
*/ el->el_search.chadir = direction;
protected el_action_t el->el_search.chatflg = tflag;
cv_csearch_fwd(EditLine *el, int ch, int count, int tflag)
{
char *cp;
cp = el->el_line.cursor; cp = el->el_line.cursor;
while (count--) { while (count--) {
if (*cp == ch) if (*cp == ch)
cp++; cp += direction;
while (cp < el->el_line.lastchar && *cp != ch) for (;;cp += direction) {
cp++;
}
if (cp >= el->el_line.lastchar) if (cp >= el->el_line.lastchar)
return (CC_ERROR); return CC_ERROR;
if (cp < el->el_line.buffer)
return CC_ERROR;
if (*cp == ch)
break;
}
}
if (*cp == ch && tflag) if (tflag)
cp--; cp -= direction;
el->el_line.cursor = cp; el->el_line.cursor = cp;
if (el->el_chared.c_vcmd.action & DELETE) { if (el->el_chared.c_vcmd.action != NOP) {
if (direction > 0)
el->el_line.cursor++; el->el_line.cursor++;
cv_delfini(el); cv_delfini(el);
return (CC_REFRESH); return CC_REFRESH;
} }
re_refresh_cursor(el); return CC_CURSOR;
return (CC_NORM);
} }
/* $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 * Copyright (c) 1992, 1993
...@@ -52,6 +52,7 @@ typedef struct el_search_t { ...@@ -52,6 +52,7 @@ typedef struct el_search_t {
int patdir; /* Direction of the last search */ int patdir; /* Direction of the last search */
int chadir; /* Character search direction */ int chadir; /* Character search direction */
char chacha; /* Character we are looking for */ char chacha; /* Character we are looking for */
char chatflg; /* 0 if f, 1 if t */
} el_search_t; } el_search_t;
...@@ -64,7 +65,6 @@ protected el_action_t ce_inc_search(EditLine *, int); ...@@ -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 cv_search(EditLine *, int);
protected el_action_t ce_search_line(EditLine *, char *, 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_repeat_srch(EditLine *, int);
protected el_action_t cv_csearch_back(EditLine *, int, int, int); protected el_action_t cv_csearch(EditLine *, int, int, int, int);
protected el_action_t cv_csearch_fwd(EditLine *, int, int, int);
#endif /* _h_el_search */ #endif /* _h_el_search */
/* $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 * Copyright (c) 1992, 1993
...@@ -36,14 +36,20 @@ ...@@ -36,14 +36,20 @@
* SUCH DAMAGE. * 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. * sig.c: Signal handling stuff.
* our policy is to trap all signals, set a good state * our policy is to trap all signals, set a good state
* and pass the ball to our caller. * and pass the ball to our caller.
*/ */
#include "sys.h"
#include "el.h" #include "el.h"
#include <stdlib.h> #include <stdlib.h>
...@@ -115,9 +121,9 @@ sig_init(EditLine *el) ...@@ -115,9 +121,9 @@ sig_init(EditLine *el)
#undef _DO #undef _DO
(void) sigprocmask(SIG_BLOCK, &nset, &oset); (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) if (el->el_signal == NULL)
return (-1); return (-1);
for (i = 0; sighdl[i] != -1; i++) for (i = 0; sighdl[i] != -1; i++)
...@@ -157,7 +163,7 @@ sig_set(EditLine *el) ...@@ -157,7 +163,7 @@ sig_set(EditLine *el)
(void) sigprocmask(SIG_BLOCK, &nset, &oset); (void) sigprocmask(SIG_BLOCK, &nset, &oset);
for (i = 0; sighdl[i] != -1; i++) { for (i = 0; sighdl[i] != -1; i++) {
libedit_sig_t s; el_signalhandler_t s;
/* This could happen if we get interrupted */ /* This could happen if we get interrupted */
if ((s = signal(sighdl[i], sig_handler)) != sig_handler) if ((s = signal(sighdl[i], sig_handler)) != sig_handler)
el->el_signal[i] = s; el->el_signal[i] = s;
......
/* $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 * Copyright (c) 1992, 1993
...@@ -62,9 +62,8 @@ ...@@ -62,9 +62,8 @@
_DO(SIGCONT) \ _DO(SIGCONT) \
_DO(SIGWINCH) _DO(SIGWINCH)
typedef RETSIGTYPE (*libedit_sig_t)(); typedef void (*el_signalhandler_t)(int);
typedef libedit_sig_t *el_signal_t; typedef el_signalhandler_t *el_signal_t;
protected void sig_end(EditLine*); protected void sig_end(EditLine*);
protected int sig_init(EditLine*); protected int sig_init(EditLine*);
......
/* $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 * Copyright (c) 1992, 1993
...@@ -44,6 +44,10 @@ ...@@ -44,6 +44,10 @@
#ifndef _h_sys #ifndef _h_sys
#define _h_sys #define _h_sys
#ifdef HAVE_SYS_CDEFS_H
#include <sys/cdefs.h>
#endif
#ifndef public #ifndef public
# define public /* Externally visible functions/variables */ # define public /* Externally visible functions/variables */
#endif #endif
...@@ -57,10 +61,6 @@ ...@@ -57,10 +61,6 @@
/* When we want to hide everything */ /* When we want to hide everything */
#endif #endif
#if HAVE_SYS_CDEFS_H
#include <sys/cdefs.h>
#endif
#ifndef _PTR_T #ifndef _PTR_T
# define _PTR_T # define _PTR_T
typedef void *ptr_t; typedef void *ptr_t;
...@@ -73,22 +73,58 @@ typedef void *ioctl_t; ...@@ -73,22 +73,58 @@ typedef void *ioctl_t;
#include <stdio.h> #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 */ #define REGEX /* Use POSIX.2 regular expression functions */
#undef REGEXP /* Use UNIX V8 regular expression functions */ #undef REGEXP /* Use UNIX V8 regular expression functions */
#if defined(__sun__) && defined(__SVR4) #ifdef notdef
# undef REGEX # undef REGEX
# undef REGEXP # undef REGEXP
# include <malloc.h> # include <malloc.h>
typedef void (*sig_t)(int); # ifdef __GNUC__
#endif /*
* Broken hdrs.
#ifndef __P */
#ifdef __STDC__ extern int tgetent(const char *bp, char *name);
#define __P(x) x extern int tgetflag(const char *id);
#else extern int tgetnum(const char *id);
#define __P(x) () extern char *tgetstr(const char *id, char **area);
#endif 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
#endif /* _h_sys */ #endif /* _h_sys */
/* $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 * Copyright (c) 1992, 1993
...@@ -36,31 +36,44 @@ ...@@ -36,31 +36,44 @@
* SUCH DAMAGE. * 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 * term.c: Editor/termcap-curses interface
* We have to declare a static variable here, since the * We have to declare a static variable here, since the
* termcap putchar routine does not take an argument! * termcap putchar routine does not take an argument!
*/ */
#include "sys.h"
#include <stdio.h> #include <stdio.h>
#include <signal.h> #include <signal.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#if defined(HAVE_TERMCAP_H) #ifdef HAVE_TERMCAP_H
#include <termcap.h> #include <termcap.h>
#elif defined(HAVE_CURSES_H) && defined(HAVE_TERM_H) /* For HPUX11 */ #endif
#ifdef HAVE_CURSES_H
#include <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> #include <term.h>
#endif #endif
#include <sys/types.h> #include <sys/types.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include "el.h"
/* /*
* IMPORTANT NOTE: these routines are allowed to look at the current screen * 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 * and the current possition assuming that it is correct. If this is not
...@@ -340,8 +353,7 @@ term_init(EditLine *el) ...@@ -340,8 +353,7 @@ term_init(EditLine *el)
return (-1); return (-1);
(void) memset(el->el_term.t_val, 0, T_val * sizeof(int)); (void) memset(el->el_term.t_val, 0, T_val * sizeof(int));
term_outfile = el->el_outfile; term_outfile = el->el_outfile;
if (term_set(el, NULL) == -1) (void) term_set(el, NULL);
return (-1);
term_init_arrow(el); term_init_arrow(el);
return (0); return (0);
} }
...@@ -637,7 +649,7 @@ mc_again: ...@@ -637,7 +649,7 @@ mc_again:
* from col 0 * from col 0
*/ */
if (EL_CAN_TAB ? if (EL_CAN_TAB ?
((unsigned int)-del > (((unsigned int) where >> 3) + (((unsigned int)-del) > (((unsigned int) where >> 3) +
(where & 07))) (where & 07)))
: (-del > where)) { : (-del > where)) {
term__putc('\r'); /* do a CR */ term__putc('\r'); /* do a CR */
...@@ -897,7 +909,7 @@ term_set(EditLine *el, const char *term) ...@@ -897,7 +909,7 @@ term_set(EditLine *el, const char *term)
memset(el->el_term.t_cap, 0, TC_BUFSIZE); 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 <= 0) {
if (i == -1) if (i == -1)
...@@ -927,7 +939,7 @@ term_set(EditLine *el, const char *term) ...@@ -927,7 +939,7 @@ term_set(EditLine *el, const char *term)
Val(T_co) = tgetnum("co"); Val(T_co) = tgetnum("co");
Val(T_li) = tgetnum("li"); Val(T_li) = tgetnum("li");
for (t = tstr; t->name != NULL; t++) 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) if (Val(T_co) < 2)
...@@ -1067,8 +1079,6 @@ term_reset_arrow(EditLine *el) ...@@ -1067,8 +1079,6 @@ term_reset_arrow(EditLine *el)
static const char stOH[] = {033, 'O', 'H', '\0'}; static const char stOH[] = {033, 'O', 'H', '\0'};
static const char stOF[] = {033, 'O', 'F', '\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, 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, 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); key_add(el, strC, &arrow[A_K_RT].fun, arrow[A_K_RT].type);
...@@ -1237,8 +1247,7 @@ term__flush(void) ...@@ -1237,8 +1247,7 @@ term__flush(void)
*/ */
protected int protected int
/*ARGSUSED*/ /*ARGSUSED*/
term_telltc(EditLine *el, int term_telltc(EditLine *el, int argc __attribute__((unused)),
argc __attribute__((unused)),
const char **argv __attribute__((unused))) const char **argv __attribute__((unused)))
{ {
const struct termcapstr *t; const struct termcapstr *t;
...@@ -1274,7 +1283,8 @@ term_telltc(EditLine *el, int ...@@ -1274,7 +1283,8 @@ term_telltc(EditLine *el, int
*/ */
protected int protected int
/*ARGSUSED*/ /*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 termcapstr *ts;
const struct termcapval *tv; const struct termcapval *tv;
...@@ -1350,7 +1360,9 @@ term_settc(EditLine *el, int argc __attribute__((unused)), const char **argv) ...@@ -1350,7 +1360,9 @@ term_settc(EditLine *el, int argc __attribute__((unused)), const char **argv)
*/ */
protected int protected int
/*ARGSUSED*/ /*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; char *cap, *scap, *ep;
int arg_need, arg_cols, arg_rows; int arg_need, arg_cols, arg_rows;
...@@ -1429,7 +1441,7 @@ term_echotc(EditLine *el, int argc __attribute__((unused)), const char **argv) ...@@ -1429,7 +1441,7 @@ term_echotc(EditLine *el, int argc __attribute__((unused)), const char **argv)
break; break;
} }
if (t->name == NULL) if (t->name == NULL)
scap = tgetstr((char*) *argv, &area); scap = tgetstr(*argv, &area);
if (!scap || scap[0] == '\0') { if (!scap || scap[0] == '\0') {
if (!silent) if (!silent)
(void) fprintf(el->el_errfile, (void) fprintf(el->el_errfile,
......
/* $NetBSD: term.h,v 1.13 2002/03/18 16:01:00 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Christos Zoulas of Cornell University.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)term.h 8.1 (Berkeley) 6/4/93
*/
/*
* el.term.h: Termcap header
*/
#ifndef _h_el_term
#define _h_el_term
#include "histedit.h"
typedef struct { /* Symbolic function key bindings */
const char *name; /* name of the key */
int key; /* Index in termcap table */
key_value_t fun; /* Function bound to it */
int type; /* Type of function */
} fkey_t;
typedef struct {
coord_t t_size; /* # lines and cols */
int t_flags;
#define TERM_CAN_INSERT 0x001 /* Has insert cap */
#define TERM_CAN_DELETE 0x002 /* Has delete cap */
#define TERM_CAN_CEOL 0x004 /* Has CEOL cap */
#define TERM_CAN_TAB 0x008 /* Can use tabs */
#define TERM_CAN_ME 0x010 /* Can turn all attrs. */
#define TERM_CAN_UP 0x020 /* Can move up */
#define TERM_HAS_META 0x040 /* Has a meta key */
#define TERM_HAS_AUTO_MARGINS 0x080 /* Has auto margins */
#define TERM_HAS_MAGIC_MARGINS 0x100 /* Has magic margins */
char *t_buf; /* Termcap buffer */
int t_loc; /* location used */
char **t_str; /* termcap strings */
int *t_val; /* termcap values */
char *t_cap; /* Termcap buffer */
fkey_t *t_fkey; /* Array of keys */
} el_term_t;
/*
* fKey indexes
*/
#define A_K_DN 0
#define A_K_UP 1
#define A_K_LT 2
#define A_K_RT 3
#define A_K_HO 4
#define A_K_EN 5
#define A_K_NKEYS 6
protected void term_move_to_line(EditLine *, int);
protected void term_move_to_char(EditLine *, int);
protected void term_clear_EOL(EditLine *, int);
protected void term_overwrite(EditLine *, const char *, int);
protected void term_insertwrite(EditLine *, char *, int);
protected void term_deletechars(EditLine *, int);
protected void term_clear_screen(EditLine *);
protected void term_beep(EditLine *);
protected int term_change_size(EditLine *, int, int);
protected int term_get_size(EditLine *, int *, int *);
protected int term_init(EditLine *);
protected void term_bind_arrow(EditLine *);
protected void term_print_arrow(EditLine *, const char *);
protected int term_clear_arrow(EditLine *, const char *);
protected int term_set_arrow(EditLine *, const char *, key_value_t *, int);
protected void term_end(EditLine *);
protected int term_set(EditLine *, const char *);
protected int term_settc(EditLine *, int, const char **);
protected int term_telltc(EditLine *, int, const char **);
protected int term_echotc(EditLine *, int, const char **);
protected int term__putc(int);
protected void term__flush(void);
/*
* Easy access macros
*/
#define EL_FLAGS (el)->el_term.t_flags
#define EL_CAN_INSERT (EL_FLAGS & TERM_CAN_INSERT)
#define EL_CAN_DELETE (EL_FLAGS & TERM_CAN_DELETE)
#define EL_CAN_CEOL (EL_FLAGS & TERM_CAN_CEOL)
#define EL_CAN_TAB (EL_FLAGS & TERM_CAN_TAB)
#define EL_CAN_ME (EL_FLAGS & TERM_CAN_ME)
#define EL_HAS_META (EL_FLAGS & TERM_HAS_META)
#define EL_HAS_AUTO_MARGINS (EL_FLAGS & TERM_HAS_AUTO_MARGINS)
#define EL_HAS_MAGIC_MARGINS (EL_FLAGS & TERM_HAS_MAGIC_MARGINS)
#endif /* _h_el_term */
/* $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 * Copyright (c) 1992, 1993
...@@ -36,12 +36,18 @@ ...@@ -36,12 +36,18 @@
* SUCH DAMAGE. * 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 * tokenize.c: Bourne shell like tokenizer
*/ */
#include "sys.h"
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include "tokenizer.h" #include "tokenizer.h"
...@@ -66,7 +72,7 @@ typedef enum { ...@@ -66,7 +72,7 @@ typedef enum {
struct tokenizer { struct tokenizer {
char *ifs; /* In field separator */ char *ifs; /* In field separator */
int argc, amax; /* Current and maximum number of args */ 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 *wptr, *wmax; /* Space and limit on the word buffer */
char *wstart; /* Beginning of next word */ char *wstart; /* Beginning of next word */
char *wspace; /* Space of word buffer */ char *wspace; /* Space of word buffer */
...@@ -103,16 +109,29 @@ tok_init(const char *ifs) ...@@ -103,16 +109,29 @@ tok_init(const char *ifs)
{ {
Tokenizer *tok = (Tokenizer *) tok_malloc(sizeof(Tokenizer)); Tokenizer *tok = (Tokenizer *) tok_malloc(sizeof(Tokenizer));
if (tok == NULL)
return NULL;
tok->ifs = strdup(ifs ? ifs : IFS); tok->ifs = strdup(ifs ? ifs : IFS);
if (tok->ifs == NULL) {
tok_free((ptr_t)tok);
return NULL;
}
tok->argc = 0; tok->argc = 0;
tok->amax = AINCR; tok->amax = AINCR;
tok->argv = (const char **) tok_malloc(sizeof(char *) * tok->amax); tok->argv = (char **) tok_malloc(sizeof(char *) * tok->amax);
if (tok->argv == NULL) if (tok->argv == NULL) {
return (NULL); tok_free((ptr_t)tok->ifs);
tok_free((ptr_t)tok);
return NULL;
}
tok->argv[0] = NULL; tok->argv[0] = NULL;
tok->wspace = (char *) tok_malloc(WINCR); tok->wspace = (char *) tok_malloc(WINCR);
if (tok->wspace == NULL) if (tok->wspace == NULL) {
return (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->wmax = tok->wspace + WINCR;
tok->wstart = tok->wspace; tok->wstart = tok->wspace;
tok->wptr = tok->wspace; tok->wptr = tok->wspace;
...@@ -268,7 +287,7 @@ tok_line(Tokenizer *tok, const char *line, int *argc, const char ***argv) ...@@ -268,7 +287,7 @@ tok_line(Tokenizer *tok, const char *line, int *argc, const char ***argv)
switch (tok->quote) { switch (tok->quote) {
case Q_none: case Q_none:
tok_finish(tok); tok_finish(tok);
*argv = tok->argv; *argv = (const char **)tok->argv;
*argc = tok->argc; *argc = tok->argc;
return (0); return (0);
...@@ -301,7 +320,7 @@ tok_line(Tokenizer *tok, const char *line, int *argc, const char ***argv) ...@@ -301,7 +320,7 @@ tok_line(Tokenizer *tok, const char *line, int *argc, const char ***argv)
return (3); return (3);
} }
tok_finish(tok); tok_finish(tok);
*argv = tok->argv; *argv = (const char **)tok->argv;
*argc = tok->argc; *argc = tok->argc;
return (0); return (0);
...@@ -363,25 +382,25 @@ tok_line(Tokenizer *tok, const char *line, int *argc, const char ***argv) ...@@ -363,25 +382,25 @@ tok_line(Tokenizer *tok, const char *line, int *argc, const char ***argv)
if (tok->wptr >= tok->wmax - 4) { if (tok->wptr >= tok->wmax - 4) {
size_t size = tok->wmax - tok->wspace + WINCR; size_t size = tok->wmax - tok->wspace + WINCR;
char *s = (char *) tok_realloc(tok->wspace, size); char *s = (char *) tok_realloc(tok->wspace, size);
/* SUPPRESS 22 */
int offs = s - tok->wspace;
if (s == NULL) if (s == NULL)
return (-1); return (-1);
if (offs != 0) { if (s != tok->wspace) {
int i; int i;
for (i = 0; i < tok->argc; i++) for (i = 0; i < tok->argc; i++) {
tok->argv[i] = tok->argv[i] + offs; tok->argv[i] =
tok->wptr = tok->wptr + offs; (tok->argv[i] - tok->wspace) + s;
tok->wstart = tok->wstart + offs; }
tok->wmax = s + size; tok->wptr = (tok->wptr - tok->wspace) + s;
tok->wstart = (tok->wstart - tok->wspace) + s;
tok->wspace = s; tok->wspace = s;
} }
tok->wmax = s + size;
} }
if (tok->argc >= tok->amax - 4) { if (tok->argc >= tok->amax - 4) {
const char **p; char **p;
tok->amax += AINCR; tok->amax += AINCR;
p = (const char **) tok_realloc(tok->argv, p = (char **) tok_realloc(tok->argv,
tok->amax * sizeof(char *)); tok->amax * sizeof(char *));
if (p == NULL) if (p == NULL)
return (-1); return (-1);
......
/* $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 * Copyright (c) 1992, 1993
......
/* $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 * Copyright (c) 1992, 1993
...@@ -36,12 +36,18 @@ ...@@ -36,12 +36,18 @@
* SUCH DAMAGE. * 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 * tty.c: tty interface stuff
*/ */
#include "sys.h"
#include "tty.h" #include "tty.h"
#include "el.h" #include "el.h"
...@@ -1039,9 +1045,8 @@ tty_stty(EditLine *el, int argc __attribute__((unused)), const char **argv) ...@@ -1039,9 +1045,8 @@ tty_stty(EditLine *el, int argc __attribute__((unused)), const char **argv)
{ {
const ttymodes_t *m; const ttymodes_t *m;
char x; char x;
const char *d;
int aflag = 0; int aflag = 0;
const char *s; const char *s, *d;
const char *name; const char *name;
int z = EX_IO; int z = EX_IO;
......
/* $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 * Copyright (c) 1992, 1993
...@@ -462,7 +462,7 @@ typedef unsigned char ttychar_t[NN_IO][C_NCC]; ...@@ -462,7 +462,7 @@ typedef unsigned char ttychar_t[NN_IO][C_NCC];
protected int tty_init(EditLine *); protected int tty_init(EditLine *);
protected void tty_end(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_rawmode(EditLine *);
protected int tty_cookedmode(EditLine *); protected int tty_cookedmode(EditLine *);
protected int tty_quotemode(EditLine *); protected int tty_quotemode(EditLine *);
......
/* $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 * Copyright (c) 1992, 1993
...@@ -36,12 +36,22 @@ ...@@ -36,12 +36,22 @@
* SUCH DAMAGE. * 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. * vi.c: Vi mode commands.
*/ */
#include "sys.h"
#include "el.h" #include "el.h"
private el_action_t cv_action(EditLine *, int); private el_action_t cv_action(EditLine *, int);
...@@ -53,22 +63,18 @@ private el_action_t cv_paste(EditLine *, int); ...@@ -53,22 +63,18 @@ private el_action_t cv_paste(EditLine *, int);
private el_action_t private el_action_t
cv_action(EditLine *el, int c) 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.action = NOP;
el->el_chared.c_vcmd.pos = 0; 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.lastchar = el->el_line.buffer;
el->el_line.cursor = el->el_line.buffer; el->el_line.cursor = el->el_line.buffer;
if (c & INSERT) if (c & INSERT)
...@@ -79,25 +85,8 @@ cv_action(EditLine *el, int c) ...@@ -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.pos = el->el_line.cursor;
el->el_chared.c_vcmd.action = c; el->el_chared.c_vcmd.action = c;
return (CC_ARGHACK); 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(): /* cv_paste():
* Paste previous deletion before or after the cursor * Paste previous deletion before or after the cursor
*/ */
...@@ -105,23 +94,25 @@ private el_action_t ...@@ -105,23 +94,25 @@ private el_action_t
cv_paste(EditLine *el, int c) cv_paste(EditLine *el, int c)
{ {
char *ptr; 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 #ifdef DEBUG_PASTE
(void) fprintf(el->el_errfile, "Paste: %x \"%s\" +%d -%d\n", (void) fprintf(el->el_errfile, "Paste: \"%.*s\"\n", len, k->buf);
un->action, un->buf, un->isize, un->dsize);
#endif #endif
if (un->isize == 0)
return (CC_ERROR); cv_undo(el);
if (!c && el->el_line.cursor < el->el_line.lastchar) if (!c && el->el_line.cursor < el->el_line.lastchar)
el->el_line.cursor++; el->el_line.cursor++;
ptr = el->el_line.cursor; ptr = el->el_line.cursor;
c_insert(el, (int) un->isize); c_insert(el, len);
if (el->el_line.cursor + un->isize > el->el_line.lastchar) if (el->el_line.cursor + len > el->el_line.lastchar)
return (CC_ERROR); return (CC_ERROR);
(void) memcpy(ptr, un->buf, un->isize); (void) memcpy(ptr, k->buf, len +0u);
return (CC_REFRESH); return (CC_REFRESH);
} }
...@@ -152,24 +143,24 @@ vi_paste_prev(EditLine *el, int c __attribute__((unused))) ...@@ -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 * Vi move to the previous space delimited word
* [B] * [B]
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*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) if (el->el_line.cursor == el->el_line.buffer)
return (CC_ERROR); 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_line.buffer,
el->el_state.argument, 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); cv_delfini(el);
return (CC_REFRESH); return (CC_REFRESH);
} }
...@@ -179,7 +170,7 @@ vi_prev_space_word(EditLine *el, int c __attribute__((unused))) ...@@ -179,7 +170,7 @@ vi_prev_space_word(EditLine *el, int c __attribute__((unused)))
/* vi_prev_word(): /* vi_prev_word():
* Vi move to the previous word * Vi move to the previous word
* [B] * [b]
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
...@@ -189,12 +180,12 @@ vi_prev_word(EditLine *el, int c __attribute__((unused))) ...@@ -189,12 +180,12 @@ vi_prev_word(EditLine *el, int c __attribute__((unused)))
if (el->el_line.cursor == el->el_line.buffer) if (el->el_line.cursor == el->el_line.buffer)
return (CC_ERROR); 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_line.buffer,
el->el_state.argument, 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); cv_delfini(el);
return (CC_REFRESH); return (CC_REFRESH);
} }
...@@ -202,25 +193,23 @@ vi_prev_word(EditLine *el, int c __attribute__((unused))) ...@@ -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 * Vi move to the next space delimited word
* [W] * [W]
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*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); return (CC_ERROR);
el->el_line.cursor = cv_next_word(el, el->el_line.cursor, el->el_line.cursor = cv_next_word(el, el->el_line.cursor,
el->el_line.lastchar, el->el_line.lastchar, el->el_state.argument, cv__isWord);
el->el_state.argument,
cv__isword);
if (el->el_map.type == MAP_VI) 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); cv_delfini(el);
return (CC_REFRESH); return (CC_REFRESH);
} }
...@@ -237,16 +226,14 @@ protected el_action_t ...@@ -237,16 +226,14 @@ protected el_action_t
vi_next_word(EditLine *el, int c __attribute__((unused))) 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); return (CC_ERROR);
el->el_line.cursor = cv_next_word(el, el->el_line.cursor, el->el_line.cursor = cv_next_word(el, el->el_line.cursor,
el->el_line.lastchar, el->el_line.lastchar, el->el_state.argument, cv__isword);
el->el_state.argument,
ce__isword);
if (el->el_map.type == MAP_VI) 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); cv_delfini(el);
return (CC_REFRESH); return (CC_REFRESH);
} }
...@@ -261,19 +248,27 @@ vi_next_word(EditLine *el, int c __attribute__((unused))) ...@@ -261,19 +248,27 @@ vi_next_word(EditLine *el, int c __attribute__((unused)))
protected el_action_t protected el_action_t
vi_change_case(EditLine *el, int c) vi_change_case(EditLine *el, int c)
{ {
int i;
if (el->el_line.cursor < el->el_line.lastchar) { if (el->el_line.cursor >= el->el_line.lastchar)
c = *el->el_line.cursor; 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)) if (isupper(c))
*el->el_line.cursor++ = tolower(c); *el->el_line.cursor = tolower(c);
else if (islower(c)) else if (islower(c))
*el->el_line.cursor++ = toupper(c); *el->el_line.cursor = toupper(c);
else
el->el_line.cursor++; if (++el->el_line.cursor >= el->el_line.lastchar) {
el->el_line.cursor--;
re_fastaddc(el); re_fastaddc(el);
return (CC_NORM); break;
} }
return (CC_ERROR); re_fastaddc(el);
}
return CC_NORM;
} }
...@@ -304,11 +299,7 @@ vi_insert_at_bol(EditLine *el, int c __attribute__((unused))) ...@@ -304,11 +299,7 @@ vi_insert_at_bol(EditLine *el, int c __attribute__((unused)))
{ {
el->el_line.cursor = el->el_line.buffer; el->el_line.cursor = el->el_line.buffer;
el->el_chared.c_vcmd.ins = el->el_line.cursor; cv_undo(el);
el->el_chared.c_undo.ptr = el->el_line.cursor;
el->el_chared.c_undo.action = DELETE;
el->el_map.current = el->el_map.key; el->el_map.current = el->el_map.key;
return (CC_CURSOR); return (CC_CURSOR);
} }
...@@ -323,13 +314,13 @@ protected el_action_t ...@@ -323,13 +314,13 @@ protected el_action_t
vi_replace_char(EditLine *el, int c __attribute__((unused))) 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_map.current = el->el_map.key;
el->el_state.inputmode = MODE_REPLACE_1; el->el_state.inputmode = MODE_REPLACE_1;
el->el_chared.c_undo.action = CHANGE; cv_undo(el);
el->el_chared.c_undo.ptr = el->el_line.cursor; return (CC_ARGHACK);
el->el_chared.c_undo.isize = 0;
el->el_chared.c_undo.dsize = 0;
return (CC_NORM);
} }
...@@ -344,17 +335,14 @@ vi_replace_mode(EditLine *el, int c __attribute__((unused))) ...@@ -344,17 +335,14 @@ vi_replace_mode(EditLine *el, int c __attribute__((unused)))
el->el_map.current = el->el_map.key; el->el_map.current = el->el_map.key;
el->el_state.inputmode = MODE_REPLACE; el->el_state.inputmode = MODE_REPLACE;
el->el_chared.c_undo.action = CHANGE; cv_undo(el);
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); return (CC_NORM);
} }
/* vi_substitute_char(): /* vi_substitute_char():
* Vi replace character under the cursor and enter insert mode * Vi replace character under the cursor and enter insert mode
* [r] * [s]
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
...@@ -376,6 +364,9 @@ protected el_action_t ...@@ -376,6 +364,9 @@ protected el_action_t
vi_substitute_line(EditLine *el, int c __attribute__((unused))) 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); (void) em_kill_line(el, 0);
el->el_map.current = el->el_map.key; el->el_map.current = el->el_map.key;
return (CC_REFRESH); return (CC_REFRESH);
...@@ -391,6 +382,9 @@ protected el_action_t ...@@ -391,6 +382,9 @@ protected el_action_t
vi_change_to_eol(EditLine *el, int c __attribute__((unused))) 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); (void) ed_kill_line(el, 0);
el->el_map.current = el->el_map.key; el->el_map.current = el->el_map.key;
return (CC_REFRESH); return (CC_REFRESH);
...@@ -407,11 +401,7 @@ vi_insert(EditLine *el, int c __attribute__((unused))) ...@@ -407,11 +401,7 @@ vi_insert(EditLine *el, int c __attribute__((unused)))
{ {
el->el_map.current = el->el_map.key; el->el_map.current = el->el_map.key;
cv_undo(el);
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;
return (CC_NORM); return (CC_NORM);
} }
...@@ -435,9 +425,7 @@ vi_add(EditLine *el, int c __attribute__((unused))) ...@@ -435,9 +425,7 @@ vi_add(EditLine *el, int c __attribute__((unused)))
} else } else
ret = CC_NORM; ret = CC_NORM;
el->el_chared.c_vcmd.ins = el->el_line.cursor; cv_undo(el);
el->el_chared.c_undo.ptr = el->el_line.cursor;
el->el_chared.c_undo.action = DELETE;
return (ret); return (ret);
} }
...@@ -454,11 +442,7 @@ vi_add_at_eol(EditLine *el, int c __attribute__((unused))) ...@@ -454,11 +442,7 @@ vi_add_at_eol(EditLine *el, int c __attribute__((unused)))
el->el_map.current = el->el_map.key; el->el_map.current = el->el_map.key;
el->el_line.cursor = el->el_line.lastchar; el->el_line.cursor = el->el_line.lastchar;
cv_undo(el);
/* 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;
return (CC_CURSOR); return (CC_CURSOR);
} }
...@@ -476,22 +460,22 @@ vi_delete_meta(EditLine *el, int c __attribute__((unused))) ...@@ -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 * Vi move to the end of the current space delimited word
* [E] * [E]
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*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) if (el->el_line.cursor == el->el_line.lastchar)
return (CC_ERROR); return (CC_ERROR);
el->el_line.cursor = cv__endword(el->el_line.cursor, 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++; el->el_line.cursor++;
cv_delfini(el); cv_delfini(el);
return (CC_REFRESH); return (CC_REFRESH);
...@@ -500,22 +484,22 @@ vi_end_word(EditLine *el, int c __attribute__((unused))) ...@@ -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 * Vi move to the end of the current word
* [e] * [e]
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*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) if (el->el_line.cursor == el->el_line.lastchar)
return (CC_ERROR); return (CC_ERROR);
el->el_line.cursor = cv__endword(el->el_line.cursor, 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++; el->el_line.cursor++;
cv_delfini(el); cv_delfini(el);
return (CC_REFRESH); return (CC_REFRESH);
...@@ -532,100 +516,19 @@ protected el_action_t ...@@ -532,100 +516,19 @@ protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
vi_undo(EditLine *el, int c __attribute__((unused))) vi_undo(EditLine *el, int c __attribute__((unused)))
{ {
char *cp, *kp; c_undo_t un = el->el_chared.c_undo;
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;
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.len == -1)
if (un->isize == 0) return CC_ERROR;
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;
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: /* switch line buffer and undo buffer */
return (CC_ERROR); 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); return (CC_REFRESH);
} }
...@@ -639,22 +542,12 @@ protected el_action_t ...@@ -639,22 +542,12 @@ protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
vi_command_mode(EditLine *el, int c __attribute__((unused))) vi_command_mode(EditLine *el, int c __attribute__((unused)))
{ {
int size;
/* [Esc] cancels pending action */ /* [Esc] cancels pending action */
el->el_chared.c_vcmd.ins = 0;
el->el_chared.c_vcmd.action = NOP; el->el_chared.c_vcmd.action = NOP;
el->el_chared.c_vcmd.pos = 0; el->el_chared.c_vcmd.pos = 0;
el->el_state.doingarg = 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_state.inputmode = MODE_INSERT;
el->el_map.current = el->el_map.alt; el->el_map.current = el->el_map.alt;
...@@ -674,41 +567,37 @@ protected el_action_t ...@@ -674,41 +567,37 @@ protected el_action_t
vi_zero(EditLine *el, int c) vi_zero(EditLine *el, int c)
{ {
if (el->el_state.doingarg) { if (el->el_state.doingarg)
if (el->el_state.argument > 1000000) return ed_argument_digit(el, c);
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; el->el_line.cursor = el->el_line.buffer;
if (el->el_chared.c_vcmd.action & DELETE) { if (el->el_chared.c_vcmd.action != NOP) {
cv_delfini(el); cv_delfini(el);
return (CC_REFRESH); return (CC_REFRESH);
} }
return (CC_CURSOR); return (CC_CURSOR);
}
} }
/* vi_delete_prev_char(): /* vi_delete_prev_char():
* Vi move to previous character (backspace) * Vi move to previous character (backspace)
* [^H] * [^H] in insert mode only
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
vi_delete_prev_char(EditLine *el, int c __attribute__((unused))) 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); return (CC_ERROR);
if (el->el_chared.c_vcmd.ins > /* do the delete here so we dont mess up the undo and paste buffers */
el->el_line.cursor - el->el_state.argument) el->el_line.cursor = --cp;
return (CC_ERROR); for (; cp < el->el_line.lastchar; cp++)
cp[0] = cp[1];
c_delbefore(el, el->el_state.argument); el->el_line.lastchar = cp - 1;
el->el_line.cursor -= el->el_state.argument;
return (CC_REFRESH); return (CC_REFRESH);
} }
...@@ -829,16 +718,7 @@ protected el_action_t ...@@ -829,16 +718,7 @@ protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
vi_next_char(EditLine *el, int c __attribute__((unused))) vi_next_char(EditLine *el, int c __attribute__((unused)))
{ {
char ch; return cv_csearch(el, CHAR_FWD, -1, el->el_state.argument, 0);
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));
} }
...@@ -850,15 +730,7 @@ protected el_action_t ...@@ -850,15 +730,7 @@ protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
vi_prev_char(EditLine *el, int c __attribute__((unused))) vi_prev_char(EditLine *el, int c __attribute__((unused)))
{ {
char ch; return cv_csearch(el, CHAR_BACK, -1, el->el_state.argument, 0);
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));
} }
...@@ -870,13 +742,7 @@ protected el_action_t ...@@ -870,13 +742,7 @@ protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
vi_to_next_char(EditLine *el, int c __attribute__((unused))) vi_to_next_char(EditLine *el, int c __attribute__((unused)))
{ {
char ch; return cv_csearch(el, CHAR_FWD, -1, el->el_state.argument, 1);
if (el_getc(el, &ch) != 1)
return (ed_end_of_file(el, 0));
return (cv_csearch_fwd(el, ch, el->el_state.argument, 1));
} }
...@@ -888,12 +754,7 @@ protected el_action_t ...@@ -888,12 +754,7 @@ protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
vi_to_prev_char(EditLine *el, int c __attribute__((unused))) vi_to_prev_char(EditLine *el, int c __attribute__((unused)))
{ {
char ch; return cv_csearch(el, CHAR_BACK, -1, el->el_state.argument, 1);
if (el_getc(el, &ch) != 1)
return (ed_end_of_file(el, 0));
return (cv_csearch_back(el, ch, el->el_state.argument, 1));
} }
...@@ -906,14 +767,8 @@ protected el_action_t ...@@ -906,14 +767,8 @@ protected el_action_t
vi_repeat_next_char(EditLine *el, int c __attribute__((unused))) vi_repeat_next_char(EditLine *el, int c __attribute__((unused)))
{ {
if (el->el_search.chacha == 0) return cv_csearch(el, el->el_search.chadir, el->el_search.chacha,
return (CC_ERROR); el->el_state.argument, el->el_search.chatflg);
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));
} }
...@@ -925,11 +780,343 @@ protected el_action_t ...@@ -925,11 +780,343 @@ protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
vi_repeat_prev_char(EditLine *el, int c __attribute__((unused))) 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) r = cv_csearch(el, -dir, el->el_search.chacha,
return (CC_ERROR); 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 ? el->el_state.thiscmd = r->cmd;
cv_csearch_fwd(el, el->el_search.chacha, el->el_state.argument, 0) : el->el_state.thisch = r->ch;
cv_csearch_back(el, el->el_search.chacha, el->el_state.argument, 0); return (*el->el_map.func[r->cmd])(el, r->ch);
} }
...@@ -1874,6 +1874,22 @@ else ...@@ -1874,6 +1874,22 @@ else
fi fi
AC_SUBST(TERMCAP_LIB) AC_SUBST(TERMCAP_LIB)
# for libedit 2.6.7
case "${host}" in
*-*-solaris2*)
AC_DEFINE_UNQUOTED(SUNOS, 1, [macro for libedit-2.6.7, current platform is solaris-2])
;;
esac
LIBEDIT_LOBJECTS=""
AC_CHECK_FUNC(strunvis, ,[LIBEDIT_LOBJECTS="$LIBEDIT_LOBJECTS unvis.o"])
AC_CHECK_FUNC(strvis, ,[LIBEDIT_LOBJECTS="$LIBEDIT_LOBJECTS vis.o"])
AC_CHECK_FUNC(strlcpy, ,[LIBEDIT_LOBJECTS="$LIBEDIT_LOBJECTS strlcpy.o"])
AC_CHECK_FUNC(strlcat, ,[LIBEDIT_LOBJECTS="$LIBEDIT_LOBJECTS strlcat.o"])
AC_CHECK_FUNC(fgetln, ,[LIBEDIT_LOBJECTS="$LIBEDIT_LOBJECTS fgetln.o"])
AC_SUBST(LIBEDIT_LOBJECTS)
enable_readline="yes"
# End of readline/libedit stuff # End of readline/libedit stuff
######################################################################### #########################################################################
...@@ -2341,10 +2357,10 @@ then ...@@ -2341,10 +2357,10 @@ then
readline_topdir="cmd-line-utils" readline_topdir="cmd-line-utils"
readline_basedir="libedit" readline_basedir="libedit"
readline_dir="$readline_topdir/$readline_basedir" 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" readline_h_ln_cmd="\$(LN) -s \$(top_builddir)/cmd-line-utils/libedit/readline readline"
compile_libedit=yes compile_libedit=yes
AC_DEFINE_UNQUOTED(HAVE_HIST_ENTRY) AC_DEFINE_UNQUOTED(HAVE_HIST_ENTRY, 1)
AC_DEFINE_UNQUOTED(USE_LIBEDIT_INTERFACE, 1) AC_DEFINE_UNQUOTED(USE_LIBEDIT_INTERFACE, 1)
elif test "$with_readline" = "yes" elif test "$with_readline" = "yes"
then then
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment