Commit 8459cd35 authored by hf@deer.(none)'s avatar hf@deer.(none)

Merge bk@192.168.21.1:/usr/home/bk/mysql-4.1

into deer.(none):/home/hf/work/mysql-4.1.clean
parents 4629ae29 0e52a458
...@@ -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
......
# Local macros for automake & autoconf # Local macros for automake & autoconf
AC_DEFUN(MYSQL_CHECK_READLINE_DECLARES_HIST_ENTRY,[
AC_CACHE_CHECK([HIST_ENTRY is declared in readline/readline.h], mysql_cv_hist_entry_declared,
AC_TRY_COMPILE(
[
#include "stdio.h"
#undef __P // readline-4.2 declares own __P
#include "readline/readline.h"
],
[
HIST_ENTRY entry;
],
[
mysql_cv_hist_entry_declared=yes
AC_DEFINE_UNQUOTED(HAVE_HIST_ENTRY, [1],
[HIST_ENTRY is defined in the outer libeditreadline])
],
[mysql_cv_libedit_interface=no]
)
)
])
AC_DEFUN(MYSQL_CHECK_LIBEDIT_INTERFACE,[ AC_DEFUN(MYSQL_CHECK_LIBEDIT_INTERFACE,[
AC_CACHE_CHECK([libedit variant of rl_completion_entry_function], mysql_cv_libedit_interface, AC_CACHE_CHECK([libedit variant of rl_completion_entry_function], mysql_cv_libedit_interface,
AC_TRY_COMPILE( AC_TRY_COMPILE(
[ [
#include "stdio.h" #include "stdio.h"
#undef __P // readline-4.2 declares own __P
#include "readline/readline.h" #include "readline/readline.h"
], ],
[ [
...@@ -26,6 +49,7 @@ AC_DEFUN(MYSQL_CHECK_NEW_RL_INTERFACE,[ ...@@ -26,6 +49,7 @@ AC_DEFUN(MYSQL_CHECK_NEW_RL_INTERFACE,[
AC_TRY_COMPILE( AC_TRY_COMPILE(
[ [
#include "stdio.h" #include "stdio.h"
#undef __P // readline-4.2 declares own __P
#include "readline/readline.h" #include "readline/readline.h"
], ],
[ [
......
...@@ -84,6 +84,7 @@ extern "C" { ...@@ -84,6 +84,7 @@ extern "C" {
#if defined( __WIN__) || defined(OS2) #if defined( __WIN__) || defined(OS2)
#include <conio.h> #include <conio.h>
#elif !defined(__NETWARE__) #elif !defined(__NETWARE__)
#undef __P // readline-4.2 declares own __P
#include <readline/readline.h> #include <readline/readline.h>
#define HAVE_READLINE #define HAVE_READLINE
#endif #endif
...@@ -294,7 +295,7 @@ static const char *server_default_groups[]= ...@@ -294,7 +295,7 @@ static const char *server_default_groups[]=
HIST_ENTRY is defined for libedit, but not for the real readline HIST_ENTRY is defined for libedit, but not for the real readline
Need to redefine it for real readline to find it Need to redefine it for real readline to find it
*/ */
#if !defined(USE_LIBEDIT_INTERFACE) #if !defined(HAVE_HIST_ENTRY)
typedef struct _hist_entry { typedef struct _hist_entry {
const char *line; const char *line;
const char *data; const char *data;
......
# Copyright (C) 2004 MySQL AB
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Library General Public License for more details.
#
# You should have received a copy of the GNU Library General Public
# License along with this library; if not, write to the Free
# Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
# MA 02111-1307, USA
## Process this file with automake to create Makefile.in ## Process this file with automake to create Makefile.in
SUBDIRS= @readline_basedir@ SUBDIRS= @readline_basedir@
......
...@@ -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
######################################################################### #########################################################################
...@@ -2303,6 +2319,20 @@ AC_ARG_WITH(libedit, ...@@ -2303,6 +2319,20 @@ AC_ARG_WITH(libedit,
[ with_libedit=undefined ] [ with_libedit=undefined ]
) )
#
# We support next variants of compilation:
# --with-readline
# | yes | no | undefined
# --with-libedit | | |
# ---------------+----------------+------+----------------------------------
# yes | ERROR! | use libedit from mysql sources
# ---------------+----------------+------+----------------------------------
# no | use readline | use system readline or external libedit
# | from mysql | according to results of m4 tests
# ---------------+ sources (if it + +----------------------------------
# undefined | is presented) | | use libedit from mysql sources
compile_readline="no" compile_readline="no"
compile_libedit="no" compile_libedit="no"
...@@ -2327,9 +2357,10 @@ then ...@@ -2327,9 +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, 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
...@@ -2341,8 +2372,12 @@ then ...@@ -2341,8 +2372,12 @@ then
compile_readline=yes compile_readline=yes
AC_DEFINE_UNQUOTED(USE_NEW_READLINE_INTERFACE, 1) AC_DEFINE_UNQUOTED(USE_NEW_READLINE_INTERFACE, 1)
else else
AC_LANG_SAVE
AC_LANG_CPLUSPLUS
MYSQL_CHECK_LIBEDIT_INTERFACE MYSQL_CHECK_LIBEDIT_INTERFACE
MYSQL_CHECK_NEW_RL_INTERFACE MYSQL_CHECK_NEW_RL_INTERFACE
MYSQL_CHECK_READLINE_DECLARES_HIST_ENTRY
AC_LANG_RESTORE
if [test "$mysql_cv_new_rl_interface" = "yes"] || [test "$mysql_cv_libedit_interface" = "no"] if [test "$mysql_cv_new_rl_interface" = "yes"] || [test "$mysql_cv_libedit_interface" = "no"]
then then
readline_link="-lreadline" readline_link="-lreadline"
......
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