Commit bd537f09 authored by Daniel Fischer's avatar Daniel Fischer

Backported libedit changes.

parent 4d1a042d
## Process this file with automake to create Makefile.in ## Process this file with automake to create Makefile.in
# Makefile for the GNU readline library.
# Copyright (C) 1994,1996,1997 Free Software Foundation, Inc.
ASRC = $(srcdir)/vi.c $(srcdir)/emacs.c $(srcdir)/common.c ASRC = $(srcdir)/vi.c $(srcdir)/emacs.c $(srcdir)/common.c
AHDR = vi.h emacs.h common.h AHDR = vi.h emacs.h common.h
...@@ -12,10 +10,9 @@ noinst_LIBRARIES = libedit.a ...@@ -12,10 +10,9 @@ noinst_LIBRARIES = libedit.a
libedit_a_SOURCES = chared.c el.c history.c map.c prompt.c readline.c \ libedit_a_SOURCES = chared.c el.c history.c map.c prompt.c readline.c \
search.c tokenizer.c vi.c common.c emacs.c \ search.c tokenizer.c vi.c common.c emacs.c \
hist.c key.c parse.c read.c refresh.c sig.c term.c \ hist.c key.c parse.c read.c refresh.c sig.c term.c \
tty.c help.c fcns.c tty.c help.c fcns.c filecomplete.c \
np/unvis.c np/strlcpy.c np/vis.c np/strlcat.c \
EXTRA_libedit_a_SOURCES = np/unvis.c np/strlcpy.c np/vis.c np/strlcat.c \ np/fgetln.c
np/fgetln.c
libedit_a_LIBADD = @LIBEDIT_LOBJECTS@ libedit_a_LIBADD = @LIBEDIT_LOBJECTS@
libedit_a_DEPENDENCIES = @LIBEDIT_LOBJECTS@ libedit_a_DEPENDENCIES = @LIBEDIT_LOBJECTS@
...@@ -23,22 +20,13 @@ libedit_a_DEPENDENCIES = @LIBEDIT_LOBJECTS@ ...@@ -23,22 +20,13 @@ libedit_a_DEPENDENCIES = @LIBEDIT_LOBJECTS@
pkginclude_HEADERS = readline/readline.h pkginclude_HEADERS = readline/readline.h
noinst_HEADERS = chared.h el.h el_term.h histedit.h key.h parse.h refresh.h sig.h \ noinst_HEADERS = chared.h el.h el_term.h histedit.h key.h parse.h refresh.h sig.h \
sys.h tokenizer.h config.h hist.h map.h prompt.h read.h \ sys.h config.h hist.h map.h prompt.h read.h \
search.h tty.h libedit_term.h vis.h search.h tty.h filecomplete.h np/vis.h
EXTRA_DIST = makelist.sh np/unvis.c np/strlcpy.c np/vis.c np/vis.h np/strlcat.c np/fgetln.c EXTRA_DIST = makelist.sh
CLEANFILES = makelist common.h emacs.h vi.h fcns.h help.h fcns.c help.c CLEANFILES = makelist common.h emacs.h vi.h fcns.h help.h fcns.c help.c
# Make sure to include stuff from this directory first, to get right "config.h"
# Automake puts into DEFAULT_INCLUDES this source and corresponding
# build directory together with ../../include to let all make files
# find the central "config.h". This variable is used before INCLUDES
# above. But in automake 1.10 the order of these are changed. Put the
# includes of this directory into DEFS to always be sure it is first
# before DEFAULT_INCLUDES on the compile line.
DEFS = -DUNDEF_THREADS_HACK -DHAVE_CONFIG_H -DNO_KILL_INTR -I. -I$(srcdir)
SUFFIXES = .sh SUFFIXES = .sh
.sh: .sh:
...@@ -101,6 +89,4 @@ term.o: vi.h emacs.h common.h help.h fcns.h ...@@ -101,6 +89,4 @@ term.o: vi.h emacs.h common.h help.h fcns.h
tty.o: vi.h emacs.h common.h help.h fcns.h tty.o: vi.h emacs.h common.h help.h fcns.h
help.o: vi.h emacs.h common.h help.h fcns.h help.o: vi.h emacs.h common.h help.h fcns.h
fcns.o: vi.h emacs.h common.h help.h fcns.h fcns.o: vi.h emacs.h common.h help.h fcns.h
filecomplete.o: vi.h emacs.h common.h help.h fcns.h
# Don't update the files from bitkeeper
%::SCCS/s.%
/* $NetBSD: chared.c,v 1.22 2004/08/13 12:10:38 mycroft Exp $ */ /* $NetBSD: chared.c,v 1.26 2009/02/06 12:45:25 sketch Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -32,7 +32,13 @@ ...@@ -32,7 +32,13 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include <config.h> #include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)chared.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif /* not lint && not SCCSID */
/* /*
* chared.c: Character editor utilities * chared.c: Character editor utilities
...@@ -40,6 +46,8 @@ ...@@ -40,6 +46,8 @@
#include <stdlib.h> #include <stdlib.h>
#include "el.h" #include "el.h"
private void ch__clearmacro (EditLine *);
/* value to leave unused in line buffer */ /* value to leave unused in line buffer */
#define EL_LEAVE 2 #define EL_LEAVE 2
...@@ -51,13 +59,13 @@ cv_undo(EditLine *el) ...@@ -51,13 +59,13 @@ cv_undo(EditLine *el)
{ {
c_undo_t *vu = &el->el_chared.c_undo; c_undo_t *vu = &el->el_chared.c_undo;
c_redo_t *r = &el->el_chared.c_redo; c_redo_t *r = &el->el_chared.c_redo;
int size; unsigned int size;
/* Save entire line for undo */ /* Save entire line for undo */
size = el->el_line.lastchar - el->el_line.buffer; size = el->el_line.lastchar - el->el_line.buffer;
vu->len = size; vu->len = size;
vu->cursor = el->el_line.cursor - el->el_line.buffer; vu->cursor = el->el_line.cursor - el->el_line.buffer;
memcpy(vu->buf, el->el_line.buffer, (size_t)size); memcpy(vu->buf, el->el_line.buffer, size);
/* save command info for redo */ /* save command info for redo */
r->count = el->el_state.doingarg ? el->el_state.argument : 0; r->count = el->el_state.doingarg ? el->el_state.argument : 0;
...@@ -439,6 +447,8 @@ cv__endword(char *p, char *high, int n, int (*wtest)(int)) ...@@ -439,6 +447,8 @@ cv__endword(char *p, char *high, int n, int (*wtest)(int))
protected int protected int
ch_init(EditLine *el) ch_init(EditLine *el)
{ {
c_macro_t *ma = &el->el_chared.c_macro;
el->el_line.buffer = (char *) el_malloc(EL_BUFSIZ); el->el_line.buffer = (char *) el_malloc(EL_BUFSIZ);
if (el->el_line.buffer == NULL) if (el->el_line.buffer == NULL)
return (-1); return (-1);
...@@ -479,11 +489,10 @@ ch_init(EditLine *el) ...@@ -479,11 +489,10 @@ ch_init(EditLine *el)
el->el_state.argument = 1; el->el_state.argument = 1;
el->el_state.lastcmd = ED_UNASSIGNED; el->el_state.lastcmd = ED_UNASSIGNED;
el->el_chared.c_macro.level = -1; ma->level = -1;
el->el_chared.c_macro.offset = 0; ma->offset = 0;
el->el_chared.c_macro.macro = (char **) el_malloc(EL_MAXMACRO * ma->macro = (char **) el_malloc(EL_MAXMACRO * sizeof(char *));
sizeof(char *)); if (ma->macro == NULL)
if (el->el_chared.c_macro.macro == NULL)
return (-1); return (-1);
return (0); return (0);
} }
...@@ -492,7 +501,7 @@ ch_init(EditLine *el) ...@@ -492,7 +501,7 @@ ch_init(EditLine *el)
* Reset the character editor * Reset the character editor
*/ */
protected void protected void
ch_reset(EditLine *el) ch_reset(EditLine *el, int mclear)
{ {
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;
...@@ -513,9 +522,19 @@ ch_reset(EditLine *el) ...@@ -513,9 +522,19 @@ ch_reset(EditLine *el)
el->el_state.argument = 1; el->el_state.argument = 1;
el->el_state.lastcmd = ED_UNASSIGNED; el->el_state.lastcmd = ED_UNASSIGNED;
el->el_chared.c_macro.level = -1;
el->el_history.eventno = 0; el->el_history.eventno = 0;
if (mclear)
ch__clearmacro(el);
}
private void
ch__clearmacro(el)
EditLine *el;
{
c_macro_t *ma = &el->el_chared.c_macro;
while (ma->level >= 0)
el_free((ptr_t)ma->macro[ma->level--]);
} }
/* ch_enlargebufs(): /* ch_enlargebufs():
...@@ -623,9 +642,9 @@ ch_end(EditLine *el) ...@@ -623,9 +642,9 @@ ch_end(EditLine *el)
el->el_chared.c_redo.cmd = ED_UNASSIGNED; 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;
ch_reset(el, 1);
el_free((ptr_t) el->el_chared.c_macro.macro); el_free((ptr_t) el->el_chared.c_macro.macro);
el->el_chared.c_macro.macro = NULL; el->el_chared.c_macro.macro = NULL;
ch_reset(el);
} }
......
/* $NetBSD: chared.h,v 1.14 2004/08/13 12:10:39 mycroft Exp $ */ /* $NetBSD: chared.h,v 1.17 2006/03/06 21:11:56 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
#define EL_MAXMACRO 10 #define EL_MAXMACRO 10
/* /*
* This is a issue of basic "vi" look-and-feel. Defining VI_MOVE works * This is an issue of basic "vi" look-and-feel. Defining VI_MOVE works
* like real vi: i.e. the transition from command<->insert modes moves * like real vi: i.e. the transition from command<->insert modes moves
* the cursor. * the cursor.
* *
...@@ -116,11 +116,10 @@ typedef struct el_chared_t { ...@@ -116,11 +116,10 @@ typedef struct el_chared_t {
} el_chared_t; } el_chared_t;
#define STReof "^D\b\b"
#define STRQQ "\"\"" #define STRQQ "\"\""
#define isglob(a) (strchr("*[]?", (a)) != NULL) #define isglob(a) (strchr("*[]?", (a)) != NULL)
#define isword(a) (isprint(a)) #define isword(a) (el_isprint(a))
#define NOP 0x00 #define NOP 0x00
#define DELETE 0x01 #define DELETE 0x01
...@@ -161,7 +160,7 @@ protected int c_gets(EditLine *, char *, const char *); ...@@ -161,7 +160,7 @@ 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 *, int);
protected int ch_enlargebufs(EditLine *, size_t); protected int ch_enlargebufs(EditLine *, size_t);
protected void ch_end(EditLine *); protected void ch_end(EditLine *);
......
/* $NetBSD: common.c,v 1.16 2003/08/07 16:44:30 agc Exp $ */ /* $NetBSD: common.c,v 1.21 2008/09/30 08:37:42 aymeric Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -32,7 +32,13 @@ ...@@ -32,7 +32,13 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include <config.h> #include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)common.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif /* not lint && not SCCSID */
/* /*
* common.c: Common Editor functions * common.c: Common Editor functions
...@@ -130,7 +136,7 @@ ed_delete_prev_word(EditLine *el, int c __attribute__((__unused__))) ...@@ -130,7 +136,7 @@ ed_delete_prev_word(EditLine *el, int c __attribute__((__unused__)))
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_delete_next_char(EditLine *el, int c __attribute__((__unused__))) ed_delete_next_char(EditLine *el, int c)
{ {
#ifdef notdef /* XXX */ #ifdef notdef /* XXX */
#define EL el->el_line #define EL el->el_line
...@@ -147,9 +153,8 @@ ed_delete_next_char(EditLine *el, int c __attribute__((__unused__))) ...@@ -147,9 +153,8 @@ ed_delete_next_char(EditLine *el, int c __attribute__((__unused__)))
#ifdef KSHVI #ifdef KSHVI
return (CC_ERROR); return (CC_ERROR);
#else #else
term_overwrite(el, STReof, 4); /* then do an EOF */
/* then do a EOF */ term_writechar(el, c);
term__flush();
return (CC_EOF); return (CC_EOF);
#endif #endif
} else { } else {
...@@ -207,13 +212,13 @@ ed_move_to_end(EditLine *el, int c __attribute__((__unused__))) ...@@ -207,13 +212,13 @@ ed_move_to_end(EditLine *el, int c __attribute__((__unused__)))
el->el_line.cursor = el->el_line.lastchar; el->el_line.cursor = el->el_line.lastchar;
if (el->el_map.type == MAP_VI) { if (el->el_map.type == MAP_VI) {
#ifdef VI_MOVE
el->el_line.cursor--;
#endif
if (el->el_chared.c_vcmd.action != NOP) { if (el->el_chared.c_vcmd.action != NOP) {
cv_delfini(el); cv_delfini(el);
return (CC_REFRESH); return (CC_REFRESH);
} }
#ifdef VI_MOVE
el->el_line.cursor--;
#endif
} }
return (CC_CURSOR); return (CC_CURSOR);
} }
...@@ -609,7 +614,7 @@ protected el_action_t ...@@ -609,7 +614,7 @@ protected el_action_t
ed_start_over(EditLine *el, int c __attribute__((__unused__))) ed_start_over(EditLine *el, int c __attribute__((__unused__)))
{ {
ch_reset(el); ch_reset(el, 0);
return (CC_REFRESH); return (CC_REFRESH);
} }
...@@ -904,7 +909,7 @@ ed_command(EditLine *el, int c __attribute__((__unused__))) ...@@ -904,7 +909,7 @@ ed_command(EditLine *el, int c __attribute__((__unused__)))
int tmplen; int tmplen;
tmplen = c_gets(el, tmpbuf, "\n: "); tmplen = c_gets(el, tmpbuf, "\n: ");
term__putc('\n'); term__putc(el, '\n');
if (tmplen < 0 || (tmpbuf[tmplen] = 0, parse_line(el, tmpbuf)) == -1) if (tmplen < 0 || (tmpbuf[tmplen] = 0, parse_line(el, tmpbuf)) == -1)
term_beep(el); term_beep(el);
......
#include "my_config.h" #include "my_config.h"
#include "sys.h" #include "sys.h"
#if defined(LIBC_SCCS) && !defined(lint)
#define __RCSID(x)
#define __COPYRIGHT(x)
#endif
#define __RENAME(x)
#define _DIAGASSERT(x)
#if !defined(__attribute__) && (defined(__cplusplus) || !defined(__GNUC__) || __GNUC__ == 2 && __GNUC_MINOR__ < 8)
#define __attribute__(A)
#endif
/* $NetBSD: el.c,v 1.39 2004/07/08 00:51:36 christos Exp $ */ /* $NetBSD: el.c,v 1.47 2009/01/18 12:17:24 lukem Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -32,7 +32,13 @@ ...@@ -32,7 +32,13 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include <config.h> #include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)el.c 8.2 (Berkeley) 1/3/94";
#else
#endif
#endif /* not lint && not SCCSID */
/* /*
* el.c: EditLine interface functions * el.c: EditLine interface functions
...@@ -58,9 +64,12 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr) ...@@ -58,9 +64,12 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr)
memset(el, 0, sizeof(EditLine)); memset(el, 0, sizeof(EditLine));
el->el_infd = fileno(fin); el->el_infile = fin;
el->el_outfile = fout; el->el_outfile = fout;
el->el_errfile = ferr; el->el_errfile = ferr;
el->el_infd = fileno(fin);
if ((el->el_prog = el_strdup(prog)) == NULL) { if ((el->el_prog = el_strdup(prog)) == NULL) {
el_free(el); el_free(el);
return NULL; return NULL;
...@@ -126,7 +135,7 @@ el_reset(EditLine *el) ...@@ -126,7 +135,7 @@ el_reset(EditLine *el)
{ {
tty_cookedmode(el); tty_cookedmode(el);
ch_reset(el); /* XXX: Do we want that? */ ch_reset(el, 0); /* XXX: Do we want that? */
} }
...@@ -136,29 +145,29 @@ el_reset(EditLine *el) ...@@ -136,29 +145,29 @@ el_reset(EditLine *el)
public int public int
el_set(EditLine *el, int op, ...) el_set(EditLine *el, int op, ...)
{ {
va_list va; va_list ap;
int rv = 0; int rv = 0;
if (el == NULL) if (el == NULL)
return (-1); return (-1);
va_start(va, op); va_start(ap, op);
switch (op) { switch (op) {
case EL_PROMPT: case EL_PROMPT:
case EL_RPROMPT: case EL_RPROMPT:
rv = prompt_set(el, va_arg(va, el_pfunc_t), op); rv = prompt_set(el, va_arg(ap, el_pfunc_t), op);
break; break;
case EL_TERMINAL: case EL_TERMINAL:
rv = term_set(el, va_arg(va, char *)); rv = term_set(el, va_arg(ap, char *));
break; break;
case EL_EDITOR: case EL_EDITOR:
rv = map_set_editor(el, va_arg(va, char *)); rv = map_set_editor(el, va_arg(ap, char *));
break; break;
case EL_SIGNAL: case EL_SIGNAL:
if (va_arg(va, int)) if (va_arg(ap, int))
el->el_flags |= HANDLE_SIGNALS; el->el_flags |= HANDLE_SIGNALS;
else else
el->el_flags &= ~HANDLE_SIGNALS; el->el_flags &= ~HANDLE_SIGNALS;
...@@ -167,6 +176,7 @@ el_set(EditLine *el, int op, ...) ...@@ -167,6 +176,7 @@ el_set(EditLine *el, int op, ...)
case EL_BIND: case EL_BIND:
case EL_TELLTC: case EL_TELLTC:
case EL_SETTC: case EL_SETTC:
case EL_GETTC:
case EL_ECHOTC: case EL_ECHOTC:
case EL_SETTY: case EL_SETTY:
{ {
...@@ -174,7 +184,7 @@ el_set(EditLine *el, int op, ...) ...@@ -174,7 +184,7 @@ el_set(EditLine *el, int op, ...)
int i; int i;
for (i = 1; i < 20; i++) for (i = 1; i < 20; i++)
if ((argv[i] = va_arg(va, char *)) == NULL) if ((argv[i] = va_arg(ap, char *)) == NULL)
break; break;
switch (op) { switch (op) {
...@@ -213,9 +223,9 @@ el_set(EditLine *el, int op, ...) ...@@ -213,9 +223,9 @@ el_set(EditLine *el, int op, ...)
case EL_ADDFN: case EL_ADDFN:
{ {
char *name = va_arg(va, char *); char *name = va_arg(ap, char *);
char *help = va_arg(va, char *); char *help = va_arg(ap, char *);
el_func_t func = va_arg(va, el_func_t); el_func_t func = va_arg(ap, el_func_t);
rv = map_addfunc(el, name, help, func); rv = map_addfunc(el, name, help, func);
break; break;
...@@ -223,15 +233,15 @@ el_set(EditLine *el, int op, ...) ...@@ -223,15 +233,15 @@ el_set(EditLine *el, int op, ...)
case EL_HIST: case EL_HIST:
{ {
hist_fun_t func = va_arg(va, hist_fun_t); hist_fun_t func = va_arg(ap, hist_fun_t);
ptr_t ptr = va_arg(va, char *); ptr_t ptr = va_arg(ap, char *);
rv = hist_set(el, func, ptr); rv = hist_set(el, func, ptr);
break; break;
} }
case EL_EDITMODE: case EL_EDITMODE:
if (va_arg(va, int)) if (va_arg(ap, int))
el->el_flags &= ~EDIT_DISABLED; el->el_flags &= ~EDIT_DISABLED;
else else
el->el_flags |= EDIT_DISABLED; el->el_flags |= EDIT_DISABLED;
...@@ -240,17 +250,17 @@ el_set(EditLine *el, int op, ...) ...@@ -240,17 +250,17 @@ el_set(EditLine *el, int op, ...)
case EL_GETCFN: case EL_GETCFN:
{ {
el_rfunc_t rc = va_arg(va, el_rfunc_t); el_rfunc_t rc = va_arg(ap, el_rfunc_t);
rv = el_read_setfn(el, rc); rv = el_read_setfn(el, rc);
break; break;
} }
case EL_CLIENTDATA: case EL_CLIENTDATA:
el->el_data = va_arg(va, void *); el->el_data = va_arg(ap, void *);
break; break;
case EL_UNBUFFERED: case EL_UNBUFFERED:
rv = va_arg(va, int); rv = va_arg(ap, int);
if (rv && !(el->el_flags & UNBUFFERED)) { if (rv && !(el->el_flags & UNBUFFERED)) {
el->el_flags |= UNBUFFERED; el->el_flags |= UNBUFFERED;
read_prepare(el); read_prepare(el);
...@@ -262,7 +272,7 @@ el_set(EditLine *el, int op, ...) ...@@ -262,7 +272,7 @@ el_set(EditLine *el, int op, ...)
break; break;
case EL_PREP_TERM: case EL_PREP_TERM:
rv = va_arg(va, int); rv = va_arg(ap, int);
if (rv) if (rv)
(void) tty_rawmode(el); (void) tty_rawmode(el);
else else
...@@ -270,12 +280,45 @@ el_set(EditLine *el, int op, ...) ...@@ -270,12 +280,45 @@ el_set(EditLine *el, int op, ...)
rv = 0; rv = 0;
break; break;
case EL_SETFP:
{
FILE *fp;
int what;
what = va_arg(ap, int);
fp = va_arg(ap, FILE *);
rv = 0;
switch (what) {
case 0:
el->el_infile = fp;
el->el_infd = fileno(fp);
break;
case 1:
el->el_outfile = fp;
break;
case 2:
el->el_errfile = fp;
break;
default:
rv = -1;
break;
}
break;
}
case EL_REFRESH:
re_clear_display(el);
re_refresh(el);
term__flush(el);
break;
default: default:
rv = -1; rv = -1;
break; break;
} }
va_end(va); va_end(ap);
return (rv); return (rv);
} }
...@@ -284,90 +327,71 @@ el_set(EditLine *el, int op, ...) ...@@ -284,90 +327,71 @@ el_set(EditLine *el, int op, ...)
* retrieve the editline parameters * retrieve the editline parameters
*/ */
public int public int
el_get(EditLine *el, int op, void *ret) el_get(EditLine *el, int op, ...)
{ {
va_list ap;
int rv; int rv;
if (el == NULL || ret == NULL) if (el == NULL)
return (-1); return -1;
va_start(ap, op);
switch (op) { switch (op) {
case EL_PROMPT: case EL_PROMPT:
case EL_RPROMPT: case EL_RPROMPT:
rv = prompt_get(el, (void *) &ret, op); rv = prompt_get(el, va_arg(ap, el_pfunc_t *), op);
break; break;
case EL_EDITOR: case EL_EDITOR:
rv = map_get_editor(el, (void *) &ret); rv = map_get_editor(el, va_arg(ap, const char **));
break; break;
case EL_SIGNAL: case EL_SIGNAL:
*((int *) ret) = (el->el_flags & HANDLE_SIGNALS); *va_arg(ap, int *) = (el->el_flags & HANDLE_SIGNALS);
rv = 0; rv = 0;
break; break;
case EL_EDITMODE: case EL_EDITMODE:
*((int *) ret) = (!(el->el_flags & EDIT_DISABLED)); *va_arg(ap, int *) = !(el->el_flags & EDIT_DISABLED);
rv = 0; rv = 0;
break; break;
case EL_TERMINAL: case EL_TERMINAL:
term_get(el, (const char **)ret); term_get(el, va_arg(ap, const char **));
rv = 0; rv = 0;
break; break;
#if 0 /* XXX */ case EL_GETTC:
case EL_BIND:
case EL_TELLTC:
case EL_SETTC:
case EL_ECHOTC:
case EL_SETTY:
{ {
const char *argv[20]; static char name[] = "gettc";
char *argv[20];
int i; int i;
for (i = 1; i < sizeof(argv) / sizeof(argv[0]); i++) for (i = 1; i < (int)(sizeof(argv) / sizeof(argv[0])); i++)
if ((argv[i] = va_arg(va, char *)) == NULL) if ((argv[i] = va_arg(ap, char *)) == NULL)
break; break;
switch (op) { switch (op) {
case EL_BIND: case EL_GETTC:
argv[0] = "bind"; argv[0] = name;
rv = map_bind(el, i, argv); rv = term_gettc(el, i, argv);
break;
case EL_TELLTC:
argv[0] = "telltc";
rv = term_telltc(el, i, argv);
break;
case EL_SETTC:
argv[0] = "settc";
rv = term_settc(el, i, argv);
break;
case EL_ECHOTC:
argv[0] = "echotc";
rv = term_echotc(el, i, argv);
break;
case EL_SETTY:
argv[0] = "setty";
rv = tty_stty(el, i, argv);
break; break;
default: default:
rv = -1; rv = -1;
EL_ABORT((el->errfile, "Bad op %d\n", op)); EL_ABORT((el->el_errfile, "Bad op %d\n", op));
break; break;
} }
break; break;
} }
#if 0 /* XXX */
case EL_ADDFN: case EL_ADDFN:
{ {
char *name = va_arg(va, char *); char *name = va_arg(ap, char *);
char *help = va_arg(va, char *); char *help = va_arg(ap, char *);
el_func_t func = va_arg(va, el_func_t); el_func_t func = va_arg(ap, el_func_t);
rv = map_addfunc(el, name, help, func); rv = map_addfunc(el, name, help, func);
break; break;
...@@ -375,31 +399,57 @@ el_get(EditLine *el, int op, void *ret) ...@@ -375,31 +399,57 @@ el_get(EditLine *el, int op, void *ret)
case EL_HIST: case EL_HIST:
{ {
hist_fun_t func = va_arg(va, hist_fun_t); hist_fun_t func = va_arg(ap, hist_fun_t);
ptr_t ptr = va_arg(va, char *); ptr_t ptr = va_arg(ap, char *);
rv = hist_set(el, func, ptr); rv = hist_set(el, func, ptr);
} }
break; break;
#endif /* XXX */ #endif /* XXX */
case EL_GETCFN: case EL_GETCFN:
*((el_rfunc_t *)ret) = el_read_getfn(el); *va_arg(ap, el_rfunc_t *) = el_read_getfn(el);
rv = 0; rv = 0;
break; break;
case EL_CLIENTDATA: case EL_CLIENTDATA:
*((void **)ret) = el->el_data; *va_arg(ap, void **) = el->el_data;
rv = 0; rv = 0;
break; break;
case EL_UNBUFFERED: case EL_UNBUFFERED:
*((int *) ret) = (!(el->el_flags & UNBUFFERED)); *va_arg(ap, int *) = (!(el->el_flags & UNBUFFERED));
rv = 0; rv = 0;
break; break;
case EL_GETFP:
{
int what;
FILE **fpp;
what = va_arg(ap, int);
fpp = va_arg(ap, FILE **);
rv = 0;
switch (what) {
case 0:
*fpp = el->el_infile;
break;
case 1:
*fpp = el->el_outfile;
break;
case 2:
*fpp = el->el_errfile;
break;
default:
rv = -1;
break;
}
break;
}
default: default:
rv = -1; rv = -1;
break;
} }
va_end(ap);
return (rv); return (rv);
} }
...@@ -428,17 +478,17 @@ el_source(EditLine *el, const char *fname) ...@@ -428,17 +478,17 @@ el_source(EditLine *el, const char *fname)
fp = NULL; fp = NULL;
if (fname == NULL) { if (fname == NULL) {
#ifdef HAVE_ISSETUGID
static const char elpath[] = "/.editrc"; static const char elpath[] = "/.editrc";
/* XXXMYSQL: Portability fix (for which platforms?) */
#ifdef MAXPATHLEN #ifdef MAXPATHLEN
char path[MAXPATHLEN]; char path[MAXPATHLEN];
#else #else
char path[4096]; char path[4096];
#endif #endif
#ifdef HAVE_ISSETUGID
if (issetugid()) if (issetugid())
return (-1); return (-1);
#endif
if ((ptr = getenv("HOME")) == NULL) if ((ptr = getenv("HOME")) == NULL)
return (-1); return (-1);
if (strlcpy(path, ptr, sizeof(path)) >= sizeof(path)) if (strlcpy(path, ptr, sizeof(path)) >= sizeof(path))
...@@ -446,6 +496,14 @@ el_source(EditLine *el, const char *fname) ...@@ -446,6 +496,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.16 2003/10/18 23:48:42 christos Exp $ */ /* $NetBSD: el.h,v 1.17 2006/12/15 22:13:33 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -110,6 +110,7 @@ typedef struct el_state_t { ...@@ -110,6 +110,7 @@ typedef struct el_state_t {
struct editline { struct editline {
char *el_prog; /* the program name */ char *el_prog; /* the program name */
FILE *el_infile; /* Stdio stuff */
FILE *el_outfile; /* Stdio stuff */ FILE *el_outfile; /* Stdio stuff */
FILE *el_errfile; /* Stdio stuff */ FILE *el_errfile; /* Stdio stuff */
int el_infd; /* Input file descriptor */ int el_infd; /* Input file descriptor */
...@@ -136,7 +137,8 @@ struct editline { ...@@ -136,7 +137,8 @@ struct editline {
protected int el_editmode(EditLine *, int, const char **); protected int el_editmode(EditLine *, int, const char **);
#define el_isprint(x) ((unsigned char) (x) < 0x80 ? isprint(x) : 1) /* XXXMYSQL: Bug#23097 mysql can't insert korean on mysql prompt. */
#define el_isprint(x) ((unsigned char) (x) < 0x80 ? isprint(x) : 1)
#ifdef DEBUG #ifdef DEBUG
#define EL_ABORT(a) do { \ #define EL_ABORT(a) do { \
......
/* $NetBSD: term.h,v 1.15 2003/09/14 21:48:55 christos Exp $ */ /* $NetBSD: term.h,v 1.19 2008/09/10 15:45:37 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -81,25 +81,6 @@ typedef struct { ...@@ -81,25 +81,6 @@ typedef struct {
#define A_K_EN 5 #define A_K_EN 5
#define A_K_NKEYS 6 #define A_K_NKEYS 6
#ifdef _SUNOS
extern int tgetent(char *, const char *);
extern int tgetflag(char *);
extern int tgetnum(char *);
extern int tputs(const char *, int, int (*)(int));
extern char* tgoto(const char*, int, int);
extern char* tgetstr(char*, char**);
#endif
#if !HAVE_DECL_TGOTO
/*
'tgoto' is not declared in the system header files, this causes
problems on 64-bit systems. The function returns a 64 bit pointer
but caller see it as "int" and it's thus truncated to 32-bit
*/
extern char* tgoto(const char*, int, int);
#endif
protected void term_move_to_line(EditLine *, int); protected void term_move_to_line(EditLine *, int);
protected void term_move_to_char(EditLine *, int); protected void term_move_to_char(EditLine *, int);
protected void term_clear_EOL(EditLine *, int); protected void term_clear_EOL(EditLine *, int);
...@@ -119,10 +100,12 @@ protected void term_end(EditLine *); ...@@ -119,10 +100,12 @@ protected void term_end(EditLine *);
protected void term_get(EditLine *, const char **); protected void term_get(EditLine *, const char **);
protected int term_set(EditLine *, const char *); protected int term_set(EditLine *, const char *);
protected int term_settc(EditLine *, int, const char **); protected int term_settc(EditLine *, int, const char **);
protected int term_gettc(EditLine *, int, char **);
protected int term_telltc(EditLine *, int, const char **); protected int term_telltc(EditLine *, int, const char **);
protected int term_echotc(EditLine *, int, const char **); protected int term_echotc(EditLine *, int, const char **);
protected int term__putc(int); protected void term_writec(EditLine *, int);
protected void term__flush(void); protected int term__putc(EditLine *, int);
protected void term__flush(EditLine *);
/* /*
* Easy access macros * Easy access macros
...@@ -134,6 +117,7 @@ protected void term__flush(void); ...@@ -134,6 +117,7 @@ protected void term__flush(void);
#define EL_CAN_CEOL (EL_FLAGS & TERM_CAN_CEOL) #define EL_CAN_CEOL (EL_FLAGS & TERM_CAN_CEOL)
#define EL_CAN_TAB (EL_FLAGS & TERM_CAN_TAB) #define EL_CAN_TAB (EL_FLAGS & TERM_CAN_TAB)
#define EL_CAN_ME (EL_FLAGS & TERM_CAN_ME) #define EL_CAN_ME (EL_FLAGS & TERM_CAN_ME)
#define EL_CAN_UP (EL_FLAGS & TERM_CAN_UP)
#define EL_HAS_META (EL_FLAGS & TERM_HAS_META) #define EL_HAS_META (EL_FLAGS & TERM_HAS_META)
#define EL_HAS_AUTO_MARGINS (EL_FLAGS & TERM_HAS_AUTO_MARGINS) #define EL_HAS_AUTO_MARGINS (EL_FLAGS & TERM_HAS_AUTO_MARGINS)
#define EL_HAS_MAGIC_MARGINS (EL_FLAGS & TERM_HAS_MAGIC_MARGINS) #define EL_HAS_MAGIC_MARGINS (EL_FLAGS & TERM_HAS_MAGIC_MARGINS)
......
/* $NetBSD: emacs.c,v 1.19 2004/10/28 21:14:52 dsl Exp $ */ /* $NetBSD: emacs.c,v 1.21 2006/03/06 21:11:56 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -32,7 +32,13 @@ ...@@ -32,7 +32,13 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include <config.h> #include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)emacs.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif /* not lint && not SCCSID */
/* /*
* emacs.c: Emacs functions * emacs.c: Emacs functions
...@@ -45,15 +51,14 @@ ...@@ -45,15 +51,14 @@
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_delete_or_list(EditLine *el, int c __attribute__((__unused__))) em_delete_or_list(EditLine *el, int c)
{ {
if (el->el_line.cursor == el->el_line.lastchar) { if (el->el_line.cursor == el->el_line.lastchar) {
/* if I'm at the end */ /* if I'm at the end */
if (el->el_line.cursor == el->el_line.buffer) { if (el->el_line.cursor == el->el_line.buffer) {
/* and the beginning */ /* and the beginning */
term_overwrite(el, STReof, 4); /* then do a EOF */ term_writec(el, c); /* then do an EOF */
term__flush();
return (CC_EOF); return (CC_EOF);
} else { } else {
/* /*
......
...@@ -32,7 +32,13 @@ ...@@ -32,7 +32,13 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include <config.h> #include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)hist.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif /* not lint && not SCCSID */
/* /*
* hist.c: History access functions * hist.c: History access functions
......
/* $NetBSD: histedit.h,v 1.25 2003/12/05 13:37:48 lukem Exp $ */ /* $NetBSD: histedit.h,v 1.35 2009/02/05 19:15:44 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -41,11 +41,15 @@ ...@@ -41,11 +41,15 @@
#define _HISTEDIT_H_ #define _HISTEDIT_H_
#define LIBEDIT_MAJOR 2 #define LIBEDIT_MAJOR 2
#define LIBEDIT_MINOR 9 #define LIBEDIT_MINOR 11
#include <sys/types.h> #include <sys/types.h>
#include <stdio.h> #include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
/* /*
* ==== Editing ==== * ==== Editing ====
*/ */
...@@ -88,7 +92,7 @@ void el_reset(EditLine *); ...@@ -88,7 +92,7 @@ void el_reset(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 *, char *); void el_push(EditLine *, const char *);
/* /*
* Beep! * Beep!
...@@ -105,7 +109,8 @@ int el_parse(EditLine *, int, const char **); ...@@ -105,7 +109,8 @@ int el_parse(EditLine *, int, const char **);
* Low level editline access functions * Low level editline access functions
*/ */
int el_set(EditLine *, int, ...); int el_set(EditLine *, int, ...);
int el_get(EditLine *, int, void *); int el_get(EditLine *, int, ...);
unsigned char _el_fn_complete(EditLine *, int);
/* /*
* el_set/el_get parameters * el_set/el_get parameters
...@@ -128,8 +133,12 @@ int el_get(EditLine *, int, void *); ...@@ -128,8 +133,12 @@ int el_get(EditLine *, int, void *);
#define EL_CLIENTDATA 14 /* , void *); */ #define EL_CLIENTDATA 14 /* , void *); */
#define EL_UNBUFFERED 15 /* , int); */ #define EL_UNBUFFERED 15 /* , int); */
#define EL_PREP_TERM 16 /* , int); */ #define EL_PREP_TERM 16 /* , int); */
#define EL_GETTC 17 /* , const char *, ..., NULL); */
#define EL_GETFP 18 /* , int, FILE **); */
#define EL_SETFP 19 /* , int, FILE *); */
#define EL_REFRESH 20 /* , void); */
#define EL_BUILTIN_GETCFN (NULL) #define EL_BUILTIN_GETCFN (NULL)
/* /*
* Source named file or $PWD/.editrc or $HOME/.editrc * Source named file or $PWD/.editrc or $HOME/.editrc
...@@ -192,6 +201,7 @@ int history(History *, HistEvent *, int, ...); ...@@ -192,6 +201,7 @@ int history(History *, HistEvent *, int, ...);
#define H_CLEAR 19 /* , void); */ #define H_CLEAR 19 /* , void); */
#define H_SETUNIQUE 20 /* , int); */ #define H_SETUNIQUE 20 /* , int); */
#define H_GETUNIQUE 21 /* , void); */ #define H_GETUNIQUE 21 /* , void); */
#define H_DEL 22 /* , int); */
/* /*
...@@ -211,4 +221,8 @@ int tok_line(Tokenizer *, const LineInfo *, ...@@ -211,4 +221,8 @@ int tok_line(Tokenizer *, const LineInfo *,
int tok_str(Tokenizer *, const char *, int tok_str(Tokenizer *, const char *,
int *, const char ***); int *, const char ***);
#ifdef __cplusplus
}
#endif
#endif /* _HISTEDIT_H_ */ #endif /* _HISTEDIT_H_ */
/* $NetBSD: history.c,v 1.28 2004/11/27 18:31:45 christos Exp $ */ /* $NetBSD: history.c,v 1.33 2009/02/06 14:40:32 sketch Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -32,7 +32,13 @@ ...@@ -32,7 +32,13 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include <config.h> #include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)history.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif /* not lint && not SCCSID */
/* /*
* hist.c: History access functions * hist.c: History access functions
...@@ -40,7 +46,11 @@ ...@@ -40,7 +46,11 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h> #include <stdarg.h>
#ifdef HAVE_VIS_H
#include <vis.h> #include <vis.h>
#else
#include "np/vis.h"
#endif
#include <sys/stat.h> #include <sys/stat.h>
static const char hist_cookie[] = "_HiStOrY_V2_\n"; static const char hist_cookie[] = "_HiStOrY_V2_\n";
...@@ -61,6 +71,7 @@ struct history { ...@@ -61,6 +71,7 @@ struct history {
history_gfun_t h_prev; /* Get the previous element */ history_gfun_t h_prev; /* Get the previous element */
history_gfun_t h_curr; /* Get the current element */ history_gfun_t h_curr; /* Get the current element */
history_sfun_t h_set; /* Set the current element */ history_sfun_t h_set; /* Set the current element */
history_sfun_t h_del; /* Set the given element */
history_vfun_t h_clear; /* Clear the history list */ history_vfun_t h_clear; /* Clear the history list */
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 */
...@@ -75,6 +86,7 @@ struct history { ...@@ -75,6 +86,7 @@ struct history {
#define HCLEAR(h, ev) (*(h)->h_clear)((h)->h_ref, ev) #define HCLEAR(h, ev) (*(h)->h_clear)((h)->h_ref, ev)
#define HENTER(h, ev, str) (*(h)->h_enter)((h)->h_ref, ev, str) #define HENTER(h, ev, str) (*(h)->h_enter)((h)->h_ref, ev, str)
#define HADD(h, ev, str) (*(h)->h_add)((h)->h_ref, ev, str) #define HADD(h, ev, str) (*(h)->h_add)((h)->h_ref, ev, str)
#define HDEL(h, ev, n) (*(h)->h_del)((h)->h_ref, ev, n)
#define h_strdup(a) strdup(a) #define h_strdup(a) strdup(a)
#define h_malloc(a) malloc(a) #define h_malloc(a) malloc(a)
...@@ -122,16 +134,18 @@ typedef struct history_t { ...@@ -122,16 +134,18 @@ typedef struct history_t {
#define H_UNIQUE 1 /* Store only unique elements */ #define H_UNIQUE 1 /* Store only unique elements */
} history_t; } history_t;
private int history_def_first(ptr_t, HistEvent *);
private int history_def_last(ptr_t, HistEvent *);
private int history_def_next(ptr_t, HistEvent *); private int history_def_next(ptr_t, HistEvent *);
private int history_def_first(ptr_t, HistEvent *);
private int history_def_prev(ptr_t, HistEvent *); private int history_def_prev(ptr_t, HistEvent *);
private int history_def_last(ptr_t, HistEvent *);
private int history_def_curr(ptr_t, HistEvent *); 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);
private void history_def_clear(ptr_t, HistEvent *);
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 int history_def_del(ptr_t, HistEvent *, const int);
private int history_def_init(ptr_t *, HistEvent *, int); private int history_def_init(ptr_t *, HistEvent *, int);
private void history_def_clear(ptr_t, HistEvent *);
private int history_def_insert(history_t *, HistEvent *, const char *); private 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 *);
...@@ -353,6 +367,24 @@ history_def_add(ptr_t p, HistEvent *ev, const char *str) ...@@ -353,6 +367,24 @@ history_def_add(ptr_t p, HistEvent *ev, const char *str)
} }
/* history_def_del():
* Delete element hp of the h list
*/
/* ARGSUSED */
private int
history_def_del(ptr_t p, HistEvent *ev __attribute__((__unused__)),
const int num)
{
history_t *h = (history_t *) p;
if (history_def_set(h, ev, num) != 0)
return (-1);
ev->str = strdup(h->cursor->ev.str);
ev->num = h->cursor->ev.num;
history_def_delete(h, ev, h->cursor);
return (0);
}
/* history_def_delete(): /* history_def_delete():
* Delete element hp of the h list * Delete element hp of the h list
*/ */
...@@ -364,6 +396,8 @@ history_def_delete(history_t *h, ...@@ -364,6 +396,8 @@ history_def_delete(history_t *h,
HistEventPrivate *evp = (void *)&hp->ev; HistEventPrivate *evp = (void *)&hp->ev;
if (hp == &h->list) if (hp == &h->list)
abort(); abort();
if (h->cursor == hp)
h->cursor = hp->prev;
hp->prev->next = hp->next; hp->prev->next = hp->next;
hp->next->prev = hp->prev; hp->next->prev = hp->prev;
h_free((ptr_t) evp->str); h_free((ptr_t) evp->str);
...@@ -497,6 +531,7 @@ history_init(void) ...@@ -497,6 +531,7 @@ history_init(void)
h->h_clear = history_def_clear; h->h_clear = history_def_clear;
h->h_enter = history_def_enter; h->h_enter = history_def_enter;
h->h_add = history_def_add; h->h_add = history_def_add;
h->h_del = history_def_del;
return (h); return (h);
} }
...@@ -512,6 +547,8 @@ history_end(History *h) ...@@ -512,6 +547,8 @@ history_end(History *h)
if (h->h_next == history_def_next) if (h->h_next == history_def_next)
history_def_clear(h->h_ref, &ev); history_def_clear(h->h_ref, &ev);
h_free(h->h_ref);
h_free(h);
} }
...@@ -597,7 +634,7 @@ history_set_fun(History *h, History *nh) ...@@ -597,7 +634,7 @@ history_set_fun(History *h, History *nh)
if (nh->h_first == NULL || nh->h_next == NULL || nh->h_last == NULL || if (nh->h_first == NULL || nh->h_next == NULL || nh->h_last == NULL ||
nh->h_prev == NULL || nh->h_curr == NULL || nh->h_set == NULL || nh->h_prev == NULL || nh->h_curr == NULL || nh->h_set == NULL ||
nh->h_enter == NULL || nh->h_add == NULL || nh->h_clear == NULL || nh->h_enter == NULL || nh->h_add == NULL || nh->h_clear == NULL ||
nh->h_ref == NULL) { nh->h_del == NULL || nh->h_ref == NULL) {
if (h->h_next != history_def_next) { if (h->h_next != history_def_next) {
history_def_init(&h->h_ref, &ev, 0); history_def_init(&h->h_ref, &ev, 0);
h->h_first = history_def_first; h->h_first = history_def_first;
...@@ -609,6 +646,7 @@ history_set_fun(History *h, History *nh) ...@@ -609,6 +646,7 @@ history_set_fun(History *h, History *nh)
h->h_clear = history_def_clear; h->h_clear = history_def_clear;
h->h_enter = history_def_enter; h->h_enter = history_def_enter;
h->h_add = history_def_add; h->h_add = history_def_add;
h->h_del = history_def_del;
} }
return (-1); return (-1);
} }
...@@ -625,6 +663,7 @@ history_set_fun(History *h, History *nh) ...@@ -625,6 +663,7 @@ history_set_fun(History *h, History *nh)
h->h_clear = nh->h_clear; h->h_clear = nh->h_clear;
h->h_enter = nh->h_enter; h->h_enter = nh->h_enter;
h->h_add = nh->h_add; h->h_add = nh->h_add;
h->h_del = nh->h_del;
return (0); return (0);
} }
...@@ -676,8 +715,8 @@ history_load(History *h, const char *fname) ...@@ -676,8 +715,8 @@ history_load(History *h, const char *fname)
(void) strunvis(ptr, line); (void) strunvis(ptr, line);
line[sz] = c; line[sz] = c;
if (HENTER(h, &ev, ptr) == -1) { if (HENTER(h, &ev, ptr) == -1) {
i = -1; i = -1;
goto oomem; goto oomem;
} }
} }
oomem: oomem:
...@@ -841,6 +880,10 @@ history(History *h, HistEvent *ev, int fun, ...) ...@@ -841,6 +880,10 @@ history(History *h, HistEvent *ev, int fun, ...)
retval = HADD(h, ev, str); retval = HADD(h, ev, str);
break; break;
case H_DEL:
retval = HDEL(h, ev, va_arg(va, const int));
break;
case H_ENTER: case H_ENTER:
str = va_arg(va, const char *); str = va_arg(va, const char *);
if ((retval = HENTER(h, ev, str)) != -1) if ((retval = HENTER(h, ev, str)) != -1)
...@@ -925,6 +968,7 @@ history(History *h, HistEvent *ev, int fun, ...) ...@@ -925,6 +968,7 @@ history(History *h, HistEvent *ev, int fun, ...)
hf.h_clear = va_arg(va, history_vfun_t); hf.h_clear = va_arg(va, history_vfun_t);
hf.h_enter = va_arg(va, history_efun_t); hf.h_enter = va_arg(va, history_efun_t);
hf.h_add = va_arg(va, history_efun_t); hf.h_add = va_arg(va, history_efun_t);
hf.h_del = va_arg(va, history_sfun_t);
if ((retval = history_set_fun(h, &hf)) == -1) if ((retval = history_set_fun(h, &hf)) == -1)
he_seterrev(ev, _HE_PARAM_MISSING); he_seterrev(ev, _HE_PARAM_MISSING);
......
/* $NetBSD: key.c,v 1.15 2003/10/18 23:48:42 christos Exp $ */ /* $NetBSD: key.c,v 1.19 2006/03/23 20:22:51 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -32,14 +32,20 @@ ...@@ -32,14 +32,20 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include <config.h> #include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)key.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif /* not lint && not SCCSID */
/* /*
* key.c: This module contains the procedures for maintaining * key.c: This module contains the procedures for maintaining
* the extended-key map. * the extended-key map.
* *
* An extended-key (key) is a sequence of keystrokes introduced * An extended-key (key) is a sequence of keystrokes introduced
* with an sequence introducer and consisting of an arbitrary * with a sequence introducer and consisting of an arbitrary
* number of characters. This module maintains a map (the el->el_key.map) * number of characters. This module maintains a map (the el->el_key.map)
* to convert these extended-key sequences into input strs * to convert these extended-key sequences into input strs
* (XK_STR), editor functions (XK_CMD), or unix commands (XK_EXE). * (XK_STR), editor functions (XK_CMD), or unix commands (XK_EXE).
...@@ -78,12 +84,12 @@ private int node_trav(EditLine *, key_node_t *, char *, ...@@ -78,12 +84,12 @@ private int node_trav(EditLine *, key_node_t *, char *,
private int node__try(EditLine *, key_node_t *, const char *, private int node__try(EditLine *, key_node_t *, const char *,
key_value_t *, int); key_value_t *, int);
private key_node_t *node__get(int); private key_node_t *node__get(int);
private void node__free(key_node_t *);
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 *, key_node_t *, private int node_lookup(EditLine *, const char *, 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);
#define KEY_BUFSIZ EL_BUFSIZ #define KEY_BUFSIZ EL_BUFSIZ
...@@ -103,7 +109,6 @@ key_init(EditLine *el) ...@@ -103,7 +109,6 @@ key_init(EditLine *el)
return (0); return (0);
} }
/* key_end(): /* key_end():
* Free the key maps * Free the key maps
*/ */
...@@ -113,8 +118,7 @@ key_end(EditLine *el) ...@@ -113,8 +118,7 @@ key_end(EditLine *el)
el_free((ptr_t) el->el_key.buf); el_free((ptr_t) el->el_key.buf);
el->el_key.buf = NULL; el->el_key.buf = NULL;
/* XXX: provide a function to clear the keys */ node__free(el->el_key.map);
el->el_key.map = NULL;
} }
...@@ -443,7 +447,7 @@ node__put(EditLine *el, key_node_t *ptr) ...@@ -443,7 +447,7 @@ node__put(EditLine *el, key_node_t *ptr)
/* node__get(): /* node__get():
* Returns pointer to an key_node_t for ch. * Returns pointer to a key_node_t for ch.
*/ */
private key_node_t * private key_node_t *
node__get(int ch) node__get(int ch)
...@@ -461,7 +465,15 @@ node__get(int ch) ...@@ -461,7 +465,15 @@ node__get(int ch)
return (ptr); return (ptr);
} }
private void
node__free(key_node_t *k)
{
if (k == NULL)
return;
node__free(k->sibling);
node__free(k->next);
el_free((ptr_t) k);
}
/* node_lookup(): /* node_lookup():
* look for the str starting at node ptr. * look for the str starting at node ptr.
...@@ -483,7 +495,7 @@ node_lookup(EditLine *el, const char *str, key_node_t *ptr, int cnt) ...@@ -483,7 +495,7 @@ node_lookup(EditLine *el, const char *str, key_node_t *ptr, int cnt)
/* If match put this char into el->el_key.buf. Recurse */ /* If match put this char into el->el_key.buf. Recurse */
if (ptr->ch == *str) { if (ptr->ch == *str) {
/* match found */ /* match found */
ncnt = key__decode_char(el->el_key.buf, cnt, ncnt = key__decode_char(el->el_key.buf, KEY_BUFSIZ, cnt,
(unsigned char) ptr->ch); (unsigned char) ptr->ch);
if (ptr->next != NULL) if (ptr->next != NULL)
/* not yet at leaf */ /* not yet at leaf */
...@@ -537,7 +549,8 @@ node_enum(EditLine *el, key_node_t *ptr, int cnt) ...@@ -537,7 +549,8 @@ node_enum(EditLine *el, key_node_t *ptr, int cnt)
return (-1); return (-1);
} }
/* put this char at end of str */ /* put this char at end of str */
ncnt = key__decode_char(el->el_key.buf, cnt, (unsigned char) ptr->ch); ncnt = key__decode_char(el->el_key.buf, KEY_BUFSIZ, cnt,
(unsigned char)ptr->ch);
if (ptr->next == NULL) { if (ptr->next == NULL) {
/* print this key and function */ /* print this key and function */
el->el_key.buf[ncnt + 1] = '"'; el->el_key.buf[ncnt + 1] = '"';
...@@ -568,9 +581,10 @@ key_kprint(EditLine *el, const char *key, key_value_t *val, int ntype) ...@@ -568,9 +581,10 @@ key_kprint(EditLine *el, const char *key, key_value_t *val, int ntype)
switch (ntype) { switch (ntype) {
case XK_STR: case XK_STR:
case XK_EXE: case XK_EXE:
(void) fprintf(el->el_outfile, fmt, key, (void) key__decode_str(val->str, unparsbuf,
key__decode_str(val->str, unparsbuf, sizeof(unparsbuf),
ntype == XK_STR ? "\"\"" : "[]")); ntype == XK_STR ? "\"\"" : "[]");
(void) fprintf(el->el_outfile, fmt, key, unparsbuf);
break; break;
case XK_CMD: case XK_CMD:
for (fp = el->el_map.help; fp->name; fp++) for (fp = el->el_map.help; fp->name; fp++)
...@@ -595,83 +609,97 @@ key_kprint(EditLine *el, const char *key, key_value_t *val, int ntype) ...@@ -595,83 +609,97 @@ key_kprint(EditLine *el, const char *key, key_value_t *val, int ntype)
} }
#define ADDC(c) \
if (b < eb) \
*b++ = c; \
else \
b++
/* key__decode_char(): /* key__decode_char():
* Put a printable form of char in buf. * Put a printable form of char in buf.
*/ */
private int protected int
key__decode_char(char *buf, int cnt, int ch) key__decode_char(char *buf, int cnt, int off, int ch)
{ {
char *sb = buf + off;
char *eb = buf + cnt;
char *b = sb;
if (ch == 0) { if (ch == 0) {
buf[cnt++] = '^'; ADDC('^');
buf[cnt] = '@'; ADDC('@');
return (cnt); return b - sb;
} }
if (iscntrl(ch)) { if (iscntrl(ch)) {
buf[cnt++] = '^'; ADDC('^');
if (ch == '\177') if (ch == '\177')
buf[cnt] = '?'; ADDC('?');
else else
buf[cnt] = ch | 0100; ADDC(ch | 0100);
} else if (ch == '^') { } else if (ch == '^') {
buf[cnt++] = '\\'; ADDC('\\');
buf[cnt] = '^'; ADDC('^');
} else if (ch == '\\') { } else if (ch == '\\') {
buf[cnt++] = '\\'; ADDC('\\');
buf[cnt] = '\\'; ADDC('\\');
} else if (ch == ' ' || (el_isprint(ch) && !isspace(ch))) { } else if (ch == ' ' || (el_isprint(ch) && !isspace(ch))) {
buf[cnt] = ch; ADDC(ch);
} else { } else {
buf[cnt++] = '\\'; ADDC('\\');
buf[cnt++] = (((unsigned int) ch >> 6) & 7) + '0'; ADDC((((unsigned int) ch >> 6) & 7) + '0');
buf[cnt++] = (((unsigned int) ch >> 3) & 7) + '0'; ADDC((((unsigned int) ch >> 3) & 7) + '0');
buf[cnt] = (ch & 7) + '0'; ADDC((ch & 7) + '0');
} }
return (cnt); return b - sb;
} }
/* key__decode_str(): /* key__decode_str():
* Make a printable version of the ey * Make a printable version of the ey
*/ */
protected char * protected int
key__decode_str(const char *str, char *buf, const char *sep) key__decode_str(const char *str, char *buf, int len, const char *sep)
{ {
char *b; char *b = buf, *eb = b + len;
const char *p; const char *p;
b = buf; b = buf;
if (sep[0] != '\0') if (sep[0] != '\0') {
*b++ = sep[0]; ADDC(sep[0]);
if (*str == 0) { }
*b++ = '^'; if (*str == '\0') {
*b++ = '@'; ADDC('^');
if (sep[0] != '\0' && sep[1] != '\0') ADDC('@');
*b++ = sep[1]; if (sep[0] != '\0' && sep[1] != '\0') {
*b++ = 0; ADDC(sep[1]);
return (buf); }
goto done;
} }
for (p = str; *p != 0; p++) { for (p = str; *p != 0; p++) {
if (iscntrl((unsigned char) *p)) { if (iscntrl((unsigned char) *p)) {
*b++ = '^'; ADDC('^');
if (*p == '\177') if (*p == '\177') {
*b++ = '?'; ADDC('?');
else } else {
*b++ = *p | 0100; ADDC(*p | 0100);
}
} else if (*p == '^' || *p == '\\') { } else if (*p == '^' || *p == '\\') {
*b++ = '\\'; ADDC('\\');
*b++ = *p; ADDC(*p);
} else if (*p == ' ' || (el_isprint((unsigned char) *p) && } else if (*p == ' ' || (el_isprint((unsigned char) *p) &&
!isspace((unsigned char) *p))) { !isspace((unsigned char) *p))) {
*b++ = *p; ADDC(*p);
} else { } else {
*b++ = '\\'; ADDC('\\');
*b++ = (((unsigned int) *p >> 6) & 7) + '0'; ADDC((((unsigned int) *p >> 6) & 7) + '0');
*b++ = (((unsigned int) *p >> 3) & 7) + '0'; ADDC((((unsigned int) *p >> 3) & 7) + '0');
*b++ = (*p & 7) + '0'; ADDC((*p & 7) + '0');
} }
} }
if (sep[0] != '\0' && sep[1] != '\0') if (sep[0] != '\0' && sep[1] != '\0') {
*b++ = sep[1]; ADDC(sep[1]);
*b++ = 0; }
return (buf); /* should check for overflow */ done:
ADDC('\0');
if (b - buf >= len)
buf[len - 1] = '\0';
return b - buf;
} }
/* $NetBSD: key.h,v 1.8 2003/08/07 16:44:32 agc Exp $ */ /* $NetBSD: key.h,v 1.10 2006/03/23 20:22:51 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -74,6 +74,8 @@ protected int key_delete(EditLine *, const char *); ...@@ -74,6 +74,8 @@ 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 *, key_value_t *, protected void key_kprint(EditLine *, const char *, key_value_t *,
int); int);
protected char *key__decode_str(const char *, char *, const char *); protected int key__decode_str(const char *, char *, int,
const char *);
protected int key__decode_char(char *, int, int, int);
#endif /* _h_el_key */ #endif /* _h_el_key */
#!/bin/sh - #!/bin/sh -
# $NetBSD: makelist,v 1.8 2003/03/10 21:21:10 christos Exp $ # $NetBSD: makelist,v 1.11 2005/10/22 16:45:03 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.
...@@ -15,11 +15,7 @@ ...@@ -15,11 +15,7 @@
# 2. Redistributions in binary form must reproduce the above copyright # 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the # notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution. # documentation and/or other materials provided with the distribution.
# 3. All advertising materials mentioning features or use of this software # 3. Neither the name of the University nor the names of its contributors
# 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 # may be used to endorse or promote products derived from this software
# without specific prior written permission. # without specific prior written permission.
# #
...@@ -68,6 +64,7 @@ case $FLAG in ...@@ -68,6 +64,7 @@ case $FLAG in
/\(\):/ { /\(\):/ {
pr = substr($2, 1, 2); pr = substr($2, 1, 2);
if (pr == "vi" || pr == "em" || pr == "ed") { if (pr == "vi" || pr == "em" || pr == "ed") {
# XXXMYSQL: support CRLF
name = substr($2, 1, index($2,"(") - 1); name = substr($2, 1, index($2,"(") - 1);
# #
# XXX: need a space between name and prototype so that -fc and -fh # XXX: need a space between name and prototype so that -fc and -fh
...@@ -97,6 +94,7 @@ case $FLAG in ...@@ -97,6 +94,7 @@ case $FLAG in
/\(\):/ { /\(\):/ {
pr = substr($2, 1, 2); pr = substr($2, 1, 2);
if (pr == "vi" || pr == "em" || pr == "ed") { if (pr == "vi" || pr == "em" || pr == "ed") {
# XXXMYSQL: support CRLF
name = substr($2, 1, index($2,"(") - 1); name = substr($2, 1, index($2,"(") - 1);
uname = ""; uname = "";
fname = ""; fname = "";
...@@ -117,13 +115,13 @@ case $FLAG in ...@@ -117,13 +115,13 @@ case $FLAG in
printf(" \""); printf(" \"");
for (i = 2; i < NF; i++) for (i = 2; i < NF; i++)
printf("%s ", $i); printf("%s ", $i);
sub("\r", "", $i); # XXXMYSQL: support CRLF
sub("\r", "", $i);
printf("%s\" },\n", $i); printf("%s\" },\n", $i);
ok = 0; ok = 0;
} }
} }
END { END {
printf(" { NULL, 0, NULL }\n");
printf("};\n"); printf("};\n");
printf("\nprotected const el_bindings_t* help__get()"); printf("\nprotected const el_bindings_t* help__get()");
printf("{ return el_func_help; }\n"); printf("{ return el_func_help; }\n");
...@@ -144,6 +142,7 @@ case $FLAG in ...@@ -144,6 +142,7 @@ case $FLAG in
# generate fcns.h from various .h files # generate fcns.h from various .h files
# #
# XXXMYSQL: use portable tr syntax
-fh) -fh)
cat $FILES | $AWK '/el_action_t/ { print $3 }' | \ cat $FILES | $AWK '/el_action_t/ { print $3 }' | \
sort | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | $AWK ' sort | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | $AWK '
...@@ -220,6 +219,7 @@ case $FLAG in ...@@ -220,6 +219,7 @@ case $FLAG in
/\(\):/ { /\(\):/ {
pr = substr($2, 1, 2); pr = substr($2, 1, 2);
if (pr == "vi" || pr == "em" || pr == "ed") { if (pr == "vi" || pr == "em" || pr == "ed") {
# XXXMYSQL: support CRLF
name = substr($2, 1, index($2, "(") - 1); name = substr($2, 1, index($2, "(") - 1);
fname = ""; fname = "";
for (i = 1; i <= length(name); i++) { for (i = 1; i <= length(name); i++) {
......
/* $NetBSD: map.c,v 1.20 2004/08/13 12:10:39 mycroft Exp $ */ /* $NetBSD: map.c,v 1.24 2006/04/09 01:36:51 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -32,7 +32,13 @@ ...@@ -32,7 +32,13 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include <config.h> #include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)map.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif /* not lint && not SCCSID */
/* /*
* map.c: Editor function definitions * map.c: Editor function definitions
...@@ -1118,11 +1124,12 @@ private void ...@@ -1118,11 +1124,12 @@ private void
map_print_key(EditLine *el, el_action_t *map, const char *in) map_print_key(EditLine *el, el_action_t *map, const char *in)
{ {
char outbuf[EL_BUFSIZ]; char outbuf[EL_BUFSIZ];
el_bindings_t *bp; el_bindings_t *bp, *ep;
if (in[0] == '\0' || in[1] == '\0') { if (in[0] == '\0' || in[1] == '\0') {
(void) key__decode_str(in, outbuf, ""); (void) key__decode_str(in, outbuf, sizeof(outbuf), "");
for (bp = el->el_map.help; bp->name != NULL; bp++) ep = &el->el_map.help[el->el_map.nfunc];
for (bp = el->el_map.help; bp < ep; bp++)
if (bp->func == map[(unsigned char) *in]) { if (bp->func == map[(unsigned char) *in]) {
(void) fprintf(el->el_outfile, (void) fprintf(el->el_outfile,
"%s\t->\t%s\n", outbuf, bp->name); "%s\t->\t%s\n", outbuf, bp->name);
...@@ -1139,7 +1146,7 @@ map_print_key(EditLine *el, el_action_t *map, const char *in) ...@@ -1139,7 +1146,7 @@ map_print_key(EditLine *el, el_action_t *map, const char *in)
private void private void
map_print_some_keys(EditLine *el, el_action_t *map, int first, int last) map_print_some_keys(EditLine *el, el_action_t *map, int first, int last)
{ {
el_bindings_t *bp; el_bindings_t *bp, *ep;
char firstbuf[2], lastbuf[2]; char firstbuf[2], lastbuf[2];
char unparsbuf[EL_BUFSIZ], extrabuf[EL_BUFSIZ]; char unparsbuf[EL_BUFSIZ], extrabuf[EL_BUFSIZ];
...@@ -1148,39 +1155,47 @@ map_print_some_keys(EditLine *el, el_action_t *map, int first, int last) ...@@ -1148,39 +1155,47 @@ map_print_some_keys(EditLine *el, el_action_t *map, int first, int last)
lastbuf[0] = last; lastbuf[0] = last;
lastbuf[1] = 0; lastbuf[1] = 0;
if (map[first] == ED_UNASSIGNED) { if (map[first] == ED_UNASSIGNED) {
if (first == last) if (first == last) {
(void) key__decode_str(firstbuf, unparsbuf,
sizeof(unparsbuf), STRQQ);
(void) fprintf(el->el_outfile, (void) fprintf(el->el_outfile,
"%-15s-> is undefined\n", "%-15s-> is undefined\n", unparsbuf);
key__decode_str(firstbuf, unparsbuf, STRQQ)); }
return; return;
} }
for (bp = el->el_map.help; bp->name != NULL; bp++) { ep = &el->el_map.help[el->el_map.nfunc];
for (bp = el->el_map.help; bp < ep; bp++) {
if (bp->func == map[first]) { if (bp->func == map[first]) {
if (first == last) { if (first == last) {
(void) key__decode_str(firstbuf, unparsbuf,
sizeof(unparsbuf), STRQQ);
(void) fprintf(el->el_outfile, "%-15s-> %s\n", (void) fprintf(el->el_outfile, "%-15s-> %s\n",
key__decode_str(firstbuf, unparsbuf, STRQQ), unparsbuf, bp->name);
bp->name);
} else { } else {
(void) key__decode_str(firstbuf, unparsbuf,
sizeof(unparsbuf), STRQQ);
(void) key__decode_str(lastbuf, extrabuf,
sizeof(extrabuf), STRQQ);
(void) fprintf(el->el_outfile, (void) fprintf(el->el_outfile,
"%-4s to %-7s-> %s\n", "%-4s to %-7s-> %s\n",
key__decode_str(firstbuf, unparsbuf, STRQQ), unparsbuf, extrabuf, bp->name);
key__decode_str(lastbuf, extrabuf, STRQQ),
bp->name);
} }
return; return;
} }
} }
#ifdef MAP_DEBUG #ifdef MAP_DEBUG
if (map == el->el_map.key) { if (map == el->el_map.key) {
(void) key__decode_str(firstbuf, unparsbuf,
sizeof(unparsbuf), STRQQ);
(void) fprintf(el->el_outfile, (void) fprintf(el->el_outfile,
"BUG!!! %s isn't bound to anything.\n", "BUG!!! %s isn't bound to anything.\n", unparsbuf);
key__decode_str(firstbuf, unparsbuf, STRQQ));
(void) fprintf(el->el_outfile, "el->el_map.key[%d] == %d\n", (void) fprintf(el->el_outfile, "el->el_map.key[%d] == %d\n",
first, el->el_map.key[first]); first, el->el_map.key[first]);
} else { } else {
(void) key__decode_str(firstbuf, unparsbuf,
sizeof(unparsbuf), STRQQ);
(void) fprintf(el->el_outfile, (void) fprintf(el->el_outfile,
"BUG!!! %s isn't bound to anything.\n", "BUG!!! %s isn't bound to anything.\n", unparsbuf);
key__decode_str(firstbuf, unparsbuf, STRQQ));
(void) fprintf(el->el_outfile, "el->el_map.alt[%d] == %d\n", (void) fprintf(el->el_outfile, "el->el_map.alt[%d] == %d\n",
first, el->el_map.alt[first]); first, el->el_map.alt[first]);
} }
...@@ -1237,7 +1252,7 @@ map_bind(EditLine *el, int argc, const char **argv) ...@@ -1237,7 +1252,7 @@ map_bind(EditLine *el, int argc, const char **argv)
char outbuf[EL_BUFSIZ]; char outbuf[EL_BUFSIZ];
const char *in = NULL; const char *in = NULL;
char *out = NULL; char *out = NULL;
el_bindings_t *bp; el_bindings_t *bp, *ep;
int cmd; int cmd;
int key; int key;
...@@ -1279,8 +1294,8 @@ map_bind(EditLine *el, int argc, const char **argv) ...@@ -1279,8 +1294,8 @@ map_bind(EditLine *el, int argc, const char **argv)
return (0); return (0);
case 'l': case 'l':
for (bp = el->el_map.help; bp->name != NULL; ep = &el->el_map.help[el->el_map.nfunc];
bp++) for (bp = el->el_map.help; bp < ep; bp++)
(void) fprintf(el->el_outfile, (void) fprintf(el->el_outfile,
"%s\n\t%s\n", "%s\n\t%s\n",
bp->name, bp->description); bp->name, bp->description);
...@@ -1367,7 +1382,7 @@ map_bind(EditLine *el, int argc, const char **argv) ...@@ -1367,7 +1382,7 @@ map_bind(EditLine *el, int argc, const char **argv)
break; break;
default: default:
EL_ABORT((el->el_errfile, "Bad XK_ type\n", ntype)); EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype));
break; break;
} }
return (0); return (0);
...@@ -1381,7 +1396,7 @@ protected int ...@@ -1381,7 +1396,7 @@ protected int
map_addfunc(EditLine *el, const char *name, const char *help, el_func_t func) map_addfunc(EditLine *el, const char *name, const char *help, el_func_t func)
{ {
void *p; void *p;
int nf = el->el_map.nfunc + 2; int nf = el->el_map.nfunc + 1;
if (name == NULL || help == NULL || func == NULL) if (name == NULL || help == NULL || func == NULL)
return (-1); return (-1);
...@@ -1400,7 +1415,6 @@ map_addfunc(EditLine *el, const char *name, const char *help, el_func_t func) ...@@ -1400,7 +1415,6 @@ map_addfunc(EditLine *el, const char *name, const char *help, el_func_t func)
el->el_map.help[nf].name = name; el->el_map.help[nf].name = name;
el->el_map.help[nf].func = nf; el->el_map.help[nf].func = nf;
el->el_map.help[nf].description = help; el->el_map.help[nf].description = help;
el->el_map.help[++nf].name = NULL;
el->el_map.nfunc++; el->el_map.nfunc++;
return (0); return (0);
......
/* $NetBSD: fgetln.c,v 1.1.1.1 1999/04/12 07:43:21 crooksa Exp $ */ /* $NetBSD: fgetln.c,v 1.9 2008/04/29 06:53:03 martin Exp $ */
/*- /*-
* Copyright (c) 1998 The NetBSD Foundation, Inc. * Copyright (c) 1998 The NetBSD Foundation, Inc.
...@@ -15,13 +15,6 @@ ...@@ -15,13 +15,6 @@
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * 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 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
...@@ -36,17 +29,24 @@ ...@@ -36,17 +29,24 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifdef HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#else
#include "config.h" #include "config.h"
#include <stdio.h> #endif
#if !HAVE_FGETLN
#include <stdlib.h> #include <stdlib.h>
#ifndef HAVE_NBTOOL_CONFIG_H
/* These headers are required, but included from nbtool_config.h */
#include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>
#endif
char * char *
fgetln(fp, len) fgetln(FILE *fp, size_t *len)
FILE *fp;
size_t *len;
{ {
static char *buf = NULL; static char *buf = NULL;
static size_t bufsiz = 0; static size_t bufsiz = 0;
...@@ -61,8 +61,8 @@ fgetln(fp, len) ...@@ -61,8 +61,8 @@ fgetln(fp, len)
if (fgets(buf, bufsiz, fp) == NULL) if (fgets(buf, bufsiz, fp) == NULL)
return NULL; return NULL;
*len = 0;
*len = 0;
while ((ptr = strchr(&buf[*len], '\n')) == NULL) { while ((ptr = strchr(&buf[*len], '\n')) == NULL) {
size_t nbufsiz = bufsiz + BUFSIZ; size_t nbufsiz = bufsiz + BUFSIZ;
char *nbuf = realloc(buf, nbufsiz); char *nbuf = realloc(buf, nbufsiz);
...@@ -76,13 +76,33 @@ fgetln(fp, len) ...@@ -76,13 +76,33 @@ fgetln(fp, len)
} else } else
buf = nbuf; buf = nbuf;
*len = bufsiz; if (fgets(&buf[bufsiz], BUFSIZ, fp) == NULL) {
if (fgets(&buf[bufsiz], BUFSIZ, fp) == NULL) buf[bufsiz] = '\0';
*len = strlen(buf);
return buf; return buf;
}
*len = bufsiz;
bufsiz = nbufsiz; bufsiz = nbufsiz;
} }
*len = (ptr - buf) + 1; *len = (ptr - buf) + 1;
return buf; return buf;
} }
#endif
#ifdef TEST
int
main(int argc, char *argv[])
{
char *p;
size_t len;
while ((p = fgetln(stdin, &len)) != NULL) {
(void)printf("%zu %s", len, p);
free(p);
}
return 0;
}
#endif
/* $NetBSD: strlcat.c,v 1.3 2007/06/04 18:19:27 christos Exp $ */
/* $OpenBSD: strlcat.c,v 1.10 2003/04/12 21:56:39 millert Exp $ */
/* /*
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Permission to use, copy, modify, and distribute this software for any
* modification, are permitted provided that the following conditions * purpose with or without fee is hereby granted, provided that the above
* are met: * copyright notice and this permission notice appear in all copies.
* 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, * THE SOFTWARE IS PROVIDED "AS IS" AND TODD C. MILLER DISCLAIMS ALL
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL TODD C. MILLER BE LIABLE
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
* 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(_KERNEL) && !defined(_STANDALONE)
#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#else
#include "config.h" #include "config.h"
#endif
#if defined(LIBC_SCCS) && !defined(lint) #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 */ #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
#ifdef _LIBC
#include "namespace.h"
#endif
#include <sys/types.h> #include <sys/types.h>
#include <assert.h>
#include <string.h> #include <string.h>
#ifdef _LIBC
# ifdef __weak_alias
__weak_alias(strlcat, _strlcat)
# endif
#endif
#else
#include <lib/libkern/libkern.h>
#endif /* !_KERNEL && !_STANDALONE */
#if !HAVE_STRLCAT
/* /*
* Appends src to string dst of size siz (unlike strncat, siz is the * 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 * full size of dst, not space left). At most siz-1 characters
* will be copied. Always NUL terminates (unless siz <= strlen(dst)). * will be copied. Always NUL terminates (unless siz <= strlen(dst)).
* Returns strlen(initial dst) + strlen(src); if retval >= siz, * Returns strlen(src) + MIN(siz, strlen(initial dst)).
* truncation occurred. * If retval >= siz, truncation occurred.
*/ */
size_t strlcat(dst, src, siz) size_t
char *dst; strlcat(char *dst, const char *src, size_t siz)
const char *src;
size_t siz;
{ {
register char *d = dst; char *d = dst;
register const char *s = src; const char *s = src;
register size_t n = siz; size_t n = siz;
size_t dlen; size_t dlen;
_DIAGASSERT(dst != NULL);
_DIAGASSERT(src != NULL);
/* Find the end of dst and adjust bytes left but don't go past end */ /* Find the end of dst and adjust bytes left but don't go past end */
while (n-- != 0 && *d != '\0') while (n-- != 0 && *d != '\0')
d++; d++;
...@@ -73,3 +82,4 @@ size_t strlcat(dst, src, siz) ...@@ -73,3 +82,4 @@ size_t strlcat(dst, src, siz)
return(dlen + (s - src)); /* count does not include NUL */ return(dlen + (s - src)); /* count does not include NUL */
} }
#endif
/* $OpenBSD: strlcpy.c,v 1.4 1999/05/01 18:56:41 millert Exp $ */ /* $NetBSD: strlcpy.c,v 1.3 2007/06/04 18:19:27 christos Exp $ */
/* $OpenBSD: strlcpy.c,v 1.7 2003/04/12 21:56:39 millert Exp $ */
/* /*
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Permission to use, copy, modify, and distribute this software for any
* modification, are permitted provided that the following conditions * purpose with or without fee is hereby granted, provided that the above
* are met: * copyright notice and this permission notice appear in all copies.
* 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, * THE SOFTWARE IS PROVIDED "AS IS" AND TODD C. MILLER DISCLAIMS ALL
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL TODD C. MILLER BE LIABLE
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
* 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(_KERNEL) && !defined(_STANDALONE)
#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#else
#include "config.h" #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
#if defined(LIBC_SCCS) && !defined(lint)
#endif /* LIBC_SCCS and not lint */ #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
#ifdef _LIBC
#include "namespace.h"
#endif
#include <sys/types.h> #include <sys/types.h>
#include <assert.h>
#include <string.h> #include <string.h>
#ifdef _LIBC
# ifdef __weak_alias
__weak_alias(strlcpy, _strlcpy)
# endif
#endif
#else
#include <lib/libkern/libkern.h>
#endif /* !_KERNEL && !_STANDALONE */
#if !HAVE_STRLCPY
/* /*
* Copy src to string dst of size siz. At most siz-1 characters * Copy src to string dst of size siz. At most siz-1 characters
* will be copied. Always NUL terminates (unless siz == 0). * will be copied. Always NUL terminates (unless siz == 0).
* Returns strlen(src); if retval >= siz, truncation occurred. * Returns strlen(src); if retval >= siz, truncation occurred.
*/ */
size_t strlcpy(dst, src, siz) size_t
char *dst; strlcpy(char *dst, const char *src, size_t siz)
const char *src;
size_t siz;
{ {
register char *d = dst; char *d = dst;
register const char *s = src; const char *s = src;
register size_t n = siz; size_t n = siz;
_DIAGASSERT(dst != NULL);
_DIAGASSERT(src != NULL);
/* Copy as many bytes as will fit */ /* Copy as many bytes as will fit */
if (n != 0 && --n != 0) { if (n != 0 && --n != 0) {
...@@ -73,3 +77,4 @@ size_t strlcpy(dst, src, siz) ...@@ -73,3 +77,4 @@ size_t strlcpy(dst, src, siz)
return(s - src - 1); /* count does not include NUL */ return(s - src - 1); /* count does not include NUL */
} }
#endif
/* $NetBSD: unvis.c,v 1.22 2002/03/23 17:38:27 christos Exp $ */ /* $NetBSD: unvis.c,v 1.28 2005/09/13 01:44:09 christos Exp $ */
/*- /*-
* Copyright (c) 1989, 1993 * Copyright (c) 1989, 1993
...@@ -12,11 +12,7 @@ ...@@ -12,11 +12,7 @@
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software * 3. Neither the name of the University nor the names of its contributors
* 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 * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -34,34 +30,30 @@ ...@@ -34,34 +30,30 @@
*/ */
#include "config.h" #include "config.h"
#if defined(LIBC_SCCS) && !defined(lint) #if defined(LIBC_SCCS) && !defined(lint)
#if 0 #if 0
static char sccsid[] = "@(#)unvis.c 8.1 (Berkeley) 6/4/93"; static char sccsid[] = "@(#)unvis.c 8.1 (Berkeley) 6/4/93";
#else #else
__RCSID("$NetBSD: unvis.c,v 1.22 2002/03/23 17:38:27 christos Exp $");
#endif #endif
#endif /* LIBC_SCCS and not lint */ #endif /* LIBC_SCCS and not lint */
#define __LIBC12_SOURCE__
#include <sys/types.h> #include <sys/types.h>
#include <assert.h> #include <assert.h>
#include <ctype.h> #include <ctype.h>
#include <stdio.h> #include <stdio.h>
#ifdef HAVE_VIS_H
#include <vis.h>
#else
#include "np/vis.h" #include "np/vis.h"
#endif
#ifdef __weak_alias #ifdef __weak_alias
__weak_alias(strunvis,_strunvis) __weak_alias(strunvis,_strunvis)
__weak_alias(unvis,_unvis)
#endif #endif
#ifdef __warn_references #if !HAVE_VIS
__warn_references(unvis,
"warning: reference to compatibility unvis(); include <vis.h> for correct reference")
#endif
#if !HAVE_VIS_H
/* /*
* decode driven by state machine * decode driven by state machine
*/ */
...@@ -72,30 +64,22 @@ __warn_references(unvis, ...@@ -72,30 +64,22 @@ __warn_references(unvis,
#define S_CTRL 4 /* control char started (^) */ #define S_CTRL 4 /* control char started (^) */
#define S_OCTAL2 5 /* octal digit 2 */ #define S_OCTAL2 5 /* octal digit 2 */
#define S_OCTAL3 6 /* octal digit 3 */ #define S_OCTAL3 6 /* octal digit 3 */
#define S_HEX1 7 /* hex digit */ #define S_HEX1 7 /* hex digit */
#define S_HEX2 8 /* hex digit 2 */ #define S_HEX2 8 /* hex digit 2 */
#define isoctal(c) (((u_char)(c)) >= '0' && ((u_char)(c)) <= '7') #define isoctal(c) (((u_char)(c)) >= '0' && ((u_char)(c)) <= '7')
#define xtod(c) (isdigit(c) ? (c - '0') : ((tolower(c) - 'a') + 10)) #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 * unvis - decode characters previously encoded by vis
*/ */
int int
__unvis13(cp, c, astate, flag) unvis(cp, c, astate, flag)
char *cp; char *cp;
int c; int c;
int *astate, flag; int *astate, flag;
{ {
unsigned char uc = (unsigned char)c;
_DIAGASSERT(cp != NULL); _DIAGASSERT(cp != NULL);
_DIAGASSERT(astate != NULL); _DIAGASSERT(astate != NULL);
...@@ -105,7 +89,7 @@ __unvis13(cp, c, astate, flag) ...@@ -105,7 +89,7 @@ __unvis13(cp, c, astate, flag)
|| *astate == S_HEX2) { || *astate == S_HEX2) {
*astate = S_GROUND; *astate = S_GROUND;
return (UNVIS_VALID); return (UNVIS_VALID);
} }
return (*astate == S_GROUND ? UNVIS_NOCHAR : UNVIS_SYNBAD); return (*astate == S_GROUND ? UNVIS_NOCHAR : UNVIS_SYNBAD);
} }
...@@ -116,7 +100,7 @@ __unvis13(cp, c, astate, flag) ...@@ -116,7 +100,7 @@ __unvis13(cp, c, astate, flag)
if (c == '\\') { if (c == '\\') {
*astate = S_START; *astate = S_START;
return (0); return (0);
} }
if ((flag & VIS_HTTPSTYLE) && c == '%') { if ((flag & VIS_HTTPSTYLE) && c == '%') {
*astate = S_HEX1; *astate = S_HEX1;
return (0); return (0);
...@@ -193,7 +177,7 @@ __unvis13(cp, c, astate, flag) ...@@ -193,7 +177,7 @@ __unvis13(cp, c, astate, flag)
} }
*astate = S_GROUND; *astate = S_GROUND;
return (UNVIS_SYNBAD); return (UNVIS_SYNBAD);
case S_META: case S_META:
if (c == '-') if (c == '-')
*astate = S_META1; *astate = S_META1;
...@@ -204,12 +188,12 @@ __unvis13(cp, c, astate, flag) ...@@ -204,12 +188,12 @@ __unvis13(cp, c, astate, flag)
return (UNVIS_SYNBAD); return (UNVIS_SYNBAD);
} }
return (0); return (0);
case S_META1: case S_META1:
*astate = S_GROUND; *astate = S_GROUND;
*cp |= c; *cp |= c;
return (UNVIS_VALID); return (UNVIS_VALID);
case S_CTRL: case S_CTRL:
if (c == '?') if (c == '?')
*cp |= 0177; *cp |= 0177;
...@@ -219,23 +203,23 @@ __unvis13(cp, c, astate, flag) ...@@ -219,23 +203,23 @@ __unvis13(cp, c, astate, flag)
return (UNVIS_VALID); return (UNVIS_VALID);
case S_OCTAL2: /* second possible octal digit */ case S_OCTAL2: /* second possible octal digit */
if (isoctal(c)) { if (isoctal(uc)) {
/* /*
* yes - and maybe a third * yes - and maybe a third
*/ */
*cp = (*cp << 3) + (c - '0'); *cp = (*cp << 3) + (c - '0');
*astate = S_OCTAL3; *astate = S_OCTAL3;
return (0); return (0);
} }
/* /*
* no - done with current sequence, push back passed char * no - done with current sequence, push back passed char
*/ */
*astate = S_GROUND; *astate = S_GROUND;
return (UNVIS_VALIDPUSH); return (UNVIS_VALIDPUSH);
case S_OCTAL3: /* third possible octal digit */ case S_OCTAL3: /* third possible octal digit */
*astate = S_GROUND; *astate = S_GROUND;
if (isoctal(c)) { if (isoctal(uc)) {
*cp = (*cp << 3) + (c - '0'); *cp = (*cp << 3) + (c - '0');
return (UNVIS_VALID); return (UNVIS_VALID);
} }
...@@ -243,27 +227,30 @@ __unvis13(cp, c, astate, flag) ...@@ -243,27 +227,30 @@ __unvis13(cp, c, astate, flag)
* we were done, push back passed char * we were done, push back passed char
*/ */
return (UNVIS_VALIDPUSH); return (UNVIS_VALIDPUSH);
case S_HEX1: case S_HEX1:
if (isxdigit(c)) { if (isxdigit(uc)) {
*cp = xtod(c); *cp = xtod(uc);
*astate = S_HEX2; *astate = S_HEX2;
return (0); return (0);
} }
/* /*
* no - done with current sequence, push back passed char * no - done with current sequence, push back passed char
*/ */
*astate = S_GROUND; *astate = S_GROUND;
return (UNVIS_VALIDPUSH); return (UNVIS_VALIDPUSH);
case S_HEX2: case S_HEX2:
*astate = S_GROUND; *astate = S_GROUND;
if (isxdigit(c)) { if (isxdigit(uc)) {
*cp = xtod(c) | (*cp << 4); *cp = xtod(uc) | (*cp << 4);
return (UNVIS_VALID); return (UNVIS_VALID);
} }
return (UNVIS_VALIDPUSH); return (UNVIS_VALIDPUSH);
default:
/* default:
* decoder in unknown state - (probably uninitialized) /*
* decoder in unknown state - (probably uninitialized)
*/ */
*astate = S_GROUND; *astate = S_GROUND;
return (UNVIS_SYNBAD); return (UNVIS_SYNBAD);
...@@ -271,7 +258,7 @@ __unvis13(cp, c, astate, flag) ...@@ -271,7 +258,7 @@ __unvis13(cp, c, astate, flag)
} }
/* /*
* strunvis - decode src into dst * strunvis - decode src into dst
* *
* Number of chars decoded into dst is returned, -1 on error. * Number of chars decoded into dst is returned, -1 on error.
* Dst is null terminated. * Dst is null terminated.
...@@ -291,8 +278,8 @@ strunvisx(dst, src, flag) ...@@ -291,8 +278,8 @@ strunvisx(dst, src, flag)
_DIAGASSERT(dst != NULL); _DIAGASSERT(dst != NULL);
while ((c = *src++) != '\0') { while ((c = *src++) != '\0') {
again: again:
switch (__unvis13(dst, c, &state, flag)) { switch (unvis(dst, c, &state, flag)) {
case UNVIS_VALID: case UNVIS_VALID:
dst++; dst++;
break; break;
...@@ -306,7 +293,7 @@ strunvisx(dst, src, flag) ...@@ -306,7 +293,7 @@ strunvisx(dst, src, flag)
return (-1); return (-1);
} }
} }
if (__unvis13(dst, c, &state, UNVIS_END) == UNVIS_VALID) if (unvis(dst, c, &state, UNVIS_END) == UNVIS_VALID)
dst++; dst++;
*dst = '\0'; *dst = '\0';
return (dst - start); return (dst - start);
......
/* $NetBSD: vis.c,v 1.22 2002/03/23 17:38:27 christos Exp $ */ /* $NetBSD: vis.c,v 1.38 2008/09/04 09:41:44 lukem Exp $ */
/*- /*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
* Copyright (c) 1989, 1993 * Copyright (c) 1989, 1993
* The Regents of the University of California. All rights reserved. * The Regents of the University of California. All rights reserved.
* *
...@@ -13,11 +12,7 @@ ...@@ -13,11 +12,7 @@
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software * 3. Neither the name of the University nor the names of its contributors
* 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 * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -34,21 +29,47 @@ ...@@ -34,21 +29,47 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
/*-
* Copyright (c) 1999, 2005 The NetBSD Foundation, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h" #include "config.h"
#if defined(LIBC_SCCS) && !defined(lint) #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 */ #endif /* LIBC_SCCS and not lint */
#include <sys/types.h> #include <sys/types.h>
#include <assert.h> #include <assert.h>
#ifdef HAVE_ALLOCA_H #ifdef HAVE_VIS_H
#include <alloca.h> #include <vis.h>
#else
#include "np/vis.h"
#endif #endif
#include <stdlib.h> #include <stdlib.h>
#include "np/vis.h"
#ifdef __weak_alias #ifdef __weak_alias
__weak_alias(strsvis,_strsvis) __weak_alias(strsvis,_strsvis)
__weak_alias(strsvisx,_strsvisx) __weak_alias(strsvisx,_strsvisx)
...@@ -58,63 +79,61 @@ __weak_alias(svis,_svis) ...@@ -58,63 +79,61 @@ __weak_alias(svis,_svis)
__weak_alias(vis,_vis) __weak_alias(vis,_vis)
#endif #endif
#if !HAVE_VIS_H #if !HAVE_VIS || !HAVE_SVIS
#include <ctype.h> #include <ctype.h>
#include <limits.h> #include <limits.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <assert.h>
static char *do_svis(char *, int, int, int, const char *);
#undef BELL #undef BELL
#if defined(__STDC__)
#define BELL '\a' #define BELL '\a'
#else
#define BELL '\007'
#endif
#define isoctal(c) (((unsigned char)(c)) >= '0' && ((unsigned char)(c)) <= '7') #define isoctal(c) (((u_char)(c)) >= '0' && ((u_char)(c)) <= '7')
#define iswhite(c) (c == ' ' || c == '\t' || c == '\n') #define iswhite(c) (c == ' ' || c == '\t' || c == '\n')
#define issafe(c) (c == '\b' || c == BELL || c == '\r') #define issafe(c) (c == '\b' || c == BELL || c == '\r')
#define xtoa(c) "0123456789abcdef"[c] #define xtoa(c) "0123456789abcdef"[c]
#define MAXEXTRAS 5 #define MAXEXTRAS 5
char *MAKEEXTRALIST(unsigned int flag, const char *orig)
{
const char *o = orig;
char *e, *extra;
while (*o++)
continue;
extra = (char*) malloc((size_t)((o - orig) + MAXEXTRAS));
assert(extra);
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';
return extra;
}
#define MAKEEXTRALIST(flag, extra, orig_str) \
do { \
const char *orig = orig_str; \
const char *o = orig; \
char *e; \
while (*o++) \
continue; \
extra = malloc((size_t)((o - orig) + MAXEXTRAS)); \
if (!extra) break; \
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) * This is do_hvis, for HTTP style (RFC 1808)
*/ */
#define HVIS(dst, c, flag, nextc, extra) \ static char *
do \ do_hvis(char *dst, int c, int flag, int nextc, const char *extra)
if (!isascii(c) || !isalnum(c) || strchr("$-_.+!*'(),", c) != NULL) { \ {
*dst++ = '%'; \ if (!isascii(c) || !isalnum(c) || strchr("$-_.+!*'(),", c) != NULL) {
*dst++ = xtoa(((unsigned int)c >> 4) & 0xf); \ *dst++ = '%';
*dst++ = xtoa((unsigned int)c & 0xf); \ *dst++ = xtoa(((unsigned int)c >> 4) & 0xf);
} else { \ *dst++ = xtoa((unsigned int)c & 0xf);
SVIS(dst, c, flag, nextc, extra); \ } else {
} \ dst = do_svis(dst, c, flag, nextc, extra);
while (/*CONSTCOND*/0) }
return dst;
}
/* /*
* This is SVIS, the central macro of vis. * This is do_vis, the central code of vis.
* dst: Pointer to the destination buffer * dst: Pointer to the destination buffer
* c: Character to encode * c: Character to encode
* flag: Flag word * flag: Flag word
...@@ -122,95 +141,103 @@ while (/*CONSTCOND*/0) ...@@ -122,95 +141,103 @@ while (/*CONSTCOND*/0)
* extra: Pointer to the list of extra characters to be * extra: Pointer to the list of extra characters to be
* backslash-protected. * backslash-protected.
*/ */
#define SVIS(dst, c, flag, nextc, extra) \ static char *
do { \ do_svis(char *dst, int c, int flag, int nextc, const char *extra)
int isextra, isc; \ {
isextra = strchr(extra, c) != NULL; \ int isextra;
if (!isextra && isascii(c) && (isgraph(c) || iswhite(c) || \ isextra = strchr(extra, c) != NULL;
((flag & VIS_SAFE) && issafe(c)))) { \ if (!isextra && isascii(c) && (isgraph(c) || iswhite(c) ||
*dst++ = c; \ ((flag & VIS_SAFE) && issafe(c)))) {
break; \ *dst++ = c;
} \ return dst;
isc = 0; \ }
if (flag & VIS_CSTYLE) { \ if (flag & VIS_CSTYLE) {
switch (c) { \ switch (c) {
case '\n': \ case '\n':
isc = 1; *dst++ = '\\'; *dst++ = 'n'; \ *dst++ = '\\'; *dst++ = 'n';
break; \ return dst;
case '\r': \ case '\r':
isc = 1; *dst++ = '\\'; *dst++ = 'r'; \ *dst++ = '\\'; *dst++ = 'r';
break; \ return dst;
case '\b': \ case '\b':
isc = 1; *dst++ = '\\'; *dst++ = 'b'; \ *dst++ = '\\'; *dst++ = 'b';
break; \ return dst;
case BELL: \ case BELL:
isc = 1; *dst++ = '\\'; *dst++ = 'a'; \ *dst++ = '\\'; *dst++ = 'a';
break; \ return dst;
case '\v': \ case '\v':
isc = 1; *dst++ = '\\'; *dst++ = 'v'; \ *dst++ = '\\'; *dst++ = 'v';
break; \ return dst;
case '\t': \ case '\t':
isc = 1; *dst++ = '\\'; *dst++ = 't'; \ *dst++ = '\\'; *dst++ = 't';
break; \ return dst;
case '\f': \ case '\f':
isc = 1; *dst++ = '\\'; *dst++ = 'f'; \ *dst++ = '\\'; *dst++ = 'f';
break; \ return dst;
case ' ': \ case ' ':
isc = 1; *dst++ = '\\'; *dst++ = 's'; \ *dst++ = '\\'; *dst++ = 's';
break; \ return dst;
case '\0': \ case '\0':
isc = 1; *dst++ = '\\'; *dst++ = '0'; \ *dst++ = '\\'; *dst++ = '0';
if (isoctal(nextc)) { \ if (isoctal(nextc)) {
*dst++ = '0'; \ *dst++ = '0';
*dst++ = '0'; \ *dst++ = '0';
} \ }
} \ return dst;
} \ default:
if (isc) break; \ if (isgraph(c)) {
if (isextra || ((c & 0177) == ' ') || (flag & VIS_OCTAL)) { \ *dst++ = '\\'; *dst++ = c;
*dst++ = '\\'; \ return 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 (isextra || ((c & 0177) == ' ') || (flag & VIS_OCTAL)) {
if ((flag & VIS_NOSLASH) == 0) *dst++ = '\\'; \ *dst++ = '\\';
if (c & 0200) { \ *dst++ = (u_char)(((u_int32_t)(u_char)c >> 6) & 03) + '0';
c &= 0177; *dst++ = 'M'; \ *dst++ = (u_char)(((u_int32_t)(u_char)c >> 3) & 07) + '0';
} \ *dst++ = (c & 07) + '0';
if (iscntrl(c)) { \ } else {
*dst++ = '^'; \ if ((flag & VIS_NOSLASH) == 0) *dst++ = '\\';
if (c == 0177) \ if (c & 0200) {
*dst++ = '?'; \ c &= 0177; *dst++ = 'M';
else \ }
*dst++ = c + '@'; \ if (iscntrl(c)) {
} else { \ *dst++ = '^';
*dst++ = '-'; *dst++ = c; \ if (c == 0177)
} \ *dst++ = '?';
} \ else
} while (/*CONSTCOND*/0) *dst++ = c + '@';
} else {
*dst++ = '-'; *dst++ = c;
}
}
return dst;
}
/* /*
* svis - visually encode characters, also encoding the characters * svis - visually encode characters, also encoding the characters
* pointed to by `extra' * pointed to by `extra'
*/ */
char * char *
svis(dst, c, flag, nextc, extra) svis(char *dst, int c, int flag, int nextc, const char *extra)
char *dst;
int c, flag, nextc;
const char *extra;
{ {
char *nextra, *to_be_freed; char *nextra = NULL;
_DIAGASSERT(dst != NULL); _DIAGASSERT(dst != NULL);
_DIAGASSERT(extra != NULL); _DIAGASSERT(extra != NULL);
nextra= to_be_freed= MAKEEXTRALIST(flag, extra); MAKEEXTRALIST(flag, nextra, extra);
if (!nextra) {
*dst = '\0'; /* can't create nextra, return "" */
return dst;
}
if (flag & VIS_HTTPSTYLE) if (flag & VIS_HTTPSTYLE)
HVIS(dst, c, flag, nextc, nextra); dst = do_hvis(dst, c, flag, nextc, nextra);
else else
SVIS(dst, c, flag, nextc, nextra); dst = do_svis(dst, c, flag, nextc, nextra);
free(nextra);
*dst = '\0'; *dst = '\0';
free(to_be_freed); return dst;
return(dst);
} }
...@@ -221,140 +248,146 @@ svis(dst, c, flag, nextc, extra) ...@@ -221,140 +248,146 @@ svis(dst, c, flag, nextc, extra)
* be encoded, too. These functions are useful e. g. to * be encoded, too. These functions are useful e. g. to
* encode strings in such a way so that they are not interpreted * encode strings in such a way so that they are not interpreted
* by a shell. * by a shell.
* *
* Dst must be 4 times the size of src to account for possible * Dst must be 4 times the size of src to account for possible
* expansion. The length of dst, not including the trailing NULL, * expansion. The length of dst, not including the trailing NULL,
* is returned. * is returned.
* *
* Strsvisx encodes exactly len bytes from src into dst. * Strsvisx encodes exactly len bytes from src into dst.
* This is useful for encoding a block of data. * This is useful for encoding a block of data.
*/ */
int int
strsvis(dst, src, flag, extra) strsvis(char *dst, const char *csrc, int flag, const char *extra)
char *dst;
const char *src;
int flag;
const char *extra;
{ {
char c; int c;
char *start; char *start;
char *nextra, *to_be_freed; char *nextra = NULL;
const unsigned char *src = (const unsigned char *)csrc;
_DIAGASSERT(dst != NULL); _DIAGASSERT(dst != NULL);
_DIAGASSERT(src != NULL); _DIAGASSERT(src != NULL);
_DIAGASSERT(extra != NULL); _DIAGASSERT(extra != NULL);
nextra= to_be_freed= MAKEEXTRALIST(flag, extra); MAKEEXTRALIST(flag, nextra, extra);
if (!nextra) {
*dst = '\0'; /* can't create nextra, return "" */
return 0;
}
if (flag & VIS_HTTPSTYLE) { if (flag & VIS_HTTPSTYLE) {
for (start = dst; (c = *src++) != '\0'; /* empty */) for (start = dst; (c = *src++) != '\0'; /* empty */)
HVIS(dst, c, flag, *src, nextra); dst = do_hvis(dst, c, flag, *src, nextra);
} else { } else {
for (start = dst; (c = *src++) != '\0'; /* empty */) for (start = dst; (c = *src++) != '\0'; /* empty */)
SVIS(dst, c, flag, *src, nextra); dst = do_svis(dst, c, flag, *src, nextra);
} }
free(nextra);
*dst = '\0'; *dst = '\0';
free(to_be_freed);
return (dst - start); return (dst - start);
} }
int int
strsvisx(dst, src, len, flag, extra) strsvisx(char *dst, const char *csrc, size_t len, int flag, const char *extra)
char *dst;
const char *src;
size_t len;
int flag;
const char *extra;
{ {
char c; unsigned char c;
char *start; char *start;
char *nextra, *to_be_freed; char *nextra = NULL;
const unsigned char *src = (const unsigned char *)csrc;
_DIAGASSERT(dst != NULL); _DIAGASSERT(dst != NULL);
_DIAGASSERT(src != NULL); _DIAGASSERT(src != NULL);
_DIAGASSERT(extra != NULL); _DIAGASSERT(extra != NULL);
nextra= to_be_freed= MAKEEXTRALIST(flag, extra); MAKEEXTRALIST(flag, nextra, extra);
if (! nextra) {
*dst = '\0'; /* can't create nextra, return "" */
return 0;
}
if (flag & VIS_HTTPSTYLE) { if (flag & VIS_HTTPSTYLE) {
for (start = dst; len > 0; len--) { for (start = dst; len > 0; len--) {
c = *src++; c = *src++;
HVIS(dst, c, flag, len ? *src : '\0', nextra); dst = do_hvis(dst, c, flag,
len > 1 ? *src : '\0', nextra);
} }
} else { } else {
for (start = dst; len > 0; len--) { for (start = dst; len > 0; len--) {
c = *src++; c = *src++;
SVIS(dst, c, flag, len ? *src : '\0', nextra); dst = do_svis(dst, c, flag,
len > 1 ? *src : '\0', nextra);
} }
} }
free(nextra);
*dst = '\0'; *dst = '\0';
free(to_be_freed);
return (dst - start); return (dst - start);
} }
#endif
#if !HAVE_VIS
/* /*
* vis - visually encode characters * vis - visually encode characters
*/ */
char * char *
vis(dst, c, flag, nextc) vis(char *dst, int c, int flag, int nextc)
char *dst;
int c, flag, nextc;
{ {
char *extra, *to_be_freed; char *extra = NULL;
unsigned char uc = (unsigned char)c;
_DIAGASSERT(dst != NULL); _DIAGASSERT(dst != NULL);
extra= to_be_freed= MAKEEXTRALIST(flag, ""); MAKEEXTRALIST(flag, extra, "");
if (! extra) {
*dst = '\0'; /* can't create extra, return "" */
return dst;
}
if (flag & VIS_HTTPSTYLE) if (flag & VIS_HTTPSTYLE)
HVIS(dst, c, flag, nextc, extra); dst = do_hvis(dst, uc, flag, nextc, extra);
else else
SVIS(dst, c, flag, nextc, extra); dst = do_svis(dst, uc, flag, nextc, extra);
free(extra);
*dst = '\0'; *dst = '\0';
free(to_be_freed); return dst;
return (dst);
} }
/* /*
* strvis, strvisx - visually encode characters from src into dst * strvis, strvisx - visually encode characters from src into dst
* *
* Dst must be 4 times the size of src to account for possible * Dst must be 4 times the size of src to account for possible
* expansion. The length of dst, not including the trailing NULL, * expansion. The length of dst, not including the trailing NULL,
* is returned. * is returned.
* *
* Strvisx encodes exactly len bytes from src into dst. * Strvisx encodes exactly len bytes from src into dst.
* This is useful for encoding a block of data. * This is useful for encoding a block of data.
*/ */
int int
strvis(dst, src, flag) strvis(char *dst, const char *src, int flag)
char *dst;
const char *src;
int flag;
{ {
char *extra; char *extra = NULL;
int tmp; int rv;
extra= MAKEEXTRALIST(flag, ""); MAKEEXTRALIST(flag, extra, "");
tmp= strsvis(dst, src, flag, extra); if (!extra) {
*dst = '\0'; /* can't create extra, return "" */
return 0;
}
rv = strsvis(dst, src, flag, extra);
free(extra); free(extra);
return tmp; return rv;
} }
int int
strvisx(dst, src, len, flag) strvisx(char *dst, const char *src, size_t len, int flag)
char *dst;
const char *src;
size_t len;
int flag;
{ {
char *extra; char *extra = NULL;
int tmp; int rv;
extra= MAKEEXTRALIST(flag, ""); MAKEEXTRALIST(flag, extra, "");
tmp= strsvisx(dst, src, len, flag, extra); if (!extra) {
*dst = '\0'; /* can't create extra, return "" */
return 0;
}
rv = strsvisx(dst, src, len, flag, extra);
free(extra); free(extra);
return tmp; return rv;
} }
#endif #endif
/* $NetBSD: vis.h,v 1.12 2002/03/23 17:39:05 christos Exp $ */ /* $NetBSD: vis.h,v 1.16 2005/09/13 01:44:32 christos Exp $ */
/*- /*-
* Copyright (c) 1990, 1993 * Copyright (c) 1990, 1993
...@@ -12,11 +12,7 @@ ...@@ -12,11 +12,7 @@
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software * 3. Neither the name of the University nor the names of its contributors
* 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 * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
...@@ -38,9 +34,7 @@ ...@@ -38,9 +34,7 @@
#ifndef _VIS_H_ #ifndef _VIS_H_
#define _VIS_H_ #define _VIS_H_
#ifdef HAVE_SYS_CDEFS_H #include <sys/types.h>
#include <sys/cdefs.h>
#endif
/* /*
* to select alternate encoding format * to select alternate encoding format
...@@ -78,6 +72,7 @@ ...@@ -78,6 +72,7 @@
*/ */
#define UNVIS_END 1 /* no more characters */ #define UNVIS_END 1 /* no more characters */
__BEGIN_DECLS
char *vis(char *, int, int, int); char *vis(char *, int, int, int);
char *svis(char *, int, int, int, const char *); char *svis(char *, int, int, int, const char *);
int strvis(char *, const char *, int); int strvis(char *, const char *, int);
...@@ -86,11 +81,7 @@ int strvisx(char *, const char *, size_t, int); ...@@ -86,11 +81,7 @@ int strvisx(char *, const char *, size_t, int);
int strsvisx(char *, const char *, size_t, int, const char *); int strsvisx(char *, const char *, size_t, int, const char *);
int strunvis(char *, const char *); int strunvis(char *, const char *);
int strunvisx(char *, const char *, int); int strunvisx(char *, const char *, int);
#ifdef __LIBC12_SOURCE__
int unvis(char *, int, int *, int); int unvis(char *, int, int *, int);
int __unvis13(char *, int, int *, int); __END_DECLS
#else
int unvis(char *, int, int *, int) __RENAME(__unvis13);
#endif
#endif /* !_VIS_H_ */ #endif /* !_VIS_H_ */
/* $NetBSD: parse.c,v 1.20 2003/12/05 13:37:48 lukem Exp $ */ /* $NetBSD: parse.c,v 1.22 2005/05/29 04:58:15 lukem Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -32,7 +32,13 @@ ...@@ -32,7 +32,13 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include <config.h> #include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)parse.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif /* not lint && not SCCSID */
/* /*
* parse.c: parse an editline extended command * parse.c: parse an editline extended command
...@@ -129,7 +135,7 @@ el_parse(EditLine *el, int argc, const char *argv[]) ...@@ -129,7 +135,7 @@ el_parse(EditLine *el, int argc, const char *argv[])
* the appropriate character or -1 if the escape is not valid * the appropriate character or -1 if the escape is not valid
*/ */
protected int protected int
parse__escape(const char **const ptr) parse__escape(const char **ptr)
{ {
const char *p; const char *p;
int c; int c;
......
/* $NetBSD: parse.h,v 1.5 2003/08/07 16:44:32 agc Exp $ */ /* $NetBSD: parse.h,v 1.6 2005/05/29 04:58:15 lukem Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
#define _h_el_parse #define _h_el_parse
protected int parse_line(EditLine *, const char *); protected int parse_line(EditLine *, const char *);
protected int parse__escape(const char ** const); protected int parse__escape(const char **);
protected char *parse__string(char *, const char *); protected char *parse__string(char *, const char *);
protected int parse_cmd(EditLine *, const char *); protected int parse_cmd(EditLine *, const char *);
......
...@@ -32,7 +32,13 @@ ...@@ -32,7 +32,13 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include <config.h> #include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)prompt.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif /* not lint && not SCCSID */
/* /*
* prompt.c: Prompt printing functions * prompt.c: Prompt printing functions
......
/* $NetBSD: read.c,v 1.35 2005/03/09 23:55:02 christos Exp $ */ /* $NetBSD: read.c,v 1.43 2009/02/05 19:15:44 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -32,7 +32,13 @@ ...@@ -32,7 +32,13 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include <config.h> #include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)read.c 8.1 (Berkeley) 6/4/93";
#else
#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.
...@@ -50,6 +56,7 @@ private int read__fixio(int, int); ...@@ -50,6 +56,7 @@ private int read__fixio(int, int);
private int read_preread(EditLine *); private int read_preread(EditLine *);
private int read_char(EditLine *, char *); private int read_char(EditLine *, char *);
private int read_getcmd(EditLine *, el_action_t *, char *); private int read_getcmd(EditLine *, el_action_t *, char *);
private void read_pop(c_macro_t *);
/* read_init(): /* read_init():
* Initialize the read stuff * Initialize the read stuff
...@@ -205,7 +212,7 @@ read_preread(EditLine *el) ...@@ -205,7 +212,7 @@ read_preread(EditLine *el)
* Push a macro * Push a macro
*/ */
public void public void
el_push(EditLine *el, char *str) el_push(EditLine *el, const char *str)
{ {
c_macro_t *ma = &el->el_chared.c_macro; c_macro_t *ma = &el->el_chared.c_macro;
...@@ -216,7 +223,7 @@ el_push(EditLine *el, char *str) ...@@ -216,7 +223,7 @@ el_push(EditLine *el, char *str)
ma->level--; ma->level--;
} }
term_beep(el); term_beep(el);
term__flush(); term__flush(el);
} }
...@@ -294,6 +301,19 @@ read_char(EditLine *el, char *cp) ...@@ -294,6 +301,19 @@ read_char(EditLine *el, char *cp)
return (num_read); return (num_read);
} }
/* read_pop():
* Pop a macro from the stack
*/
private void
read_pop(c_macro_t *ma)
{
int i;
el_free(ma->macro[0]);
for (i = ma->level--; i > 0; i--)
ma->macro[i - 1] = ma->macro[i];
ma->offset = 0;
}
/* el_getc(): /* el_getc():
* Read a character * Read a character
...@@ -304,26 +324,28 @@ el_getc(EditLine *el, char *cp) ...@@ -304,26 +324,28 @@ el_getc(EditLine *el, char *cp)
int num_read; int num_read;
c_macro_t *ma = &el->el_chared.c_macro; c_macro_t *ma = &el->el_chared.c_macro;
term__flush(); term__flush(el);
for (;;) { for (;;) {
if (ma->level < 0) { if (ma->level < 0) {
if (!read_preread(el)) if (!read_preread(el))
break; break;
} }
if (ma->level < 0) if (ma->level < 0)
break; break;
if (ma->macro[ma->level][ma->offset] == '\0') { if (ma->macro[0][ma->offset] == '\0') {
el_free(ma->macro[ma->level--]); read_pop(ma);
ma->offset = 0;
continue; continue;
} }
*cp = ma->macro[ma->level][ma->offset++] & 0377;
if (ma->macro[ma->level][ma->offset] == '\0') { *cp = ma->macro[0][ma->offset++] & 0377;
if (ma->macro[0][ma->offset] == '\0') {
/* Needed for QuoteMode On */ /* Needed for QuoteMode On */
el_free(ma->macro[ma->level--]); read_pop(ma);
ma->offset = 0;
} }
return (1); return (1);
} }
...@@ -357,11 +379,11 @@ read_prepare(EditLine *el) ...@@ -357,11 +379,11 @@ read_prepare(EditLine *el)
we have the wrong size. */ we have the wrong size. */
el_resize(el); 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, 0);
re_refresh(el); /* print the prompt */ re_refresh(el); /* print the prompt */
if (el->el_flags & UNBUFFERED) if (el->el_flags & UNBUFFERED)
term__flush(); term__flush(el);
} }
protected void protected void
...@@ -438,7 +460,7 @@ el_gets(EditLine *el, int *nread) ...@@ -438,7 +460,7 @@ el_gets(EditLine *el, int *nread)
else else
cp = el->el_line.lastchar; cp = el->el_line.lastchar;
term__flush(); term__flush(el);
while ((*el->el_read.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 */
...@@ -478,7 +500,7 @@ el_gets(EditLine *el, int *nread) ...@@ -478,7 +500,7 @@ el_gets(EditLine *el, int *nread)
#endif /* DEBUG_READ */ #endif /* DEBUG_READ */
break; break;
} }
if ((unsigned int)cmdnum >= el->el_map.nfunc) { /* BUG CHECK command */ if ((unsigned int)cmdnum >= (unsigned int)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);
...@@ -570,7 +592,7 @@ el_gets(EditLine *el, int *nread) ...@@ -570,7 +592,7 @@ el_gets(EditLine *el, int *nread)
#endif /* DEBUG_READ */ #endif /* DEBUG_READ */
/* put (real) cursor in a known place */ /* put (real) cursor in a known place */
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, 1); /* reset the input pointers */
re_refresh(el); /* print the prompt again */ re_refresh(el); /* print the prompt again */
break; break;
...@@ -581,7 +603,7 @@ el_gets(EditLine *el, int *nread) ...@@ -581,7 +603,7 @@ el_gets(EditLine *el, int *nread)
"*** editor ERROR ***\r\n\n"); "*** editor ERROR ***\r\n\n");
#endif /* DEBUG_READ */ #endif /* DEBUG_READ */
term_beep(el); term_beep(el);
term__flush(); term__flush(el);
break; break;
} }
el->el_state.argument = 1; el->el_state.argument = 1;
...@@ -591,7 +613,7 @@ el_gets(EditLine *el, int *nread) ...@@ -591,7 +613,7 @@ el_gets(EditLine *el, int *nread)
break; break;
} }
term__flush(); /* flush any buffered output */ term__flush(el); /* flush any buffered output */
/* make sure the tty is set up correctly */ /* make sure the tty is set up correctly */
if ((el->el_flags & UNBUFFERED) == 0) { if ((el->el_flags & UNBUFFERED) == 0) {
read_finish(el); read_finish(el);
......
/* $NetBSD: read.h,v 1.4 2004/02/27 14:52:18 christos Exp $ */ /* $NetBSD: read.h,v 1.6 2008/04/29 06:53:01 martin Exp $ */
/*- /*-
* Copyright (c) 2001 The NetBSD Foundation, Inc. * Copyright (c) 2001 The NetBSD Foundation, Inc.
...@@ -15,13 +15,6 @@ ...@@ -15,13 +15,6 @@
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * 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 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
......
/* $NetBSD: readline.c,v 1.49 2005/03/10 19:34:46 christos Exp $ */ /* $NetBSD: readline.c,v 1.78 2009/02/05 19:15:26 christos Exp $ */
/*- /*-
* Copyright (c) 1997 The NetBSD Foundation, Inc. * Copyright (c) 1997 The NetBSD Foundation, Inc.
...@@ -15,13 +15,6 @@ ...@@ -15,13 +15,6 @@
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * 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 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
...@@ -36,25 +29,9 @@ ...@@ -36,25 +29,9 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
/* AIX requires this to be the first thing in the file. */ #include "config.h"
#if defined (_AIX) && !defined (__GNUC__) #if !defined(lint) && !defined(SCCSID)
#pragma alloca #endif /* not lint && not SCCSID */
#endif
#include <config.h>
#ifdef __GNUC__
# undef alloca
# define alloca(n) __builtin_alloca (n)
#else
# ifdef HAVE_ALLOCA_H
# include <alloca.h>
# else
# ifndef _AIX
extern char *alloca ();
# endif
# endif
#endif
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
...@@ -68,12 +45,20 @@ extern char *alloca (); ...@@ -68,12 +45,20 @@ extern char *alloca ();
#include <limits.h> #include <limits.h>
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <setjmp.h>
#ifdef HAVE_VIS_H
#include <vis.h> #include <vis.h>
#else
#include "np/vis.h"
#endif
#include "readline/readline.h" #include "readline/readline.h"
#include "el.h" #include "el.h"
#include "fcns.h" /* for EL_NUM_FCNS */ #include "fcns.h" /* for EL_NUM_FCNS */
#include "histedit.h" #include "histedit.h"
#include "filecomplete.h"
void rl_prep_terminal(int);
void rl_deprep_terminal(void);
/* for rl_complete() */ /* for rl_complete() */
#define TAB '\r' #define TAB '\r'
...@@ -94,9 +79,12 @@ FILE *rl_outstream = NULL; ...@@ -94,9 +79,12 @@ FILE *rl_outstream = NULL;
int rl_point = 0; int rl_point = 0;
int rl_end = 0; int rl_end = 0;
char *rl_line_buffer = NULL; char *rl_line_buffer = NULL;
VFunction *rl_linefunc = NULL; VCPFunction *rl_linefunc = NULL;
int rl_done = 0; int rl_done = 0;
VFunction *rl_event_hook = NULL; VFunction *rl_event_hook = NULL;
KEYMAP_ENTRY_ARRAY emacs_standard_keymap,
emacs_meta_keymap,
emacs_ctlx_keymap;
int history_base = 1; /* probably never subject to change */ int history_base = 1; /* probably never subject to change */
int history_length = 0; int history_length = 0;
...@@ -112,21 +100,23 @@ int rl_attempted_completion_over = 0; ...@@ -112,21 +100,23 @@ int rl_attempted_completion_over = 0;
char *rl_basic_word_break_characters = break_chars; 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; Function *rl_completion_entry_function = NULL;
CPPFunction *rl_attempted_completion_function = NULL; CPPFunction *rl_attempted_completion_function = NULL;
Function *rl_pre_input_hook = NULL; Function *rl_pre_input_hook = NULL;
Function *rl_startup1_hook = NULL; Function *rl_startup1_hook = NULL;
Function *rl_getc_function = NULL; int (*rl_getc_function)(FILE *) = NULL;
char *rl_terminal_name = NULL; char *rl_terminal_name = NULL;
int rl_already_prompted = 0; int rl_already_prompted = 0;
int rl_filename_completion_desired = 0; int rl_filename_completion_desired = 0;
int rl_ignore_completion_duplicates = 0; int rl_ignore_completion_duplicates = 0;
int rl_catch_signals = 1; int rl_catch_signals = 1;
int readline_echoing_p = 1;
int _rl_print_completions_horizontally = 0;
VFunction *rl_redisplay_function = NULL; VFunction *rl_redisplay_function = NULL;
Function *rl_startup_hook = NULL; Function *rl_startup_hook = NULL;
VFunction *rl_completion_display_matches_hook = NULL; VFunction *rl_completion_display_matches_hook = NULL;
VFunction *rl_prep_term_function = NULL; VFunction *rl_prep_term_function = (VFunction *)rl_prep_terminal;
VFunction *rl_deprep_term_function = NULL; VFunction *rl_deprep_term_function = (VFunction *)rl_deprep_terminal;
/* /*
* The current prompt string. * The current prompt string.
...@@ -150,7 +140,7 @@ int rl_completion_query_items = 100; ...@@ -150,7 +140,7 @@ int rl_completion_query_items = 100;
* in the parsed text when it is passed to the completion function. * in the parsed text when it is passed to the completion function.
* Shell uses this to help determine what kind of completing to do. * Shell uses this to help determine what kind of completing to do.
*/ */
char *rl_special_prefixes = (char *)NULL; char *rl_special_prefixes = NULL;
/* /*
* This is the character appended to the completed words if at the end of * This is the character appended to the completed words if at the end of
...@@ -160,25 +150,21 @@ int rl_completion_append_character = ' '; ...@@ -160,25 +150,21 @@ int rl_completion_append_character = ' ';
/* stuff below is used internally by libedit for readline emulation */ /* stuff below is used internally by libedit for readline emulation */
/* if not zero, non-unique completions always show list of possible matches */
static int _rl_complete_show_all = 0;
static History *h = NULL; static History *h = NULL;
static EditLine *e = NULL; static EditLine *e = NULL;
static Function *map[256]; static Function *map[256];
static int el_rl_complete_cmdnum = 0; static jmp_buf topbuf;
/* internal functions */ /* internal functions */
static unsigned char _el_rl_complete(EditLine *, int); static unsigned char _el_rl_complete(EditLine *, int);
static unsigned char _el_rl_tstp(EditLine *, int); static unsigned char _el_rl_tstp(EditLine *, int);
static char *_get_prompt(EditLine *); static char *_get_prompt(EditLine *);
static int _getc_function(EditLine *, char *);
static HIST_ENTRY *_move_history(int); static HIST_ENTRY *_move_history(int);
static int _history_expand_command(const char *, size_t, size_t, static int _history_expand_command(const char *, size_t, size_t,
char **); char **);
static char *_rl_compat_sub(const char *, const char *, static char *_rl_compat_sub(const char *, const char *,
const char *, int); const char *, int);
static int _rl_complete_internal(int);
static int _rl_qsort_string_compare(const void *, const void *);
static int _rl_event_read_char(EditLine *, char *); static int _rl_event_read_char(EditLine *, char *);
static void _rl_update_pos(void); static void _rl_update_pos(void);
...@@ -205,16 +191,49 @@ _move_history(int op) ...@@ -205,16 +191,49 @@ _move_history(int op)
return (HIST_ENTRY *) NULL; return (HIST_ENTRY *) NULL;
rl_he.line = ev.str; rl_he.line = ev.str;
rl_he.data = (histdata_t) &(ev.num); rl_he.data = NULL;
return (&rl_he); return (&rl_he);
} }
/*
* read one key from user defined input function
*/
static int
/*ARGSUSED*/
_getc_function(EditLine *el, char *c)
{
int i;
i = (*rl_getc_function)(NULL);
if (i == -1)
return 0;
*c = i;
return 1;
}
/* /*
* READLINE compatibility stuff * READLINE compatibility stuff
*/ */
/*
* Set the prompt
*/
int
rl_set_prompt(const char *prompt)
{
if (!prompt)
prompt = "";
if (rl_prompt != NULL && strcmp(rl_prompt, prompt) == 0)
return 0;
if (rl_prompt)
free(rl_prompt);
rl_prompt = strdup(prompt);
return rl_prompt == NULL ? -1 : 0;
}
/* /*
* initialize rl compat stuff * initialize rl compat stuff
*/ */
...@@ -223,7 +242,6 @@ rl_initialize(void) ...@@ -223,7 +242,6 @@ rl_initialize(void)
{ {
HistEvent ev; HistEvent ev;
const LineInfo *li; const LineInfo *li;
int i;
int editmode = 1; int editmode = 1;
struct termios t; struct termios t;
...@@ -257,9 +275,12 @@ rl_initialize(void) ...@@ -257,9 +275,12 @@ rl_initialize(void)
max_input_history = INT_MAX; max_input_history = INT_MAX;
el_set(e, EL_HIST, history, h); el_set(e, EL_HIST, history, h);
/* setup getc function if valid */
if (rl_getc_function)
el_set(e, EL_GETCFN, _getc_function);
/* for proper prompt printing in readline() */ /* for proper prompt printing in readline() */
rl_prompt = strdup(""); if (rl_set_prompt("") == -1) {
if (rl_prompt == NULL) {
history_end(h); history_end(h);
el_end(e); el_end(e);
return -1; return -1;
...@@ -291,17 +312,6 @@ rl_initialize(void) ...@@ -291,17 +312,6 @@ rl_initialize(void)
"ReadLine compatible suspend function", "ReadLine compatible suspend function",
_el_rl_tstp); _el_rl_tstp);
el_set(e, EL_BIND, "^Z", "rl_tstp", NULL); el_set(e, EL_BIND, "^Z", "rl_tstp", NULL);
/*
* Find out where the rl_complete function was added; this is
* used later to detect that lastcmd was also rl_complete.
*/
for(i=EL_NUM_FCNS; i < e->el_map.nfunc; i++) {
if (e->el_map.func[i] == _el_rl_complete) {
el_rl_complete_cmdnum = i;
break;
}
}
/* read settings from configuration file */ /* read settings from configuration file */
el_source(e, NULL); el_source(e, NULL);
...@@ -327,9 +337,10 @@ rl_initialize(void) ...@@ -327,9 +337,10 @@ rl_initialize(void)
* trailing newline (if there is any) * trailing newline (if there is any)
*/ */
char * char *
readline(const char *prompt) readline(const char *p)
{ {
HistEvent ev; HistEvent ev;
const char * volatile prompt = p;
int count; int count;
const char *ret; const char *ret;
char *buf; char *buf;
...@@ -340,15 +351,11 @@ readline(const char *prompt) ...@@ -340,15 +351,11 @@ readline(const char *prompt)
rl_done = 0; rl_done = 0;
(void)setjmp(topbuf);
/* update prompt accordingly to what has been passed */ /* update prompt accordingly to what has been passed */
if (!prompt) if (rl_set_prompt(prompt) == -1)
prompt = ""; return NULL;
if (strcmp(rl_prompt, prompt) != 0) {
free(rl_prompt);
rl_prompt = strdup(prompt);
if (rl_prompt == NULL)
return NULL;
}
if (rl_pre_input_hook) if (rl_pre_input_hook)
(*rl_pre_input_hook)(NULL, 0); (*rl_pre_input_hook)(NULL, 0);
...@@ -446,7 +453,7 @@ _rl_compat_sub(const char *str, const char *what, const char *with, ...@@ -446,7 +453,7 @@ _rl_compat_sub(const char *str, const char *what, const char *with,
} else } else
*r++ = *s++; *r++ = *s++;
} }
*r = 0; *r = '\0';
return(result); return(result);
} }
...@@ -467,7 +474,7 @@ get_history_event(const char *cmd, int *cindex, int qchar) ...@@ -467,7 +474,7 @@ get_history_event(const char *cmd, int *cindex, int qchar)
return(NULL); return(NULL);
/* find out which event to take */ /* find out which event to take */
if (cmd[idx] == history_expansion_char || cmd[idx] == 0) { if (cmd[idx] == history_expansion_char || cmd[idx] == '\0') {
if (history(h, &ev, H_FIRST) != 0) if (history(h, &ev, H_FIRST) != 0)
return(NULL); return(NULL);
*cindex = cmd[idx]? (idx + 1):idx; *cindex = cmd[idx]? (idx + 1):idx;
...@@ -689,7 +696,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen, ...@@ -689,7 +696,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen,
if (aptr) if (aptr)
free(aptr); free(aptr);
if (*cmd == 0 || (cmd - (command + offs) >= cmdlen)) { if (*cmd == '\0' || ((size_t)(cmd - (command + offs)) >= cmdlen)) {
*result = tmp; *result = tmp;
return(1); return(1);
} }
...@@ -699,7 +706,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen, ...@@ -699,7 +706,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen,
continue; continue;
else if (*cmd == 'h') { /* remove trailing path */ else if (*cmd == 'h') { /* remove trailing path */
if ((aptr = strrchr(tmp, '/')) != NULL) if ((aptr = strrchr(tmp, '/')) != NULL)
*aptr = 0; *aptr = '\0';
} else if (*cmd == 't') { /* remove leading path */ } else if (*cmd == 't') { /* remove leading path */
if ((aptr = strrchr(tmp, '/')) != NULL) { if ((aptr = strrchr(tmp, '/')) != NULL) {
aptr = strdup(aptr + 1); aptr = strdup(aptr + 1);
...@@ -708,7 +715,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen, ...@@ -708,7 +715,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen,
} }
} else if (*cmd == 'r') { /* remove trailing suffix */ } else if (*cmd == 'r') { /* remove trailing suffix */
if ((aptr = strrchr(tmp, '.')) != NULL) if ((aptr = strrchr(tmp, '.')) != NULL)
*aptr = 0; *aptr = '\0';
} else if (*cmd == 'e') { /* remove all but suffix */ } else if (*cmd == 'e') { /* remove all but suffix */
if ((aptr = strrchr(tmp, '.')) != NULL) { if ((aptr = strrchr(tmp, '.')) != NULL) {
aptr = strdup(aptr); aptr = strdup(aptr);
...@@ -732,6 +739,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen, ...@@ -732,6 +739,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen,
what = realloc(from, size); what = realloc(from, size);
if (what == NULL) { if (what == NULL) {
free(from); free(from);
free(tmp);
return 0; return 0;
} }
len = 0; len = 0;
...@@ -744,6 +752,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen, ...@@ -744,6 +752,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen,
(size <<= 1)); (size <<= 1));
if (nwhat == NULL) { if (nwhat == NULL) {
free(what); free(what);
free(tmp);
return 0; return 0;
} }
what = nwhat; what = nwhat;
...@@ -756,10 +765,13 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen, ...@@ -756,10 +765,13 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen,
free(what); free(what);
if (search) { if (search) {
from = strdup(search); from = strdup(search);
if (from == NULL) if (from == NULL) {
free(tmp);
return 0; return 0;
}
} else { } else {
from = NULL; from = NULL;
free(tmp);
return (-1); return (-1);
} }
} }
...@@ -771,6 +783,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen, ...@@ -771,6 +783,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen,
with = realloc(to, size); with = realloc(to, size);
if (with == NULL) { if (with == NULL) {
free(to); free(to);
free(tmp);
return -1; return -1;
} }
len = 0; len = 0;
...@@ -782,6 +795,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen, ...@@ -782,6 +795,7 @@ _history_expand_command(const char *command, size_t offs, size_t cmdlen,
nwith = realloc(with, size); nwith = realloc(with, size);
if (nwith == NULL) { if (nwith == NULL) {
free(with); free(with);
free(tmp);
return -1; return -1;
} }
with = nwith; with = nwith;
...@@ -850,12 +864,14 @@ history_expand(char *str, char **output) ...@@ -850,12 +864,14 @@ history_expand(char *str, char **output)
return 0; return 0;
} }
#define ADD_STRING(what, len) \ #define ADD_STRING(what, len, fr) \
{ \ { \
if (idx + len + 1 > size) { \ if (idx + len + 1 > size) { \
char *nresult = realloc(result, (size += len + 1));\ char *nresult = realloc(result, (size += len + 1));\
if (nresult == NULL) { \ if (nresult == NULL) { \
free(*output); \ free(*output); \
if (/*CONSTCOND*/fr) \
free(tmp); \
return 0; \ return 0; \
} \ } \
result = nresult; \ result = nresult; \
...@@ -867,6 +883,7 @@ history_expand(char *str, char **output) ...@@ -867,6 +883,7 @@ history_expand(char *str, char **output)
result = NULL; result = NULL;
size = idx = 0; size = idx = 0;
tmp = NULL;
for (i = 0; str[i];) { for (i = 0; str[i];) {
int qchar, loop_again; int qchar, loop_again;
size_t len, start, j; size_t len, start, j;
...@@ -904,13 +921,11 @@ history_expand(char *str, char **output) ...@@ -904,13 +921,11 @@ history_expand(char *str, char **output)
goto loop; goto loop;
} }
len = i - start; len = i - start;
tmp = &str[start]; ADD_STRING(&str[start], len, 0);
ADD_STRING(tmp, len);
if (str[i] == '\0' || str[i] != history_expansion_char) { if (str[i] == '\0' || str[i] != history_expansion_char) {
len = j - i; len = j - i;
tmp = &str[i]; ADD_STRING(&str[i], len, 0);
ADD_STRING(tmp, len);
if (start == 0) if (start == 0)
ret = 0; ret = 0;
else else
...@@ -920,8 +935,11 @@ history_expand(char *str, char **output) ...@@ -920,8 +935,11 @@ history_expand(char *str, char **output)
ret = _history_expand_command (str, i, (j - i), &tmp); ret = _history_expand_command (str, i, (j - i), &tmp);
if (ret > 0 && tmp) { if (ret > 0 && tmp) {
len = strlen(tmp); len = strlen(tmp);
ADD_STRING(tmp, len); ADD_STRING(tmp, len, 1);
}
if (tmp) {
free(tmp); free(tmp);
tmp = NULL;
} }
i = j; i = j;
} }
...@@ -973,23 +991,23 @@ history_arg_extract(int start, int end, const char *str) ...@@ -973,23 +991,23 @@ history_arg_extract(int start, int end, const char *str)
if (start < 0) if (start < 0)
start = end; start = end;
if (start < 0 || end < 0 || start > max || end > max || start > end) if (start < 0 || end < 0 || (size_t)start > max || (size_t)end > max || start > end)
return(NULL); return(NULL);
for (i = start, len = 0; i <= end; i++) for (i = start, len = 0; i <= (size_t)end; i++)
len += strlen(arr[i]) + 1; len += strlen(arr[i]) + 1;
len++; len++;
result = malloc(len); result = malloc(len);
if (result == NULL) if (result == NULL)
return NULL; return NULL;
for (i = start, len = 0; i <= end; i++) { for (i = start, len = 0; i <= (size_t)end; i++) {
(void)strcpy(result + len, arr[i]); (void)strcpy(result + len, arr[i]);
len += strlen(arr[i]); len += strlen(arr[i]);
if (i < end) if (i < (size_t)end)
result[len++] = ' '; result[len++] = ' ';
} }
result[len] = 0; result[len] = '\0';
for (i = 0; arr[i]; i++) for (i = 0; arr[i]; i++)
free(arr[i]); free(arr[i]);
...@@ -1152,7 +1170,7 @@ history_get(int num) ...@@ -1152,7 +1170,7 @@ history_get(int num)
return (NULL); /* error */ return (NULL); /* error */
/* look backwards for event matching specified offset */ /* look backwards for event matching specified offset */
if (history(h, &ev, H_NEXT_EVENT, num)) if (history(h, &ev, H_NEXT_EVENT, num + 1))
return (NULL); return (NULL);
she.line = ev.str; she.line = ev.str;
...@@ -1184,6 +1202,31 @@ add_history(const char *line) ...@@ -1184,6 +1202,31 @@ add_history(const char *line)
} }
/*
* remove the specified entry from the history list and return it.
*/
HIST_ENTRY *
remove_history(int num)
{
HIST_ENTRY *she;
HistEvent ev;
if (h == NULL || e == NULL)
rl_initialize();
if (history(h, &ev, H_DEL, num) != 0)
return NULL;
if ((she = malloc(sizeof(*she))) == NULL)
return NULL;
she->line = ev.str;
she->data = NULL;
return she;
}
/* /*
* clear the history list - delete all entries * clear the history list - delete all entries
*/ */
...@@ -1377,172 +1420,18 @@ history_search_pos(const char *str, ...@@ -1377,172 +1420,18 @@ history_search_pos(const char *str,
/********************************/ /********************************/
/* completion functions */ /* completion functions */
/*
* does tilde expansion of strings of type ``~user/foo''
* if ``user'' isn't valid user name or ``txt'' doesn't start
* w/ '~', returns pointer to strdup()ed copy of ``txt''
*
* it's callers's responsibility to free() returned string
*/
char * char *
tilde_expand(char *txt) tilde_expand(char *name)
{ {
struct passwd *pass; return fn_tilde_expand(name);
char *temp;
size_t len = 0;
if (txt[0] != '~')
return (strdup(txt));
temp = strchr(txt + 1, '/');
if (temp == NULL) {
temp = strdup(txt + 1);
if (temp == NULL)
return NULL;
} else {
len = temp - txt + 1; /* text until string after slash */
temp = malloc(len);
if (temp == NULL)
return NULL;
(void)strncpy(temp, txt + 1, len - 2);
temp[len - 2] = '\0';
}
pass = getpwnam(temp);
free(temp); /* value no more needed */
if (pass == NULL)
return (strdup(txt));
/* update pointer txt to point at string immedially following */
/* first slash */
txt += len;
temp = malloc(strlen(pass->pw_dir) + 1 + strlen(txt) + 1);
if (temp == NULL)
return NULL;
(void)sprintf(temp, "%s/%s", pass->pw_dir, txt);
return (temp);
} }
/*
* return first found file name starting by the ``text'' or NULL if no
* such file can be found
* value of ``state'' is ignored
*
* it's caller's responsibility to free returned string
*/
char * char *
filename_completion_function(const char *text, int state) filename_completion_function(const char *name, int state)
{ {
static DIR *dir = NULL; return fn_filename_completion_function(name, state);
static char *filename = NULL, *dirname = NULL;
static size_t filename_len = 0;
struct dirent *entry;
char *temp;
size_t len;
if (state == 0 || dir == NULL) {
temp = strrchr(text, '/');
if (temp) {
char *nptr;
temp++;
nptr = realloc(filename, strlen(temp) + 1);
if (nptr == NULL) {
free(filename);
return NULL;
}
filename = nptr;
(void)strcpy(filename, temp);
len = temp - text; /* including last slash */
nptr = realloc(dirname, len + 1);
if (nptr == NULL) {
free(filename);
return NULL;
}
dirname = nptr;
(void)strncpy(dirname, text, len);
dirname[len] = '\0';
} else {
if (*text == 0)
filename = NULL;
else {
filename = strdup(text);
if (filename == NULL)
return NULL;
}
dirname = NULL;
}
/* support for ``~user'' syntax */
if (dirname && *dirname == '~') {
char *nptr;
temp = tilde_expand(dirname);
if (temp == NULL)
return NULL;
nptr = realloc(dirname, strlen(temp) + 1);
if (nptr == NULL) {
free(dirname);
return NULL;
}
dirname = nptr;
(void)strcpy(dirname, temp); /* safe */
free(temp); /* no longer needed */
}
/* will be used in cycle */
filename_len = filename ? strlen(filename) : 0;
if (dir != NULL) {
(void)closedir(dir);
dir = NULL;
}
dir = opendir(dirname ? dirname : ".");
if (!dir)
return (NULL); /* cannot open the directory */
}
/* find the match */
while ((entry = readdir(dir)) != NULL) {
/* skip . and .. */
if (entry->d_name[0] == '.' && (!entry->d_name[1]
|| (entry->d_name[1] == '.' && !entry->d_name[2])))
continue;
if (filename_len == 0)
break;
/* otherwise, get first entry where first */
/* filename_len characters are equal */
if (entry->d_name[0] == filename[0]
/* Some dirents have d_namlen, but it is not portable. */
&& strlen(entry->d_name) >= filename_len
&& strncmp(entry->d_name, filename,
filename_len) == 0)
break;
}
if (entry) { /* match found */
struct stat stbuf;
/* Some dirents have d_namlen, but it is not portable. */
len = strlen(entry->d_name) +
((dirname) ? strlen(dirname) : 0) + 1 + 1;
temp = malloc(len);
if (temp == NULL)
return NULL;
(void)sprintf(temp, "%s%s",
dirname ? dirname : "", entry->d_name); /* safe */
/* test, if it's directory */
if (stat(temp, &stbuf) == 0 && S_ISDIR(stbuf.st_mode))
strcat(temp, "/"); /* safe */
} else {
(void)closedir(dir);
dir = NULL;
temp = NULL;
}
return (temp);
} }
/* /*
* a completion generator for usernames; returns _first_ username * a completion generator for usernames; returns _first_ username
* which starts with supplied text * which starts with supplied text
...@@ -1564,6 +1453,7 @@ username_completion_function(const char *text, int state) ...@@ -1564,6 +1453,7 @@ username_completion_function(const char *text, int state)
if (state == 0) if (state == 0)
setpwent(); setpwent();
/* XXXMYSQL: just use non-_r functions for now */
while ((pwd = getpwent()) && text[0] == pwd->pw_name[0] while ((pwd = getpwent()) && text[0] == pwd->pw_name[0]
&& strcmp(text, pwd->pw_name) == 0); && strcmp(text, pwd->pw_name) == 0);
...@@ -1575,16 +1465,6 @@ username_completion_function(const char *text, int state) ...@@ -1575,16 +1465,6 @@ username_completion_function(const char *text, int state)
} }
/*
* el-compatible wrapper around rl_complete; needed for key binding
*/
/* ARGSUSED */
static unsigned char
_el_rl_complete(EditLine *el __attribute__((__unused__)), int ch)
{
return (unsigned char) rl_complete(0, ch);
}
/* /*
* el-compatible wrapper to send TSTP on ^Z * el-compatible wrapper to send TSTP on ^Z
*/ */
...@@ -1596,273 +1476,36 @@ _el_rl_tstp(EditLine *el __attribute__((__unused__)), int ch __attribute__((__un ...@@ -1596,273 +1476,36 @@ _el_rl_tstp(EditLine *el __attribute__((__unused__)), int ch __attribute__((__un
return CC_NORM; return CC_NORM;
} }
/*
* returns list of completions for text given
*/
char **
completion_matches(const char *text, CPFunction *genfunc)
{
char **match_list = NULL, *retstr, *prevstr;
size_t match_list_len, max_equal, which, i;
size_t matches;
if (h == NULL || e == NULL)
rl_initialize();
matches = 0;
match_list_len = 1;
while ((retstr = (*genfunc) (text, (int)matches)) != NULL) {
/* allow for list terminator here */
if (matches + 3 >= match_list_len) {
char **nmatch_list;
while (matches + 3 >= match_list_len)
match_list_len <<= 1;
nmatch_list = realloc(match_list,
match_list_len * sizeof(char *));
if (nmatch_list == NULL) {
free(match_list);
return NULL;
}
match_list = nmatch_list;
}
match_list[++matches] = retstr;
}
if (!match_list)
return NULL; /* nothing found */
/* find least denominator and insert it to match_list[0] */
which = 2;
prevstr = match_list[1];
max_equal = strlen(prevstr);
for (; which <= matches; which++) {
for (i = 0; i < max_equal &&
prevstr[i] == match_list[which][i]; i++)
continue;
max_equal = i;
}
retstr = malloc(max_equal + 1);
if (retstr == NULL) {
free(match_list);
return NULL;
}
(void)strncpy(retstr, match_list[1], max_equal);
retstr[max_equal] = '\0';
match_list[0] = retstr;
/* add NULL as last pointer to the array */
match_list[matches + 1] = (char *) NULL;
return (match_list);
}
/*
* Sort function for qsort(). Just wrapper around strcasecmp().
*/
static int
_rl_qsort_string_compare(i1, i2)
const void *i1, *i2;
{
const char *s1 = ((const char * const *)i1)[0];
const char *s2 = ((const char * const *)i2)[0];
return strcasecmp(s1, s2);
}
/* /*
* Display list of strings in columnar format on readline's output stream. * Display list of strings in columnar format on readline's output stream.
* 'matches' is list of strings, 'len' is number of strings in 'matches', * 'matches' is list of strings, 'len' is number of strings in 'matches',
* 'max' is maximum length of string in 'matches'. * 'max' is maximum length of string in 'matches'.
*/ */
void void
rl_display_match_list (matches, len, max) rl_display_match_list(char **matches, int len, int max)
char **matches;
int len, max;
{ {
int i, idx, limit, count;
int screenwidth = e->el_term.t_size.h;
/* fn_display_match_list(e, matches, len, max);
* Find out how many entries can be put on one line, count
* with two spaces between strings.
*/
limit = screenwidth / (max + 2);
if (limit == 0)
limit = 1;
/* how many lines of output */
count = len / limit;
if (count * limit < len)
count++;
/* Sort the items if they are not already sorted. */
qsort(&matches[1], (size_t)(len - 1), sizeof(char *),
_rl_qsort_string_compare);
idx = 1;
for(; count > 0; count--) {
for(i = 0; i < limit && matches[idx]; i++, idx++)
(void)fprintf(e->el_outfile, "%-*s ", max,
matches[idx]);
(void)fprintf(e->el_outfile, "\n");
}
} }
/* static const char *
* Complete the word at or before point, called by rl_complete() /*ARGSUSED*/
* 'what_to_do' says what to do with the completion. _rl_completion_append_character_function(const char *dummy
* `?' means list the possible completions. __attribute__((__unused__)))
* TAB means do standard completion.
* `*' means insert all of the possible completions.
* `!' means to do standard completion, and list all possible completions if
* there is more than one.
*
* Note: '*' support is not implemented
*/
static int
_rl_complete_internal(int what_to_do)
{ {
CPFunction *complet_func; static char buf[2];
const LineInfo *li; buf[0] = rl_completion_append_character;
char *temp, **matches; buf[1] = '\0';
const char *ctemp; return buf;
size_t len;
rl_completion_type = what_to_do;
if (h == NULL || e == NULL)
rl_initialize();
complet_func = rl_completion_entry_function;
if (!complet_func)
complet_func = filename_completion_function;
/* We now look backwards for the start of a filename/variable word */
li = el_line(e);
ctemp = (const char *) li->cursor;
while (ctemp > li->buffer
&& !strchr(rl_basic_word_break_characters, ctemp[-1])
&& (!rl_special_prefixes
|| !strchr(rl_special_prefixes, ctemp[-1]) ) )
ctemp--;
len = li->cursor - ctemp;
temp = alloca(len + 1);
(void)strncpy(temp, ctemp, len);
temp[len] = '\0';
/* these can be used by function called in completion_matches() */
/* or (*rl_attempted_completion_function)() */
_rl_update_pos();
if (rl_attempted_completion_function) {
int end = li->cursor - li->buffer;
matches = (*rl_attempted_completion_function) (temp, (int)
(end - len), end);
} else
matches = 0;
if (!rl_attempted_completion_function || !matches)
matches = completion_matches(temp, complet_func);
if (matches) {
int i, retval = CC_REFRESH;
int matches_num, maxlen, match_len, match_display=1;
/*
* Only replace the completed string with common part of
* possible matches if there is possible completion.
*/
if (matches[0][0] != '\0') {
el_deletestr(e, (int) len);
el_insertstr(e, matches[0]);
}
if (what_to_do == '?')
goto display_matches;
if (matches[2] == NULL && strcmp(matches[0], matches[1]) == 0) {
/*
* We found exact match. Add a space after
* it, unless we do filename completion and the
* object is a directory.
*/
size_t alen = strlen(matches[0]);
if ((complet_func != filename_completion_function
|| (alen > 0 && (matches[0])[alen - 1] != '/'))
&& rl_completion_append_character) {
char buf[2];
buf[0] = rl_completion_append_character;
buf[1] = '\0';
el_insertstr(e, buf);
}
} else if (what_to_do == '!') {
display_matches:
/*
* More than one match and requested to list possible
* matches.
*/
for(i=1, maxlen=0; matches[i]; i++) {
match_len = strlen(matches[i]);
if (match_len > maxlen)
maxlen = match_len;
}
matches_num = i - 1;
/* newline to get on next line from command line */
(void)fprintf(e->el_outfile, "\n");
/*
* If there are too many items, ask user for display
* confirmation.
*/
if (matches_num > rl_completion_query_items) {
(void)fprintf(e->el_outfile,
"Display all %d possibilities? (y or n) ",
matches_num);
(void)fflush(e->el_outfile);
if (getc(stdin) != 'y')
match_display = 0;
(void)fprintf(e->el_outfile, "\n");
}
if (match_display)
rl_display_match_list(matches, matches_num,
maxlen);
retval = CC_REDISPLAY;
} else if (matches[0][0]) {
/*
* There was some common match, but the name was
* not complete enough. Next tab will print possible
* completions.
*/
el_beep(e);
} else {
/* lcd is not a valid object - further specification */
/* is needed */
el_beep(e);
retval = CC_NORM;
}
/* free elements of array and the array itself */
for (i = 0; matches[i]; i++)
free(matches[i]);
free(matches), matches = NULL;
return (retval);
}
return (CC_NORM);
} }
/* /*
* complete word at current point * complete word at current point
*/ */
/* ARGSUSED */
int int
/*ARGSUSED*/ rl_complete(int ignore __attribute__((__unused__)), int invoking_key)
rl_complete(int ignore, int invoking_key)
{ {
if (h == NULL || e == NULL) if (h == NULL || e == NULL)
rl_initialize(); rl_initialize();
...@@ -1873,15 +1516,26 @@ rl_complete(int ignore, int invoking_key) ...@@ -1873,15 +1516,26 @@ rl_complete(int ignore, int invoking_key)
arr[1] = '\0'; arr[1] = '\0';
el_insertstr(e, arr); el_insertstr(e, arr);
return (CC_REFRESH); return (CC_REFRESH);
} else if (e->el_state.lastcmd == el_rl_complete_cmdnum) }
return _rl_complete_internal('?');
else if (_rl_complete_show_all) /* Just look at how many global variables modify this operation! */
return _rl_complete_internal('!'); return fn_complete(e,
else (CPFunction *)rl_completion_entry_function,
return _rl_complete_internal(TAB); rl_attempted_completion_function,
rl_basic_word_break_characters, rl_special_prefixes,
_rl_completion_append_character_function, rl_completion_query_items,
&rl_completion_type, &rl_attempted_completion_over,
&rl_point, &rl_end);
} }
/* ARGSUSED */
static unsigned char
_el_rl_complete(EditLine *el __attribute__((__unused__)), int ch)
{
return (unsigned char)rl_complete(0, ch);
}
/* /*
* misc other functions * misc other functions
*/ */
...@@ -1989,7 +1643,7 @@ int ...@@ -1989,7 +1643,7 @@ int
rl_add_defun(const char *name, Function *fun, int c) rl_add_defun(const char *name, Function *fun, int c)
{ {
char dest[8]; char dest[8];
if (c >= sizeof(map) / sizeof(map[0]) || c < 0) if ((size_t)c >= sizeof(map) / sizeof(map[0]) || c < 0)
return -1; return -1;
map[(unsigned char)c] = fun; map[(unsigned char)c] = fun;
el_set(e, EL_ADDFN, name, name, rl_bind_wrapper); el_set(e, EL_ADDFN, name, name, rl_bind_wrapper);
...@@ -2007,11 +1661,7 @@ rl_callback_read_char() ...@@ -2007,11 +1661,7 @@ rl_callback_read_char()
if (buf == NULL || count-- <= 0) if (buf == NULL || count-- <= 0)
return; return;
#ifdef CTRL2 /* _AIX */ if (count == 0 && buf[0] == e->el_tty.t_c[TS_IO][C_EOF])
if (count == 0 && buf[0] == CTRL2('d'))
#else
if (count == 0 && buf[0] == CTRL('d'))
#endif
done = 1; done = 1;
if (buf[count] == '\n' || buf[count] == '\r') if (buf[count] == '\n' || buf[count] == '\r')
done = 2; done = 2;
...@@ -2029,14 +1679,12 @@ rl_callback_read_char() ...@@ -2029,14 +1679,12 @@ rl_callback_read_char()
} }
void void
rl_callback_handler_install (const char *prompt, VFunction *linefunc) rl_callback_handler_install(const char *prompt, VCPFunction *linefunc)
{ {
if (e == NULL) { if (e == NULL) {
rl_initialize(); rl_initialize();
} }
if (rl_prompt) (void)rl_set_prompt(prompt);
free(rl_prompt);
rl_prompt = prompt ? strdup(strchr(prompt, *prompt)) : NULL;
rl_linefunc = linefunc; rl_linefunc = linefunc;
el_set(e, EL_UNBUFFERED, 1); el_set(e, EL_UNBUFFERED, 1);
} }
...@@ -2045,17 +1693,14 @@ void ...@@ -2045,17 +1693,14 @@ void
rl_callback_handler_remove(void) rl_callback_handler_remove(void)
{ {
el_set(e, EL_UNBUFFERED, 0); el_set(e, EL_UNBUFFERED, 0);
rl_linefunc = NULL;
} }
void void
rl_redisplay(void) rl_redisplay(void)
{ {
char a[2]; char a[2];
#ifdef CTRL2 /* _AIX */ a[0] = e->el_tty.t_c[TS_IO][C_REPRINT];
a[0] = CTRL2('r');
#else
a[0] = CTRL('r');
#endif
a[1] = '\0'; a[1] = '\0';
el_push(e, a); el_push(e, a);
} }
...@@ -2079,7 +1724,7 @@ rl_prep_terminal(int meta_flag) ...@@ -2079,7 +1724,7 @@ rl_prep_terminal(int meta_flag)
} }
void void
rl_deprep_terminal() rl_deprep_terminal(void)
{ {
el_set(e, EL_PREP_TERM, 0); el_set(e, EL_PREP_TERM, 0);
} }
...@@ -2104,6 +1749,16 @@ rl_parse_and_bind(const char *line) ...@@ -2104,6 +1749,16 @@ rl_parse_and_bind(const char *line)
return (argc ? 1 : 0); return (argc ? 1 : 0);
} }
int
rl_variable_bind(const char *var, const char *value)
{
/*
* The proper return value is undocument, but this is what the
* readline source seems to do.
*/
return ((el_set(e, EL_BIND, "", var, value) == -1) ? 1 : 0);
}
void void
rl_stuff_char(int c) rl_stuff_char(int c)
{ {
...@@ -2119,7 +1774,7 @@ _rl_event_read_char(EditLine *el, char *cp) ...@@ -2119,7 +1774,7 @@ _rl_event_read_char(EditLine *el, char *cp)
{ {
int n, num_read = 0; int n, num_read = 0;
*cp = 0; *cp = '\0';
while (rl_event_hook) { while (rl_event_hook) {
(*rl_event_hook)(); (*rl_event_hook)();
...@@ -2164,3 +1819,142 @@ _rl_update_pos(void) ...@@ -2164,3 +1819,142 @@ _rl_update_pos(void)
rl_point = li->cursor - li->buffer; rl_point = li->cursor - li->buffer;
rl_end = li->lastchar - li->buffer; rl_end = li->lastchar - li->buffer;
} }
void
rl_get_screen_size(int *rows, int *cols)
{
if (rows)
el_get(e, EL_GETTC, "li", rows);
if (cols)
el_get(e, EL_GETTC, "co", cols);
}
void
rl_set_screen_size(int rows, int cols)
{
char buf[64];
(void)snprintf(buf, sizeof(buf), "%d", rows);
el_set(e, EL_SETTC, "li", buf);
(void)snprintf(buf, sizeof(buf), "%d", cols);
el_set(e, EL_SETTC, "co", buf);
}
char **
rl_completion_matches(const char *str, rl_compentry_func_t *fun)
{
size_t len, max, i, j, min;
char **list, *match, *a, *b;
len = 1;
max = 10;
if ((list = malloc(max * sizeof(*list))) == NULL)
return NULL;
while ((match = (*fun)(str, (int)(len - 1))) != NULL) {
if (len == max) {
char **nl;
max += 10;
if ((nl = realloc(list, max * sizeof(*nl))) == NULL)
goto out;
list = nl;
}
list[len++] = match;
}
if (len == 1)
goto out;
list[len] = NULL;
if (len == 2) {
if ((list[0] = strdup(list[1])) == NULL)
goto out;
return list;
}
qsort(&list[1], len - 1, sizeof(*list),
(int (*)(const void *, const void *)) strcmp);
min = SIZE_T_MAX;
for (i = 1, a = list[i]; i < len - 1; i++, a = b) {
b = list[i + 1];
for (j = 0; a[j] && a[j] == b[j]; j++)
continue;
if (min > j)
min = j;
}
if (min == 0 && *str) {
if ((list[0] = strdup(str)) == NULL)
goto out;
} else {
if ((list[0] = malloc(min + 1)) == NULL)
goto out;
(void)memcpy(list[0], list[1], min);
list[0][min] = '\0';
}
return list;
out:
free(list);
return NULL;
}
char *
rl_filename_completion_function (const char *text, int state)
{
return fn_filename_completion_function(text, state);
}
void
rl_forced_update_display(void)
{
el_set(e, EL_REFRESH);
}
int
_rl_abort_internal(void)
{
el_beep(e);
longjmp(topbuf, 1);
/*NOTREACHED*/
}
int
_rl_qsort_string_compare(char **s1, char **s2)
{
return strcoll(*s1, *s2);
}
int
/*ARGSUSED*/
rl_kill_text(int from, int to)
{
return 0;
}
Keymap
rl_make_bare_keymap(void)
{
return NULL;
}
Keymap
rl_get_keymap(void)
{
return NULL;
}
void
/*ARGSUSED*/
rl_set_keymap(Keymap k)
{
}
int
/*ARGSUSED*/
rl_generic_bind(int type, const char * keyseq, const char * data, Keymap k)
{
return 0;
}
int
/*ARGSUSED*/
rl_bind_key_in_map(int key, Function *fun, Keymap k)
{
return 0;
}
/* $NetBSD: readline.h,v 1.12 2004/09/08 18:15:37 christos Exp $ */ /* $NetBSD: readline.h,v 1.24 2009/02/05 19:15:26 christos Exp $ */
/*- /*-
* Copyright (c) 1997 The NetBSD Foundation, Inc. * Copyright (c) 1997 The NetBSD Foundation, Inc.
...@@ -15,13 +15,6 @@ ...@@ -15,13 +15,6 @@
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * 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 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
...@@ -45,14 +38,14 @@ ...@@ -45,14 +38,14 @@
/* typedefs */ /* typedefs */
typedef int Function(const char *, int); typedef int Function(const char *, int);
typedef void VFunction(void); typedef void VFunction(void);
typedef void VCPFunction(char *);
typedef char *CPFunction(const char *, int); typedef char *CPFunction(const char *, int);
typedef char **CPPFunction(const char *, int, int); typedef char **CPPFunction(const char *, int, int);
typedef char *rl_compentry_func_t(const char *, int);
typedef void *histdata_t;
typedef struct _hist_entry { typedef struct _hist_entry {
const char *line; const char *line;
histdata_t *data; const char *data;
} HIST_ENTRY; } HIST_ENTRY;
typedef struct _keymap_entry { typedef struct _keymap_entry {
...@@ -73,7 +66,7 @@ typedef KEYMAP_ENTRY *Keymap; ...@@ -73,7 +66,7 @@ typedef KEYMAP_ENTRY *Keymap;
#ifndef CTRL #ifndef CTRL
#include <sys/ioctl.h> #include <sys/ioctl.h>
#if defined(__GLIBC__) || defined(__MWERKS__) #if !defined(__sun) && !defined(__hpux) && !defined(_AIX)
#include <sys/ttydefaults.h> #include <sys/ttydefaults.h>
#endif #endif
#ifndef CTRL #ifndef CTRL
...@@ -102,8 +95,9 @@ extern int max_input_history; ...@@ -102,8 +95,9 @@ extern int max_input_history;
extern 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 Function *rl_completion_entry_function;
extern CPPFunction *rl_attempted_completion_function; extern CPPFunction *rl_attempted_completion_function;
extern int rl_attempted_completion_over;
extern int rl_completion_type; extern int rl_completion_type;
extern int rl_completion_query_items; extern int rl_completion_query_items;
extern char *rl_special_prefixes; extern char *rl_special_prefixes;
...@@ -122,11 +116,13 @@ extern KEYMAP_ENTRY_ARRAY emacs_standard_keymap, ...@@ -122,11 +116,13 @@ extern KEYMAP_ENTRY_ARRAY emacs_standard_keymap,
emacs_ctlx_keymap; emacs_ctlx_keymap;
extern int rl_filename_completion_desired; extern int rl_filename_completion_desired;
extern int rl_ignore_completion_duplicates; extern int rl_ignore_completion_duplicates;
extern Function *rl_getc_function; extern int (*rl_getc_function)(FILE *);
extern VFunction *rl_redisplay_function; extern VFunction *rl_redisplay_function;
extern VFunction *rl_completion_display_matches_hook; extern VFunction *rl_completion_display_matches_hook;
extern VFunction *rl_prep_term_function; extern VFunction *rl_prep_term_function;
extern VFunction *rl_deprep_term_function; extern VFunction *rl_deprep_term_function;
extern int readline_echoing_p;
extern int _rl_print_completions_horizontally;
/* supported functions */ /* supported functions */
char *readline(const char *); char *readline(const char *);
...@@ -141,6 +137,7 @@ int history_is_stifled(void); ...@@ -141,6 +137,7 @@ int history_is_stifled(void);
int where_history(void); int where_history(void);
HIST_ENTRY *current_history(void); HIST_ENTRY *current_history(void);
HIST_ENTRY *history_get(int); HIST_ENTRY *history_get(int);
HIST_ENTRY *remove_history(int);
int history_total_bytes(void); int history_total_bytes(void);
int history_set_pos(int); int history_set_pos(int);
HIST_ENTRY *previous_history(void); HIST_ENTRY *previous_history(void);
...@@ -168,7 +165,7 @@ void rl_reset_terminal(const char *); ...@@ -168,7 +165,7 @@ void rl_reset_terminal(const char *);
int rl_bind_key(int, int (*)(int, int)); int rl_bind_key(int, int (*)(int, int));
int rl_newline(int, int); int rl_newline(int, int);
void rl_callback_read_char(void); void rl_callback_read_char(void);
void rl_callback_handler_install(const char *, VFunction *); void rl_callback_handler_install(const char *, VCPFunction *);
void rl_callback_handler_remove(void); void rl_callback_handler_remove(void);
void rl_redisplay(void); void rl_redisplay(void);
int rl_get_previous_history(int, int); int rl_get_previous_history(int, int);
...@@ -176,13 +173,24 @@ void rl_prep_terminal(int); ...@@ -176,13 +173,24 @@ void rl_prep_terminal(int);
void rl_deprep_terminal(void); void rl_deprep_terminal(void);
int rl_read_init_file(const char *); int rl_read_init_file(const char *);
int rl_parse_and_bind(const char *); int rl_parse_and_bind(const char *);
int rl_variable_bind(const char *, const char *);
void rl_stuff_char(int); void rl_stuff_char(int);
int rl_add_defun(const char *, Function *, int); int rl_add_defun(const char *, Function *, int);
void rl_get_screen_size(int *, int *);
void rl_set_screen_size(int, int);
char *rl_filename_completion_function (const char *, int);
int _rl_abort_internal(void);
int _rl_qsort_string_compare(char **, char **);
char **rl_completion_matches(const char *, rl_compentry_func_t *);
void rl_forced_update_display(void);
int rl_set_prompt(const char *);
/* /*
* The following are not implemented * The following are not implemented
*/ */
int rl_kill_text(int, int);
Keymap rl_get_keymap(void); Keymap rl_get_keymap(void);
void rl_set_keymap(Keymap);
Keymap rl_make_bare_keymap(void); Keymap rl_make_bare_keymap(void);
int rl_generic_bind(int, const char *, const char *, Keymap); int rl_generic_bind(int, const char *, const char *, Keymap);
int rl_bind_key_in_map(int, Function *, Keymap); int rl_bind_key_in_map(int, Function *, Keymap);
......
/* $NetBSD: refresh.c,v 1.26 2003/08/07 16:44:33 agc Exp $ */ /* $NetBSD: refresh.c,v 1.28 2008/09/10 15:45:37 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -32,7 +32,13 @@ ...@@ -32,7 +32,13 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include <config.h> #include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)refresh.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif /* not lint && not SCCSID */
/* /*
* refresh.c: Lower level screen refreshing functions * refresh.c: Lower level screen refreshing functions
...@@ -49,6 +55,7 @@ private void re_update_line(EditLine *, char *, char *, int); ...@@ -49,6 +55,7 @@ private void re_update_line(EditLine *, char *, char *, int);
private void re_insert (EditLine *, char *, int, int, char *, int); private void re_insert (EditLine *, char *, int, int, char *, int);
private void re_delete(EditLine *, char *, int, int, int); private void re_delete(EditLine *, char *, int, int, int);
private void re_fastputc(EditLine *, int); private void re_fastputc(EditLine *, int);
private void re_clear_eol(EditLine *, int, int, 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);
...@@ -315,9 +322,9 @@ re_goto_bottom(EditLine *el) ...@@ -315,9 +322,9 @@ 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('\n'); term__putc(el, '\n');
re_clear_display(el); re_clear_display(el);
term__flush(); term__flush(el);
} }
...@@ -340,7 +347,7 @@ re_insert(EditLine *el __attribute__((__unused__)), ...@@ -340,7 +347,7 @@ re_insert(EditLine *el __attribute__((__unused__)),
ELRE_DEBUG(1, ELRE_DEBUG(1,
(__F, "re_insert() starting: %d at %d max %d, d == \"%s\"\n", (__F, "re_insert() starting: %d at %d max %d, d == \"%s\"\n",
num, dat, dlen, d)); num, dat, dlen, d));
ELRE_DEBUG(1, (__F, "s == \"%s\"n", s)); ELRE_DEBUG(1, (__F, "s == \"%s\"\n", s));
/* open up the space for num chars */ /* open up the space for num chars */
if (num > 0) { if (num > 0) {
...@@ -353,7 +360,7 @@ re_insert(EditLine *el __attribute__((__unused__)), ...@@ -353,7 +360,7 @@ re_insert(EditLine *el __attribute__((__unused__)),
ELRE_DEBUG(1, (__F, ELRE_DEBUG(1, (__F,
"re_insert() after insert: %d at %d max %d, d == \"%s\"\n", "re_insert() after insert: %d at %d max %d, d == \"%s\"\n",
num, dat, dlen, d)); num, dat, dlen, d));
ELRE_DEBUG(1, (__F, "s == \"%s\"n", s)); ELRE_DEBUG(1, (__F, "s == \"%s\"\n", s));
/* copy the characters */ /* copy the characters */
for (a = d + dat; (a < d + dlen) && (num > 0); num--) for (a = d + dat; (a < d + dlen) && (num > 0); num--)
...@@ -362,7 +369,7 @@ re_insert(EditLine *el __attribute__((__unused__)), ...@@ -362,7 +369,7 @@ re_insert(EditLine *el __attribute__((__unused__)),
ELRE_DEBUG(1, ELRE_DEBUG(1,
(__F, "re_insert() after copy: %d at %d max %d, %s == \"%s\"\n", (__F, "re_insert() after copy: %d at %d max %d, %s == \"%s\"\n",
num, dat, dlen, d, s)); num, dat, dlen, d, s));
ELRE_DEBUG(1, (__F, "s == \"%s\"n", s)); ELRE_DEBUG(1, (__F, "s == \"%s\"\n", s));
} }
...@@ -411,6 +418,32 @@ re__strncopy(char *a, char *b, size_t n) ...@@ -411,6 +418,32 @@ re__strncopy(char *a, char *b, size_t n)
*a++ = *b++; *a++ = *b++;
} }
/* re_clear_eol():
* Find the number of characters we need to clear till the end of line
* in order to make sure that we have cleared the previous contents of
* the line. fx and sx is the number of characters inserted or deleted
* int the first or second diff, diff is the difference between the
* number of characters between the new and old line.
*/
private void
re_clear_eol(EditLine *el, int fx, int sx, int diff)
{
ELRE_DEBUG(1, (__F, "re_clear_eol sx %d, fx %d, diff %d\n",
sx, fx, diff));
if (fx < 0)
fx = -fx;
if (sx < 0)
sx = -sx;
if (fx > diff)
diff = fx;
if (sx > diff)
diff = sx;
ELRE_DEBUG(1, (__F, "re_clear_eol %d\n", diff));
term_clear_EOL(el, diff);
}
/***************************************************************** /*****************************************************************
re_update_line() is based on finding the middle difference of each line re_update_line() is based on finding the middle difference of each line
...@@ -626,7 +659,7 @@ re_update_line(EditLine *el, char *old, char *new, int i) ...@@ -626,7 +659,7 @@ re_update_line(EditLine *el, char *old, char *new, int i)
fx = (nsb - nfd) - (osb - ofd); fx = (nsb - nfd) - (osb - ofd);
sx = (nls - nse) - (ols - ose); sx = (nls - nse) - (ols - ose);
ELRE_DEBUG(1, (__F, "\n")); ELRE_DEBUG(1, (__F, "fx %d, sx %d\n", fx, sx));
ELRE_DEBUG(1, (__F, "ofd %d, osb %d, ose %d, ols %d, oe %d\n", ELRE_DEBUG(1, (__F, "ofd %d, osb %d, ose %d, ols %d, oe %d\n",
ofd - old, osb - old, ose - old, ols - old, oe - old)); ofd - old, osb - old, ose - old, ols - old, oe - old));
ELRE_DEBUG(1, (__F, "nfd %d, nsb %d, nse %d, nls %d, ne %d\n", ELRE_DEBUG(1, (__F, "nfd %d, nsb %d, nse %d, nls %d, ne %d\n",
...@@ -775,9 +808,7 @@ re_update_line(EditLine *el, char *old, char *new, int i) ...@@ -775,9 +808,7 @@ re_update_line(EditLine *el, char *old, char *new, int i)
* write (nsb-nfd) chars of new starting at nfd * write (nsb-nfd) chars of new starting at nfd
*/ */
term_overwrite(el, nfd, (nsb - nfd)); term_overwrite(el, nfd, (nsb - nfd));
ELRE_DEBUG(1, (__F, re_clear_eol(el, fx, sx, (oe - old) - (ne - new));
"cleareol %d\n", (oe - old) - (ne - new)));
term_clear_EOL(el, (oe - old) - (ne - new));
/* /*
* Done * Done
*/ */
...@@ -818,10 +849,7 @@ re_update_line(EditLine *el, char *old, char *new, int i) ...@@ -818,10 +849,7 @@ re_update_line(EditLine *el, char *old, char *new, int i)
ELRE_DEBUG(1, (__F, ELRE_DEBUG(1, (__F,
"but with nothing left to save\r\n")); "but with nothing left to save\r\n"));
term_overwrite(el, nse, (nls - nse)); term_overwrite(el, nse, (nls - nse));
ELRE_DEBUG(1, (__F, re_clear_eol(el, fx, sx, (oe - old) - (ne - new));
"cleareol %d\n", (oe - old) - (ne - new)));
if ((oe - old) - (ne - new) != 0)
term_clear_EOL(el, (oe - old) - (ne - new));
} }
} }
/* /*
...@@ -982,7 +1010,7 @@ re_refresh_cursor(EditLine *el) ...@@ -982,7 +1010,7 @@ re_refresh_cursor(EditLine *el)
/* now go there */ /* now go there */
term_move_to_line(el, v); term_move_to_line(el, v);
term_move_to_char(el, h); term_move_to_char(el, h);
term__flush(); term__flush(el);
} }
...@@ -993,7 +1021,7 @@ private void ...@@ -993,7 +1021,7 @@ private void
re_fastputc(EditLine *el, int c) re_fastputc(EditLine *el, int c)
{ {
term__putc(c); term__putc(el, c);
el->el_display[el->el_cursor.v][el->el_cursor.h++] = c; el->el_display[el->el_cursor.v][el->el_cursor.h++] = c;
if (el->el_cursor.h >= el->el_term.t_size.h) { if (el->el_cursor.h >= el->el_term.t_size.h) {
/* if we must overflow */ /* if we must overflow */
...@@ -1020,12 +1048,12 @@ re_fastputc(EditLine *el, int c) ...@@ -1020,12 +1048,12 @@ re_fastputc(EditLine *el, int c)
} }
if (EL_HAS_AUTO_MARGINS) { if (EL_HAS_AUTO_MARGINS) {
if (EL_HAS_MAGIC_MARGINS) { if (EL_HAS_MAGIC_MARGINS) {
term__putc(' '); term__putc(el, ' ');
term__putc('\b'); term__putc(el, '\b');
} }
} else { } else {
term__putc('\r'); term__putc(el, '\r');
term__putc('\n'); term__putc(el, '\n');
} }
} }
} }
...@@ -1065,7 +1093,7 @@ re_fastaddc(EditLine *el) ...@@ -1065,7 +1093,7 @@ re_fastaddc(EditLine *el)
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(el);
} }
...@@ -1104,7 +1132,7 @@ re_clear_lines(EditLine *el) ...@@ -1104,7 +1132,7 @@ re_clear_lines(EditLine *el)
} else { } else {
term_move_to_line(el, el->el_refresh.r_oldcv); term_move_to_line(el, el->el_refresh.r_oldcv);
/* go to last line */ /* go to last line */
term__putc('\r'); /* go to BOL */ term__putc(el, '\r'); /* go to BOL */
term__putc('\n'); /* go to new line */ term__putc(el, '\n'); /* go to new line */
} }
} }
...@@ -32,12 +32,17 @@ ...@@ -32,12 +32,17 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include <config.h> #include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)search.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif /* not lint && not SCCSID */
/* /*
* search.c: History and character search functions * search.c: History and character search functions
*/ */
#include <sys/types.h>
#include <stdlib.h> #include <stdlib.h>
#if defined(REGEX) #if defined(REGEX)
#include <regex.h> #include <regex.h>
......
/* $NetBSD: sig.c,v 1.11 2003/08/07 16:44:33 agc Exp $ */ /* $NetBSD: sig.c,v 1.12 2008/09/10 15:45:37 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -32,7 +32,13 @@ ...@@ -32,7 +32,13 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include <config.h> #include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)sig.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif /* not lint && not SCCSID */
/* /*
* sig.c: Signal handling stuff. * sig.c: Signal handling stuff.
...@@ -51,15 +57,15 @@ private const int sighdl[] = { ...@@ -51,15 +57,15 @@ private const int sighdl[] = {
- 1 - 1
}; };
private void sig_handler(int); private void el_sig_handler(int);
/* sig_handler(): /* el_sig_handler():
* This is the handler called for all signals * This is the handler called for all signals
* XXX: we cannot pass any data so we just store the old editline * XXX: we cannot pass any data so we just store the old editline
* state in a private variable * state in a private variable
*/ */
private void private void
sig_handler(int signo) el_sig_handler(int signo)
{ {
int i; int i;
sigset_t nset, oset; sigset_t nset, oset;
...@@ -73,7 +79,7 @@ sig_handler(int signo) ...@@ -73,7 +79,7 @@ sig_handler(int signo)
tty_rawmode(sel); tty_rawmode(sel);
if (ed_redisplay(sel, 0) == CC_REFRESH) if (ed_redisplay(sel, 0) == CC_REFRESH)
re_refresh(sel); re_refresh(sel);
term__flush(); term__flush(sel);
break; break;
case SIGWINCH: case SIGWINCH:
...@@ -154,7 +160,7 @@ sig_set(EditLine *el) ...@@ -154,7 +160,7 @@ sig_set(EditLine *el)
for (i = 0; sighdl[i] != -1; i++) { for (i = 0; sighdl[i] != -1; i++) {
el_signalhandler_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], el_sig_handler)) != el_sig_handler)
el->el_signal[i] = s; el->el_signal[i] = s;
} }
sel = el; sel = el;
......
/* $NetBSD: sig.h,v 1.5 2003/08/07 16:44:33 agc Exp $ */ /* $NetBSD: sig.h,v 1.6 2008/07/12 15:27:14 christos Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -51,7 +51,6 @@ ...@@ -51,7 +51,6 @@
#define ALLSIGS \ #define ALLSIGS \
_DO(SIGINT) \ _DO(SIGINT) \
_DO(SIGTSTP) \ _DO(SIGTSTP) \
_DO(SIGSTOP) \
_DO(SIGQUIT) \ _DO(SIGQUIT) \
_DO(SIGHUP) \ _DO(SIGHUP) \
_DO(SIGTERM) \ _DO(SIGTERM) \
......
...@@ -48,14 +48,14 @@ ...@@ -48,14 +48,14 @@
# define __attribute__(A) # define __attribute__(A)
#endif #endif
#ifndef __P
# define __P(x) x
#endif
#ifndef _DIAGASSERT #ifndef _DIAGASSERT
# define _DIAGASSERT(x) # define _DIAGASSERT(x)
#endif #endif
#ifndef SIZE_T_MAX
# define SIZE_T_MAX UINT_MAX
#endif
#ifndef __BEGIN_DECLS #ifndef __BEGIN_DECLS
# ifdef __cplusplus # ifdef __cplusplus
# define __BEGIN_DECLS extern "C" { # define __BEGIN_DECLS extern "C" {
...@@ -113,6 +113,25 @@ char *fgetln(FILE *fp, size_t *len); ...@@ -113,6 +113,25 @@ char *fgetln(FILE *fp, size_t *len);
#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 */
#ifdef __SunOS
extern int tgetent(char *, const char *);
extern int tgetflag(char *);
extern int tgetnum(char *);
extern int tputs(const char *, int, int (*)(int));
extern char* tgoto(const char*, int, int);
extern char* tgetstr(char*, char**);
#endif
/* XXXMYSQL: Bug#10218 Command line recall rolls into segfault */
#if !HAVE_DECL_TGOTO
/*
'tgoto' is not declared in the system header files, this causes
problems on 64-bit systems. The function returns a 64 bit pointer
but caller see it as "int" and it's thus truncated to 32-bit
*/
extern char* tgoto(const char*, int, int);
#endif
#ifdef notdef #ifdef notdef
# undef REGEX # undef REGEX
# undef REGEXP # undef REGEXP
......
/* $NetBSD: term.c,v 1.40 2004/05/22 23:21:28 christos Exp $ */ /* $NetBSD: term.c,v 1.48 2009/02/06 20:08:13 sketch Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -32,7 +32,13 @@ ...@@ -32,7 +32,13 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include <config.h> #include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)term.c 8.2 (Berkeley) 4/30/95";
#else
#endif
#endif /* not lint && not SCCSID */
/* /*
* term.c: Editor/termcap-curses interface * term.c: Editor/termcap-curses interface
...@@ -44,21 +50,28 @@ ...@@ -44,21 +50,28 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#if 0 /* TODO: do we need this */
#ifdef HAVE_TERMCAP_H
#include <termcap.h>
#endif
#endif
#ifdef HAVE_CURSES_H #ifdef HAVE_CURSES_H
# include <curses.h> #include <curses.h>
#elif HAVE_NCURSES_H #endif
# include <ncurses.h> #ifdef HAVE_NCURSES_H
#include <ncurses.h>
#endif #endif
/* Solaris's term.h does horrid things. */ /* Solaris's term.h does horrid things. */
#if (defined(HAVE_TERM_H) && !defined(_SUNOS)) #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>
#ifdef _REENTRANT
#include <pthread.h>
#endif
#include "el.h" #include "el.h"
/* /*
...@@ -263,9 +276,13 @@ private int term_alloc_display(EditLine *); ...@@ -263,9 +276,13 @@ private int term_alloc_display(EditLine *);
private void term_alloc(EditLine *, const struct termcapstr *, const char *); private void term_alloc(EditLine *, const struct termcapstr *, const char *);
private void term_init_arrow(EditLine *); private void term_init_arrow(EditLine *);
private void term_reset_arrow(EditLine *); private void term_reset_arrow(EditLine *);
private int term_putc(int);
private void term_tputs(EditLine *, const char *, int);
#ifdef _REENTRANT
private FILE *term_outfile = NULL; /* XXX: How do we fix that? */ private pthread_mutex_t term_mutex = PTHREAD_MUTEX_INITIALIZER;
#endif
private FILE *term_outfile = NULL;
/* term_setflags(): /* term_setflags():
...@@ -313,7 +330,6 @@ term_setflags(EditLine *el) ...@@ -313,7 +330,6 @@ term_setflags(EditLine *el)
#endif /* DEBUG_SCREEN */ #endif /* DEBUG_SCREEN */
} }
/* term_init(): /* term_init():
* Initialize the terminal stuff * Initialize the terminal stuff
*/ */
...@@ -339,7 +355,6 @@ term_init(EditLine *el) ...@@ -339,7 +355,6 @@ term_init(EditLine *el)
if (el->el_term.t_val == NULL) if (el->el_term.t_val == NULL)
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;
(void) term_set(el, NULL); (void) term_set(el, NULL);
term_init_arrow(el); term_init_arrow(el);
return (0); return (0);
...@@ -390,7 +405,8 @@ term_alloc(EditLine *el, const struct termcapstr *t, const char *cap) ...@@ -390,7 +405,8 @@ term_alloc(EditLine *el, const struct termcapstr *t, const char *cap)
* New string is shorter; no need to allocate space * New string is shorter; no need to allocate space
*/ */
if (clen <= tlen) { if (clen <= tlen) {
(void) strcpy(*str, cap); /* XXX strcpy is safe */ if (*str)
(void) strcpy(*str, cap); /* XXX strcpy is safe */
return; return;
} }
/* /*
...@@ -464,8 +480,12 @@ term_alloc_display(EditLine *el) ...@@ -464,8 +480,12 @@ term_alloc_display(EditLine *el)
return (-1); return (-1);
for (i = 0; i < c->v; i++) { for (i = 0; i < c->v; i++) {
b[i] = (char *) el_malloc((size_t) (sizeof(char) * (c->h + 1))); b[i] = (char *) el_malloc((size_t) (sizeof(char) * (c->h + 1)));
if (b[i] == NULL) if (b[i] == NULL) {
while (--i >= 0)
el_free((ptr_t) b[i]);
el_free((ptr_t) b);
return (-1); return (-1);
}
} }
b[c->v] = NULL; b[c->v] = NULL;
el->el_display = b; el->el_display = b;
...@@ -475,8 +495,12 @@ term_alloc_display(EditLine *el) ...@@ -475,8 +495,12 @@ term_alloc_display(EditLine *el)
return (-1); return (-1);
for (i = 0; i < c->v; i++) { for (i = 0; i < c->v; i++) {
b[i] = (char *) el_malloc((size_t) (sizeof(char) * (c->h + 1))); b[i] = (char *) el_malloc((size_t) (sizeof(char) * (c->h + 1)));
if (b[i] == NULL) if (b[i] == NULL) {
while (--i >= 0)
el_free((ptr_t) b[i]);
el_free((ptr_t) b);
return (-1); return (-1);
}
} }
b[c->v] = NULL; b[c->v] = NULL;
el->el_vdisplay = b; el->el_vdisplay = b;
...@@ -542,12 +566,12 @@ term_move_to_line(EditLine *el, int where) ...@@ -542,12 +566,12 @@ term_move_to_line(EditLine *el, int where)
del--; del--;
} else { } else {
if ((del > 1) && GoodStr(T_DO)) { if ((del > 1) && GoodStr(T_DO)) {
(void) tputs(tgoto(Str(T_DO), del, del), term_tputs(el, tgoto(Str(T_DO), del,
del, term__putc); del), del);
del = 0; del = 0;
} else { } else {
for (; del > 0; del--) for (; del > 0; del--)
term__putc('\n'); term__putc(el, '\n');
/* because the \n will become \r\n */ /* because the \n will become \r\n */
el->el_cursor.h = 0; el->el_cursor.h = 0;
} }
...@@ -555,12 +579,11 @@ term_move_to_line(EditLine *el, int where) ...@@ -555,12 +579,11 @@ term_move_to_line(EditLine *el, int where)
} }
} else { /* del < 0 */ } else { /* del < 0 */
if (GoodStr(T_UP) && (-del > 1 || !GoodStr(T_up))) if (GoodStr(T_UP) && (-del > 1 || !GoodStr(T_up)))
(void) tputs(tgoto(Str(T_UP), -del, -del), -del, term_tputs(el, tgoto(Str(T_UP), -del, -del), -del);
term__putc);
else { else {
if (GoodStr(T_up)) if (GoodStr(T_up))
for (; del < 0; del++) for (; del < 0; del++)
(void) tputs(Str(T_up), 1, term__putc); term_tputs(el, Str(T_up), 1);
} }
} }
el->el_cursor.v = where;/* now where is here */ el->el_cursor.v = where;/* now where is here */
...@@ -587,7 +610,7 @@ term_move_to_char(EditLine *el, int where) ...@@ -587,7 +610,7 @@ term_move_to_char(EditLine *el, int where)
return; return;
} }
if (!where) { /* if where is first column */ if (!where) { /* if where is first column */
term__putc('\r'); /* do a CR */ term__putc(el, '\r'); /* do a CR */
el->el_cursor.h = 0; el->el_cursor.h = 0;
return; return;
} }
...@@ -595,12 +618,11 @@ term_move_to_char(EditLine *el, int where) ...@@ -595,12 +618,11 @@ term_move_to_char(EditLine *el, int where)
if ((del < -4 || del > 4) && GoodStr(T_ch)) if ((del < -4 || del > 4) && GoodStr(T_ch))
/* go there directly */ /* go there directly */
(void) tputs(tgoto(Str(T_ch), where, where), where, term__putc); term_tputs(el, tgoto(Str(T_ch), where, where), where);
else { else {
if (del > 0) { /* moving forward */ if (del > 0) { /* moving forward */
if ((del > 4) && GoodStr(T_RI)) if ((del > 4) && GoodStr(T_RI))
(void) tputs(tgoto(Str(T_RI), del, del), term_tputs(el, tgoto(Str(T_RI), del, del), del);
del, term__putc);
else { else {
/* if I can do tabs, use them */ /* if I can do tabs, use them */
if (EL_CAN_TAB) { if (EL_CAN_TAB) {
...@@ -611,7 +633,7 @@ term_move_to_char(EditLine *el, int where) ...@@ -611,7 +633,7 @@ term_move_to_char(EditLine *el, int where)
(el->el_cursor.h & 0370); (el->el_cursor.h & 0370);
i < (where & 0370); i < (where & 0370);
i += 8) i += 8)
term__putc('\t'); term__putc(el, '\t');
/* then tab over */ /* then tab over */
el->el_cursor.h = where & 0370; el->el_cursor.h = where & 0370;
} }
...@@ -631,8 +653,8 @@ term_move_to_char(EditLine *el, int where) ...@@ -631,8 +653,8 @@ term_move_to_char(EditLine *el, int where)
} }
} else { /* del < 0 := moving backward */ } else { /* del < 0 := moving backward */
if ((-del > 4) && GoodStr(T_LE)) if ((-del > 4) && GoodStr(T_LE))
(void) tputs(tgoto(Str(T_LE), -del, -del), term_tputs(el, tgoto(Str(T_LE), -del, -del),
-del, term__putc); -del);
else { /* can't go directly there */ else { /* can't go directly there */
/* /*
* if the "cost" is greater than the "cost" * if the "cost" is greater than the "cost"
...@@ -643,12 +665,12 @@ term_move_to_char(EditLine *el, int where) ...@@ -643,12 +665,12 @@ term_move_to_char(EditLine *el, int where)
(((unsigned int) where >> 3) + (((unsigned int) where >> 3) +
(where & 07))) (where & 07)))
: (-del > where)) { : (-del > where)) {
term__putc('\r'); /* do a CR */ term__putc(el, '\r'); /* do a CR */
el->el_cursor.h = 0; el->el_cursor.h = 0;
goto mc_again; /* and try again */ goto mc_again; /* and try again */
} }
for (i = 0; i < -del; i++) for (i = 0; i < -del; i++)
term__putc('\b'); term__putc(el, '\b');
} }
} }
} }
...@@ -673,7 +695,7 @@ term_overwrite(EditLine *el, const char *cp, int n) ...@@ -673,7 +695,7 @@ term_overwrite(EditLine *el, const char *cp, int n)
return; return;
} }
do { do {
term__putc(*cp++); term__putc(el, *cp++);
el->el_cursor.h++; el->el_cursor.h++;
} while (--n); } while (--n);
...@@ -689,7 +711,7 @@ term_overwrite(EditLine *el, const char *cp, int n) ...@@ -689,7 +711,7 @@ term_overwrite(EditLine *el, const char *cp, int n)
!= '\0') != '\0')
term_overwrite(el, &c, 1); term_overwrite(el, &c, 1);
else else
term__putc(' '); term__putc(el, ' ');
el->el_cursor.h = 1; el->el_cursor.h = 1;
} }
} else /* no wrap, but cursor stays on screen */ } else /* no wrap, but cursor stays on screen */
...@@ -723,19 +745,18 @@ term_deletechars(EditLine *el, int num) ...@@ -723,19 +745,18 @@ term_deletechars(EditLine *el, int num)
if (GoodStr(T_DC)) /* if I have multiple delete */ if (GoodStr(T_DC)) /* if I have multiple delete */
if ((num > 1) || !GoodStr(T_dc)) { /* if dc would be more if ((num > 1) || !GoodStr(T_dc)) { /* if dc would be more
* expen. */ * expen. */
(void) tputs(tgoto(Str(T_DC), num, num), term_tputs(el, tgoto(Str(T_DC), num, num), num);
num, term__putc);
return; return;
} }
if (GoodStr(T_dm)) /* if I have delete mode */ if (GoodStr(T_dm)) /* if I have delete mode */
(void) tputs(Str(T_dm), 1, term__putc); term_tputs(el, Str(T_dm), 1);
if (GoodStr(T_dc)) /* else do one at a time */ if (GoodStr(T_dc)) /* else do one at a time */
while (num--) while (num--)
(void) tputs(Str(T_dc), 1, term__putc); term_tputs(el, Str(T_dc), 1);
if (GoodStr(T_ed)) /* if I have delete mode */ if (GoodStr(T_ed)) /* if I have delete mode */
(void) tputs(Str(T_ed), 1, term__putc); term_tputs(el, Str(T_ed), 1);
} }
...@@ -764,37 +785,35 @@ term_insertwrite(EditLine *el, char *cp, int num) ...@@ -764,37 +785,35 @@ term_insertwrite(EditLine *el, char *cp, int num)
if (GoodStr(T_IC)) /* if I have multiple insert */ if (GoodStr(T_IC)) /* if I have multiple insert */
if ((num > 1) || !GoodStr(T_ic)) { if ((num > 1) || !GoodStr(T_ic)) {
/* if ic would be more expensive */ /* if ic would be more expensive */
(void) tputs(tgoto(Str(T_IC), num, num), term_tputs(el, tgoto(Str(T_IC), num, num), num);
num, term__putc);
term_overwrite(el, cp, num); term_overwrite(el, cp, num);
/* this updates el_cursor.h */ /* this updates el_cursor.h */
return; return;
} }
if (GoodStr(T_im) && GoodStr(T_ei)) { /* if I have insert mode */ if (GoodStr(T_im) && GoodStr(T_ei)) { /* if I have insert mode */
(void) tputs(Str(T_im), 1, term__putc); term_tputs(el, Str(T_im), 1);
el->el_cursor.h += num; el->el_cursor.h += num;
do do
term__putc(*cp++); term__putc(el, *cp++);
while (--num); while (--num);
if (GoodStr(T_ip)) /* have to make num chars insert */ if (GoodStr(T_ip)) /* have to make num chars insert */
(void) tputs(Str(T_ip), 1, term__putc); term_tputs(el, Str(T_ip), 1);
(void) tputs(Str(T_ei), 1, term__putc); term_tputs(el, Str(T_ei), 1);
return; return;
} }
do { do {
if (GoodStr(T_ic)) /* have to make num chars insert */ if (GoodStr(T_ic)) /* have to make num chars insert */
(void) tputs(Str(T_ic), 1, term__putc); term_tputs(el, Str(T_ic), 1);
/* insert a char */
term__putc(*cp++); term__putc(el, *cp++);
el->el_cursor.h++; el->el_cursor.h++;
if (GoodStr(T_ip)) /* have to make num chars insert */ if (GoodStr(T_ip)) /* have to make num chars insert */
(void) tputs(Str(T_ip), 1, term__putc); term_tputs(el, Str(T_ip), 1);
/* pad the inserted char */ /* pad the inserted char */
} while (--num); } while (--num);
...@@ -810,10 +829,10 @@ term_clear_EOL(EditLine *el, int num) ...@@ -810,10 +829,10 @@ term_clear_EOL(EditLine *el, int num)
int i; int i;
if (EL_CAN_CEOL && GoodStr(T_ce)) if (EL_CAN_CEOL && GoodStr(T_ce))
(void) tputs(Str(T_ce), 1, term__putc); term_tputs(el, Str(T_ce), 1);
else { else {
for (i = 0; i < num; i++) for (i = 0; i < num; i++)
term__putc(' '); term__putc(el, ' ');
el->el_cursor.h += num; /* have written num spaces */ el->el_cursor.h += num; /* have written num spaces */
} }
} }
...@@ -828,14 +847,14 @@ term_clear_screen(EditLine *el) ...@@ -828,14 +847,14 @@ term_clear_screen(EditLine *el)
if (GoodStr(T_cl)) if (GoodStr(T_cl))
/* send the clear screen code */ /* send the clear screen code */
(void) tputs(Str(T_cl), Val(T_li), term__putc); term_tputs(el, Str(T_cl), Val(T_li));
else if (GoodStr(T_ho) && GoodStr(T_cd)) { else if (GoodStr(T_ho) && GoodStr(T_cd)) {
(void) tputs(Str(T_ho), Val(T_li), term__putc); /* home */ term_tputs(el, Str(T_ho), Val(T_li)); /* home */
/* clear to bottom of screen */ /* clear to bottom of screen */
(void) tputs(Str(T_cd), Val(T_li), term__putc); term_tputs(el, Str(T_cd), Val(T_li));
} else { } else {
term__putc('\r'); term__putc(el, '\r');
term__putc('\n'); term__putc(el, '\n');
} }
} }
...@@ -848,9 +867,9 @@ term_beep(EditLine *el) ...@@ -848,9 +867,9 @@ term_beep(EditLine *el)
{ {
if (GoodStr(T_bl)) if (GoodStr(T_bl))
/* what termcap says we should use */ /* what termcap says we should use */
(void) tputs(Str(T_bl), 1, term__putc); term_tputs(el, Str(T_bl), 1);
else else
term__putc('\007'); /* an ASCII bell; ^G */ term__putc(el, '\007'); /* an ASCII bell; ^G */
} }
...@@ -862,9 +881,9 @@ protected void ...@@ -862,9 +881,9 @@ protected void
term_clear_to_bottom(EditLine *el) term_clear_to_bottom(EditLine *el)
{ {
if (GoodStr(T_cd)) if (GoodStr(T_cd))
(void) tputs(Str(T_cd), Val(T_li), term__putc); term_tputs(el, Str(T_cd), Val(T_li));
else if (GoodStr(T_ce)) else if (GoodStr(T_ce))
(void) tputs(Str(T_ce), Val(T_li), term__putc); term_tputs(el, Str(T_ce), Val(T_li));
} }
#endif #endif
...@@ -936,7 +955,7 @@ term_set(EditLine *el, const char *term) ...@@ -936,7 +955,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++) {
/* XXX: some systems tgetstr needs non const */ /* XXX: some systems' tgetstr needs non const */
term_alloc(el, t, tgetstr(strchr(t->name, *t->name), term_alloc(el, t, tgetstr(strchr(t->name, *t->name),
&area)); &area));
} }
...@@ -1220,26 +1239,62 @@ term_bind_arrow(EditLine *el) ...@@ -1220,26 +1239,62 @@ term_bind_arrow(EditLine *el)
} }
} }
/* term_putc():
* Add a character
*/
private int
term_putc(int c)
{
if (term_outfile == NULL)
return -1;
return fputc(c, term_outfile);
}
private void
term_tputs(EditLine *el, const char *cap, int affcnt)
{
#ifdef _REENTRANT
pthread_mutex_lock(&term_mutex);
#endif
term_outfile = el->el_outfile;
(void)tputs(cap, affcnt, term_putc);
#ifdef _REENTRANT
pthread_mutex_unlock(&term_mutex);
#endif
}
/* term__putc(): /* term__putc():
* Add a character * Add a character
*/ */
protected int protected int
term__putc(int c) term__putc(EditLine *el, int c)
{ {
return (fputc(c, term_outfile)); return fputc(c, el->el_outfile);
} }
/* term__flush(): /* term__flush():
* Flush output * Flush output
*/ */
protected void protected void
term__flush(void) term__flush(EditLine *el)
{ {
(void) fflush(term_outfile); (void) fflush(el->el_outfile);
}
/* term_writec():
* Write the given character out, in a human readable form
*/
protected void
term_writec(EditLine *el, int c)
{
char buf[8];
int cnt = key__decode_char(buf, sizeof(buf), 0, c);
buf[cnt] = '\0';
term_overwrite(el, buf, cnt);
term__flush(el);
} }
...@@ -1269,11 +1324,17 @@ term_telltc(EditLine *el, int argc __attribute__((__unused__)), ...@@ -1269,11 +1324,17 @@ term_telltc(EditLine *el, int argc __attribute__((__unused__)),
(void) fprintf(el->el_outfile, "\tIt %s magic margins\n", (void) fprintf(el->el_outfile, "\tIt %s magic margins\n",
EL_HAS_MAGIC_MARGINS ? "has" : "does not have"); EL_HAS_MAGIC_MARGINS ? "has" : "does not have");
for (t = tstr, ts = el->el_term.t_str; t->name != NULL; t++, ts++) for (t = tstr, ts = el->el_term.t_str; t->name != NULL; t++, ts++) {
const char *ub;
if (*ts && **ts) {
(void) key__decode_str(*ts, upbuf, sizeof(upbuf), "");
ub = upbuf;
} else {
ub = "(empty)";
}
(void) fprintf(el->el_outfile, "\t%25s (%s) == %s\n", (void) fprintf(el->el_outfile, "\t%25s (%s) == %s\n",
t->long_name, t->long_name, t->name, ub);
t->name, *ts && **ts ? }
key__decode_str(*ts, upbuf, "") : "(empty)");
(void) fputc('\n', el->el_outfile); (void) fputc('\n', el->el_outfile);
return (0); return (0);
} }
...@@ -1292,7 +1353,7 @@ term_settc(EditLine *el, int argc __attribute__((__unused__)), ...@@ -1292,7 +1353,7 @@ term_settc(EditLine *el, int argc __attribute__((__unused__)),
const char *what, *how; const char *what, *how;
if (argv == NULL || argv[1] == NULL || argv[2] == NULL) if (argv == NULL || argv[1] == NULL || argv[2] == NULL)
return (-1); return -1;
what = argv[1]; what = argv[1];
how = argv[2]; how = argv[2];
...@@ -1307,7 +1368,7 @@ term_settc(EditLine *el, int argc __attribute__((__unused__)), ...@@ -1307,7 +1368,7 @@ term_settc(EditLine *el, int argc __attribute__((__unused__)),
if (ts->name != NULL) { if (ts->name != NULL) {
term_alloc(el, ts, how); term_alloc(el, ts, how);
term_setflags(el); term_setflags(el);
return (0); return 0;
} }
/* /*
* Do the numeric ones second * Do the numeric ones second
...@@ -1316,46 +1377,100 @@ term_settc(EditLine *el, int argc __attribute__((__unused__)), ...@@ -1316,46 +1377,100 @@ term_settc(EditLine *el, int argc __attribute__((__unused__)),
if (strcmp(tv->name, what) == 0) if (strcmp(tv->name, what) == 0)
break; break;
if (tv->name != NULL) { if (tv->name != NULL)
if (tv == &tval[T_pt] || tv == &tval[T_km] || return -1;
tv == &tval[T_am] || tv == &tval[T_xn]) {
if (strcmp(how, "yes") == 0)
el->el_term.t_val[tv - tval] = 1;
else if (strcmp(how, "no") == 0)
el->el_term.t_val[tv - tval] = 0;
else {
(void) fprintf(el->el_errfile,
"settc: Bad value `%s'.\n", how);
return (-1);
}
term_setflags(el);
if (term_change_size(el, Val(T_li), Val(T_co)) == -1)
return (-1);
return (0);
} else {
long i;
char *ep;
i = strtol(how, &ep, 10); if (tv == &tval[T_pt] || tv == &tval[T_km] ||
if (*ep != '\0') { tv == &tval[T_am] || tv == &tval[T_xn]) {
(void) fprintf(el->el_errfile, if (strcmp(how, "yes") == 0)
"settc: Bad value `%s'.\n", how); el->el_term.t_val[tv - tval] = 1;
return (-1); else if (strcmp(how, "no") == 0)
} el->el_term.t_val[tv - tval] = 0;
el->el_term.t_val[tv - tval] = (int) i; else {
el->el_term.t_size.v = Val(T_co); (void) fprintf(el->el_errfile,
el->el_term.t_size.h = Val(T_li); "%s: Bad value `%s'.\n", argv[0], how);
if (tv == &tval[T_co] || tv == &tval[T_li]) return -1;
if (term_change_size(el, Val(T_li), Val(T_co)) }
== -1) term_setflags(el);
return (-1); if (term_change_size(el, Val(T_li), Val(T_co)) == -1)
return (0); return -1;
return 0;
} else {
long i;
char *ep;
i = strtol(how, &ep, 10);
if (*ep != '\0') {
(void) fprintf(el->el_errfile,
"%s: Bad value `%s'.\n", argv[0], how);
return -1;
} }
el->el_term.t_val[tv - tval] = (int) i;
el->el_term.t_size.v = Val(T_co);
el->el_term.t_size.h = Val(T_li);
if (tv == &tval[T_co] || tv == &tval[T_li])
if (term_change_size(el, Val(T_li), Val(T_co))
== -1)
return -1;
return 0;
} }
return (-1);
} }
/* term_gettc():
* Get the current terminal characteristics
*/
protected int
/*ARGSUSED*/
term_gettc(EditLine *el, int argc __attribute__((__unused__)), char **argv)
{
const struct termcapstr *ts;
const struct termcapval *tv;
char *what;
void *how;
if (argv == NULL || argv[1] == NULL || argv[2] == NULL)
return (-1);
what = argv[1];
how = argv[2];
/*
* Do the strings first
*/
for (ts = tstr; ts->name != NULL; ts++)
if (strcmp(ts->name, what) == 0)
break;
if (ts->name != NULL) {
*(char **)how = el->el_term.t_str[ts - tstr];
return 0;
}
/*
* Do the numeric ones second
*/
for (tv = tval; tv->name != NULL; tv++)
if (strcmp(tv->name, what) == 0)
break;
if (tv->name == NULL)
return -1;
if (tv == &tval[T_pt] || tv == &tval[T_km] ||
tv == &tval[T_am] || tv == &tval[T_xn]) {
static char yes[] = "yes";
static char no[] = "no";
if (el->el_term.t_val[tv - tval])
*(char **)how = yes;
else
*(char **)how = no;
return 0;
} else {
*(int *)how = el->el_term.t_val[tv - tval];
return 0;
}
}
/* term_echotc(): /* term_echotc():
* Print the termcap string out with variable substitution * Print the termcap string out with variable substitution
*/ */
...@@ -1441,7 +1556,7 @@ term_echotc(EditLine *el, int argc __attribute__((__unused__)), ...@@ -1441,7 +1556,7 @@ term_echotc(EditLine *el, int argc __attribute__((__unused__)),
break; break;
} }
if (t->name == NULL) { if (t->name == NULL) {
/* XXX: some systems tgetstr needs non const */ /* XXX: some systems' tgetstr needs non const */
scap = tgetstr(strchr(*argv, **argv), &area); scap = tgetstr(strchr(*argv, **argv), &area);
} }
if (!scap || scap[0] == '\0') { if (!scap || scap[0] == '\0') {
...@@ -1494,7 +1609,7 @@ term_echotc(EditLine *el, int argc __attribute__((__unused__)), ...@@ -1494,7 +1609,7 @@ term_echotc(EditLine *el, int argc __attribute__((__unused__)),
*argv); *argv);
return (-1); return (-1);
} }
(void) tputs(scap, 1, term__putc); term_tputs(el, scap, 1);
break; break;
case 1: case 1:
argv++; argv++;
...@@ -1522,7 +1637,7 @@ term_echotc(EditLine *el, int argc __attribute__((__unused__)), ...@@ -1522,7 +1637,7 @@ term_echotc(EditLine *el, int argc __attribute__((__unused__)),
*argv); *argv);
return (-1); return (-1);
} }
(void) tputs(tgoto(scap, arg_cols, arg_rows), 1, term__putc); term_tputs(el, tgoto(scap, arg_cols, arg_rows), 1);
break; break;
default: default:
/* This is wrong, but I will ignore it... */ /* This is wrong, but I will ignore it... */
...@@ -1578,8 +1693,7 @@ term_echotc(EditLine *el, int argc __attribute__((__unused__)), ...@@ -1578,8 +1693,7 @@ term_echotc(EditLine *el, int argc __attribute__((__unused__)),
*argv); *argv);
return (-1); return (-1);
} }
(void) tputs(tgoto(scap, arg_cols, arg_rows), arg_rows, term_tputs(el, tgoto(scap, arg_cols, arg_rows), arg_rows);
term__putc);
break; break;
} }
return (0); return (0);
......
...@@ -32,7 +32,13 @@ ...@@ -32,7 +32,13 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include <config.h> #include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)tokenizer.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif /* not lint && not SCCSID */
/* /*
* tokenize.c: Bourne shell like tokenizer * tokenize.c: Bourne shell like tokenizer
......
/* $NetBSD: tty.c,v 1.21 2004/08/13 12:10:39 mycroft Exp $ */ /* $NetBSD: tty.c,v 1.28 2009/02/06 19:53:23 sketch Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -32,18 +32,25 @@ ...@@ -32,18 +32,25 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include <config.h> #include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)tty.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif /* not lint && not SCCSID */
/* /*
* tty.c: tty interface stuff * tty.c: tty interface stuff
*/ */
#include <assert.h> #include <assert.h>
#include <errno.h>
#include "tty.h" #include "tty.h"
#include "el.h" #include "el.h"
typedef struct ttymodes_t { typedef struct ttymodes_t {
const char *m_name; const char *m_name;
u_int m_value; unsigned int m_value;
int m_type; int m_type;
} ttymodes_t; } ttymodes_t;
...@@ -438,13 +445,12 @@ private const ttymodes_t ttymodes[] = { ...@@ -438,13 +445,12 @@ private const ttymodes_t ttymodes[] = {
#define tty_getty(el, td) tcgetattr((el)->el_infd, (td))
#define tty_setty(el, td) tcsetattr((el)->el_infd, TCSADRAIN, (td))
#define tty__gettabs(td) ((((td)->c_oflag & TAB3) == TAB3) ? 0 : 1) #define tty__gettabs(td) ((((td)->c_oflag & TAB3) == TAB3) ? 0 : 1)
#define tty__geteightbit(td) (((td)->c_cflag & CSIZE) == CS8) #define tty__geteightbit(td) (((td)->c_cflag & CSIZE) == CS8)
#define tty__cooked_mode(td) ((td)->c_lflag & ICANON) #define tty__cooked_mode(td) ((td)->c_lflag & ICANON)
private int tty_getty(EditLine *, struct termios *);
private int tty_setty(EditLine *, int, const struct termios *);
private int tty__getcharindex(int); private int tty__getcharindex(int);
private void tty__getchar(struct termios *, unsigned char *); private void tty__getchar(struct termios *, unsigned char *);
private void tty__setchar(struct termios *, unsigned char *); private void tty__setchar(struct termios *, unsigned char *);
...@@ -453,6 +459,29 @@ private int tty_setup(EditLine *); ...@@ -453,6 +459,29 @@ private int tty_setup(EditLine *);
#define t_qu t_ts #define t_qu t_ts
/* tty_getty():
* Wrapper for tcgetattr to handle EINTR
*/
private int
tty_getty(EditLine *el, struct termios *t)
{
int rv;
while ((rv = tcgetattr(el->el_infd, t)) == -1 && errno == EINTR)
continue;
return rv;
}
/* tty_setty():
* Wrapper for tcsetattr to handle EINTR
*/
private int
tty_setty(EditLine *el, int action, const struct termios *t)
{
int rv;
while ((rv = tcsetattr(el->el_infd, action, t)) == -1 && errno == EINTR)
continue;
return rv;
}
/* tty_setup(): /* tty_setup():
* Get the tty parameters and initialize the editing state * Get the tty parameters and initialize the editing state
...@@ -514,7 +543,7 @@ tty_setup(EditLine *el) ...@@ -514,7 +543,7 @@ tty_setup(EditLine *el)
el->el_tty.t_c[TS_IO][rst]; el->el_tty.t_c[TS_IO][rst];
} }
tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]); tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]);
if (tty_setty(el, &el->el_tty.t_ex) == -1) { if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ex) == -1) {
#ifdef DEBUG_TTY #ifdef DEBUG_TTY
(void) fprintf(el->el_errfile, (void) fprintf(el->el_errfile,
"tty_setup: tty_setty: %s\n", "tty_setup: tty_setty: %s\n",
...@@ -522,8 +551,11 @@ tty_setup(EditLine *el) ...@@ -522,8 +551,11 @@ tty_setup(EditLine *el)
#endif /* DEBUG_TTY */ #endif /* DEBUG_TTY */
return (-1); return (-1);
} }
} else }
#ifdef notdef
else
tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]); tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]);
#endif
el->el_tty.t_ed.c_iflag &= ~el->el_tty.t_t[ED_IO][MD_INP].t_clrmask; el->el_tty.t_ed.c_iflag &= ~el->el_tty.t_t[ED_IO][MD_INP].t_clrmask;
el->el_tty.t_ed.c_iflag |= el->el_tty.t_t[ED_IO][MD_INP].t_setmask; el->el_tty.t_ed.c_iflag |= el->el_tty.t_t[ED_IO][MD_INP].t_setmask;
...@@ -1040,7 +1072,7 @@ tty_rawmode(EditLine *el) ...@@ -1040,7 +1072,7 @@ tty_rawmode(EditLine *el)
} }
} }
} }
if (tty_setty(el, &el->el_tty.t_ed) == -1) { if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ed) == -1) {
#ifdef DEBUG_TTY #ifdef DEBUG_TTY
(void) fprintf(el->el_errfile, "tty_rawmode: tty_setty: %s\n", (void) fprintf(el->el_errfile, "tty_rawmode: tty_setty: %s\n",
strerror(errno)); strerror(errno));
...@@ -1065,7 +1097,7 @@ tty_cookedmode(EditLine *el) ...@@ -1065,7 +1097,7 @@ tty_cookedmode(EditLine *el)
if (el->el_flags & EDIT_DISABLED) if (el->el_flags & EDIT_DISABLED)
return (0); return (0);
if (tty_setty(el, &el->el_tty.t_ex) == -1) { if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ex) == -1) {
#ifdef DEBUG_TTY #ifdef DEBUG_TTY
(void) fprintf(el->el_errfile, (void) fprintf(el->el_errfile,
"tty_cookedmode: tty_setty: %s\n", "tty_cookedmode: tty_setty: %s\n",
...@@ -1101,7 +1133,7 @@ tty_quotemode(EditLine *el) ...@@ -1101,7 +1133,7 @@ tty_quotemode(EditLine *el)
el->el_tty.t_qu.c_lflag &= ~el->el_tty.t_t[QU_IO][MD_LIN].t_clrmask; el->el_tty.t_qu.c_lflag &= ~el->el_tty.t_t[QU_IO][MD_LIN].t_clrmask;
el->el_tty.t_qu.c_lflag |= el->el_tty.t_t[QU_IO][MD_LIN].t_setmask; el->el_tty.t_qu.c_lflag |= el->el_tty.t_t[QU_IO][MD_LIN].t_setmask;
if (tty_setty(el, &el->el_tty.t_qu) == -1) { if (tty_setty(el, TCSADRAIN, &el->el_tty.t_qu) == -1) {
#ifdef DEBUG_TTY #ifdef DEBUG_TTY
(void) fprintf(el->el_errfile, "QuoteModeOn: tty_setty: %s\n", (void) fprintf(el->el_errfile, "QuoteModeOn: tty_setty: %s\n",
strerror(errno)); strerror(errno));
...@@ -1122,7 +1154,7 @@ tty_noquotemode(EditLine *el) ...@@ -1122,7 +1154,7 @@ tty_noquotemode(EditLine *el)
if (el->el_tty.t_mode != QU_IO) if (el->el_tty.t_mode != QU_IO)
return (0); return (0);
if (tty_setty(el, &el->el_tty.t_ed) == -1) { if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ed) == -1) {
#ifdef DEBUG_TTY #ifdef DEBUG_TTY
(void) fprintf(el->el_errfile, "QuoteModeOff: tty_setty: %s\n", (void) fprintf(el->el_errfile, "QuoteModeOff: tty_setty: %s\n",
strerror(errno)); strerror(errno));
...@@ -1193,10 +1225,14 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv) ...@@ -1193,10 +1225,14 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv)
st = len = st = len =
strlen(el->el_tty.t_t[z][m->m_type].t_name); strlen(el->el_tty.t_t[z][m->m_type].t_name);
} }
x = (el->el_tty.t_t[z][i].t_setmask & m->m_value) if (i != -1) {
? '+' : '\0'; x = (el->el_tty.t_t[z][i].t_setmask & m->m_value)
x = (el->el_tty.t_t[z][i].t_clrmask & m->m_value) ? '+' : '\0';
? '-' : x; x = (el->el_tty.t_t[z][i].t_clrmask & m->m_value)
? '-' : x;
} else {
x = '\0';
}
if (x != '\0' || aflag) { if (x != '\0' || aflag) {
...@@ -1221,7 +1257,7 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv) ...@@ -1221,7 +1257,7 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv)
return (0); return (0);
} }
while (argv && (s = *argv++)) { while (argv && (s = *argv++)) {
char *p; const char *p;
switch (*s) { switch (*s) {
case '+': case '+':
case '-': case '-':
...@@ -1232,10 +1268,10 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv) ...@@ -1232,10 +1268,10 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv)
break; break;
} }
d = s; d = s;
if ((p = strchr(s, '=')) != NULL) p = strchr(s, '=');
*p++ = '\0';
for (m = ttymodes; m->m_name; m++) for (m = ttymodes; m->m_name; m++)
if (strcmp(m->m_name, d) == 0 && if ((p ? strncmp(m->m_name, d, (size_t)(p - d)) :
strcmp(m->m_name, d)) == 0 &&
(p == NULL || m->m_type == MD_CHAR)) (p == NULL || m->m_type == MD_CHAR))
break; break;
...@@ -1246,7 +1282,7 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv) ...@@ -1246,7 +1282,7 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv)
} }
if (p) { if (p) {
int c = ffs((int)m->m_value); int c = ffs((int)m->m_value);
int v = *p ? parse__escape((const char **const) &p) : int v = *++p ? parse__escape((const char **) &p) :
el->el_tty.t_vdisable; el->el_tty.t_vdisable;
assert(c-- != 0); assert(c-- != 0);
c = tty__getcharindex(c); c = tty__getcharindex(c);
...@@ -1269,6 +1305,17 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv) ...@@ -1269,6 +1305,17 @@ tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv)
break; break;
} }
} }
if (el->el_tty.t_mode == z) {
if (tty_setty(el, TCSADRAIN, tios) == -1) {
#ifdef DEBUG_TTY
(void) fprintf(el->el_errfile,
"tty_stty: tty_setty: %s\n", strerror(errno));
#endif /* DEBUG_TTY */
return (-1);
}
}
return (0); return (0);
} }
......
/* $NetBSD: tty.h,v 1.10 2003/08/07 16:44:34 agc Exp $ */ /* $NetBSD: tty.h,v 1.11 2005/06/01 11:37:52 lukem Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -450,8 +450,8 @@ ...@@ -450,8 +450,8 @@
typedef struct { typedef struct {
const char *t_name; const char *t_name;
u_int t_setmask; unsigned int t_setmask;
u_int t_clrmask; unsigned int t_clrmask;
} ttyperm_t[NN_IO][MD_NN]; } ttyperm_t[NN_IO][MD_NN];
typedef unsigned char ttychar_t[NN_IO][C_NCC]; typedef unsigned char ttychar_t[NN_IO][C_NCC];
......
/* $NetBSD: vi.c,v 1.20 2004/08/13 12:10:39 mycroft Exp $ */ /* $NetBSD: vi.c,v 1.28 2009/02/06 13:14:37 sketch Exp $ */
/*- /*-
* Copyright (c) 1992, 1993 * Copyright (c) 1992, 1993
...@@ -32,11 +32,17 @@ ...@@ -32,11 +32,17 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#include <config.h> #include "config.h"
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <sys/wait.h> #include <sys/wait.h>
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)vi.c 8.1 (Berkeley) 6/4/93";
#else
#endif
#endif /* not lint && not SCCSID */
/* /*
* vi.c: Vi mode commands. * vi.c: Vi mode commands.
...@@ -64,8 +70,10 @@ cv_action(EditLine *el, int c) ...@@ -64,8 +70,10 @@ cv_action(EditLine *el, int c)
el->el_line.lastchar - 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_line.lastchar = el->el_line.buffer; if (!(c & YANK)) {
el->el_line.cursor = el->el_line.buffer; el->el_line.lastchar = el->el_line.buffer;
el->el_line.cursor = el->el_line.buffer;
}
if (c & INSERT) if (c & INSERT)
el->el_map.current = el->el_map.key; el->el_map.current = el->el_map.key;
...@@ -82,7 +90,6 @@ cv_action(EditLine *el, int c) ...@@ -82,7 +90,6 @@ cv_action(EditLine *el, int c)
private el_action_t private el_action_t
cv_paste(EditLine *el, int c) cv_paste(EditLine *el, int c)
{ {
char *ptr;
c_kill_t *k = &el->el_chared.c_kill; c_kill_t *k = &el->el_chared.c_kill;
int len = k->last - k->buf; int len = k->last - k->buf;
...@@ -96,12 +103,12 @@ cv_paste(EditLine *el, int c) ...@@ -96,12 +103,12 @@ cv_paste(EditLine *el, int c)
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;
c_insert(el, len); c_insert(el, len);
if (el->el_line.cursor + len > el->el_line.lastchar) if (el->el_line.cursor + len > el->el_line.lastchar)
return (CC_ERROR); return (CC_ERROR);
(void) memcpy(ptr, k->buf, len +0u); (void) memcpy(el->el_line.cursor, k->buf, len +0u);
return (CC_REFRESH); return (CC_REFRESH);
} }
...@@ -592,13 +599,12 @@ vi_delete_prev_char(EditLine *el, int c __attribute__((__unused__))) ...@@ -592,13 +599,12 @@ vi_delete_prev_char(EditLine *el, int c __attribute__((__unused__)))
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
vi_list_or_eof(EditLine *el, int c __attribute__((__unused__))) vi_list_or_eof(EditLine *el, int c)
{ {
if (el->el_line.cursor == el->el_line.lastchar) { if (el->el_line.cursor == el->el_line.lastchar) {
if (el->el_line.cursor == el->el_line.buffer) { if (el->el_line.cursor == el->el_line.buffer) {
term_overwrite(el, STReof, 4); /* then do a EOF */ term_writec(el, c); /* then do a EOF */
term__flush();
return (CC_EOF); return (CC_EOF);
} else { } else {
/* /*
...@@ -888,7 +894,7 @@ vi_yank(EditLine *el, int c) ...@@ -888,7 +894,7 @@ vi_yank(EditLine *el, int c)
/* vi_comment_out(): /* vi_comment_out():
* Vi comment out current command * Vi comment out current command
* [c] * [#]
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
...@@ -905,18 +911,19 @@ vi_comment_out(EditLine *el, int c) ...@@ -905,18 +911,19 @@ vi_comment_out(EditLine *el, int c)
/* vi_alias(): /* vi_alias():
* Vi include shell alias * Vi include shell alias
* [@] * [@]
* NB: posix impiles that we should enter insert mode, however * NB: posix implies that we should enter insert mode, however
* this is against historical precedent... * this is against historical precedent...
*/ */
#if defined(__weak_reference) && !defined(__FreeBSD__)
extern char *get_alias_text(const char *) __weak_reference(get_alias_text);
#endif
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
vi_alias(EditLine *el, int c) vi_alias(EditLine *el, int c)
{ {
#ifdef __weak_extern #if defined(__weak_reference) && !defined(__FreeBSD__)
char alias_name[3]; char alias_name[3];
char *alias_text; char *alias_text;
extern char *get_alias_text(const char *);
__weak_extern(get_alias_text);
if (get_alias_text == 0) { if (get_alias_text == 0) {
return CC_ERROR; return CC_ERROR;
...@@ -1014,7 +1021,7 @@ vi_histedit(EditLine *el, int c) ...@@ -1014,7 +1021,7 @@ vi_histedit(EditLine *el, int c)
return CC_ERROR; return CC_ERROR;
case 0: case 0:
close(fd); close(fd);
execlp("vi", "vi", tempfile, (char *) NULL); execlp("vi", "vi", tempfile, (char *)NULL);
exit(0); exit(0);
/*NOTREACHED*/ /*NOTREACHED*/
default: default:
......
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