Sync libedit with recent NetBSD developments. Including improvements to the

vi-mode, removal of clause 3, cleanups and the export of the tokenization
functions.

Not included: config.h, filecomplete.{c,h}
This commit is contained in:
Stefan Farfeleder 2005-08-07 20:55:59 +00:00
parent 515faf2fbe
commit 76d00450e6
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=148834
39 changed files with 2417 additions and 1499 deletions

View File

@ -13,11 +13,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,7 +30,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)histedit.h 8.2 (Berkeley) 1/3/94 * @(#)histedit.h 8.2 (Berkeley) 1/3/94
* $NetBSD: histedit.h,v 1.15 2000/02/28 17:41:05 chopps Exp $ * $NetBSD: histedit.h,v 1.28 2005/07/14 15:00:58 christos Exp $
* $FreeBSD$ * $FreeBSD$
*/ */
@ -52,6 +48,7 @@ __BEGIN_DECLS
/* /*
* ==== Editing ==== * ==== Editing ====
*/ */
typedef struct editline EditLine; typedef struct editline EditLine;
/* /*
@ -63,7 +60,6 @@ typedef struct lineinfo {
const char *lastchar; const char *lastchar;
} LineInfo; } LineInfo;
/* /*
* EditLine editor function return codes. * EditLine editor function return codes.
* For user-defined function interface * For user-defined function interface
@ -83,16 +79,15 @@ typedef struct lineinfo {
* Initialization, cleanup, and resetting * Initialization, cleanup, and resetting
*/ */
EditLine *el_init(const char *, FILE *, FILE *, FILE *); EditLine *el_init(const char *, FILE *, FILE *, FILE *);
void el_reset(EditLine *);
void el_end(EditLine *); void el_end(EditLine *);
void el_reset(EditLine *);
/* /*
* Get a line, a character or push a string back in the input queue * Get a line, a character or push a string back in the input queue
*/ */
const char *el_gets(EditLine *, int *); const char *el_gets(EditLine *, int *);
int el_getc(EditLine *, char *); int el_getc(EditLine *, char *);
void el_push(EditLine *, const char *); void el_push(EditLine *, char *);
/* /*
* Beep! * Beep!
@ -103,13 +98,16 @@ void el_beep(EditLine *);
* High level function internals control * High level function internals control
* Parses argc, argv array and executes builtin editline commands * Parses argc, argv array and executes builtin editline commands
*/ */
int el_parse(EditLine *, int, char **); 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, void *);
#if 0
unsigned char _el_fn_complete(EditLine *, int);
#endif
/* /*
* el_set/el_get parameters * el_set/el_get parameters
@ -128,6 +126,12 @@ int el_get(EditLine *, int, void *);
#define EL_HIST 10 /* , hist_fun_t, const char *); */ #define EL_HIST 10 /* , hist_fun_t, const char *); */
#define EL_EDITMODE 11 /* , int); */ #define EL_EDITMODE 11 /* , int); */
#define EL_RPROMPT 12 /* , el_pfunc_t); */ #define EL_RPROMPT 12 /* , el_pfunc_t); */
#define EL_GETCFN 13 /* , el_rfunc_t); */
#define EL_CLIENTDATA 14 /* , void *); */
#define EL_UNBUFFERED 15 /* , int); */
#define EL_PREP_TERM 16 /* , int); */
#define EL_BUILTIN_GETCFN (NULL)
/* /*
* Source named file or $PWD/.editrc or $HOME/.editrc * Source named file or $PWD/.editrc or $HOME/.editrc
@ -155,6 +159,7 @@ const LineInfo *el_line(EditLine *);
int el_insertstr(EditLine *, const char *); int el_insertstr(EditLine *, const char *);
void el_deletestr(EditLine *, int); void el_deletestr(EditLine *, int);
/* /*
* ==== History ==== * ==== History ====
*/ */
@ -183,7 +188,7 @@ int history(History *, HistEvent *, int, ...);
#define H_PREV 5 /* , void); */ #define H_PREV 5 /* , void); */
#define H_NEXT 6 /* , void); */ #define H_NEXT 6 /* , void); */
#define H_CURR 8 /* , const int); */ #define H_CURR 8 /* , const int); */
#define H_SET 7 /* , void); */ #define H_SET 7 /* , int); */
#define H_ADD 9 /* , const char *); */ #define H_ADD 9 /* , const char *); */
#define H_ENTER 10 /* , const char *); */ #define H_ENTER 10 /* , const char *); */
#define H_APPEND 11 /* , const char *); */ #define H_APPEND 11 /* , const char *); */
@ -195,6 +200,27 @@ int history(History *, HistEvent *, int, ...);
#define H_LOAD 17 /* , const char *); */ #define H_LOAD 17 /* , const char *); */
#define H_SAVE 18 /* , const char *); */ #define H_SAVE 18 /* , const char *); */
#define H_CLEAR 19 /* , void); */ #define H_CLEAR 19 /* , void); */
#define H_SETUNIQUE 20 /* , int); */
#define H_GETUNIQUE 21 /* , void); */
#define H_DEL 22 /* , int); */
/*
* ==== Tokenization ====
*/
typedef struct tokenizer Tokenizer;
/*
* String tokenization functions, using simplified sh(1) quoting rules
*/
Tokenizer *tok_init(const char *);
void tok_end(Tokenizer *);
void tok_reset(Tokenizer *);
int tok_line(Tokenizer *, const LineInfo *,
int *, const char ***, int *, int *);
int tok_str(Tokenizer *, const char *,
int *, const char ***);
__END_DECLS __END_DECLS

View File

@ -1,4 +1,4 @@
# $NetBSD: Makefile,v 1.19 2000/08/15 12:01:40 mrg Exp $ # $NetBSD: Makefile,v 1.34 2005/05/28 12:02:53 lukem Exp $
# @(#)Makefile 8.1 (Berkeley) 6/4/93 # @(#)Makefile 8.1 (Berkeley) 6/4/93
# $FreeBSD$ # $FreeBSD$
@ -20,7 +20,9 @@ MLINKS= editline.3 el_deletestr.3 editline.3 el_end.3 editline.3 el_init.3 \
editline.3 history_init.3 editline.3 el_insertstr.3 \ editline.3 history_init.3 editline.3 el_insertstr.3 \
editline.3 el_line.3 editline.3 el_parse.3 editline.3 el_push.3 \ editline.3 el_line.3 editline.3 el_parse.3 editline.3 el_push.3 \
editline.3 el_reset.3 editline.3 el_resize.3 editline.3 el_set.3 \ editline.3 el_reset.3 editline.3 el_resize.3 editline.3 el_set.3 \
editline.3 el_source.3 editline.3 el_source.3 \
editline.3 tok_init.3 editline.3 tok_end.3 editline.3 tok_reset.3 \
editline.3 tok_line.3 editline.3 tok_str.3
# For speed and debugging # For speed and debugging
#SRCS= ${OSRCS} tokenizer.c history.c #SRCS= ${OSRCS} tokenizer.c history.c
@ -31,7 +33,7 @@ CLEANFILES+= common.h editline.c emacs.h fcns.c fcns.h help.c help.h vi.h
CFLAGS+= -I. -I${.CURDIR} CFLAGS+= -I. -I${.CURDIR}
CFLAGS+= #-DDEBUG_TTY -DDEBUG_KEY -DDEBUG_READ -DDEBUG -DDEBUG_REFRESH CFLAGS+= #-DDEBUG_TTY -DDEBUG_KEY -DDEBUG_READ -DDEBUG -DDEBUG_REFRESH
CFLAGS+= #-DDEBUG_PASTE CFLAGS+= #-DDEBUG_PASTE -DDEBUG_EDIT
AHDR= vi.h emacs.h common.h AHDR= vi.h emacs.h common.h
ASRC= ${.CURDIR}/vi.c ${.CURDIR}/emacs.c ${.CURDIR}/common.c ASRC= ${.CURDIR}/vi.c ${.CURDIR}/emacs.c ${.CURDIR}/common.c

View File

@ -13,11 +13,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.
* *
@ -43,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1992, 1993\n\
#if !defined(lint) && !defined(SCCSID) #if !defined(lint) && !defined(SCCSID)
static char sccsid[] = "@(#)test.c 8.1 (Berkeley) 6/4/93"; static char sccsid[] = "@(#)test.c 8.1 (Berkeley) 6/4/93";
#endif /* not lint && not SCCSID */ #endif /* not lint && not SCCSID */
__RCSID("$NetBSD: test.c,v 1.8 1999/09/21 00:07:03 lukem Exp $"); __RCSID("$NetBSD: test.c,v 1.18 2005/06/01 11:37:52 lukem Exp $");
__FBSDID("$FreeBSD$"); __FBSDID("$FreeBSD$");
/* /*
@ -60,12 +56,11 @@ __FBSDID("$FreeBSD$");
#include <dirent.h> #include <dirent.h>
#include "histedit.h" #include "histedit.h"
#include "tokenizer.h"
static int continuation = 0; static int continuation = 0;
static EditLine *el = NULL; volatile sig_atomic_t gotsig = 0;
static u_char complete(EditLine *, int); static unsigned char complete(EditLine *, int);
int main(int, char **); int main(int, char **);
static char *prompt(EditLine *); static char *prompt(EditLine *);
static void sig(int); static void sig(int);
@ -73,8 +68,8 @@ static void sig(int);
static char * static char *
prompt(EditLine *el) prompt(EditLine *el)
{ {
static char a[] = "Edit$"; static char a[] = "Edit$ ";
static char b[] = "Edit>"; static char b[] = "Edit> ";
return (continuation ? b : a); return (continuation ? b : a);
} }
@ -82,9 +77,7 @@ prompt(EditLine *el)
static void static void
sig(int i) sig(int i)
{ {
gotsig = i;
(void) fprintf(stderr, "Got signal %d.\n", i);
el_reset(el);
} }
static unsigned char static unsigned char
@ -99,7 +92,8 @@ complete(EditLine *el, int ch)
/* /*
* Find the last word * Find the last word
*/ */
for (ptr = lf->cursor - 1; !isspace(*ptr) && ptr > lf->buffer; ptr--) for (ptr = lf->cursor - 1;
!isspace((unsigned char)*ptr) && ptr > lf->buffer; ptr--)
continue; continue;
len = lf->cursor - ++ptr; len = lf->cursor - ++ptr;
@ -122,10 +116,14 @@ complete(EditLine *el, int ch)
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
EditLine *el = NULL;
int num; int num;
const char *buf; const char *buf;
Tokenizer *tok; Tokenizer *tok;
int lastevent = 0, ncontinuation; #if 0
int lastevent = 0;
#endif
int ncontinuation;
History *hist; History *hist;
HistEvent ev; HistEvent ev;
@ -169,17 +167,41 @@ main(int argc, char *argv[])
el_source(el, NULL); el_source(el, NULL);
while ((buf = el_gets(el, &num)) != NULL && num != 0) { while ((buf = el_gets(el, &num)) != NULL && num != 0) {
int ac; int ac, cc, co;
char **av;
#ifdef DEBUG #ifdef DEBUG
(void) fprintf(stderr, "got %d %s", num, buf); int i;
#endif #endif
const char **av;
const LineInfo *li;
li = el_line(el);
#ifdef DEBUG
(void) fprintf(stderr, "==> got %d %s", num, buf);
(void) fprintf(stderr, " > li `%.*s_%.*s'\n",
(li->cursor - li->buffer), li->buffer,
(li->lastchar - 1 - li->cursor),
(li->cursor >= li->lastchar) ? "" : li->cursor);
#endif
if (gotsig) {
(void) fprintf(stderr, "Got signal %d.\n", gotsig);
gotsig = 0;
el_reset(el);
}
if (!continuation && num == 1) if (!continuation && num == 1)
continue; continue;
if (tok_line(tok, buf, &ac, &av) > 0) ac = cc = co = 0;
ncontinuation = 1; ncontinuation = tok_line(tok, li, &ac, &av, &cc, &co);
if (ncontinuation < 0) {
(void) fprintf(stderr, "Internal error\n");
continuation = 0;
continue;
}
#ifdef DEBUG
(void) fprintf(stderr, " > nc %d ac %d cc %d co %d\n",
ncontinuation, ac, cc, co);
#endif
#if 0 #if 0
if (continuation) { if (continuation) {
/* /*
@ -187,7 +209,7 @@ main(int argc, char *argv[])
* moved around in history. * moved around in history.
*/ */
if (history(hist, &ev, H_SET, lastevent) == -1) if (history(hist, &ev, H_SET, lastevent) == -1)
err(1, "%d: %s\n", lastevent, ev.str); err(1, "%d: %s", lastevent, ev.str);
history(hist, &ev, H_ADD , buf); history(hist, &ev, H_ADD , buf);
} else { } else {
history(hist, &ev, H_ENTER, buf); history(hist, &ev, H_ENTER, buf);
@ -200,6 +222,18 @@ main(int argc, char *argv[])
continuation = ncontinuation; continuation = ncontinuation;
ncontinuation = 0; ncontinuation = 0;
if (continuation)
continue;
#ifdef DEBUG
for (i = 0; i < ac; i++) {
(void) fprintf(stderr, " > arg# %2d ", i);
if (i != cc)
(void) fprintf(stderr, "`%s'\n", av[i]);
else
(void) fprintf(stderr, "`%.*s_%s'\n",
co, av[i], av[i] + co);
}
#endif
if (strcmp(av[0], "history") == 0) { if (strcmp(av[0], "history") == 0) {
int rv; int rv;
@ -235,7 +269,7 @@ main(int argc, char *argv[])
} else if (el_parse(el, ac, av) == -1) { } else if (el_parse(el, ac, av) == -1) {
switch (fork()) { switch (fork()) {
case 0: case 0:
execvp(av[0], av); execvp(av[0], __DECONST(char *const *, av));
perror(av[0]); perror(av[0]);
_exit(1); _exit(1);
/*NOTREACHED*/ /*NOTREACHED*/

View File

@ -13,11 +13,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.
* *
@ -33,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $NetBSD: chared.c,v 1.13 2001/04/13 01:04:19 lukem Exp $ * $NetBSD: chared.c,v 1.24 2005/08/01 23:00:15 christos Exp $
*/ */
#if !defined(lint) && !defined(SCCSID) #if !defined(lint) && !defined(SCCSID)
@ -50,6 +46,8 @@ __FBSDID("$FreeBSD$");
#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
@ -57,17 +55,36 @@ __FBSDID("$FreeBSD$");
* Handle state for the vi undo command * Handle state for the vi undo command
*/ */
protected void protected void
cv_undo(EditLine *el,int action, size_t size, char *ptr) cv_undo(EditLine *el)
{ {
c_undo_t *vu = &el->el_chared.c_undo; c_undo_t *vu = &el->el_chared.c_undo;
vu->action = action; c_redo_t *r = &el->el_chared.c_redo;
vu->ptr = ptr; unsigned int size;
vu->isize = size;
(void) memcpy(vu->buf, vu->ptr, size); /* Save entire line for undo */
#ifdef DEBUG_UNDO size = el->el_line.lastchar - el->el_line.buffer;
(void) fprintf(el->el_errfile, "Undo buffer \"%s\" size = +%d -%d\n", vu->len = size;
vu->ptr, vu->isize, vu->dsize); vu->cursor = el->el_line.cursor - el->el_line.buffer;
#endif memcpy(vu->buf, el->el_line.buffer, size);
/* save command info for redo */
r->count = el->el_state.doingarg ? el->el_state.argument : 0;
r->action = el->el_chared.c_vcmd.action;
r->pos = r->buf;
r->cmd = el->el_state.thiscmd;
r->ch = el->el_state.thisch;
}
/* cv_yank():
* Save yank/delete data for paste
*/
protected void
cv_yank(EditLine *el, const char *ptr, int size)
{
c_kill_t *k = &el->el_chared.c_kill;
memcpy(k->buf, ptr, size +0u);
k->last = k->buf + size;
} }
@ -79,8 +96,10 @@ c_insert(EditLine *el, int num)
{ {
char *cp; char *cp;
if (el->el_line.lastchar + num >= el->el_line.limit) if (el->el_line.lastchar + num >= el->el_line.limit) {
return; /* can't go past end of buffer */ if (!ch_enlargebufs(el, num +0u))
return; /* can't go past end of buffer */
}
if (el->el_line.cursor < el->el_line.lastchar) { if (el->el_line.cursor < el->el_line.lastchar) {
/* if I must move chars */ /* if I must move chars */
@ -101,12 +120,14 @@ c_delafter(EditLine *el, int num)
if (el->el_line.cursor + num > el->el_line.lastchar) if (el->el_line.cursor + num > el->el_line.lastchar)
num = el->el_line.lastchar - el->el_line.cursor; num = el->el_line.lastchar - el->el_line.cursor;
if (el->el_map.current != el->el_map.emacs) {
cv_undo(el);
cv_yank(el, el->el_line.cursor, num);
}
if (num > 0) { if (num > 0) {
char *cp; char *cp;
if (el->el_map.current != el->el_map.emacs)
cv_undo(el, INSERT, (size_t)num, el->el_line.cursor);
for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++) for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++)
*cp = cp[num]; *cp = cp[num];
@ -115,6 +136,21 @@ c_delafter(EditLine *el, int num)
} }
/* c_delafter1():
* Delete the character after the cursor, do not yank
*/
protected void
c_delafter1(EditLine *el)
{
char *cp;
for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++)
*cp = cp[1];
el->el_line.lastchar--;
}
/* c_delbefore(): /* c_delbefore():
* Delete num characters before the cursor * Delete num characters before the cursor
*/ */
@ -125,13 +161,14 @@ c_delbefore(EditLine *el, int num)
if (el->el_line.cursor - num < el->el_line.buffer) if (el->el_line.cursor - num < el->el_line.buffer)
num = el->el_line.cursor - el->el_line.buffer; num = el->el_line.cursor - el->el_line.buffer;
if (el->el_map.current != el->el_map.emacs) {
cv_undo(el);
cv_yank(el, el->el_line.cursor - num, num);
}
if (num > 0) { if (num > 0) {
char *cp; char *cp;
if (el->el_map.current != el->el_map.emacs)
cv_undo(el, INSERT, (size_t)num,
el->el_line.cursor - num);
for (cp = el->el_line.cursor - num; for (cp = el->el_line.cursor - num;
cp <= el->el_line.lastchar; cp <= el->el_line.lastchar;
cp++) cp++)
@ -142,38 +179,52 @@ c_delbefore(EditLine *el, int num)
} }
/* c_delbefore1():
* Delete the character before the cursor, do not yank
*/
protected void
c_delbefore1(EditLine *el)
{
char *cp;
for (cp = el->el_line.cursor - 1; cp <= el->el_line.lastchar; cp++)
*cp = cp[1];
el->el_line.lastchar--;
}
/* ce__isword(): /* ce__isword():
* Return if p is part of a word according to emacs * Return if p is part of a word according to emacs
*/ */
protected int protected int
ce__isword(int p) ce__isword(int p)
{ {
return (isalpha((unsigned char)p) || isdigit((unsigned char)p) || strchr("*?_-.[]~=", p) != NULL); return (isalnum(p) || strchr("*?_-.[]~=", p) != NULL);
} }
/* cv__isword(): /* cv__isword():
* Return type of word for p according to vi * Return if p is part of a word according to vi
*/ */
protected int protected int
cv__isword(int p) cv__isword(int p)
{ {
if (isspace((unsigned char) p)) if (isalnum(p) || p == '_')
return 0; return 1;
if ((unsigned char) p == '_' || isalnum((unsigned char) p)) if (isgraph(p))
return 1; return 2;
return 2; return 0;
} }
/* c___isword(): /* cv__isWord():
* Return if p is part of a space-delimited word (!isspace) * Return if p is part of a big word according to vi
*/ */
protected int protected int
c___isword(p) cv__isWord(int p)
int p;
{ {
return !isspace((unsigned char) p); return (!isspace(p));
} }
@ -235,7 +286,7 @@ cv_next_word(EditLine *el, char *p, char *high, int n, int (*wtest)(int))
* vi historically deletes with cw only the word preserving the * vi historically deletes with cw only the word preserving the
* trailing whitespace! This is not what 'w' does.. * trailing whitespace! This is not what 'w' does..
*/ */
if (el->el_chared.c_vcmd.action != (DELETE|INSERT)) if (n || el->el_chared.c_vcmd.action != (DELETE|INSERT))
while ((p < high) && isspace((unsigned char) *p)) while ((p < high) && isspace((unsigned char) *p))
p++; p++;
} }
@ -252,26 +303,19 @@ cv_next_word(EditLine *el, char *p, char *high, int n, int (*wtest)(int))
* Find the previous word vi style * Find the previous word vi style
*/ */
protected char * protected char *
cv_prev_word(EditLine *el, char *p, char *low, int n, int (*wtest)(int)) cv_prev_word(char *p, char *low, int n, int (*wtest)(int))
{ {
int test; int test;
p--;
while (n--) { while (n--) {
p--; while ((p > low) && isspace((unsigned char) *p))
/* p--;
* vi historically deletes with cb only the word preserving the
* leading whitespace! This is not what 'b' does..
*/
if (el->el_chared.c_vcmd.action != (DELETE|INSERT))
while ((p > low) && isspace((unsigned char) *p))
p--;
test = (*wtest)((unsigned char) *p); test = (*wtest)((unsigned char) *p);
while ((p >= low) && (*wtest)((unsigned char) *p) == test) while ((p >= low) && (*wtest)((unsigned char) *p) == test)
p--; p--;
p++;
while (isspace((unsigned char) *p))
p++;
} }
p++;
/* p now points where we want it */ /* p now points where we want it */
if (p < low) if (p < low)
@ -322,47 +366,34 @@ protected void
cv_delfini(EditLine *el) cv_delfini(EditLine *el)
{ {
int size; int size;
int oaction; int action = el->el_chared.c_vcmd.action;
if (el->el_chared.c_vcmd.action & INSERT) if (action & INSERT)
el->el_map.current = el->el_map.key; el->el_map.current = el->el_map.key;
oaction = el->el_chared.c_vcmd.action;
el->el_chared.c_vcmd.action = NOP;
if (el->el_chared.c_vcmd.pos == 0) if (el->el_chared.c_vcmd.pos == 0)
/* sanity */
return; return;
size = el->el_line.cursor - el->el_chared.c_vcmd.pos;
if (el->el_line.cursor > el->el_chared.c_vcmd.pos) { if (size == 0)
size = (int) (el->el_line.cursor - el->el_chared.c_vcmd.pos);
c_delbefore(el, size);
el->el_line.cursor = el->el_chared.c_vcmd.pos;
re_refresh_cursor(el);
} else if (el->el_line.cursor < el->el_chared.c_vcmd.pos) {
size = (int)(el->el_chared.c_vcmd.pos - el->el_line.cursor);
c_delafter(el, size);
} else {
size = 1; size = 1;
c_delafter(el, size); el->el_line.cursor = el->el_chared.c_vcmd.pos;
if (action & YANK) {
if (size > 0)
cv_yank(el, el->el_line.cursor, size);
else
cv_yank(el, el->el_line.cursor + size, -size);
} else {
if (size > 0) {
c_delafter(el, size);
re_refresh_cursor(el);
} else {
c_delbefore(el, -size);
el->el_line.cursor += size;
}
} }
switch (oaction) { el->el_chared.c_vcmd.action = NOP;
case DELETE|INSERT:
el->el_chared.c_undo.action = DELETE|INSERT;
break;
case DELETE:
el->el_chared.c_undo.action = INSERT;
break;
case NOP:
case INSERT:
default:
EL_ABORT((el->el_errfile, "Bad oaction %d\n", oaction));
break;
}
el->el_chared.c_undo.ptr = el->el_line.cursor;
el->el_chared.c_undo.dsize = size;
} }
@ -392,21 +423,19 @@ ce__endword(char *p, char *high, int n)
* Go to the end of this word according to vi * Go to the end of this word according to vi
*/ */
protected char * protected char *
cv__endword(char *p, char *high, int n) cv__endword(char *p, char *high, int n, int (*wtest)(int))
{ {
int test;
p++; p++;
while (n--) { while (n--) {
while ((p < high) && isspace((unsigned char) *p)) while ((p < high) && isspace((unsigned char) *p))
p++; p++;
if (isalnum((unsigned char) *p)) test = (*wtest)((unsigned char) *p);
while ((p < high) && isalnum((unsigned char) *p)) while ((p < high) && (*wtest)((unsigned char) *p) == test)
p++; p++;
else
while ((p < high) && !(isspace((unsigned char) *p) ||
isalnum((unsigned char) *p)))
p++;
} }
p--; p--;
return (p); return (p);
@ -418,6 +447,8 @@ cv__endword(char *p, char *high, int n)
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);
@ -425,20 +456,23 @@ ch_init(EditLine *el)
(void) memset(el->el_line.buffer, 0, EL_BUFSIZ); (void) memset(el->el_line.buffer, 0, EL_BUFSIZ);
el->el_line.cursor = el->el_line.buffer; el->el_line.cursor = el->el_line.buffer;
el->el_line.lastchar = el->el_line.buffer; el->el_line.lastchar = el->el_line.buffer;
el->el_line.limit = &el->el_line.buffer[EL_BUFSIZ - 2]; el->el_line.limit = &el->el_line.buffer[EL_BUFSIZ - EL_LEAVE];
el->el_chared.c_undo.buf = (char *) el_malloc(EL_BUFSIZ); el->el_chared.c_undo.buf = (char *) el_malloc(EL_BUFSIZ);
if (el->el_chared.c_undo.buf == NULL) if (el->el_chared.c_undo.buf == NULL)
return (-1); return (-1);
(void) memset(el->el_chared.c_undo.buf, 0, EL_BUFSIZ); (void) memset(el->el_chared.c_undo.buf, 0, EL_BUFSIZ);
el->el_chared.c_undo.action = NOP; el->el_chared.c_undo.len = -1;
el->el_chared.c_undo.isize = 0; el->el_chared.c_undo.cursor = 0;
el->el_chared.c_undo.dsize = 0; el->el_chared.c_redo.buf = (char *) el_malloc(EL_BUFSIZ);
el->el_chared.c_undo.ptr = el->el_line.buffer; if (el->el_chared.c_redo.buf == NULL)
return (-1);
el->el_chared.c_redo.pos = el->el_chared.c_redo.buf;
el->el_chared.c_redo.lim = el->el_chared.c_redo.buf + EL_BUFSIZ;
el->el_chared.c_redo.cmd = ED_UNASSIGNED;
el->el_chared.c_vcmd.action = NOP; el->el_chared.c_vcmd.action = NOP;
el->el_chared.c_vcmd.pos = el->el_line.buffer; el->el_chared.c_vcmd.pos = el->el_line.buffer;
el->el_chared.c_vcmd.ins = el->el_line.buffer;
el->el_chared.c_kill.buf = (char *) el_malloc(EL_BUFSIZ); el->el_chared.c_kill.buf = (char *) el_malloc(EL_BUFSIZ);
if (el->el_chared.c_kill.buf == NULL) if (el->el_chared.c_kill.buf == NULL)
@ -455,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.nline = NULL; ma->level = -1;
el->el_chared.c_macro.level = -1; 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);
} }
@ -468,19 +501,16 @@ 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;
el->el_chared.c_undo.action = NOP; el->el_chared.c_undo.len = -1;
el->el_chared.c_undo.isize = 0; el->el_chared.c_undo.cursor = 0;
el->el_chared.c_undo.dsize = 0;
el->el_chared.c_undo.ptr = el->el_line.buffer;
el->el_chared.c_vcmd.action = NOP; el->el_chared.c_vcmd.action = NOP;
el->el_chared.c_vcmd.pos = el->el_line.buffer; el->el_chared.c_vcmd.pos = el->el_line.buffer;
el->el_chared.c_vcmd.ins = el->el_line.buffer;
el->el_chared.c_kill.mark = el->el_line.buffer; el->el_chared.c_kill.mark = el->el_line.buffer;
@ -492,9 +522,17 @@ 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; if (mclear)
ch__clearmacro(el);
}
el->el_history.eventno = 0; 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():
@ -535,7 +573,8 @@ ch_enlargebufs(el, addlen)
el->el_line.buffer = newbuffer; el->el_line.buffer = newbuffer;
el->el_line.cursor = newbuffer + (el->el_line.cursor - oldbuf); el->el_line.cursor = newbuffer + (el->el_line.cursor - oldbuf);
el->el_line.lastchar = newbuffer + (el->el_line.lastchar - oldbuf); el->el_line.lastchar = newbuffer + (el->el_line.lastchar - oldbuf);
el->el_line.limit = &newbuffer[newsz - EL_LEAVE]; /* don't set new size until all buffers are enlarged */
el->el_line.limit = &newbuffer[sz - EL_LEAVE];
/* /*
* Reallocate kill buffer. * Reallocate kill buffer.
@ -564,14 +603,22 @@ ch_enlargebufs(el, addlen)
/* zero the newly added memory, leave old data in */ /* zero the newly added memory, leave old data in */
(void) memset(&newbuffer[sz], 0, newsz - sz); (void) memset(&newbuffer[sz], 0, newsz - sz);
el->el_chared.c_undo.ptr = el->el_line.buffer +
(el->el_chared.c_undo.ptr - oldbuf);
el->el_chared.c_undo.buf = newbuffer; el->el_chared.c_undo.buf = newbuffer;
newbuffer = el_realloc(el->el_chared.c_redo.buf, newsz);
if (!newbuffer)
return 0;
el->el_chared.c_redo.pos = newbuffer +
(el->el_chared.c_redo.pos - el->el_chared.c_redo.buf);
el->el_chared.c_redo.lim = newbuffer +
(el->el_chared.c_redo.lim - el->el_chared.c_redo.buf);
el->el_chared.c_redo.buf = newbuffer;
if (!hist_enlargebuf(el, sz, newsz)) if (!hist_enlargebuf(el, sz, newsz))
return 0; return 0;
/* Safe to set enlarged buffer size */
el->el_line.limit = &el->el_line.buffer[newsz - EL_LEAVE];
return 1; return 1;
} }
@ -586,11 +633,16 @@ ch_end(EditLine *el)
el->el_line.limit = NULL; el->el_line.limit = NULL;
el_free((ptr_t) el->el_chared.c_undo.buf); el_free((ptr_t) el->el_chared.c_undo.buf);
el->el_chared.c_undo.buf = NULL; el->el_chared.c_undo.buf = NULL;
el_free((ptr_t) el->el_chared.c_redo.buf);
el->el_chared.c_redo.buf = NULL;
el->el_chared.c_redo.pos = NULL;
el->el_chared.c_redo.lim = NULL;
el->el_chared.c_redo.cmd = ED_UNASSIGNED;
el_free((ptr_t) el->el_chared.c_kill.buf); el_free((ptr_t) el->el_chared.c_kill.buf);
el->el_chared.c_kill.buf = NULL; el->el_chared.c_kill.buf = NULL;
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);
} }
@ -638,51 +690,64 @@ el_deletestr(EditLine *el, int n)
* Get a string * Get a string
*/ */
protected int protected int
c_gets(EditLine *el, char *buf) c_gets(EditLine *el, char *buf, const char *prompt)
{ {
char ch; char ch;
int len = 0; int len;
char *cp = el->el_line.buffer;
if (prompt) {
len = strlen(prompt);
memcpy(cp, prompt, len + 0u);
cp += len;
}
len = 0;
for (;;) {
el->el_line.cursor = cp;
*cp = ' ';
el->el_line.lastchar = cp + 1;
re_refresh(el);
if (el_getc(el, &ch) != 1) {
ed_end_of_file(el, 0);
len = -1;
break;
}
for (ch = 0; ch == 0;) {
if (el_getc(el, &ch) != 1)
return (ed_end_of_file(el, 0));
switch (ch) { switch (ch) {
case '\010': /* Delete and backspace */ case '\010': /* Delete and backspace */
case '\177': case '\177':
if (len > 1) { if (len <= 0) {
*el->el_line.cursor-- = '\0'; len = -1;
el->el_line.lastchar = el->el_line.cursor; break;
buf[len--] = '\0';
} else {
el->el_line.buffer[0] = '\0';
el->el_line.lastchar = el->el_line.buffer;
el->el_line.cursor = el->el_line.buffer;
return (CC_REFRESH);
} }
re_refresh(el); cp--;
ch = 0; continue;
break;
case '\033': /* ESC */ case '\033': /* ESC */
case '\r': /* Newline */ case '\r': /* Newline */
case '\n': case '\n':
buf[len] = ch;
break; break;
default: default:
if (len >= EL_BUFSIZ) if (len >= EL_BUFSIZ - 16)
term_beep(el); term_beep(el);
else { else {
buf[len++] = ch; buf[len++] = ch;
*el->el_line.cursor++ = ch; *cp++ = ch;
el->el_line.lastchar = el->el_line.cursor;
} }
re_refresh(el); continue;
ch = 0;
break;
} }
break;
} }
buf[len] = ch;
return (len); el->el_line.buffer[0] = '\0';
el->el_line.lastchar = el->el_line.buffer;
el->el_line.cursor = el->el_line.buffer;
return len;
} }

View File

@ -13,11 +13,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,7 +30,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)chared.h 8.1 (Berkeley) 6/4/93 * @(#)chared.h 8.1 (Berkeley) 6/4/93
* $NetBSD: chared.h,v 1.5 2000/09/04 22:06:29 lukem Exp $ * $NetBSD: chared.h,v 1.15 2005/08/01 23:00:15 christos Exp $
* $FreeBSD$ * $FreeBSD$
*/ */
@ -66,28 +62,36 @@
typedef struct c_macro_t { typedef struct c_macro_t {
int level; int level;
int offset;
char **macro; char **macro;
char *nline;
} c_macro_t; } c_macro_t;
/* /*
* Undo information for both vi and emacs * Undo information for vi - no undo in emacs (yet)
*/ */
typedef struct c_undo_t { typedef struct c_undo_t {
int action; int len; /* length of saved line */
size_t isize; int cursor; /* position of saved cursor */
size_t dsize; char *buf; /* full saved text */
char *ptr;
char *buf;
} c_undo_t; } c_undo_t;
/* redo for vi */
typedef struct c_redo_t {
char *buf; /* redo insert key sequence */
char *pos;
char *lim;
el_action_t cmd; /* command to redo */
char ch; /* char that invoked it */
int count;
int action; /* from cv_action() */
} c_redo_t;
/* /*
* Current action information for vi * Current action information for vi
*/ */
typedef struct c_vcmd_t { typedef struct c_vcmd_t {
int action; int action;
char *pos; char *pos;
char *ins;
} c_vcmd_t; } c_vcmd_t;
/* /*
@ -106,6 +110,7 @@ typedef struct c_kill_t {
typedef struct el_chared_t { typedef struct el_chared_t {
c_undo_t c_undo; c_undo_t c_undo;
c_kill_t c_kill; c_kill_t c_kill;
c_redo_t c_redo;
c_vcmd_t c_vcmd; c_vcmd_t c_vcmd;
c_macro_t c_macro; c_macro_t c_macro;
} el_chared_t; } el_chared_t;
@ -120,10 +125,10 @@ typedef struct el_chared_t {
#define NOP 0x00 #define NOP 0x00
#define DELETE 0x01 #define DELETE 0x01
#define INSERT 0x02 #define INSERT 0x02
#define CHANGE 0x04 #define YANK 0x04
#define CHAR_FWD 0 #define CHAR_FWD (+1)
#define CHAR_BACK 1 #define CHAR_BACK (-1)
#define MODE_INSERT 0 #define MODE_INSERT 0
#define MODE_REPLACE 1 #define MODE_REPLACE 1
@ -137,23 +142,26 @@ typedef struct el_chared_t {
protected int cv__isword(int); protected int cv__isword(int);
protected int cv__isWord(int);
protected void cv_delfini(EditLine *); protected void cv_delfini(EditLine *);
protected char *cv__endword(char *, char *, int); protected char *cv__endword(char *, char *, int, int (*)(int));
protected int ce__isword(int); protected int ce__isword(int);
protected int c___isword(int); protected void cv_undo(EditLine *);
protected void cv_undo(EditLine *, int, size_t, char *); protected void cv_yank(EditLine *, const char *, int);
protected char *cv_next_word(EditLine*, char *, char *, int, int (*)(int)); protected char *cv_next_word(EditLine*, char *, char *, int, int (*)(int));
protected char *cv_prev_word(EditLine*, char *, char *, int, int (*)(int)); protected char *cv_prev_word(char *, char *, int, int (*)(int));
protected char *c__next_word(char *, char *, int, int (*)(int)); protected char *c__next_word(char *, char *, int, int (*)(int));
protected char *c__prev_word(char *, char *, int, int (*)(int)); protected char *c__prev_word(char *, char *, int, int (*)(int));
protected void c_insert(EditLine *, int); protected void c_insert(EditLine *, int);
protected void c_delbefore(EditLine *, int); protected void c_delbefore(EditLine *, int);
protected void c_delbefore1(EditLine *);
protected void c_delafter(EditLine *, int); protected void c_delafter(EditLine *, int);
protected int c_gets(EditLine *, char *); protected void c_delafter1(EditLine *);
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 *);

View File

@ -13,11 +13,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.
* *
@ -33,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $NetBSD: common.c,v 1.9 2000/09/04 22:06:29 lukem Exp $ * $NetBSD: common.c,v 1.17 2005/08/01 23:00:15 christos Exp $
*/ */
#if !defined(lint) && !defined(SCCSID) #if !defined(lint) && !defined(SCCSID)
@ -54,7 +50,7 @@ __FBSDID("$FreeBSD$");
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_end_of_file(EditLine *el, int c) ed_end_of_file(EditLine *el, int c __unused)
{ {
re_goto_bottom(el); re_goto_bottom(el);
@ -70,7 +66,7 @@ ed_end_of_file(EditLine *el, int c)
protected el_action_t protected el_action_t
ed_insert(EditLine *el, int c) ed_insert(EditLine *el, int c)
{ {
int i; int count = el->el_state.argument;
if (c == '\0') if (c == '\0')
return (CC_ERROR); return (CC_ERROR);
@ -78,46 +74,28 @@ ed_insert(EditLine *el, int c)
if (el->el_line.lastchar + el->el_state.argument >= if (el->el_line.lastchar + el->el_state.argument >=
el->el_line.limit) { el->el_line.limit) {
/* end of buffer space, try to allocate more */ /* end of buffer space, try to allocate more */
if (!ch_enlargebufs(el, (size_t) el->el_state.argument)) if (!ch_enlargebufs(el, (size_t) count))
return CC_ERROR; /* error allocating more */ return CC_ERROR; /* error allocating more */
} }
if (el->el_state.argument == 1) { if (count == 1) {
if (el->el_state.inputmode != MODE_INSERT) { if (el->el_state.inputmode == MODE_INSERT
el->el_chared.c_undo.buf[el->el_chared.c_undo.isize++] = || el->el_line.cursor >= el->el_line.lastchar)
*el->el_line.cursor; c_insert(el, 1);
el->el_chared.c_undo.buf[el->el_chared.c_undo.isize] =
'\0';
c_delafter(el, 1);
}
c_insert(el, 1);
*el->el_line.cursor++ = c; *el->el_line.cursor++ = c;
el->el_state.doingarg = 0; /* just in case */
re_fastaddc(el); /* fast refresh for one char. */ re_fastaddc(el); /* fast refresh for one char. */
} else { } else {
if (el->el_state.inputmode != MODE_INSERT) { if (el->el_state.inputmode != MODE_REPLACE_1)
for (i = 0; i < el->el_state.argument; i++) c_insert(el, el->el_state.argument);
el->el_chared.c_undo.buf[el->el_chared.c_undo.isize++] =
el->el_line.cursor[i];
el->el_chared.c_undo.buf[el->el_chared.c_undo.isize] = while (count-- && el->el_line.cursor < el->el_line.lastchar)
'\0';
c_delafter(el, el->el_state.argument);
}
c_insert(el, el->el_state.argument);
while (el->el_state.argument--)
*el->el_line.cursor++ = c; *el->el_line.cursor++ = c;
re_refresh(el); re_refresh(el);
} }
if (el->el_state.inputmode == MODE_REPLACE_1
|| el->el_state.inputmode == MODE_REPLACE)
el->el_chared.c_undo.action=CHANGE;
if (el->el_state.inputmode == MODE_REPLACE_1) if (el->el_state.inputmode == MODE_REPLACE_1)
return (vi_command_mode(el, 0)); return vi_command_mode(el, 0);
return (CC_NORM); return (CC_NORM);
} }
@ -129,7 +107,7 @@ ed_insert(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_delete_prev_word(EditLine *el, int c) ed_delete_prev_word(EditLine *el, int c __unused)
{ {
char *cp, *p, *kp; char *cp, *p, *kp;
@ -157,7 +135,7 @@ ed_delete_prev_word(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_delete_next_char(EditLine *el, int c) ed_delete_next_char(EditLine *el, int c __unused)
{ {
#ifdef notdef /* XXX */ #ifdef notdef /* XXX */
#define EL el->el_line #define EL el->el_line
@ -208,7 +186,7 @@ ed_delete_next_char(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_kill_line(EditLine *el, int c) ed_kill_line(EditLine *el, int c __unused)
{ {
char *kp, *cp; char *kp, *cp;
@ -229,7 +207,7 @@ ed_kill_line(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_move_to_end(EditLine *el, int c) ed_move_to_end(EditLine *el, int c __unused)
{ {
el->el_line.cursor = el->el_line.lastchar; el->el_line.cursor = el->el_line.lastchar;
@ -237,7 +215,7 @@ ed_move_to_end(EditLine *el, int c)
#ifdef VI_MOVE #ifdef VI_MOVE
el->el_line.cursor--; el->el_line.cursor--;
#endif #endif
if (el->el_chared.c_vcmd.action & DELETE) { if (el->el_chared.c_vcmd.action != NOP) {
cv_delfini(el); cv_delfini(el);
return (CC_REFRESH); return (CC_REFRESH);
} }
@ -252,7 +230,7 @@ ed_move_to_end(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_move_to_beg(EditLine *el, int c) ed_move_to_beg(EditLine *el, int c __unused)
{ {
el->el_line.cursor = el->el_line.buffer; el->el_line.cursor = el->el_line.buffer;
@ -261,7 +239,7 @@ ed_move_to_beg(EditLine *el, int c)
/* We want FIRST non space character */ /* We want FIRST non space character */
while (isspace((unsigned char) *el->el_line.cursor)) while (isspace((unsigned char) *el->el_line.cursor))
el->el_line.cursor++; el->el_line.cursor++;
if (el->el_chared.c_vcmd.action & DELETE) { if (el->el_chared.c_vcmd.action != NOP) {
cv_delfini(el); cv_delfini(el);
return (CC_REFRESH); return (CC_REFRESH);
} }
@ -301,18 +279,22 @@ ed_transpose_chars(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_next_char(EditLine *el, int c) ed_next_char(EditLine *el, int c __unused)
{ {
char *lim = el->el_line.lastchar;
if (el->el_line.cursor >= el->el_line.lastchar) if (el->el_line.cursor >= lim ||
(el->el_line.cursor == lim - 1 &&
el->el_map.type == MAP_VI &&
el->el_chared.c_vcmd.action == NOP))
return (CC_ERROR); return (CC_ERROR);
el->el_line.cursor += el->el_state.argument; el->el_line.cursor += el->el_state.argument;
if (el->el_line.cursor > el->el_line.lastchar) if (el->el_line.cursor > lim)
el->el_line.cursor = el->el_line.lastchar; el->el_line.cursor = lim;
if (el->el_map.type == MAP_VI) if (el->el_map.type == MAP_VI)
if (el->el_chared.c_vcmd.action & DELETE) { if (el->el_chared.c_vcmd.action != NOP) {
cv_delfini(el); cv_delfini(el);
return (CC_REFRESH); return (CC_REFRESH);
} }
@ -326,7 +308,7 @@ ed_next_char(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_prev_word(EditLine *el, int c) ed_prev_word(EditLine *el, int c __unused)
{ {
if (el->el_line.cursor == el->el_line.buffer) if (el->el_line.cursor == el->el_line.buffer)
@ -338,7 +320,7 @@ ed_prev_word(EditLine *el, int c)
ce__isword); ce__isword);
if (el->el_map.type == MAP_VI) if (el->el_map.type == MAP_VI)
if (el->el_chared.c_vcmd.action & DELETE) { if (el->el_chared.c_vcmd.action != NOP) {
cv_delfini(el); cv_delfini(el);
return (CC_REFRESH); return (CC_REFRESH);
} }
@ -352,7 +334,7 @@ ed_prev_word(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_prev_char(EditLine *el, int c) ed_prev_char(EditLine *el, int c __unused)
{ {
if (el->el_line.cursor > el->el_line.buffer) { if (el->el_line.cursor > el->el_line.buffer) {
@ -361,7 +343,7 @@ ed_prev_char(EditLine *el, int c)
el->el_line.cursor = el->el_line.buffer; el->el_line.cursor = el->el_line.buffer;
if (el->el_map.type == MAP_VI) if (el->el_map.type == MAP_VI)
if (el->el_chared.c_vcmd.action & DELETE) { if (el->el_chared.c_vcmd.action != NOP) {
cv_delfini(el); cv_delfini(el);
return (CC_REFRESH); return (CC_REFRESH);
} }
@ -413,25 +395,9 @@ ed_digit(EditLine *el, int c)
(el->el_state.argument * 10) + (c - '0'); (el->el_state.argument * 10) + (c - '0');
} }
return (CC_ARGHACK); return (CC_ARGHACK);
} else {
if (el->el_line.lastchar + 1 >= el->el_line.limit) {
if (!ch_enlargebufs(el, 1))
return (CC_ERROR);
}
if (el->el_state.inputmode != MODE_INSERT) {
el->el_chared.c_undo.buf[el->el_chared.c_undo.isize++] =
*el->el_line.cursor;
el->el_chared.c_undo.buf[el->el_chared.c_undo.isize] =
'\0';
c_delafter(el, 1);
}
c_insert(el, 1);
*el->el_line.cursor++ = c;
el->el_state.doingarg = 0;
re_fastaddc(el);
} }
return (CC_NORM);
return ed_insert(el, c);
} }
@ -465,12 +431,10 @@ ed_argument_digit(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_unassigned(EditLine *el, int c) ed_unassigned(EditLine *el, int c __unused)
{ {
term_beep(el); return (CC_ERROR);
term__flush();
return (CC_NORM);
} }
@ -484,7 +448,8 @@ ed_unassigned(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_tty_sigint(EditLine *el, int c) ed_tty_sigint(EditLine *el __unused,
int c __unused)
{ {
return (CC_NORM); return (CC_NORM);
@ -497,7 +462,8 @@ ed_tty_sigint(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_tty_dsusp(EditLine *el, int c) ed_tty_dsusp(EditLine *el __unused,
int c __unused)
{ {
return (CC_NORM); return (CC_NORM);
@ -510,7 +476,8 @@ ed_tty_dsusp(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_tty_flush_output(EditLine *el, int c) ed_tty_flush_output(EditLine *el __unused,
int c __unused)
{ {
return (CC_NORM); return (CC_NORM);
@ -523,7 +490,8 @@ ed_tty_flush_output(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_tty_sigquit(EditLine *el, int c) ed_tty_sigquit(EditLine *el __unused,
int c __unused)
{ {
return (CC_NORM); return (CC_NORM);
@ -536,7 +504,8 @@ ed_tty_sigquit(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_tty_sigtstp(EditLine *el, int c) ed_tty_sigtstp(EditLine *el __unused,
int c __unused)
{ {
return (CC_NORM); return (CC_NORM);
@ -549,7 +518,8 @@ ed_tty_sigtstp(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_tty_stop_output(EditLine *el, int c) ed_tty_stop_output(EditLine *el __unused,
int c __unused)
{ {
return (CC_NORM); return (CC_NORM);
@ -562,7 +532,8 @@ ed_tty_stop_output(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_tty_start_output(EditLine *el, int c) ed_tty_start_output(EditLine *el __unused,
int c __unused)
{ {
return (CC_NORM); return (CC_NORM);
@ -575,14 +546,12 @@ ed_tty_start_output(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_newline(EditLine *el, int c) ed_newline(EditLine *el, int c __unused)
{ {
re_goto_bottom(el); re_goto_bottom(el);
*el->el_line.lastchar++ = '\n'; *el->el_line.lastchar++ = '\n';
*el->el_line.lastchar = '\0'; *el->el_line.lastchar = '\0';
if (el->el_map.type == MAP_VI)
el->el_chared.c_vcmd.ins = el->el_line.buffer;
return (CC_NEWLINE); return (CC_NEWLINE);
} }
@ -593,7 +562,7 @@ ed_newline(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_delete_prev_char(EditLine *el, int c) ed_delete_prev_char(EditLine *el, int c __unused)
{ {
if (el->el_line.cursor <= el->el_line.buffer) if (el->el_line.cursor <= el->el_line.buffer)
@ -613,7 +582,7 @@ ed_delete_prev_char(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_clear_screen(EditLine *el, int c) ed_clear_screen(EditLine *el, int c __unused)
{ {
term_clear_screen(el); /* clear the whole real screen */ term_clear_screen(el); /* clear the whole real screen */
@ -628,7 +597,8 @@ ed_clear_screen(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_redisplay(EditLine *el, int c) ed_redisplay(EditLine *el __unused,
int c __unused)
{ {
return (CC_REDISPLAY); return (CC_REDISPLAY);
@ -641,10 +611,10 @@ ed_redisplay(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_start_over(EditLine *el, int c) ed_start_over(EditLine *el, int c __unused)
{ {
ch_reset(el); ch_reset(el, 0);
return (CC_REFRESH); return (CC_REFRESH);
} }
@ -655,7 +625,8 @@ ed_start_over(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_sequence_lead_in(EditLine *el, int c) ed_sequence_lead_in(EditLine *el __unused,
int c __unused)
{ {
return (CC_NORM); return (CC_NORM);
@ -668,11 +639,12 @@ ed_sequence_lead_in(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_prev_history(EditLine *el, int c) ed_prev_history(EditLine *el, int c __unused)
{ {
char beep = 0; char beep = 0;
int sv_event = el->el_history.eventno;
el->el_chared.c_undo.action = NOP; el->el_chared.c_undo.len = -1;
*el->el_line.lastchar = '\0'; /* just in case */ *el->el_line.lastchar = '\0'; /* just in case */
if (el->el_history.eventno == 0) { /* save the current buffer if (el->el_history.eventno == 0) { /* save the current buffer
@ -685,15 +657,17 @@ ed_prev_history(EditLine *el, int c)
el->el_history.eventno += el->el_state.argument; el->el_history.eventno += el->el_state.argument;
if (hist_get(el) == CC_ERROR) { if (hist_get(el) == CC_ERROR) {
if (el->el_map.type == MAP_VI) {
el->el_history.eventno = sv_event;
return CC_ERROR;
}
beep = 1; beep = 1;
/* el->el_history.eventno was fixed by first call */ /* el->el_history.eventno was fixed by first call */
(void) hist_get(el); (void) hist_get(el);
} }
re_refresh(el);
if (beep) if (beep)
return (CC_ERROR); return CC_REFRESH_BEEP;
else return CC_REFRESH;
return (CC_NORM); /* was CC_UP_HIST */
} }
@ -703,19 +677,24 @@ ed_prev_history(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_next_history(EditLine *el, int c) ed_next_history(EditLine *el, int c __unused)
{ {
el_action_t beep = CC_REFRESH, rval;
el->el_chared.c_undo.action = NOP; el->el_chared.c_undo.len = -1;
*el->el_line.lastchar = '\0'; /* just in case */ *el->el_line.lastchar = '\0'; /* just in case */
el->el_history.eventno -= el->el_state.argument; el->el_history.eventno -= el->el_state.argument;
if (el->el_history.eventno < 0) { if (el->el_history.eventno < 0) {
el->el_history.eventno = 0; el->el_history.eventno = 0;
return (CC_ERROR);/* make it beep */ beep = CC_REFRESH_BEEP;
} }
return (hist_get(el)); rval = hist_get(el);
if (rval == CC_REFRESH)
return beep;
return rval;
} }
@ -725,14 +704,14 @@ ed_next_history(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_search_prev_history(EditLine *el, int c) ed_search_prev_history(EditLine *el, int c __unused)
{ {
const char *hp; const char *hp;
int h; int h;
bool_t found = 0; bool_t found = 0;
el->el_chared.c_vcmd.action = NOP; el->el_chared.c_vcmd.action = NOP;
el->el_chared.c_undo.action = NOP; el->el_chared.c_undo.len = -1;
*el->el_line.lastchar = '\0'; /* just in case */ *el->el_line.lastchar = '\0'; /* just in case */
if (el->el_history.eventno < 0) { if (el->el_history.eventno < 0) {
#ifdef DEBUG_EDIT #ifdef DEBUG_EDIT
@ -793,14 +772,14 @@ ed_search_prev_history(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_search_next_history(EditLine *el, int c) ed_search_next_history(EditLine *el, int c __unused)
{ {
const char *hp; const char *hp;
int h; int h;
bool_t found = 0; bool_t found = 0;
el->el_chared.c_vcmd.action = NOP; el->el_chared.c_vcmd.action = NOP;
el->el_chared.c_undo.action = NOP; el->el_chared.c_undo.len = -1;
*el->el_line.lastchar = '\0'; /* just in case */ *el->el_line.lastchar = '\0'; /* just in case */
if (el->el_history.eventno == 0) if (el->el_history.eventno == 0)
@ -847,7 +826,7 @@ ed_search_next_history(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_prev_line(EditLine *el, int c) ed_prev_line(EditLine *el, int c __unused)
{ {
char *ptr; char *ptr;
int nchars = c_hpos(el); int nchars = c_hpos(el);
@ -890,7 +869,7 @@ ed_prev_line(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_next_line(EditLine *el, int c) ed_next_line(EditLine *el, int c __unused)
{ {
char *ptr; char *ptr;
int nchars = c_hpos(el); int nchars = c_hpos(el);
@ -924,30 +903,18 @@ ed_next_line(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
ed_command(EditLine *el, int c) ed_command(EditLine *el, int c __unused)
{ {
char tmpbuf[EL_BUFSIZ]; char tmpbuf[EL_BUFSIZ];
int tmplen; int tmplen;
el->el_line.buffer[0] = '\0'; tmplen = c_gets(el, tmpbuf, "\n: ");
el->el_line.lastchar = el->el_line.buffer; term__putc('\n');
el->el_line.cursor = el->el_line.buffer;
c_insert(el, 3); /* prompt + ": " */ if (tmplen < 0 || (tmpbuf[tmplen] = 0, parse_line(el, tmpbuf)) == -1)
*el->el_line.cursor++ = '\n'; term_beep(el);
*el->el_line.cursor++ = ':';
*el->el_line.cursor++ = ' ';
re_refresh(el);
tmplen = c_gets(el, tmpbuf); el->el_map.current = el->el_map.key;
tmpbuf[tmplen] = '\0'; re_clear_display(el);
return CC_REFRESH;
el->el_line.buffer[0] = '\0';
el->el_line.lastchar = el->el_line.buffer;
el->el_line.cursor = el->el_line.buffer;
if (parse_line(el, tmpbuf) == -1)
return (CC_ERROR);
else
return (CC_REFRESH);
} }

View File

@ -1,6 +1,6 @@
.\" $NetBSD: editline.3,v 1.20 2000/02/28 17:41:05 chopps Exp $ .\" $NetBSD: editline.3,v 1.48 2005/07/14 15:02:37 wiz Exp $
.\" .\"
.\" Copyright (c) 1997-1999 The NetBSD Foundation, Inc. .\" Copyright (c) 1997-2003 The NetBSD Foundation, Inc.
.\" All rights reserved. .\" All rights reserved.
.\" .\"
.\" This file was contributed to The NetBSD Foundation by Luke Mewburn. .\" This file was contributed to The NetBSD Foundation by Luke Mewburn.
@ -35,7 +35,7 @@
.\" .\"
.\" $FreeBSD$ .\" $FreeBSD$
.\" .\"
.Dd November 12, 1999 .Dd July 14, 2005
.Os .Os
.Dt EDITLINE 3 .Dt EDITLINE 3
.Sh NAME .Sh NAME
@ -55,8 +55,13 @@
.Nm el_deletestr , .Nm el_deletestr ,
.Nm history_init , .Nm history_init ,
.Nm history_end , .Nm history_end ,
.Nm history .Nm history ,
.Nd line editor and history functions .Nm tok_init ,
.Nm tok_end ,
.Nm tok_reset ,
.Nm tok_line ,
.Nm tok_str
.Nd line editor, history and tokenization functions
.Sh LIBRARY .Sh LIBRARY
.Lb libedit .Lb libedit
.Sh SYNOPSIS .Sh SYNOPSIS
@ -74,7 +79,7 @@
.Ft void .Ft void
.Fn el_push "EditLine *e" "const char *str" .Fn el_push "EditLine *e" "const char *str"
.Ft int .Ft int
.Fn el_parse "EditLine *e" "int argc" "char *argv[]" .Fn el_parse "EditLine *e" "int argc" "const char *argv[]"
.Ft int .Ft int
.Fn el_set "EditLine *e" "int op" "..." .Fn el_set "EditLine *e" "int op" "..."
.Ft int .Ft int
@ -95,10 +100,20 @@
.Fn history_end "History *h" .Fn history_end "History *h"
.Ft int .Ft int
.Fn history "History *h" "HistEvent *ev" "int op" "..." .Fn history "History *h" "HistEvent *ev" "int op" "..."
.Ft Tokenizer *
.Fn tok_init "const char *IFS"
.Ft void
.Fn tok_end "Tokenizer *t"
.Ft void
.Fn tok_reset "Tokenizer *t"
.Ft int
.Fn tok_line "Tokenizer *t" "const LineInfo *li" "int *argc" "const char **argv[]" "int *cursorc" "int *cursoro"
.Ft int
.Fn tok_str "Tokenizer *t" "const char *str" "int *argc" "const char **argv[]"
.Sh DESCRIPTION .Sh DESCRIPTION
The The
.Nm .Nm
library provides generic line editing and history functions, library provides generic line editing, history and tokenization functions,
similar to those found in similar to those found in
.Xr sh 1 . .Xr sh 1 .
.Pp .Pp
@ -154,7 +169,7 @@ if no characters were read or if an error occurred.
Read a character from the tty. Read a character from the tty.
.Fa ch .Fa ch
is modified to contain the character read. is modified to contain the character read.
Returns the number of characters read if successful, -1 otherwise. Returns the number of characters read if successful, \-1 otherwise.
.It Fn el_push .It Fn el_push
Pushes Pushes
.Fa str .Fa str
@ -176,7 +191,7 @@ to execute builtin
.Nm .Nm
commands. commands.
If the command is prefixed with If the command is prefixed with
.Dq prog: .Dq prog :
then then
.Fn el_parse .Fn el_parse
will only execute the command if will only execute the command if
@ -186,7 +201,7 @@ matches the
argument supplied to argument supplied to
.Fn el_init . .Fn el_init .
The return value is The return value is
-1 if the command is unknown, \-1 if the command is unknown,
0 if there was no error or 0 if there was no error or
.Dq prog .Dq prog
did not match, or did not match, or
@ -305,7 +320,7 @@ for more information.
.It Dv EL_ADDFN , Xo .It Dv EL_ADDFN , Xo
.Fa "const char *name" , .Fa "const char *name" ,
.Fa "const char *help" , .Fa "const char *help" ,
.Fa "unsigned char (*func)(EditLine *e, int ch) .Fa "unsigned char (*func)(EditLine *e, int ch)"
.Xc .Xc
Add a user defined function, Add a user defined function,
.Fn func , .Fn func ,
@ -370,6 +385,24 @@ check this
(using (using
.Fn el_get ) .Fn el_get )
to determine if editing should be enabled or not. to determine if editing should be enabled or not.
.It Dv EL_GETCFN , Fa "int (*f)(EditLine *, char *c)"
Define the character reading function as
.Fa f ,
which is to return the number of characters read and store them in
.Fa c .
This function is called internally by
.Fn el_gets
and
.Fn el_getc .
The builtin function can be set or restored with the special function
name ``EL_BUILTIN_GETCFN''.
.It Dv EL_CLIENTDATA , Fa "void *data"
Register
.Fa data
to be associated with this EditLine structure.
It can be retrieved with the corresponding
.Fn el_get
call.
.El .El
.It Fn el_get .It Fn el_get
Get Get
@ -378,6 +411,7 @@ parameters.
.Fa op .Fa op
determines which parameter to retrieve into determines which parameter to retrieve into
.Fa result . .Fa result .
Returns 0 if successful, \-1 otherwise.
.Pp .Pp
The following values for The following values for
.Fa op .Fa op
@ -401,6 +435,22 @@ has installed private signal handlers (see
above). above).
.It Dv EL_EDITMODE, Fa "int *" .It Dv EL_EDITMODE, Fa "int *"
Return non-zero if editing is enabled. Return non-zero if editing is enabled.
.It Dv EL_GETCFN, Fa "int (**f)(EditLine *, char *)"
Return a pointer to the function that read characters, which is equal to
``EL_BUILTIN_GETCFN'' in the case of the default builtin function.
.It Dv EL_CLIENTDATA , Fa "void **data"
Retrieve
.Fa data
previously registered with the corresponding
.Fn el_set
call.
.It Dv EL_UNBUFFERED, Fa "int"
Sets or clears unbuffered mode.
In this mode,
.Fn el_gets
will return immediately after processing a single character.
.It Dv EL_PREP_TERM, Fa "int"
Sets or clears terminal editing mode.
.El .El
.It Fn el_source .It Fn el_source
Initialise Initialise
@ -443,11 +493,21 @@ typedef struct lineinfo {
const char *lastchar; /* address of last character */ const char *lastchar; /* address of last character */
} LineInfo; } LineInfo;
.Ed .Ed
.Pp
.Fa buffer
is not NUL terminated.
This function may be called after
.Fn el_gets
to obtain the
.Fa LineInfo
structure pertaining to line returned by that function,
and from within user defined functions added with
.Dv EL_ADDFN .
.It Fn el_insertstr .It Fn el_insertstr
Insert Insert
.Fa str .Fa str
into the line at the cursor. into the line at the cursor.
Returns -1 if Returns \-1 if
.Fa str .Fa str
is empty or will not fit, and 0 otherwise. is empty or will not fit, and 0 otherwise.
.It Fn el_deletestr .It Fn el_deletestr
@ -527,7 +587,11 @@ Set the cursor to point to the requested element.
.It Dv H_ADD , Fa "const char *str" .It Dv H_ADD , Fa "const char *str"
Append Append
.Fa str .Fa str
to the current element of the history, or create an element with to the current element of the history, or perform the
.Dv H_ENTER
operation with argument
.Fa str
if there is no current element.
.It Dv H_APPEND , Fa "const char *str" .It Dv H_APPEND , Fa "const char *str"
Append Append
.Fa str .Fa str
@ -537,6 +601,17 @@ Add
.Fa str .Fa str
as a new element to the history, and, if necessary, as a new element to the history, and, if necessary,
removing the oldest entry to keep the list to the created size. removing the oldest entry to keep the list to the created size.
If
.Dv H_SETUNIQUE
was has been called with a non-zero arguments, the element
will not be entered into the history if its contents match
the ones of the current history element.
If the element is entered
.Fn history
returns 1, if it is ignored as a duplicate returns 0.
Finally
.Fn history
returns \-1 if an error occurred.
.It Dv H_PREV_STR , Fa "const char *str" .It Dv H_PREV_STR , Fa "const char *str"
Return the closest previous event that starts with Return the closest previous event that starts with
.Fa str . .Fa str .
@ -555,6 +630,20 @@ Load the history list stored in
.It Dv H_SAVE , Fa "const char *file" .It Dv H_SAVE , Fa "const char *file"
Save the history list to Save the history list to
.Fa file . .Fa file .
.It Dv H_SETUNIQUE , Fa "int unique"
Set if the adjacent identical event strings should not be entered into
the history.
.It Dv H_GETUNIQUE
Retrieve the current setting if if adjacent elements should be entered into
the history.
.It Dv H_DEL , Fa "int num"
Delete the event numbered
.Fa e .
This function is only provided for
.Xr readline 3
compatibility.
The caller is responsible for free'ing the string in the returned
.Fa HistEvent .
.El .El
.Pp .Pp
The The
@ -566,6 +655,78 @@ Otherwise, \-1 is returned and
.Fa ev .Fa ev
is updated to contain more details about the error. is updated to contain more details about the error.
.El .El
.Sh TOKENIZATION FUNCTIONS
The tokenization functions use a common data structure,
.Fa Tokenizer ,
which is created by
.Fn tok_init
and freed by
.Fn tok_end .
.Pp
The following functions are available:
.Bl -tag -width 4n
.It Fn tok_init
Initialise the tokenizer, and return a data structure
to be used by all other tokenizer functions.
.Fa IFS
contains the Input Field Separators, which defaults to
.Aq space ,
.Aq tab ,
and
.Aq newline
if
.Dv NULL .
.It Fn tok_end
Clean up and finish with
.Fa t ,
assumed to have been created with
.Fn tok_init .
.It Fn tok_reset
Reset the tokenizer state.
Use after a line has been successfully tokenized
by
.Fn tok_line
or
.Fn tok_str
and before a new line is to be tokenized.
.It Fn tok_line
Tokenize
.Fa li ,
If successful, modify:
.Fa argv
to contain the words,
.Fa argc
to contain the number of words,
.Fa cursorc
(if not
.Dv NULL )
to contain the index of the word containing the cursor,
and
.Fa cursoro
(if not
.Dv NULL )
to contain the offset within
.Fa argv[cursorc]
of the cursor.
.Pp
Returns
0 if successful,
\-1 for an internal error,
1 for an unmatched single quote,
2 for an unmatched double quote,
and
3 for a backslash quoted
.Aq newline .
A positive exit code indicates that another line should be read
and tokenization attempted again.
.
.It Fn tok_str
A simpler form of
.Fn tok_line ;
.Fa str
is a NUL terminated string to tokenize.
.El
.
.\"XXX.Sh EXAMPLES .\"XXX.Sh EXAMPLES
.\"XXX: provide some examples .\"XXX: provide some examples
.Sh SEE ALSO .Sh SEE ALSO
@ -603,9 +764,6 @@ wrote this manual and implemented
and and
.Dv EL_RPROMPT . .Dv EL_RPROMPT .
.Sh BUGS .Sh BUGS
The tokenization functions are not publically defined in
.In histedit.h .
.Pp
At this time, it is the responsibility of the caller to At this time, it is the responsibility of the caller to
check the result of the check the result of the
.Dv EL_EDITMODE .Dv EL_EDITMODE

View File

@ -1,4 +1,4 @@
.\" $NetBSD: editrc.5,v 1.10 2000/11/08 00:09:38 lukem Exp $ .\" $NetBSD: editrc.5,v 1.19 2003/11/01 23:35:33 christos Exp $
.\" .\"
.\" Copyright (c) 1997-2000 The NetBSD Foundation, Inc. .\" Copyright (c) 1997-2000 The NetBSD Foundation, Inc.
.\" All rights reserved. .\" All rights reserved.
@ -35,7 +35,7 @@
.\" .\"
.\" $FreeBSD$ .\" $FreeBSD$
.\" .\"
.Dd November 8, 2000 .Dd October 18, 2003
.Os .Os
.Dt EDITRC 5 .Dt EDITRC 5
.Sh NAME .Sh NAME
@ -64,7 +64,7 @@ for more information.
.Ar prog .Ar prog
is the program name string that a program defines when it calls is the program name string that a program defines when it calls
.Xr el_init 3 .Xr el_init 3
to setup to set up
.Xr editline 3 , .Xr editline 3 ,
which is usually which is usually
.Va argv[0] . .Va argv[0] .
@ -230,8 +230,24 @@ causes messages to be verbose.
Enable or disable the Enable or disable the
.Nm editline .Nm editline
functionality in a program. functionality in a program.
.It Ic history .It Ic history Ar list | Ar size Dv n | Ar unique Dv n
List the history. The
.Ar list
command lists all entries in the history.
The
.Ar size
command sets the history size to
.Dv n
entries.
The
.Ar unique
command controls if history should keep duplicate entries.
If
.Dv n
is non zero, only keep unique history entries.
If
.Dv n
is zero, then keep all entries (the default).
.It Ic telltc .It Ic telltc
List the values of all the terminal capabilities (see List the values of all the terminal capabilities (see
.Xr termcap 5 ) . .Xr termcap 5 ) .
@ -251,6 +267,7 @@ No sanity checking is done.
.Op Ar +mode .Op Ar +mode
.Op Ar -mode .Op Ar -mode
.Op Ar mode .Op Ar mode
.Op Ar char=c
.Xc .Xc
Control which tty modes that Control which tty modes that
.Nm .Nm
@ -287,6 +304,15 @@ fixes
on or off or removes control of on or off or removes control of
.Ar mode .Ar mode
in the chosen set. in the chosen set.
.Pp
.Ic Setty
can also be used to set tty characters to particular values using
.Ar char=value .
If
.Ar value
is empty
then the character is set to
.Dv _POSIX_VDISABLE .
.El .El
.Sh EDITOR COMMANDS .Sh EDITOR COMMANDS
The following editor commands are available for use in key bindings: The following editor commands are available for use in key bindings:

View File

@ -13,11 +13,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.
* *
@ -33,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $NetBSD: el.c,v 1.20 2000/11/11 22:18:57 christos Exp $ * $NetBSD: el.c,v 1.40 2005/08/01 23:00:15 christos Exp $
*/ */
#if !defined(lint) && !defined(SCCSID) #if !defined(lint) && !defined(SCCSID)
@ -54,6 +50,8 @@ __FBSDID("$FreeBSD$");
#include <stdarg.h> #include <stdarg.h>
#include "el.h" #include "el.h"
#define HAVE_ISSETUGID
/* el_init(): /* el_init():
* Initialize editline and set default parameters. * Initialize editline and set default parameters.
*/ */
@ -62,9 +60,6 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr)
{ {
EditLine *el = (EditLine *) el_malloc(sizeof(EditLine)); EditLine *el = (EditLine *) el_malloc(sizeof(EditLine));
#ifdef DEBUG
char *tty;
#endif
if (el == NULL) if (el == NULL)
return (NULL); return (NULL);
@ -74,14 +69,21 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr)
el->el_infd = fileno(fin); el->el_infd = fileno(fin);
el->el_outfile = fout; el->el_outfile = fout;
el->el_errfile = ferr; el->el_errfile = ferr;
el->el_prog = strdup(prog); if ((el->el_prog = el_strdup(prog)) == NULL) {
el_free(el);
return NULL;
}
/* /*
* Initialize all the modules. Order is important!!! * Initialize all the modules. Order is important!!!
*/ */
el->el_flags = 0; el->el_flags = 0;
(void) term_init(el); if (term_init(el) == -1) {
el_free(el->el_prog);
el_free(el);
return NULL;
}
(void) key_init(el); (void) key_init(el);
(void) map_init(el); (void) map_init(el);
if (tty_init(el) == -1) if (tty_init(el) == -1)
@ -91,7 +93,7 @@ el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr)
(void) hist_init(el); (void) hist_init(el);
(void) prompt_init(el); (void) prompt_init(el);
(void) sig_init(el); (void) sig_init(el);
el->data = NULL; (void) read_init(el);
return (el); return (el);
} }
@ -132,7 +134,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? */
} }
@ -143,11 +145,12 @@ public int
el_set(EditLine *el, int op, ...) el_set(EditLine *el, int op, ...)
{ {
va_list va; va_list va;
int rv; int rv = 0;
va_start(va, op);
if (el == NULL) if (el == NULL)
return (-1); return (-1);
va_start(va, op);
switch (op) { switch (op) {
case EL_PROMPT: case EL_PROMPT:
case EL_RPROMPT: case EL_RPROMPT:
@ -167,7 +170,6 @@ el_set(EditLine *el, int op, ...)
el->el_flags |= HANDLE_SIGNALS; el->el_flags |= HANDLE_SIGNALS;
else else
el->el_flags &= ~HANDLE_SIGNALS; el->el_flags &= ~HANDLE_SIGNALS;
rv = 0;
break; break;
case EL_BIND: case EL_BIND:
@ -176,7 +178,7 @@ el_set(EditLine *el, int op, ...)
case EL_ECHOTC: case EL_ECHOTC:
case EL_SETTY: case EL_SETTY:
{ {
char *argv[20]; const char *argv[20];
int i; int i;
for (i = 1; i < 20; i++) for (i = 1; i < 20; i++)
@ -244,8 +246,41 @@ el_set(EditLine *el, int op, ...)
rv = 0; rv = 0;
break; break;
case EL_GETCFN:
{
el_rfunc_t rc = va_arg(va, el_rfunc_t);
rv = el_read_setfn(el, rc);
break;
}
case EL_CLIENTDATA:
el->el_data = va_arg(va, void *);
break;
case EL_UNBUFFERED:
rv = va_arg(va, int);
if (rv && !(el->el_flags & UNBUFFERED)) {
el->el_flags |= UNBUFFERED;
read_prepare(el);
} else if (!rv && (el->el_flags & UNBUFFERED)) {
el->el_flags &= ~UNBUFFERED;
read_finish(el);
}
rv = 0;
break;
case EL_PREP_TERM:
rv = va_arg(va, int);
if (rv)
(void) tty_rawmode(el);
else
(void) tty_cookedmode(el);
rv = 0;
break;
default: default:
rv = -1; rv = -1;
break;
} }
va_end(va); va_end(va);
@ -266,11 +301,11 @@ el_get(EditLine *el, int op, void *ret)
switch (op) { switch (op) {
case EL_PROMPT: case EL_PROMPT:
case EL_RPROMPT: case EL_RPROMPT:
rv = prompt_get(el, (el_pfunc_t *) & ret, op); rv = prompt_get(el, (void *) &ret, op);
break; break;
case EL_EDITOR: case EL_EDITOR:
rv = map_get_editor(el, (const char **) &ret); rv = map_get_editor(el, (void *) &ret);
break; break;
case EL_SIGNAL: case EL_SIGNAL:
@ -283,21 +318,22 @@ el_get(EditLine *el, int op, void *ret)
rv = 0; rv = 0;
break; break;
#if 0 /* XXX */
case EL_TERMINAL: case EL_TERMINAL:
rv = term_get(el, (const char *) &ret); term_get(el, (const char **)ret);
rv = 0;
break; break;
#if 0 /* XXX */
case EL_BIND: case EL_BIND:
case EL_TELLTC: case EL_TELLTC:
case EL_SETTC: case EL_SETTC:
case EL_ECHOTC: case EL_ECHOTC:
case EL_SETTY: case EL_SETTY:
{ {
char *argv[20]; const char *argv[20];
int i; int i;
for (i = 1; i < 20; i++) for (i = 1; i < sizeof(argv) / sizeof(argv[0]); i++)
if ((argv[i] = va_arg(va, char *)) == NULL) if ((argv[i] = va_arg(va, char *)) == NULL)
break; break;
@ -354,6 +390,21 @@ el_get(EditLine *el, int op, void *ret)
break; break;
#endif /* XXX */ #endif /* XXX */
case EL_GETCFN:
*((el_rfunc_t *)ret) = el_read_getfn(el);
rv = 0;
break;
case EL_CLIENTDATA:
*((void **)ret) = el->el_data;
rv = 0;
break;
case EL_UNBUFFERED:
*((int *) ret) = (!(el->el_flags & UNBUFFERED));
rv = 0;
break;
default: default:
rv = -1; rv = -1;
} }
@ -369,7 +420,7 @@ el_data_set (el, data)
EditLine *el; EditLine *el;
void *data; void *data;
{ {
el->data = data; el->el_data = data;
return; return;
} }
@ -381,8 +432,8 @@ public void *
el_data_get (el) el_data_get (el)
EditLine *el; EditLine *el;
{ {
if (el->data) if (el->el_data)
return (el->data); return (el->el_data);
return (NULL); return (NULL);
} }
@ -396,7 +447,6 @@ el_line(EditLine *el)
return (const LineInfo *) (void *) &el->el_line; return (const LineInfo *) (void *) &el->el_line;
} }
static const char elpath[] = "/.editrc";
/* el_source(): /* el_source():
* Source a file * Source a file
@ -406,10 +456,14 @@ el_source(EditLine *el, const char *fname)
{ {
FILE *fp; FILE *fp;
size_t len; size_t len;
char *ptr, path[MAXPATHLEN]; char *ptr;
fp = NULL; fp = NULL;
if (fname == NULL) { if (fname == NULL) {
#ifdef HAVE_ISSETUGID
static const char elpath[] = "/.editrc";
char path[MAXPATHLEN];
if (issetugid()) if (issetugid())
return (-1); return (-1);
if ((ptr = getenv("HOME")) == NULL) if ((ptr = getenv("HOME")) == NULL)
@ -419,6 +473,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");
@ -477,7 +539,7 @@ el_beep(EditLine *el)
*/ */
protected int protected int
/*ARGSUSED*/ /*ARGSUSED*/
el_editmode(EditLine *el, int argc, char **argv) el_editmode(EditLine *el, int argc, const char **argv)
{ {
const char *how; const char *how;
@ -485,10 +547,13 @@ el_editmode(EditLine *el, int argc, char **argv)
return (-1); return (-1);
how = argv[1]; how = argv[1];
if (strcmp(how, "on") == 0) if (strcmp(how, "on") == 0) {
el->el_flags &= ~EDIT_DISABLED; el->el_flags &= ~EDIT_DISABLED;
else if (strcmp(how, "off") == 0) tty_rawmode(el);
} else if (strcmp(how, "off") == 0) {
tty_cookedmode(el);
el->el_flags |= EDIT_DISABLED; el->el_flags |= EDIT_DISABLED;
}
else { else {
(void) fprintf(el->el_errfile, "edit: Bad value `%s'.\n", how); (void) fprintf(el->el_errfile, "edit: Bad value `%s'.\n", how);
return (-1); return (-1);

View File

@ -13,11 +13,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,7 +30,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)el.h 8.1 (Berkeley) 6/4/93 * @(#)el.h 8.1 (Berkeley) 6/4/93
* $NetBSD: el.h,v 1.7 2000/11/11 22:18:57 christos Exp $ * $NetBSD: el.h,v 1.16 2003/10/18 23:48:42 christos Exp $
* $FreeBSD$ * $FreeBSD$
*/ */
@ -55,9 +51,10 @@
#define EL_BUFSIZ 1024 /* Maximum line size */ #define EL_BUFSIZ 1024 /* Maximum line size */
#define HANDLE_SIGNALS 1<<0 #define HANDLE_SIGNALS 0x01
#define NO_TTY 1<<1 #define NO_TTY 0x02
#define EDIT_DISABLED 1<<2 #define EDIT_DISABLED 0x04
#define UNBUFFERED 0x08
typedef int bool_t; /* True or not */ typedef int bool_t; /* True or not */
@ -72,7 +69,7 @@ typedef struct el_line_t {
char *buffer; /* Input line */ char *buffer; /* Input line */
char *cursor; /* Cursor position */ char *cursor; /* Cursor position */
char *lastchar; /* Last character */ char *lastchar; /* Last character */
const char *limit; /* Max position */ const char *limit; /* Max position */
} el_line_t; } el_line_t;
/* /*
@ -84,11 +81,14 @@ typedef struct el_state_t {
int argument; /* Numeric argument */ int argument; /* Numeric argument */
int metanext; /* Is the next char a meta char */ int metanext; /* Is the next char a meta char */
el_action_t lastcmd; /* Previous command */ el_action_t lastcmd; /* Previous command */
el_action_t thiscmd; /* this command */
char thisch; /* char that generated it */
} el_state_t; } el_state_t;
/* /*
* Until we come up with something better... * Until we come up with something better...
*/ */
#define el_strdup(a) strdup(a)
#define el_malloc(a) malloc(a) #define el_malloc(a) malloc(a)
#define el_realloc(a,b) realloc(a, b) #define el_realloc(a,b) realloc(a, b)
#define el_free(a) free(a) #define el_free(a) free(a)
@ -106,6 +106,7 @@ typedef struct el_state_t {
#include "parse.h" #include "parse.h"
#include "sig.h" #include "sig.h"
#include "help.h" #include "help.h"
#include "read.h"
struct editline { struct editline {
char *el_prog; /* the program name */ char *el_prog; /* the program name */
@ -116,6 +117,7 @@ struct editline {
coord_t el_cursor; /* Cursor location */ coord_t el_cursor; /* Cursor location */
char **el_display; /* Real screen image = what is there */ char **el_display; /* Real screen image = what is there */
char **el_vdisplay; /* Virtual screen image = what we see */ char **el_vdisplay; /* Virtual screen image = what we see */
void *el_data; /* Client data */
el_line_t el_line; /* The current line information */ el_line_t el_line; /* The current line information */
el_state_t el_state; /* Current editor state */ el_state_t el_state; /* Current editor state */
el_term_t el_term; /* Terminal dependent stuff */ el_term_t el_term; /* Terminal dependent stuff */
@ -129,15 +131,18 @@ struct editline {
el_history_t el_history; /* History stuff */ el_history_t el_history; /* History stuff */
el_search_t el_search; /* Search stuff */ el_search_t el_search; /* Search stuff */
el_signal_t el_signal; /* Signal handling stuff */ el_signal_t el_signal; /* Signal handling stuff */
el_read_t el_read; /* Character reading stuff */
void *data; /* user data */
}; };
protected int el_editmode(EditLine *, int, char **); protected int el_editmode(EditLine *, int, const char **);
#ifdef DEBUG #ifdef DEBUG
#define EL_ABORT(a) (void) (fprintf(el->el_errfile, "%s, %d: ", \ #define EL_ABORT(a) do { \
__FILE__, __LINE__), fprintf a, abort()) fprintf(el->el_errfile, "%s, %d: ", \
__FILE__, __LINE__); \
fprintf a; \
abort(); \
} while( /*CONSTCOND*/0);
#else #else
#define EL_ABORT(a) abort() #define EL_ABORT(a) abort()
#endif #endif

View File

@ -13,11 +13,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.
* *
@ -33,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $NetBSD: emacs.c,v 1.8 2000/09/04 22:06:29 lukem Exp $ * $NetBSD: emacs.c,v 1.19 2004/10/28 21:14:52 dsl Exp $
*/ */
#if !defined(lint) && !defined(SCCSID) #if !defined(lint) && !defined(SCCSID)
@ -54,7 +50,7 @@ __FBSDID("$FreeBSD$");
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_delete_or_list(EditLine *el, int c) em_delete_or_list(EditLine *el, int c __unused)
{ {
if (el->el_line.cursor == el->el_line.lastchar) { if (el->el_line.cursor == el->el_line.lastchar) {
@ -73,7 +69,10 @@ em_delete_or_list(EditLine *el, int c)
return (CC_ERROR); return (CC_ERROR);
} }
} else { } else {
c_delafter(el, el->el_state.argument); /* delete after dot */ if (el->el_state.doingarg)
c_delafter(el, el->el_state.argument);
else
c_delafter1(el);
if (el->el_line.cursor > el->el_line.lastchar) if (el->el_line.cursor > el->el_line.lastchar)
el->el_line.cursor = el->el_line.lastchar; el->el_line.cursor = el->el_line.lastchar;
/* bounds check */ /* bounds check */
@ -88,7 +87,7 @@ em_delete_or_list(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_delete_next_word(EditLine *el, int c) em_delete_next_word(EditLine *el, int c __unused)
{ {
char *cp, *p, *kp; char *cp, *p, *kp;
@ -117,14 +116,12 @@ em_delete_next_word(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_yank(EditLine *el, int c) em_yank(EditLine *el, int c __unused)
{ {
char *kp, *cp; char *kp, *cp;
if (el->el_chared.c_kill.last == el->el_chared.c_kill.buf) { if (el->el_chared.c_kill.last == el->el_chared.c_kill.buf)
if (!ch_enlargebufs(el, 1)) return (CC_NORM);
return (CC_ERROR);
}
if (el->el_line.lastchar + if (el->el_line.lastchar +
(el->el_chared.c_kill.last - el->el_chared.c_kill.buf) >= (el->el_chared.c_kill.last - el->el_chared.c_kill.buf) >=
@ -154,7 +151,7 @@ em_yank(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_kill_line(EditLine *el, int c) em_kill_line(EditLine *el, int c __unused)
{ {
char *kp, *cp; char *kp, *cp;
@ -176,7 +173,7 @@ em_kill_line(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_kill_region(EditLine *el, int c) em_kill_region(EditLine *el, int c __unused)
{ {
char *kp, *cp; char *kp, *cp;
@ -209,11 +206,11 @@ em_kill_region(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_copy_region(EditLine *el, int c) em_copy_region(EditLine *el, int c __unused)
{ {
char *kp, *cp; char *kp, *cp;
if (el->el_chared.c_kill.mark) if (!el->el_chared.c_kill.mark)
return (CC_ERROR); return (CC_ERROR);
if (el->el_chared.c_kill.mark > el->el_line.cursor) { if (el->el_chared.c_kill.mark > el->el_line.cursor) {
@ -233,12 +230,12 @@ em_copy_region(EditLine *el, int c)
} }
/* em_gosmacs_traspose(): /* em_gosmacs_transpose():
* Exchange the two characters before the cursor * Exchange the two characters before the cursor
* Gosling emacs transpose chars [^T] * Gosling emacs transpose chars [^T]
*/ */
protected el_action_t protected el_action_t
em_gosmacs_traspose(EditLine *el, int c) em_gosmacs_transpose(EditLine *el, int c)
{ {
if (el->el_line.cursor > &el->el_line.buffer[1]) { if (el->el_line.cursor > &el->el_line.buffer[1]) {
@ -258,7 +255,7 @@ em_gosmacs_traspose(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_next_word(EditLine *el, int c) em_next_word(EditLine *el, int c __unused)
{ {
if (el->el_line.cursor == el->el_line.lastchar) if (el->el_line.cursor == el->el_line.lastchar)
return (CC_ERROR); return (CC_ERROR);
@ -269,7 +266,7 @@ em_next_word(EditLine *el, int c)
ce__isword); ce__isword);
if (el->el_map.type == MAP_VI) if (el->el_map.type == MAP_VI)
if (el->el_chared.c_vcmd.action & DELETE) { if (el->el_chared.c_vcmd.action != NOP) {
cv_delfini(el); cv_delfini(el);
return (CC_REFRESH); return (CC_REFRESH);
} }
@ -283,7 +280,7 @@ em_next_word(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_upper_case(EditLine *el, int c) em_upper_case(EditLine *el, int c __unused)
{ {
char *cp, *ep; char *cp, *ep;
@ -291,8 +288,8 @@ em_upper_case(EditLine *el, int c)
el->el_state.argument, ce__isword); el->el_state.argument, ce__isword);
for (cp = el->el_line.cursor; cp < ep; cp++) for (cp = el->el_line.cursor; cp < ep; cp++)
if (islower((unsigned char) *cp)) if (islower((unsigned char)*cp))
*cp = toupper((unsigned char) *cp); *cp = toupper((unsigned char)*cp);
el->el_line.cursor = ep; el->el_line.cursor = ep;
if (el->el_line.cursor > el->el_line.lastchar) if (el->el_line.cursor > el->el_line.lastchar)
@ -307,7 +304,7 @@ em_upper_case(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_capitol_case(EditLine *el, int c) em_capitol_case(EditLine *el, int c __unused)
{ {
char *cp, *ep; char *cp, *ep;
@ -315,16 +312,16 @@ em_capitol_case(EditLine *el, int c)
el->el_state.argument, ce__isword); el->el_state.argument, ce__isword);
for (cp = el->el_line.cursor; cp < ep; cp++) { for (cp = el->el_line.cursor; cp < ep; cp++) {
if (isalpha((unsigned char) *cp)) { if (isalpha((unsigned char)*cp)) {
if (islower((unsigned char) *cp)) if (islower((unsigned char)*cp))
*cp = toupper((unsigned char) *cp); *cp = toupper((unsigned char)*cp);
cp++; cp++;
break; break;
} }
} }
for (; cp < ep; cp++) for (; cp < ep; cp++)
if (isupper((unsigned char) *cp)) if (isupper((unsigned char)*cp))
*cp = tolower((unsigned char) *cp); *cp = tolower((unsigned char)*cp);
el->el_line.cursor = ep; el->el_line.cursor = ep;
if (el->el_line.cursor > el->el_line.lastchar) if (el->el_line.cursor > el->el_line.lastchar)
@ -339,7 +336,7 @@ em_capitol_case(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_lower_case(EditLine *el, int c) em_lower_case(EditLine *el, int c __unused)
{ {
char *cp, *ep; char *cp, *ep;
@ -347,8 +344,8 @@ em_lower_case(EditLine *el, int c)
el->el_state.argument, ce__isword); el->el_state.argument, ce__isword);
for (cp = el->el_line.cursor; cp < ep; cp++) for (cp = el->el_line.cursor; cp < ep; cp++)
if (isupper((unsigned char) *cp)) if (isupper((unsigned char)*cp))
*cp = tolower((unsigned char) *cp); *cp = tolower((unsigned char)*cp);
el->el_line.cursor = ep; el->el_line.cursor = ep;
if (el->el_line.cursor > el->el_line.lastchar) if (el->el_line.cursor > el->el_line.lastchar)
@ -363,7 +360,7 @@ em_lower_case(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_set_mark(EditLine *el, int c) em_set_mark(EditLine *el, int c __unused)
{ {
el->el_chared.c_kill.mark = el->el_line.cursor; el->el_chared.c_kill.mark = el->el_line.cursor;
@ -377,7 +374,7 @@ em_set_mark(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_exchange_mark(EditLine *el, int c) em_exchange_mark(EditLine *el, int c __unused)
{ {
char *cp; char *cp;
@ -394,7 +391,7 @@ em_exchange_mark(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_universal_argument(EditLine *el, int c) em_universal_argument(EditLine *el, int c __unused)
{ /* multiply current argument by 4 */ { /* multiply current argument by 4 */
if (el->el_state.argument > 1000000) if (el->el_state.argument > 1000000)
@ -411,7 +408,7 @@ em_universal_argument(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_meta_next(EditLine *el, int c) em_meta_next(EditLine *el, int c __unused)
{ {
el->el_state.metanext = 1; el->el_state.metanext = 1;
@ -424,7 +421,7 @@ em_meta_next(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_toggle_overwrite(EditLine *el, int c) em_toggle_overwrite(EditLine *el, int c __unused)
{ {
el->el_state.inputmode = (el->el_state.inputmode == MODE_INSERT) ? el->el_state.inputmode = (el->el_state.inputmode == MODE_INSERT) ?
@ -438,7 +435,7 @@ em_toggle_overwrite(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_copy_prev_word(EditLine *el, int c) em_copy_prev_word(EditLine *el, int c __unused)
{ {
char *cp, *oldc, *dp; char *cp, *oldc, *dp;
@ -465,7 +462,7 @@ em_copy_prev_word(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_inc_search_next(EditLine *el, int c) em_inc_search_next(EditLine *el, int c __unused)
{ {
el->el_search.patlen = 0; el->el_search.patlen = 0;
@ -478,9 +475,32 @@ em_inc_search_next(EditLine *el, int c)
*/ */
protected el_action_t protected el_action_t
/*ARGSUSED*/ /*ARGSUSED*/
em_inc_search_prev(EditLine *el, int c) em_inc_search_prev(EditLine *el, int c __unused)
{ {
el->el_search.patlen = 0; el->el_search.patlen = 0;
return (ce_inc_search(el, ED_SEARCH_PREV_HISTORY)); return (ce_inc_search(el, ED_SEARCH_PREV_HISTORY));
} }
/* em_delete_prev_char():
* Delete the character to the left of the cursor
* [^?]
*/
protected el_action_t
/*ARGSUSED*/
em_delete_prev_char(EditLine *el, int c __unused)
{
if (el->el_line.cursor <= el->el_line.buffer)
return (CC_ERROR);
if (el->el_state.doingarg)
c_delbefore(el, el->el_state.argument);
else
c_delbefore1(el);
el->el_line.cursor -= el->el_state.argument;
if (el->el_line.cursor < el->el_line.buffer)
el->el_line.cursor = el->el_line.buffer;
return (CC_REFRESH);
}

View File

@ -13,11 +13,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.
* *
@ -33,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $NetBSD: hist.c,v 1.8 2001/01/10 07:45:41 jdolecek Exp $ * $NetBSD: hist.c,v 1.15 2003/11/01 23:36:39 christos Exp $
*/ */
#if !defined(lint) && !defined(SCCSID) #if !defined(lint) && !defined(SCCSID)
@ -130,18 +126,16 @@ hist_get(EditLine *el)
el->el_history.eventno = h; el->el_history.eventno = h;
return (CC_ERROR); return (CC_ERROR);
} }
(void) strncpy(el->el_line.buffer, hp, (void) strlcpy(el->el_line.buffer, hp,
(size_t)(el->el_line.limit - el->el_line.buffer)); (size_t)(el->el_line.limit - el->el_line.buffer));
el->el_line.lastchar = el->el_line.buffer + strlen(el->el_line.buffer); el->el_line.lastchar = el->el_line.buffer + strlen(el->el_line.buffer);
if (el->el_line.lastchar > el->el_line.buffer) { if (el->el_line.lastchar > el->el_line.buffer
if (el->el_line.lastchar[-1] == '\n') && el->el_line.lastchar[-1] == '\n')
el->el_line.lastchar--; el->el_line.lastchar--;
if (el->el_line.lastchar[-1] == ' ') if (el->el_line.lastchar > el->el_line.buffer
el->el_line.lastchar--; && el->el_line.lastchar[-1] == ' ')
if (el->el_line.lastchar < el->el_line.buffer) el->el_line.lastchar--;
el->el_line.lastchar = el->el_line.buffer;
}
#ifdef KSHVI #ifdef KSHVI
if (el->el_map.type == MAP_VI) if (el->el_map.type == MAP_VI)
el->el_line.cursor = el->el_line.buffer; el->el_line.cursor = el->el_line.buffer;
@ -153,21 +147,40 @@ hist_get(EditLine *el)
} }
/* hist_list() /* hist_command()
* List history entries * process a history command
*/ */
protected int protected int
/*ARGSUSED*/ hist_command(EditLine *el, int argc, const char **argv)
hist_list(EditLine *el, int argc, char **argv)
{ {
const char *str; const char *str;
int num;
HistEvent ev;
if (el->el_history.ref == NULL) if (el->el_history.ref == NULL)
return (-1); return (-1);
for (str = HIST_LAST(el); str != NULL; str = HIST_PREV(el))
(void) fprintf(el->el_outfile, "%d %s", if (argc == 1 || strcmp(argv[1], "list") == 0) {
el->el_history.ev.num, str); /* List history entries */
return (0);
for (str = HIST_LAST(el); str != NULL; str = HIST_PREV(el))
(void) fprintf(el->el_outfile, "%d %s",
el->el_history.ev.num, str);
return (0);
}
if (argc != 3)
return (-1);
num = (int)strtol(argv[2], NULL, 0);
if (strcmp(argv[1], "size") == 0)
return history(el->el_history.ref, &ev, H_SETSIZE, num);
if (strcmp(argv[1], "unique") == 0)
return history(el->el_history.ref, &ev, H_SETUNIQUE, num);
return -1;
} }
/* hist_enlargebuf() /* hist_enlargebuf()

View File

@ -13,11 +13,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,7 +30,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)hist.h 8.1 (Berkeley) 6/4/93 * @(#)hist.h 8.1 (Berkeley) 6/4/93
* $NetBSD: hist.h,v 1.5 2000/09/04 22:06:30 lukem Exp $ * $NetBSD: hist.h,v 1.10 2003/08/07 16:44:31 agc Exp $
* $FreeBSD$ * $FreeBSD$
*/ */
@ -66,7 +62,7 @@ typedef struct el_history_t {
#define HIST_FIRST(el) HIST_FUN(el, H_FIRST, NULL) #define HIST_FIRST(el) HIST_FUN(el, H_FIRST, NULL)
#define HIST_LAST(el) HIST_FUN(el, H_LAST, NULL) #define HIST_LAST(el) HIST_FUN(el, H_LAST, NULL)
#define HIST_PREV(el) HIST_FUN(el, H_PREV, NULL) #define HIST_PREV(el) HIST_FUN(el, H_PREV, NULL)
#define HIST_EVENT(el, num) HIST_FUN(el, H_EVENT, num) #define HIST_SET(el, num) HIST_FUN(el, H_SET, num)
#define HIST_LOAD(el, fname) HIST_FUN(el, H_LOAD fname) #define HIST_LOAD(el, fname) HIST_FUN(el, H_LOAD fname)
#define HIST_SAVE(el, fname) HIST_FUN(el, H_SAVE fname) #define HIST_SAVE(el, fname) HIST_FUN(el, H_SAVE fname)
@ -74,7 +70,7 @@ protected int hist_init(EditLine *);
protected void hist_end(EditLine *); protected void hist_end(EditLine *);
protected el_action_t hist_get(EditLine *); protected el_action_t hist_get(EditLine *);
protected int hist_set(EditLine *, hist_fun_t, ptr_t); protected int hist_set(EditLine *, hist_fun_t, ptr_t);
protected int hist_list(EditLine *, int, char **); protected int hist_command(EditLine *, int, const char **);
protected int hist_enlargebuf(EditLine *, size_t, size_t); protected int hist_enlargebuf(EditLine *, size_t, size_t);
#endif /* _h_el_hist */ #endif /* _h_el_hist */

View File

@ -13,11 +13,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.
* *
@ -33,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $NetBSD: history.c,v 1.16 2000/09/04 22:06:30 lukem Exp $ * $NetBSD: history.c,v 1.31 2005/08/01 14:34:06 christos Exp $
*/ */
#if !defined(lint) && !defined(SCCSID) #if !defined(lint) && !defined(SCCSID)
@ -71,10 +67,12 @@ 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 */
}; };
#define HNEXT(h, ev) (*(h)->h_next)((h)->h_ref, ev) #define HNEXT(h, ev) (*(h)->h_next)((h)->h_ref, ev)
#define HFIRST(h, ev) (*(h)->h_first)((h)->h_ref, ev) #define HFIRST(h, ev) (*(h)->h_first)((h)->h_ref, ev)
#define HPREV(h, ev) (*(h)->h_prev)((h)->h_ref, ev) #define HPREV(h, ev) (*(h)->h_prev)((h)->h_ref, ev)
@ -84,14 +82,24 @@ 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_malloc(a) malloc(a) #define h_malloc(a) malloc(a)
#define h_realloc(a, b) realloc((a), (b)) #define h_realloc(a, b) realloc((a), (b))
#define h_free(a) free(a) #define h_free(a) free(a)
typedef struct {
int num;
char *str;
} HistEventPrivate;
private int history_setsize(History *, HistEvent *, int); private int history_setsize(History *, HistEvent *, int);
private int history_getsize(History *, HistEvent *); private int history_getsize(History *, HistEvent *);
private int history_setunique(History *, HistEvent *, int);
private int history_getunique(History *, HistEvent *);
private int history_set_fun(History *, History *); private int history_set_fun(History *, History *);
private int history_load(History *, const char *); private int history_load(History *, const char *);
private int history_save(History *, const char *); private int history_save(History *, const char *);
@ -110,31 +118,41 @@ typedef struct hentry_t {
HistEvent ev; /* What we return */ HistEvent ev; /* What we return */
struct hentry_t *next; /* Next entry */ struct hentry_t *next; /* Next entry */
struct hentry_t *prev; /* Previous entry */ struct hentry_t *prev; /* Previous entry */
} hentry_t; } hentry_t;
typedef struct history_t { typedef struct history_t {
hentry_t list; /* Fake list header element */ hentry_t list; /* Fake list header element */
hentry_t *cursor; /* Current element in the list */ hentry_t *cursor; /* Current element in the list */
int max; /* Maximum number of events */ int max; /* Maximum number of events */
int cur; /* Current number of events */ int cur; /* Current number of events */
int eventid; /* For generation of unique event id */ int eventid; /* For generation of unique event id */
} history_t; int flags; /* History flags */
#define H_UNIQUE 1 /* Store only unique elements */
} history_t;
private int history_def_first(ptr_t, HistEvent *);
private int history_def_last(ptr_t, HistEvent *);
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 void history_def_init(ptr_t *, HistEvent *, int); private int history_def_del(ptr_t, HistEvent *, const int);
private void history_def_clear(ptr_t, HistEvent *);
private int history_def_init(ptr_t *, HistEvent *, int);
private int history_def_insert(history_t *, HistEvent *, const char *); private int history_def_insert(history_t *, HistEvent *, const char *);
private void history_def_delete(history_t *, HistEvent *, hentry_t *); private void history_def_delete(history_t *, HistEvent *, hentry_t *);
#define history_def_setsize(p, num)(void) (((history_t *) p)->max = (num)) #define history_def_setsize(p, num)(void) (((history_t *)p)->max = (num))
#define history_def_getsize(p) (((history_t *) p)->cur) #define history_def_getsize(p) (((history_t *)p)->cur)
#define history_def_getunique(p) (((((history_t *)p)->flags) & H_UNIQUE) != 0)
#define history_def_setunique(p, uni) \
if (uni) \
(((history_t *)p)->flags) |= H_UNIQUE; \
else \
(((history_t *)p)->flags) &= ~H_UNIQUE
#define he_strerror(code) he_errlist[code] #define he_strerror(code) he_errlist[code]
#define he_seterrev(evp, code) {\ #define he_seterrev(evp, code) {\
@ -227,20 +245,19 @@ history_def_next(ptr_t p, HistEvent *ev)
{ {
history_t *h = (history_t *) p; history_t *h = (history_t *) p;
if (h->cursor != &h->list) if (h->cursor == &h->list) {
h->cursor = h->cursor->next;
else {
he_seterrev(ev, _HE_EMPTY_LIST); he_seterrev(ev, _HE_EMPTY_LIST);
return (-1); return (-1);
} }
if (h->cursor != &h->list) if (h->cursor->next == &h->list) {
*ev = h->cursor->ev;
else {
he_seterrev(ev, _HE_END_REACHED); he_seterrev(ev, _HE_END_REACHED);
return (-1); return (-1);
} }
h->cursor = h->cursor->next;
*ev = h->cursor->ev;
return (0); return (0);
} }
@ -253,21 +270,20 @@ history_def_prev(ptr_t p, HistEvent *ev)
{ {
history_t *h = (history_t *) p; history_t *h = (history_t *) p;
if (h->cursor != &h->list) if (h->cursor == &h->list) {
h->cursor = h->cursor->prev;
else {
he_seterrev(ev, he_seterrev(ev,
(h->cur > 0) ? _HE_END_REACHED : _HE_EMPTY_LIST); (h->cur > 0) ? _HE_END_REACHED : _HE_EMPTY_LIST);
return (-1); return (-1);
} }
if (h->cursor != &h->list) if (h->cursor->prev == &h->list) {
*ev = h->cursor->ev;
else {
he_seterrev(ev, _HE_START_REACHED); he_seterrev(ev, _HE_START_REACHED);
return (-1); return (-1);
} }
h->cursor = h->cursor->prev;
*ev = h->cursor->ev;
return (0); return (0);
} }
@ -328,39 +344,59 @@ history_def_add(ptr_t p, HistEvent *ev, const char *str)
history_t *h = (history_t *) p; history_t *h = (history_t *) p;
size_t len; size_t len;
char *s; char *s;
HistEventPrivate *evp = (void *)&h->cursor->ev;
if (h->cursor == &h->list) if (h->cursor == &h->list)
return (history_def_enter(p, ev, str)); return (history_def_enter(p, ev, str));
len = strlen(h->cursor->ev.str) + strlen(str) + 1; len = strlen(evp->str) + strlen(str) + 1;
s = (char *) h_malloc(len); s = (char *) h_malloc(len);
if (!s) { if (s == NULL) {
he_seterrev(ev, _HE_MALLOC_FAILED); he_seterrev(ev, _HE_MALLOC_FAILED);
return (-1); return (-1);
} }
(void) strlcpy(s, h->cursor->ev.str, len); (void) strlcpy(s, h->cursor->ev.str, len);
(void) strlcat(s, str, len); (void) strlcat(s, str, len);
/* LINTED const cast */ h_free((ptr_t)evp->str);
h_free((ptr_t) h->cursor->ev.str); evp->str = s;
h->cursor->ev.str = s;
*ev = h->cursor->ev; *ev = h->cursor->ev;
return (0); return (0);
} }
/* history_def_del():
* Delete element hp of the h list
*/
/* ARGSUSED */
private int
history_def_del(ptr_t p, HistEvent *ev __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
*/ */
/* ARGSUSED */ /* ARGSUSED */
private void private void
history_def_delete(history_t *h, HistEvent *ev, hentry_t *hp) history_def_delete(history_t *h,
HistEvent *ev __unused, hentry_t *hp)
{ {
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;
/* LINTED const cast */ h_free((ptr_t) evp->str);
h_free((ptr_t) hp->ev.str);
h_free(hp); h_free(hp);
h->cur--; h->cur--;
} }
@ -374,11 +410,11 @@ history_def_insert(history_t *h, HistEvent *ev, const char *str)
{ {
h->cursor = (hentry_t *) h_malloc(sizeof(hentry_t)); h->cursor = (hentry_t *) h_malloc(sizeof(hentry_t));
if (h->cursor) if (h->cursor == NULL)
h->cursor->ev.str = strdup(str); goto oomem;
if (!h->cursor || !h->cursor->ev.str) { if ((h->cursor->ev.str = h_strdup(str)) == NULL) {
he_seterrev(ev, _HE_MALLOC_FAILED); h_free((ptr_t)h->cursor);
return (-1); goto oomem;
} }
h->cursor->ev.num = ++h->eventid; h->cursor->ev.num = ++h->eventid;
h->cursor->next = h->list.next; h->cursor->next = h->list.next;
@ -389,6 +425,9 @@ history_def_insert(history_t *h, HistEvent *ev, const char *str)
*ev = h->cursor->ev; *ev = h->cursor->ev;
return (0); return (0);
oomem:
he_seterrev(ev, _HE_MALLOC_FAILED);
return (-1);
} }
@ -400,6 +439,10 @@ history_def_enter(ptr_t p, HistEvent *ev, const char *str)
{ {
history_t *h = (history_t *) p; history_t *h = (history_t *) p;
if ((h->flags & H_UNIQUE) != 0 && h->list.next != &h->list &&
strcmp(h->list.next->ev.str, str) == 0)
return (0);
if (history_def_insert(h, ev, str) == -1) if (history_def_insert(h, ev, str) == -1)
return (-1); /* error, keep error message */ return (-1); /* error, keep error message */
@ -407,10 +450,10 @@ history_def_enter(ptr_t p, HistEvent *ev, const char *str)
* Always keep at least one entry. * Always keep at least one entry.
* This way we don't have to check for the empty list. * This way we don't have to check for the empty list.
*/ */
while (h->cur - 1 > h->max) while (h->cur > h->max && h->cur > 0)
history_def_delete(h, ev, h->list.prev); history_def_delete(h, ev, h->list.prev);
return (0); return (1);
} }
@ -418,10 +461,12 @@ history_def_enter(ptr_t p, HistEvent *ev, const char *str)
* Default history initialization function * Default history initialization function
*/ */
/* ARGSUSED */ /* ARGSUSED */
private void private int
history_def_init(ptr_t *p, HistEvent *ev, int n) history_def_init(ptr_t *p, HistEvent *ev __unused, int n)
{ {
history_t *h = (history_t *) h_malloc(sizeof(history_t)); history_t *h = (history_t *) h_malloc(sizeof(history_t));
if (h == NULL)
return -1;
if (n <= 0) if (n <= 0)
n = 0; n = 0;
@ -432,7 +477,9 @@ history_def_init(ptr_t *p, HistEvent *ev, int n)
h->list.ev.str = NULL; h->list.ev.str = NULL;
h->list.ev.num = 0; h->list.ev.num = 0;
h->cursor = &h->list; h->cursor = &h->list;
h->flags = 0;
*p = (ptr_t) h; *p = (ptr_t) h;
return 0;
} }
@ -461,10 +508,15 @@ history_def_clear(ptr_t p, HistEvent *ev)
public History * public History *
history_init(void) history_init(void)
{ {
History *h = (History *) h_malloc(sizeof(History));
HistEvent ev; HistEvent ev;
History *h = (History *) h_malloc(sizeof(History));
if (h == NULL)
return NULL;
history_def_init(&h->h_ref, &ev, 0); if (history_def_init(&h->h_ref, &ev, 0) == -1) {
h_free((ptr_t)h);
return NULL;
}
h->h_ent = -1; h->h_ent = -1;
h->h_next = history_def_next; h->h_next = history_def_next;
h->h_first = history_def_first; h->h_first = history_def_first;
@ -475,6 +527,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);
} }
@ -490,6 +543,7 @@ 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);
} }
@ -520,18 +574,46 @@ history_setsize(History *h, HistEvent *ev, int num)
private int private int
history_getsize(History *h, HistEvent *ev) history_getsize(History *h, HistEvent *ev)
{ {
int retval = 0; if (h->h_next != history_def_next) {
he_seterrev(ev, _HE_NOT_ALLOWED);
return (-1);
}
ev->num = history_def_getsize(h->h_ref);
if (ev->num < -1) {
he_seterrev(ev, _HE_SIZE_NEGATIVE);
return (-1);
}
return (0);
}
/* history_setunique():
* Set if adjacent equal events should not be entered in history.
*/
private int
history_setunique(History *h, HistEvent *ev, int uni)
{
if (h->h_next != history_def_next) { if (h->h_next != history_def_next) {
he_seterrev(ev, _HE_NOT_ALLOWED); he_seterrev(ev, _HE_NOT_ALLOWED);
return (-1); return (-1);
} }
retval = history_def_getsize(h->h_ref); history_def_setunique(h->h_ref, uni);
if (retval < -1) { return (0);
he_seterrev(ev, _HE_SIZE_NEGATIVE); }
/* history_getunique():
* Get if adjacent equal events should not be entered in history.
*/
private int
history_getunique(History *h, HistEvent *ev)
{
if (h->h_next != history_def_next) {
he_seterrev(ev, _HE_NOT_ALLOWED);
return (-1); return (-1);
} }
ev->num = retval; ev->num = history_def_getunique(h->h_ref);
return (0); return (0);
} }
@ -547,7 +629,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;
@ -559,6 +641,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);
} }
@ -575,6 +658,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);
} }
@ -603,6 +687,8 @@ history_load(History *h, const char *fname)
goto done; goto done;
ptr = h_malloc(max_size = 1024); ptr = h_malloc(max_size = 1024);
if (ptr == NULL)
goto done;
for (i = 0; (line = fgetln(fp, &sz)) != NULL; i++) { for (i = 0; (line = fgetln(fp, &sz)) != NULL; i++) {
char c = line[sz]; char c = line[sz];
@ -612,15 +698,24 @@ history_load(History *h, const char *fname)
line[sz] = '\0'; line[sz] = '\0';
if (max_size < sz) { if (max_size < sz) {
max_size = (sz + 1023) & ~1023; char *nptr;
ptr = h_realloc(ptr, max_size); max_size = (sz + 1024) & ~1023;
nptr = h_realloc(ptr, max_size);
if (nptr == NULL) {
i = -1;
goto oomem;
}
ptr = nptr;
} }
(void) strunvis(ptr, line); (void) strunvis(ptr, line);
line[sz] = c; line[sz] = c;
HENTER(h, &ev, ptr); if (HENTER(h, &ev, ptr) == -1) {
h_free((ptr_t)ptr);
return -1;
}
} }
h_free(ptr); oomem:
h_free((ptr_t)ptr);
done: done:
(void) fclose(fp); (void) fclose(fp);
return (i); return (i);
@ -635,28 +730,40 @@ history_save(History *h, const char *fname)
{ {
FILE *fp; FILE *fp;
HistEvent ev; HistEvent ev;
int i = 0, retval; int i = -1, retval;
size_t len, max_size; size_t len, max_size;
char *ptr; char *ptr;
if ((fp = fopen(fname, "w")) == NULL) if ((fp = fopen(fname, "w")) == NULL)
return (-1); return (-1);
(void) fchmod(fileno(fp), S_IRUSR|S_IWUSR); if (fchmod(fileno(fp), S_IRUSR|S_IWUSR) == -1)
(void) fputs(hist_cookie, fp); goto done;
if (fputs(hist_cookie, fp) == EOF)
goto done;
ptr = h_malloc(max_size = 1024); ptr = h_malloc(max_size = 1024);
for (retval = HLAST(h, &ev); if (ptr == NULL)
goto done;
for (i = 0, retval = HLAST(h, &ev);
retval != -1; retval != -1;
retval = HPREV(h, &ev), i++) { retval = HPREV(h, &ev), i++) {
len = strlen(ev.str) * 4; len = strlen(ev.str) * 4;
if (len >= max_size) { if (len >= max_size) {
max_size = (len + 1023) & 1023; char *nptr;
ptr = h_realloc(ptr, max_size); max_size = (len + 1024) & ~1023;
nptr = h_realloc(ptr, max_size);
if (nptr == NULL) {
i = -1;
goto oomem;
}
ptr = nptr;
} }
(void) strvis(ptr, ev.str, VIS_WHITE); (void) strvis(ptr, ev.str, VIS_WHITE);
(void) fprintf(fp, "%s\n", ptr); (void) fprintf(fp, "%s\n", ptr);
} }
h_free(ptr); oomem:
h_free((ptr_t)ptr);
done:
(void) fclose(fp); (void) fclose(fp);
return (i); return (i);
} }
@ -755,11 +862,23 @@ history(History *h, HistEvent *ev, int fun, ...)
retval = history_setsize(h, ev, va_arg(va, int)); retval = history_setsize(h, ev, va_arg(va, int));
break; break;
case H_GETUNIQUE:
retval = history_getunique(h, ev);
break;
case H_SETUNIQUE:
retval = history_setunique(h, ev, va_arg(va, int));
break;
case H_ADD: case H_ADD:
str = va_arg(va, const char *); str = va_arg(va, const char *);
retval = HADD(h, ev, str); retval = HADD(h, ev, str);
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)
@ -844,6 +963,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);

View File

@ -13,11 +13,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.
* *
@ -33,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $NetBSD: key.c,v 1.11 2001/01/23 15:55:30 jdolecek Exp $ * $NetBSD: key.c,v 1.16 2005/07/06 21:13:02 christos Exp $
*/ */
#if !defined(lint) && !defined(SCCSID) #if !defined(lint) && !defined(SCCSID)
@ -63,7 +59,6 @@ __FBSDID("$FreeBSD$");
* 1) It is not possible to have one key that is a * 1) It is not possible to have one key that is a
* substr of another. * substr of another.
*/ */
#include "sys.h"
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
@ -87,9 +82,11 @@ 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 **, char *); private int node__delete(EditLine *, key_node_t **, const char *);
private int node_lookup(EditLine *, char *, key_node_t *, int); private int node_lookup(EditLine *, const char *, key_node_t *,
int);
private int node_enum(EditLine *, key_node_t *, int); private int node_enum(EditLine *, key_node_t *, int);
private int key__decode_char(char *, int, int); private int key__decode_char(char *, int, int);
@ -111,7 +108,6 @@ key_init(EditLine *el)
return (0); return (0);
} }
/* key_end(): /* key_end():
* Free the key maps * Free the key maps
*/ */
@ -121,8 +117,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;
} }
@ -216,7 +211,7 @@ key_add(EditLine *el, const char *key, key_value_t *val, int ntype)
* *
*/ */
protected void protected void
key_clear(EditLine *el, el_action_t *map, char *in) key_clear(EditLine *el, el_action_t *map, const char *in)
{ {
if ((map[(unsigned char)*in] == ED_SEQUENCE_LEAD_IN) && if ((map[(unsigned char)*in] == ED_SEQUENCE_LEAD_IN) &&
@ -233,7 +228,7 @@ key_clear(EditLine *el, el_action_t *map, char *in)
* they exists. * they exists.
*/ */
protected int protected int
key_delete(EditLine *el, char *key) key_delete(EditLine *el, const char *key)
{ {
if (key[0] == '\0') { if (key[0] == '\0') {
@ -254,7 +249,7 @@ key_delete(EditLine *el, char *key)
* Print entire el->el_key.map if null * Print entire el->el_key.map if null
*/ */
protected void protected void
key_print(EditLine *el, char *key) key_print(EditLine *el, const char *key)
{ {
/* do nothing if el->el_key.map is empty and null key specified */ /* do nothing if el->el_key.map is empty and null key specified */
@ -353,7 +348,8 @@ node__try(EditLine *el, key_node_t *ptr, const char *str, key_value_t *val, int
break; break;
case XK_STR: case XK_STR:
case XK_EXE: case XK_EXE:
ptr->val.str = strdup(val->str); if ((ptr->val.str = el_strdup(val->str)) == NULL)
return -1;
break; break;
default: default:
EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype)); EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype));
@ -373,7 +369,7 @@ node__try(EditLine *el, key_node_t *ptr, const char *str, key_value_t *val, int
* Delete node that matches str * Delete node that matches str
*/ */
private int private int
node__delete(EditLine *el, key_node_t **inptr, char *str) node__delete(EditLine *el, key_node_t **inptr, const char *str)
{ {
key_node_t *ptr; key_node_t *ptr;
key_node_t *prev_ptr = NULL; key_node_t *prev_ptr = NULL;
@ -468,14 +464,22 @@ 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.
* Print if last node * Print if last node
*/ */
private int private int
node_lookup(EditLine *el, char *str, key_node_t *ptr, int cnt) node_lookup(EditLine *el, const char *str, key_node_t *ptr, int cnt)
{ {
int ncnt; int ncnt;
@ -565,7 +569,7 @@ node_enum(EditLine *el, key_node_t *ptr, int cnt)
* function specified by val * function specified by val
*/ */
protected void protected void
key_kprint(EditLine *el, char *key, key_value_t *val, int ntype) key_kprint(EditLine *el, const char *key, key_value_t *val, int ntype)
{ {
el_bindings_t *fp; el_bindings_t *fp;
char unparsbuf[EL_BUFSIZ]; char unparsbuf[EL_BUFSIZ];
@ -638,13 +642,15 @@ key__decode_char(char *buf, int cnt, int ch)
return (cnt); return (cnt);
} }
/* key__decode_str(): /* key__decode_str():
* Make a printable version of the ey * Make a printable version of the ey
*/ */
protected char * protected char *
key__decode_str(char *str, char *buf, char *sep) key__decode_str(const char *str, char *buf, const char *sep)
{ {
char *b, *p; char *b;
const char *p;
b = buf; b = buf;
if (sep[0] != '\0') if (sep[0] != '\0')

View File

@ -13,11 +13,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,7 +30,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)key.h 8.1 (Berkeley) 6/4/93 * @(#)key.h 8.1 (Berkeley) 6/4/93
* $NetBSD: key.h,v 1.4 2000/09/04 22:06:30 lukem Exp $ * $NetBSD: key.h,v 1.8 2003/08/07 16:44:32 agc Exp $
* $FreeBSD$ * $FreeBSD$
*/ */
@ -62,6 +58,10 @@ typedef struct el_key_t {
#define XK_NOD 2 #define XK_NOD 2
#define XK_EXE 3 #define XK_EXE 3
#undef key_end
#undef key_clear
#undef key_print
protected int key_init(EditLine *); protected int key_init(EditLine *);
protected void key_end(EditLine *); protected void key_end(EditLine *);
protected key_value_t *key_map_cmd(EditLine *, int); protected key_value_t *key_map_cmd(EditLine *, int);
@ -69,10 +69,11 @@ protected key_value_t *key_map_str(EditLine *, char *);
protected void key_reset(EditLine *); protected void key_reset(EditLine *);
protected int key_get(EditLine *, char *, key_value_t *); protected int key_get(EditLine *, char *, key_value_t *);
protected void key_add(EditLine *, const char *, key_value_t *, int); protected void key_add(EditLine *, const char *, key_value_t *, int);
protected void key_clear(EditLine *, el_action_t *, char *); protected void key_clear(EditLine *, el_action_t *, const char *);
protected int key_delete(EditLine *, char *); protected int key_delete(EditLine *, const char *);
protected void key_print(EditLine *, char *); protected void key_print(EditLine *, const char *);
protected void key_kprint(EditLine *, char *, key_value_t *, int); protected void key_kprint(EditLine *, const char *, key_value_t *,
protected char *key__decode_str(char *, char *, char *); int);
protected char *key__decode_str(const char *, char *, const char *);
#endif /* _h_el_key */ #endif /* _h_el_key */

View File

@ -1,5 +1,5 @@
#!/bin/sh - #!/bin/sh -
# $NetBSD: makelist,v 1.6 2000/09/04 23:45:18 lukem Exp $ # $NetBSD: makelist,v 1.9 2005/05/16 13:14:43 lukem Exp $
# $FreeBSD$ # $FreeBSD$
# #
# Copyright (c) 1992, 1993 # Copyright (c) 1992, 1993
@ -16,11 +16,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.
# #
@ -40,7 +36,7 @@
# makelist.sh: Automatically generate header files... # makelist.sh: Automatically generate header files...
AWK=/usr/bin/awk AWK=awk
USAGE="usage: $0 -h|-e|-fc|-fh|-bc|-bh|-m <filenames>" USAGE="usage: $0 -h|-e|-fc|-fh|-bc|-bh|-m <filenames>"
if [ "x$1" = "x" ] if [ "x$1" = "x" ]

View File

@ -13,11 +13,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.
* *
@ -33,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $NetBSD: map.c,v 1.13 2001/01/04 15:56:32 christos Exp $ * $NetBSD: map.c,v 1.20 2004/08/13 12:10:39 mycroft Exp $
*/ */
#if !defined(lint) && !defined(SCCSID) #if !defined(lint) && !defined(SCCSID)
@ -51,7 +47,7 @@ __FBSDID("$FreeBSD$");
#define N_KEYS 256 #define N_KEYS 256
private void map_print_key(EditLine *, el_action_t *, char *); private void map_print_key(EditLine *, el_action_t *, const char *);
private void map_print_some_keys(EditLine *, el_action_t *, int, int); private void map_print_some_keys(EditLine *, el_action_t *, int, int);
private void map_print_all_keys(EditLine *); private void map_print_all_keys(EditLine *);
private void map_init_nls(EditLine *); private void map_init_nls(EditLine *);
@ -69,7 +65,7 @@ private const el_action_t el_map_emacs[] = {
/* 5 */ ED_MOVE_TO_END, /* ^E */ /* 5 */ ED_MOVE_TO_END, /* ^E */
/* 6 */ ED_NEXT_CHAR, /* ^F */ /* 6 */ ED_NEXT_CHAR, /* ^F */
/* 7 */ ED_UNASSIGNED, /* ^G */ /* 7 */ ED_UNASSIGNED, /* ^G */
/* 8 */ ED_DELETE_PREV_CHAR, /* ^H */ /* 8 */ EM_DELETE_PREV_CHAR, /* ^H */
/* 9 */ ED_UNASSIGNED, /* ^I */ /* 9 */ ED_UNASSIGNED, /* ^I */
/* 10 */ ED_NEWLINE, /* ^J */ /* 10 */ ED_NEWLINE, /* ^J */
/* 11 */ ED_KILL_LINE, /* ^K */ /* 11 */ ED_KILL_LINE, /* ^K */
@ -188,7 +184,7 @@ private const el_action_t el_map_emacs[] = {
/* 124 */ ED_INSERT, /* | */ /* 124 */ ED_INSERT, /* | */
/* 125 */ ED_INSERT, /* } */ /* 125 */ ED_INSERT, /* } */
/* 126 */ ED_INSERT, /* ~ */ /* 126 */ ED_INSERT, /* ~ */
/* 127 */ ED_DELETE_PREV_CHAR, /* ^? */ /* 127 */ EM_DELETE_PREV_CHAR, /* ^? */
/* 128 */ ED_UNASSIGNED, /* M-^@ */ /* 128 */ ED_UNASSIGNED, /* M-^@ */
/* 129 */ ED_UNASSIGNED, /* M-^A */ /* 129 */ ED_UNASSIGNED, /* M-^A */
/* 130 */ ED_UNASSIGNED, /* M-^B */ /* 130 */ ED_UNASSIGNED, /* M-^B */
@ -377,7 +373,7 @@ private const el_action_t el_map_vi_insert[] = {
/* 5 */ ED_MOVE_TO_END, /* ^E */ /* 5 */ ED_MOVE_TO_END, /* ^E */
/* 6 */ ED_NEXT_CHAR, /* ^F */ /* 6 */ ED_NEXT_CHAR, /* ^F */
/* 7 */ ED_UNASSIGNED, /* ^G */ /* 7 */ ED_UNASSIGNED, /* ^G */
/* 8 */ ED_DELETE_PREV_CHAR, /* ^H */ /* BackSpace key */ /* 8 */ VI_DELETE_PREV_CHAR, /* ^H */ /* BackSpace key */
/* 9 */ ED_UNASSIGNED, /* ^I */ /* Tab Key */ /* 9 */ ED_UNASSIGNED, /* ^I */ /* Tab Key */
/* 10 */ ED_NEWLINE, /* ^J */ /* 10 */ ED_NEWLINE, /* ^J */
/* 11 */ ED_KILL_LINE, /* ^K */ /* 11 */ ED_KILL_LINE, /* ^K */
@ -497,135 +493,135 @@ private const el_action_t el_map_vi_insert[] = {
/* 124 */ ED_INSERT, /* | */ /* 124 */ ED_INSERT, /* | */
/* 125 */ ED_INSERT, /* } */ /* 125 */ ED_INSERT, /* } */
/* 126 */ ED_INSERT, /* ~ */ /* 126 */ ED_INSERT, /* ~ */
/* 127 */ ED_DELETE_PREV_CHAR, /* ^? */ /* 127 */ VI_DELETE_PREV_CHAR, /* ^? */
/* 128 */ ED_UNASSIGNED, /* M-^@ */ /* 128 */ ED_INSERT, /* M-^@ */
/* 129 */ ED_UNASSIGNED, /* M-^A */ /* 129 */ ED_INSERT, /* M-^A */
/* 130 */ ED_UNASSIGNED, /* M-^B */ /* 130 */ ED_INSERT, /* M-^B */
/* 131 */ ED_UNASSIGNED, /* M-^C */ /* 131 */ ED_INSERT, /* M-^C */
/* 132 */ ED_UNASSIGNED, /* M-^D */ /* 132 */ ED_INSERT, /* M-^D */
/* 133 */ ED_UNASSIGNED, /* M-^E */ /* 133 */ ED_INSERT, /* M-^E */
/* 134 */ ED_UNASSIGNED, /* M-^F */ /* 134 */ ED_INSERT, /* M-^F */
/* 135 */ ED_UNASSIGNED, /* M-^G */ /* 135 */ ED_INSERT, /* M-^G */
/* 136 */ ED_UNASSIGNED, /* M-^H */ /* 136 */ ED_INSERT, /* M-^H */
/* 137 */ ED_UNASSIGNED, /* M-^I */ /* 137 */ ED_INSERT, /* M-^I */
/* 138 */ ED_UNASSIGNED, /* M-^J */ /* 138 */ ED_INSERT, /* M-^J */
/* 139 */ ED_UNASSIGNED, /* M-^K */ /* 139 */ ED_INSERT, /* M-^K */
/* 140 */ ED_UNASSIGNED, /* M-^L */ /* 140 */ ED_INSERT, /* M-^L */
/* 141 */ ED_UNASSIGNED, /* M-^M */ /* 141 */ ED_INSERT, /* M-^M */
/* 142 */ ED_UNASSIGNED, /* M-^N */ /* 142 */ ED_INSERT, /* M-^N */
/* 143 */ ED_UNASSIGNED, /* M-^O */ /* 143 */ ED_INSERT, /* M-^O */
/* 144 */ ED_UNASSIGNED, /* M-^P */ /* 144 */ ED_INSERT, /* M-^P */
/* 145 */ ED_UNASSIGNED, /* M-^Q */ /* 145 */ ED_INSERT, /* M-^Q */
/* 146 */ ED_UNASSIGNED, /* M-^R */ /* 146 */ ED_INSERT, /* M-^R */
/* 147 */ ED_UNASSIGNED, /* M-^S */ /* 147 */ ED_INSERT, /* M-^S */
/* 148 */ ED_UNASSIGNED, /* M-^T */ /* 148 */ ED_INSERT, /* M-^T */
/* 149 */ ED_UNASSIGNED, /* M-^U */ /* 149 */ ED_INSERT, /* M-^U */
/* 150 */ ED_UNASSIGNED, /* M-^V */ /* 150 */ ED_INSERT, /* M-^V */
/* 151 */ ED_UNASSIGNED, /* M-^W */ /* 151 */ ED_INSERT, /* M-^W */
/* 152 */ ED_UNASSIGNED, /* M-^X */ /* 152 */ ED_INSERT, /* M-^X */
/* 153 */ ED_UNASSIGNED, /* M-^Y */ /* 153 */ ED_INSERT, /* M-^Y */
/* 154 */ ED_UNASSIGNED, /* M-^Z */ /* 154 */ ED_INSERT, /* M-^Z */
/* 155 */ ED_UNASSIGNED, /* M-^[ */ /* 155 */ ED_INSERT, /* M-^[ */
/* 156 */ ED_UNASSIGNED, /* M-^\ */ /* 156 */ ED_INSERT, /* M-^\ */
/* 157 */ ED_UNASSIGNED, /* M-^] */ /* 157 */ ED_INSERT, /* M-^] */
/* 158 */ ED_UNASSIGNED, /* M-^^ */ /* 158 */ ED_INSERT, /* M-^^ */
/* 159 */ ED_UNASSIGNED, /* M-^_ */ /* 159 */ ED_INSERT, /* M-^_ */
/* 160 */ ED_UNASSIGNED, /* M-SPACE */ /* 160 */ ED_INSERT, /* M-SPACE */
/* 161 */ ED_UNASSIGNED, /* M-! */ /* 161 */ ED_INSERT, /* M-! */
/* 162 */ ED_UNASSIGNED, /* M-" */ /* 162 */ ED_INSERT, /* M-" */
/* 163 */ ED_UNASSIGNED, /* M-# */ /* 163 */ ED_INSERT, /* M-# */
/* 164 */ ED_UNASSIGNED, /* M-$ */ /* 164 */ ED_INSERT, /* M-$ */
/* 165 */ ED_UNASSIGNED, /* M-% */ /* 165 */ ED_INSERT, /* M-% */
/* 166 */ ED_UNASSIGNED, /* M-& */ /* 166 */ ED_INSERT, /* M-& */
/* 167 */ ED_UNASSIGNED, /* M-' */ /* 167 */ ED_INSERT, /* M-' */
/* 168 */ ED_UNASSIGNED, /* M-( */ /* 168 */ ED_INSERT, /* M-( */
/* 169 */ ED_UNASSIGNED, /* M-) */ /* 169 */ ED_INSERT, /* M-) */
/* 170 */ ED_UNASSIGNED, /* M-* */ /* 170 */ ED_INSERT, /* M-* */
/* 171 */ ED_UNASSIGNED, /* M-+ */ /* 171 */ ED_INSERT, /* M-+ */
/* 172 */ ED_UNASSIGNED, /* M-, */ /* 172 */ ED_INSERT, /* M-, */
/* 173 */ ED_UNASSIGNED, /* M-- */ /* 173 */ ED_INSERT, /* M-- */
/* 174 */ ED_UNASSIGNED, /* M-. */ /* 174 */ ED_INSERT, /* M-. */
/* 175 */ ED_UNASSIGNED, /* M-/ */ /* 175 */ ED_INSERT, /* M-/ */
/* 176 */ ED_UNASSIGNED, /* M-0 */ /* 176 */ ED_INSERT, /* M-0 */
/* 177 */ ED_UNASSIGNED, /* M-1 */ /* 177 */ ED_INSERT, /* M-1 */
/* 178 */ ED_UNASSIGNED, /* M-2 */ /* 178 */ ED_INSERT, /* M-2 */
/* 179 */ ED_UNASSIGNED, /* M-3 */ /* 179 */ ED_INSERT, /* M-3 */
/* 180 */ ED_UNASSIGNED, /* M-4 */ /* 180 */ ED_INSERT, /* M-4 */
/* 181 */ ED_UNASSIGNED, /* M-5 */ /* 181 */ ED_INSERT, /* M-5 */
/* 182 */ ED_UNASSIGNED, /* M-6 */ /* 182 */ ED_INSERT, /* M-6 */
/* 183 */ ED_UNASSIGNED, /* M-7 */ /* 183 */ ED_INSERT, /* M-7 */
/* 184 */ ED_UNASSIGNED, /* M-8 */ /* 184 */ ED_INSERT, /* M-8 */
/* 185 */ ED_UNASSIGNED, /* M-9 */ /* 185 */ ED_INSERT, /* M-9 */
/* 186 */ ED_UNASSIGNED, /* M-: */ /* 186 */ ED_INSERT, /* M-: */
/* 187 */ ED_UNASSIGNED, /* M-; */ /* 187 */ ED_INSERT, /* M-; */
/* 188 */ ED_UNASSIGNED, /* M-< */ /* 188 */ ED_INSERT, /* M-< */
/* 189 */ ED_UNASSIGNED, /* M-= */ /* 189 */ ED_INSERT, /* M-= */
/* 190 */ ED_UNASSIGNED, /* M-> */ /* 190 */ ED_INSERT, /* M-> */
/* 191 */ ED_UNASSIGNED, /* M-? */ /* 191 */ ED_INSERT, /* M-? */
/* 192 */ ED_UNASSIGNED, /* M-@ */ /* 192 */ ED_INSERT, /* M-@ */
/* 193 */ ED_UNASSIGNED, /* M-A */ /* 193 */ ED_INSERT, /* M-A */
/* 194 */ ED_UNASSIGNED, /* M-B */ /* 194 */ ED_INSERT, /* M-B */
/* 195 */ ED_UNASSIGNED, /* M-C */ /* 195 */ ED_INSERT, /* M-C */
/* 196 */ ED_UNASSIGNED, /* M-D */ /* 196 */ ED_INSERT, /* M-D */
/* 197 */ ED_UNASSIGNED, /* M-E */ /* 197 */ ED_INSERT, /* M-E */
/* 198 */ ED_UNASSIGNED, /* M-F */ /* 198 */ ED_INSERT, /* M-F */
/* 199 */ ED_UNASSIGNED, /* M-G */ /* 199 */ ED_INSERT, /* M-G */
/* 200 */ ED_UNASSIGNED, /* M-H */ /* 200 */ ED_INSERT, /* M-H */
/* 201 */ ED_UNASSIGNED, /* M-I */ /* 201 */ ED_INSERT, /* M-I */
/* 202 */ ED_UNASSIGNED, /* M-J */ /* 202 */ ED_INSERT, /* M-J */
/* 203 */ ED_UNASSIGNED, /* M-K */ /* 203 */ ED_INSERT, /* M-K */
/* 204 */ ED_UNASSIGNED, /* M-L */ /* 204 */ ED_INSERT, /* M-L */
/* 205 */ ED_UNASSIGNED, /* M-M */ /* 205 */ ED_INSERT, /* M-M */
/* 206 */ ED_UNASSIGNED, /* M-N */ /* 206 */ ED_INSERT, /* M-N */
/* 207 */ ED_UNASSIGNED, /* M-O */ /* 207 */ ED_INSERT, /* M-O */
/* 208 */ ED_UNASSIGNED, /* M-P */ /* 208 */ ED_INSERT, /* M-P */
/* 209 */ ED_UNASSIGNED, /* M-Q */ /* 209 */ ED_INSERT, /* M-Q */
/* 210 */ ED_UNASSIGNED, /* M-R */ /* 210 */ ED_INSERT, /* M-R */
/* 211 */ ED_UNASSIGNED, /* M-S */ /* 211 */ ED_INSERT, /* M-S */
/* 212 */ ED_UNASSIGNED, /* M-T */ /* 212 */ ED_INSERT, /* M-T */
/* 213 */ ED_UNASSIGNED, /* M-U */ /* 213 */ ED_INSERT, /* M-U */
/* 214 */ ED_UNASSIGNED, /* M-V */ /* 214 */ ED_INSERT, /* M-V */
/* 215 */ ED_UNASSIGNED, /* M-W */ /* 215 */ ED_INSERT, /* M-W */
/* 216 */ ED_UNASSIGNED, /* M-X */ /* 216 */ ED_INSERT, /* M-X */
/* 217 */ ED_UNASSIGNED, /* M-Y */ /* 217 */ ED_INSERT, /* M-Y */
/* 218 */ ED_UNASSIGNED, /* M-Z */ /* 218 */ ED_INSERT, /* M-Z */
/* 219 */ ED_UNASSIGNED, /* M-[ */ /* 219 */ ED_INSERT, /* M-[ */
/* 220 */ ED_UNASSIGNED, /* M-\ */ /* 220 */ ED_INSERT, /* M-\ */
/* 221 */ ED_UNASSIGNED, /* M-] */ /* 221 */ ED_INSERT, /* M-] */
/* 222 */ ED_UNASSIGNED, /* M-^ */ /* 222 */ ED_INSERT, /* M-^ */
/* 223 */ ED_UNASSIGNED, /* M-_ */ /* 223 */ ED_INSERT, /* M-_ */
/* 224 */ ED_UNASSIGNED, /* M-` */ /* 224 */ ED_INSERT, /* M-` */
/* 225 */ ED_UNASSIGNED, /* M-a */ /* 225 */ ED_INSERT, /* M-a */
/* 226 */ ED_UNASSIGNED, /* M-b */ /* 226 */ ED_INSERT, /* M-b */
/* 227 */ ED_UNASSIGNED, /* M-c */ /* 227 */ ED_INSERT, /* M-c */
/* 228 */ ED_UNASSIGNED, /* M-d */ /* 228 */ ED_INSERT, /* M-d */
/* 229 */ ED_UNASSIGNED, /* M-e */ /* 229 */ ED_INSERT, /* M-e */
/* 230 */ ED_UNASSIGNED, /* M-f */ /* 230 */ ED_INSERT, /* M-f */
/* 231 */ ED_UNASSIGNED, /* M-g */ /* 231 */ ED_INSERT, /* M-g */
/* 232 */ ED_UNASSIGNED, /* M-h */ /* 232 */ ED_INSERT, /* M-h */
/* 233 */ ED_UNASSIGNED, /* M-i */ /* 233 */ ED_INSERT, /* M-i */
/* 234 */ ED_UNASSIGNED, /* M-j */ /* 234 */ ED_INSERT, /* M-j */
/* 235 */ ED_UNASSIGNED, /* M-k */ /* 235 */ ED_INSERT, /* M-k */
/* 236 */ ED_UNASSIGNED, /* M-l */ /* 236 */ ED_INSERT, /* M-l */
/* 237 */ ED_UNASSIGNED, /* M-m */ /* 237 */ ED_INSERT, /* M-m */
/* 238 */ ED_UNASSIGNED, /* M-n */ /* 238 */ ED_INSERT, /* M-n */
/* 239 */ ED_UNASSIGNED, /* M-o */ /* 239 */ ED_INSERT, /* M-o */
/* 240 */ ED_UNASSIGNED, /* M-p */ /* 240 */ ED_INSERT, /* M-p */
/* 241 */ ED_UNASSIGNED, /* M-q */ /* 241 */ ED_INSERT, /* M-q */
/* 242 */ ED_UNASSIGNED, /* M-r */ /* 242 */ ED_INSERT, /* M-r */
/* 243 */ ED_UNASSIGNED, /* M-s */ /* 243 */ ED_INSERT, /* M-s */
/* 244 */ ED_UNASSIGNED, /* M-t */ /* 244 */ ED_INSERT, /* M-t */
/* 245 */ ED_UNASSIGNED, /* M-u */ /* 245 */ ED_INSERT, /* M-u */
/* 246 */ ED_UNASSIGNED, /* M-v */ /* 246 */ ED_INSERT, /* M-v */
/* 247 */ ED_UNASSIGNED, /* M-w */ /* 247 */ ED_INSERT, /* M-w */
/* 248 */ ED_UNASSIGNED, /* M-x */ /* 248 */ ED_INSERT, /* M-x */
/* 249 */ ED_UNASSIGNED, /* M-y */ /* 249 */ ED_INSERT, /* M-y */
/* 250 */ ED_UNASSIGNED, /* M-z */ /* 250 */ ED_INSERT, /* M-z */
/* 251 */ ED_UNASSIGNED, /* M-{ */ /* 251 */ ED_INSERT, /* M-{ */
/* 252 */ ED_UNASSIGNED, /* M-| */ /* 252 */ ED_INSERT, /* M-| */
/* 253 */ ED_UNASSIGNED, /* M-} */ /* 253 */ ED_INSERT, /* M-} */
/* 254 */ ED_UNASSIGNED, /* M-~ */ /* 254 */ ED_INSERT, /* M-~ */
/* 255 */ ED_UNASSIGNED /* M-^? */ /* 255 */ ED_INSERT /* M-^? */
}; };
private const el_action_t el_map_vi_command[] = { private const el_action_t el_map_vi_command[] = {
@ -637,7 +633,7 @@ private const el_action_t el_map_vi_command[] = {
/* 5 */ ED_MOVE_TO_END, /* ^E */ /* 5 */ ED_MOVE_TO_END, /* ^E */
/* 6 */ ED_UNASSIGNED, /* ^F */ /* 6 */ ED_UNASSIGNED, /* ^F */
/* 7 */ ED_UNASSIGNED, /* ^G */ /* 7 */ ED_UNASSIGNED, /* ^G */
/* 8 */ ED_PREV_CHAR, /* ^H */ /* 8 */ ED_DELETE_PREV_CHAR, /* ^H */
/* 9 */ ED_UNASSIGNED, /* ^I */ /* 9 */ ED_UNASSIGNED, /* ^I */
/* 10 */ ED_NEWLINE, /* ^J */ /* 10 */ ED_NEWLINE, /* ^J */
/* 11 */ ED_KILL_LINE, /* ^K */ /* 11 */ ED_KILL_LINE, /* ^K */
@ -664,9 +660,9 @@ private const el_action_t el_map_vi_command[] = {
/* 32 */ ED_NEXT_CHAR, /* SPACE */ /* 32 */ ED_NEXT_CHAR, /* SPACE */
/* 33 */ ED_UNASSIGNED, /* ! */ /* 33 */ ED_UNASSIGNED, /* ! */
/* 34 */ ED_UNASSIGNED, /* " */ /* 34 */ ED_UNASSIGNED, /* " */
/* 35 */ ED_UNASSIGNED, /* # */ /* 35 */ VI_COMMENT_OUT, /* # */
/* 36 */ ED_MOVE_TO_END, /* $ */ /* 36 */ ED_MOVE_TO_END, /* $ */
/* 37 */ ED_UNASSIGNED, /* % */ /* 37 */ VI_MATCH, /* % */
/* 38 */ ED_UNASSIGNED, /* & */ /* 38 */ ED_UNASSIGNED, /* & */
/* 39 */ ED_UNASSIGNED, /* ' */ /* 39 */ ED_UNASSIGNED, /* ' */
/* 40 */ ED_UNASSIGNED, /* ( */ /* 40 */ ED_UNASSIGNED, /* ( */
@ -675,7 +671,7 @@ private const el_action_t el_map_vi_command[] = {
/* 43 */ ED_NEXT_HISTORY, /* + */ /* 43 */ ED_NEXT_HISTORY, /* + */
/* 44 */ VI_REPEAT_PREV_CHAR, /* , */ /* 44 */ VI_REPEAT_PREV_CHAR, /* , */
/* 45 */ ED_PREV_HISTORY, /* - */ /* 45 */ ED_PREV_HISTORY, /* - */
/* 46 */ ED_UNASSIGNED, /* . */ /* 46 */ VI_REDO, /* . */
/* 47 */ VI_SEARCH_PREV, /* / */ /* 47 */ VI_SEARCH_PREV, /* / */
/* 48 */ VI_ZERO, /* 0 */ /* 48 */ VI_ZERO, /* 0 */
/* 49 */ ED_ARGUMENT_DIGIT, /* 1 */ /* 49 */ ED_ARGUMENT_DIGIT, /* 1 */
@ -693,14 +689,14 @@ private const el_action_t el_map_vi_command[] = {
/* 61 */ ED_UNASSIGNED, /* = */ /* 61 */ ED_UNASSIGNED, /* = */
/* 62 */ ED_UNASSIGNED, /* > */ /* 62 */ ED_UNASSIGNED, /* > */
/* 63 */ VI_SEARCH_NEXT, /* ? */ /* 63 */ VI_SEARCH_NEXT, /* ? */
/* 64 */ ED_UNASSIGNED, /* @ */ /* 64 */ VI_ALIAS, /* @ */
/* 65 */ VI_ADD_AT_EOL, /* A */ /* 65 */ VI_ADD_AT_EOL, /* A */
/* 66 */ VI_PREV_SPACE_WORD, /* B */ /* 66 */ VI_PREV_BIG_WORD, /* B */
/* 67 */ VI_CHANGE_TO_EOL, /* C */ /* 67 */ VI_CHANGE_TO_EOL, /* C */
/* 68 */ ED_KILL_LINE, /* D */ /* 68 */ ED_KILL_LINE, /* D */
/* 69 */ VI_TO_END_WORD, /* E */ /* 69 */ VI_END_BIG_WORD, /* E */
/* 70 */ VI_PREV_CHAR, /* F */ /* 70 */ VI_PREV_CHAR, /* F */
/* 71 */ ED_UNASSIGNED, /* G */ /* 71 */ VI_TO_HISTORY_LINE, /* G */
/* 72 */ ED_UNASSIGNED, /* H */ /* 72 */ ED_UNASSIGNED, /* H */
/* 73 */ VI_INSERT_AT_BOL, /* I */ /* 73 */ VI_INSERT_AT_BOL, /* I */
/* 74 */ ED_SEARCH_NEXT_HISTORY, /* J */ /* 74 */ ED_SEARCH_NEXT_HISTORY, /* J */
@ -716,15 +712,15 @@ private const el_action_t el_map_vi_command[] = {
/* 84 */ VI_TO_PREV_CHAR, /* T */ /* 84 */ VI_TO_PREV_CHAR, /* T */
/* 85 */ VI_UNDO_LINE, /* U */ /* 85 */ VI_UNDO_LINE, /* U */
/* 86 */ ED_UNASSIGNED, /* V */ /* 86 */ ED_UNASSIGNED, /* V */
/* 87 */ VI_NEXT_SPACE_WORD, /* W */ /* 87 */ VI_NEXT_BIG_WORD, /* W */
/* 88 */ ED_DELETE_PREV_CHAR, /* X */ /* 88 */ ED_DELETE_PREV_CHAR, /* X */
/* 89 */ ED_UNASSIGNED, /* Y */ /* 89 */ VI_YANK_END, /* Y */
/* 90 */ ED_UNASSIGNED, /* Z */ /* 90 */ ED_UNASSIGNED, /* Z */
/* 91 */ ED_SEQUENCE_LEAD_IN, /* [ */ /* 91 */ ED_SEQUENCE_LEAD_IN, /* [ */
/* 92 */ ED_UNASSIGNED, /* \ */ /* 92 */ ED_UNASSIGNED, /* \ */
/* 93 */ ED_UNASSIGNED, /* ] */ /* 93 */ ED_UNASSIGNED, /* ] */
/* 94 */ ED_MOVE_TO_BEG, /* ^ */ /* 94 */ ED_MOVE_TO_BEG, /* ^ */
/* 95 */ ED_UNASSIGNED, /* _ */ /* 95 */ VI_HISTORY_WORD, /* _ */
/* 96 */ ED_UNASSIGNED, /* ` */ /* 96 */ ED_UNASSIGNED, /* ` */
/* 97 */ VI_ADD, /* a */ /* 97 */ VI_ADD, /* a */
/* 98 */ VI_PREV_WORD, /* b */ /* 98 */ VI_PREV_WORD, /* b */
@ -747,13 +743,13 @@ private const el_action_t el_map_vi_command[] = {
/* 115 */ VI_SUBSTITUTE_CHAR, /* s */ /* 115 */ VI_SUBSTITUTE_CHAR, /* s */
/* 116 */ VI_TO_NEXT_CHAR, /* t */ /* 116 */ VI_TO_NEXT_CHAR, /* t */
/* 117 */ VI_UNDO, /* u */ /* 117 */ VI_UNDO, /* u */
/* 118 */ ED_UNASSIGNED, /* v */ /* 118 */ VI_HISTEDIT, /* v */
/* 119 */ VI_NEXT_WORD, /* w */ /* 119 */ VI_NEXT_WORD, /* w */
/* 120 */ ED_DELETE_NEXT_CHAR, /* x */ /* 120 */ ED_DELETE_NEXT_CHAR, /* x */
/* 121 */ ED_UNASSIGNED, /* y */ /* 121 */ VI_YANK, /* y */
/* 122 */ ED_UNASSIGNED, /* z */ /* 122 */ ED_UNASSIGNED, /* z */
/* 123 */ ED_UNASSIGNED, /* { */ /* 123 */ ED_UNASSIGNED, /* { */
/* 124 */ ED_UNASSIGNED, /* | */ /* 124 */ VI_TO_COLUMN, /* | */
/* 125 */ ED_UNASSIGNED, /* } */ /* 125 */ ED_UNASSIGNED, /* } */
/* 126 */ VI_CHANGE_CASE, /* ~ */ /* 126 */ VI_CHANGE_CASE, /* ~ */
/* 127 */ ED_DELETE_PREV_CHAR, /* ^? */ /* 127 */ ED_DELETE_PREV_CHAR, /* ^? */
@ -1124,7 +1120,7 @@ map_get_editor(EditLine *el, const char **editor)
* Print the function description for 1 key * Print the function description for 1 key
*/ */
private void private void
map_print_key(EditLine *el, el_action_t *map, 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;
@ -1237,14 +1233,14 @@ map_print_all_keys(EditLine *el)
* Add/remove/change bindings * Add/remove/change bindings
*/ */
protected int protected int
map_bind(EditLine *el, int argc, char **argv) map_bind(EditLine *el, int argc, const char **argv)
{ {
el_action_t *map; el_action_t *map;
int ntype, rem; int ntype, rem;
char *p; const char *p;
char inbuf[EL_BUFSIZ]; char inbuf[EL_BUFSIZ];
char outbuf[EL_BUFSIZ]; char outbuf[EL_BUFSIZ];
char *in = NULL; const char *in = NULL;
char *out = NULL; char *out = NULL;
el_bindings_t *bp; el_bindings_t *bp;
int cmd; int cmd;

View File

@ -13,11 +13,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,7 +30,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)map.h 8.1 (Berkeley) 6/4/93 * @(#)map.h 8.1 (Berkeley) 6/4/93
* $NetBSD: map.h,v 1.5 2000/09/04 22:06:31 lukem Exp $ * $NetBSD: map.h,v 1.8 2003/08/07 16:44:32 agc Exp $
* $FreeBSD$ * $FreeBSD$
*/ */
@ -67,7 +63,7 @@ typedef struct el_map_t {
#define MAP_EMACS 0 #define MAP_EMACS 0
#define MAP_VI 1 #define MAP_VI 1
protected int map_bind(EditLine *, int, char **); protected int map_bind(EditLine *, int, const char **);
protected int map_init(EditLine *); protected int map_init(EditLine *);
protected void map_end(EditLine *); protected void map_end(EditLine *);
protected void map_init_vi(EditLine *); protected void map_init_vi(EditLine *);

View File

@ -13,11 +13,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.
* *
@ -33,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $NetBSD: parse.c,v 1.13 2000/09/04 22:06:31 lukem Exp $ * $NetBSD: parse.c,v 1.22 2005/05/29 04:58:15 lukem Exp $
*/ */
#if !defined(lint) && !defined(SCCSID) #if !defined(lint) && !defined(SCCSID)
@ -57,17 +53,16 @@ __FBSDID("$FreeBSD$");
*/ */
#include "sys.h" #include "sys.h"
#include "el.h" #include "el.h"
#include "tokenizer.h"
#include <stdlib.h> #include <stdlib.h>
private const struct { private const struct {
char *name; const char *name;
int (*func)(EditLine *, int, char **); int (*func)(EditLine *, int, const char **);
} cmds[] = { } cmds[] = {
{ "bind", map_bind }, { "bind", map_bind },
{ "echotc", term_echotc }, { "echotc", term_echotc },
{ "edit", el_editmode }, { "edit", el_editmode },
{ "history", hist_list }, { "history", hist_command },
{ "telltc", term_telltc }, { "telltc", term_telltc },
{ "settc", term_settc }, { "settc", term_settc },
{ "setty", tty_stty }, { "setty", tty_stty },
@ -81,12 +76,12 @@ private const struct {
protected int protected int
parse_line(EditLine *el, const char *line) parse_line(EditLine *el, const char *line)
{ {
char **argv; const char **argv;
int argc; int argc;
Tokenizer *tok; Tokenizer *tok;
tok = tok_init(NULL); tok = tok_init(NULL);
tok_line(tok, line, &argc, &argv); tok_str(tok, line, &argc, &argv);
argc = el_parse(el, argc, argv); argc = el_parse(el, argc, argv);
tok_end(tok); tok_end(tok);
return (argc); return (argc);
@ -97,9 +92,9 @@ parse_line(EditLine *el, const char *line)
* Command dispatcher * Command dispatcher
*/ */
public int public int
el_parse(EditLine *el, int argc, char *argv[]) el_parse(EditLine *el, int argc, const char *argv[])
{ {
char *ptr; const char *ptr;
int i; int i;
if (argc < 1) if (argc < 1)
@ -139,7 +134,7 @@ el_parse(EditLine *el, int argc, 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;
@ -204,7 +199,7 @@ parse__escape(const char **const ptr)
c = *p; c = *p;
break; break;
} }
} else if (*p == '^' && isascii(p[1]) && (p[1] == '?' || isalpha(p[1]))) { } else if (*p == '^') {
p++; p++;
c = (*p == '?') ? '\177' : (*p & 0237); c = (*p == '?') ? '\177' : (*p & 0237);
} else } else
@ -212,6 +207,7 @@ parse__escape(const char **const ptr)
*ptr = ++p; *ptr = ++p;
return ((unsigned char)c); return ((unsigned char)c);
} }
/* parse__string(): /* parse__string():
* Parse the escapes from in and put the raw string out * Parse the escapes from in and put the raw string out
*/ */
@ -234,6 +230,14 @@ parse__string(char *out, const char *in)
*out++ = n; *out++ = n;
break; break;
case 'M':
if (in[1] == '-' && in[2] != '\0') {
*out++ = '\033';
in += 2;
break;
}
/*FALLTHROUGH*/
default: default:
*out++ = *in++; *out++ = *in++;
break; break;

View File

@ -13,11 +13,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,7 +30,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)parse.h 8.1 (Berkeley) 6/4/93 * @(#)parse.h 8.1 (Berkeley) 6/4/93
* $NetBSD: parse.h,v 1.3 1999/07/02 15:21:26 simonb Exp $ * $NetBSD: parse.h,v 1.6 2005/05/29 04:58:15 lukem Exp $
* $FreeBSD$ * $FreeBSD$
*/ */
@ -45,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 *);

View File

@ -13,11 +13,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.
* *
@ -33,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $NetBSD: prompt.c,v 1.7 2000/09/04 22:06:31 lukem Exp $ * $NetBSD: prompt.c,v 1.11 2003/08/07 16:44:32 agc Exp $
*/ */
#if !defined(lint) && !defined(SCCSID) #if !defined(lint) && !defined(SCCSID)
@ -57,7 +53,7 @@ private char *prompt_default_r(EditLine *);
*/ */
private char * private char *
/*ARGSUSED*/ /*ARGSUSED*/
prompt_default(EditLine *el) prompt_default(EditLine *el __unused)
{ {
static char a[3] = {'?', ' ', '\0'}; static char a[3] = {'?', ' ', '\0'};
@ -70,7 +66,7 @@ prompt_default(EditLine *el)
*/ */
private char * private char *
/*ARGSUSED*/ /*ARGSUSED*/
prompt_default_r(EditLine *el) prompt_default_r(EditLine *el __unused)
{ {
static char a[1] = {'\0'}; static char a[1] = {'\0'};
@ -125,7 +121,7 @@ prompt_init(EditLine *el)
*/ */
protected void protected void
/*ARGSUSED*/ /*ARGSUSED*/
prompt_end(EditLine *el) prompt_end(EditLine *el __unused)
{ {
} }

View File

@ -13,11 +13,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,7 +30,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)prompt.h 8.1 (Berkeley) 6/4/93 * @(#)prompt.h 8.1 (Berkeley) 6/4/93
* $NetBSD: prompt.h,v 1.4 1999/11/12 01:05:07 lukem Exp $ * $NetBSD: prompt.h,v 1.6 2003/08/07 16:44:32 agc Exp $
* $FreeBSD$ * $FreeBSD$
*/ */

View File

@ -13,11 +13,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.
* *
@ -33,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $NetBSD: read.c,v 1.18 2000/11/11 22:18:58 christos Exp $ * $NetBSD: read.c,v 1.39 2005/08/02 12:11:14 christos Exp $
*/ */
#if !defined(lint) && !defined(SCCSID) #if !defined(lint) && !defined(SCCSID)
@ -57,8 +53,48 @@ __FBSDID("$FreeBSD$");
private int read__fixio(int, int); private int read__fixio(int, int);
private int read_preread(EditLine *); private int read_preread(EditLine *);
private int read_getcmd(EditLine *, el_action_t *, char *);
private int read_char(EditLine *, char *); private int read_char(EditLine *, char *);
private int read_getcmd(EditLine *, el_action_t *, char *);
/* read_init():
* Initialize the read stuff
*/
protected int
read_init(EditLine *el)
{
/* builtin read_char */
el->el_read.read_char = read_char;
return 0;
}
/* el_read_setfn():
* Set the read char function to the one provided.
* If it is set to EL_BUILTIN_GETCFN, then reset to the builtin one.
*/
protected int
el_read_setfn(EditLine *el, el_rfunc_t rc)
{
el->el_read.read_char = (rc == EL_BUILTIN_GETCFN) ? read_char : rc;
return 0;
}
/* el_read_getfn():
* return the current read char function, or EL_BUILTIN_GETCFN
* if it is the default one
*/
protected el_rfunc_t
el_read_getfn(EditLine *el)
{
return (el->el_read.read_char == read_char) ?
EL_BUILTIN_GETCFN : el->el_read.read_char;
}
#ifndef MIN
#define MIN(A,B) ((A) < (B) ? (A) : (B))
#endif
#ifdef DEBUG_EDIT #ifdef DEBUG_EDIT
private void private void
@ -84,7 +120,7 @@ read_debug(EditLine *el)
*/ */
/* ARGSUSED */ /* ARGSUSED */
private int private int
read__fixio(int fd, int e) read__fixio(int fd __unused, int e)
{ {
switch (e) { switch (e) {
@ -149,10 +185,6 @@ read_preread(EditLine *el)
{ {
int chrs = 0; int chrs = 0;
if (el->el_chared.c_macro.nline) {
el_free((ptr_t) el->el_chared.c_macro.nline);
el->el_chared.c_macro.nline = NULL;
}
if (el->el_tty.t_mode == ED_IO) if (el->el_tty.t_mode == ED_IO)
return (0); return (0);
@ -165,8 +197,7 @@ read_preread(EditLine *el)
(size_t) MIN(chrs, EL_BUFSIZ - 1)); (size_t) MIN(chrs, EL_BUFSIZ - 1));
if (chrs > 0) { if (chrs > 0) {
buf[chrs] = '\0'; buf[chrs] = '\0';
el->el_chared.c_macro.nline = strdup(buf); el_push(el, buf);
el_push(el, el->el_chared.c_macro.nline);
} }
} }
#endif /* FIONREAD */ #endif /* FIONREAD */
@ -179,18 +210,18 @@ read_preread(EditLine *el)
* Push a macro * Push a macro
*/ */
public void public void
el_push(EditLine *el, const char *str) el_push(EditLine *el, char *str)
{ {
c_macro_t *ma = &el->el_chared.c_macro; c_macro_t *ma = &el->el_chared.c_macro;
if (str != NULL && ma->level + 1 < EL_MAXMACRO) { if (str != NULL && ma->level + 1 < EL_MAXMACRO) {
ma->level++; ma->level++;
/* LINTED const cast */ if ((ma->macro[ma->level] = el_strdup(str)) != NULL)
ma->macro[ma->level] = (char *) str; return;
} else { ma->level--;
term_beep(el);
term__flush();
} }
term_beep(el);
term__flush();
} }
@ -200,10 +231,10 @@ el_push(EditLine *el, const char *str)
private int private int
read_getcmd(EditLine *el, el_action_t *cmdnum, char *ch) read_getcmd(EditLine *el, el_action_t *cmdnum, char *ch)
{ {
el_action_t cmd = ED_UNASSIGNED; el_action_t cmd;
int num; int num;
while (cmd == ED_UNASSIGNED || cmd == ED_SEQUENCE_LEAD_IN) { do {
if ((num = el_getc(el, ch)) != 1) /* if EOF or error */ if ((num = el_getc(el, ch)) != 1) /* if EOF or error */
return (num); return (num);
@ -242,7 +273,7 @@ read_getcmd(EditLine *el, el_action_t *cmdnum, char *ch)
} }
if (el->el_map.alt == NULL) if (el->el_map.alt == NULL)
el->el_map.current = el->el_map.key; el->el_map.current = el->el_map.key;
} } while (cmd == ED_SEQUENCE_LEAD_IN);
*cmdnum = cmd; *cmdnum = cmd;
return (OKCMD); return (OKCMD);
} }
@ -287,14 +318,16 @@ el_getc(EditLine *el, char *cp)
if (ma->level < 0) if (ma->level < 0)
break; break;
if (*ma->macro[ma->level] == 0) { if (ma->macro[ma->level][ma->offset] == '\0') {
ma->level--; el_free(ma->macro[ma->level--]);
ma->offset = 0;
continue; continue;
} }
*cp = *ma->macro[ma->level]++ & 0377; *cp = ma->macro[ma->level][ma->offset++] & 0377;
if (*ma->macro[ma->level] == 0) { /* Needed for QuoteMode if (ma->macro[ma->level][ma->offset] == '\0') {
* On */ /* Needed for QuoteMode On */
ma->level--; el_free(ma->macro[ma->level--]);
ma->offset = 0;
} }
return (1); return (1);
} }
@ -308,13 +341,42 @@ el_getc(EditLine *el, char *cp)
#ifdef DEBUG_READ #ifdef DEBUG_READ
(void) fprintf(el->el_errfile, "Reading a character\n"); (void) fprintf(el->el_errfile, "Reading a character\n");
#endif /* DEBUG_READ */ #endif /* DEBUG_READ */
num_read = read_char(el, cp); num_read = (*el->el_read.read_char)(el, cp);
#ifdef DEBUG_READ #ifdef DEBUG_READ
(void) fprintf(el->el_errfile, "Got it %c\n", *cp); (void) fprintf(el->el_errfile, "Got it %c\n", *cp);
#endif /* DEBUG_READ */ #endif /* DEBUG_READ */
return (num_read); return (num_read);
} }
protected void
read_prepare(EditLine *el)
{
if (el->el_flags & HANDLE_SIGNALS)
sig_set(el);
if (el->el_flags & NO_TTY)
return;
if ((el->el_flags & (UNBUFFERED|EDIT_DISABLED)) == UNBUFFERED)
tty_rawmode(el);
/* This is relatively cheap, and things go terribly wrong if
we have the wrong size. */
el_resize(el);
re_clear_display(el); /* reset the display stuff */
ch_reset(el, 0);
re_refresh(el); /* print the prompt */
if (el->el_flags & UNBUFFERED)
term__flush();
}
protected void
read_finish(EditLine *el)
{
if ((el->el_flags & UNBUFFERED) == 0)
(void) tty_cookedmode(el);
if (el->el_flags & HANDLE_SIGNALS)
sig_clr(el);
}
public const char * public const char *
el_gets(EditLine *el, int *nread) el_gets(EditLine *el, int *nread)
@ -323,18 +385,16 @@ el_gets(EditLine *el, int *nread)
el_action_t cmdnum = 0; el_action_t cmdnum = 0;
int num; /* how many chars we have read at NL */ int num; /* how many chars we have read at NL */
char ch; char ch;
int crlf = 0;
#ifdef FIONREAD #ifdef FIONREAD
c_macro_t *ma = &el->el_chared.c_macro; c_macro_t *ma = &el->el_chared.c_macro;
#endif /* FIONREAD */ #endif /* FIONREAD */
if (el->el_flags & HANDLE_SIGNALS)
sig_set(el);
if (el->el_flags & NO_TTY) { if (el->el_flags & NO_TTY) {
char *cp = el->el_line.buffer; char *cp = el->el_line.buffer;
size_t idx; size_t idx;
while (read_char(el, cp) == 1) { while ((*el->el_read.read_char)(el, cp) == 1) {
/* make sure there is space for next character */ /* make sure there is space for next character */
if (cp + 1 >= el->el_line.limit) { if (cp + 1 >= el->el_line.limit) {
idx = (cp - el->el_line.buffer); idx = (cp - el->el_line.buffer);
@ -343,6 +403,8 @@ el_gets(EditLine *el, int *nread)
cp = &el->el_line.buffer[idx]; cp = &el->el_line.buffer[idx];
} }
cp++; cp++;
if (el->el_flags & UNBUFFERED)
break;
if (cp[-1] == '\r' || cp[-1] == '\n') if (cp[-1] == '\r' || cp[-1] == '\n')
break; break;
} }
@ -353,8 +415,7 @@ el_gets(EditLine *el, int *nread)
*nread = el->el_line.cursor - el->el_line.buffer; *nread = el->el_line.cursor - el->el_line.buffer;
return (el->el_line.buffer); return (el->el_line.buffer);
} }
re_clear_display(el); /* reset the display stuff */
ch_reset(el);
#ifdef FIONREAD #ifdef FIONREAD
if (el->el_tty.t_mode == EX_IO && ma->level < 0) { if (el->el_tty.t_mode == EX_IO && ma->level < 0) {
@ -371,15 +432,20 @@ el_gets(EditLine *el, int *nread)
} }
#endif /* FIONREAD */ #endif /* FIONREAD */
re_refresh(el); /* print the prompt */ if ((el->el_flags & UNBUFFERED) == 0)
read_prepare(el);
if (el->el_flags & EDIT_DISABLED) { if (el->el_flags & EDIT_DISABLED) {
char *cp = el->el_line.buffer; char *cp;
size_t idx; size_t idx;
if ((el->el_flags & UNBUFFERED) == 0)
cp = el->el_line.buffer;
else
cp = el->el_line.lastchar;
term__flush(); term__flush();
while (read_char(el, cp) == 1) { while ((*el->el_read.read_char)(el, cp) == 1) {
/* make sure there is space next character */ /* make sure there is space next character */
if (cp + 1 >= el->el_line.limit) { if (cp + 1 >= el->el_line.limit) {
idx = (cp - el->el_line.buffer); idx = (cp - el->el_line.buffer);
@ -387,8 +453,13 @@ el_gets(EditLine *el, int *nread)
break; break;
cp = &el->el_line.buffer[idx]; cp = &el->el_line.buffer[idx];
} }
if (*cp == 4) /* ought to be stty eof */
break;
cp++; cp++;
if (cp[-1] == '\r' || cp[-1] == '\n') crlf = cp[-1] == '\r' || cp[-1] == '\n';
if (el->el_flags & UNBUFFERED)
break;
if (crlf)
break; break;
} }
@ -398,6 +469,7 @@ el_gets(EditLine *el, int *nread)
*nread = el->el_line.cursor - el->el_line.buffer; *nread = el->el_line.cursor - el->el_line.buffer;
return (el->el_line.buffer); return (el->el_line.buffer);
} }
for (num = OKCMD; num == OKCMD;) { /* while still editing this for (num = OKCMD; num == OKCMD;) { /* while still editing this
* line */ * line */
#ifdef DEBUG_EDIT #ifdef DEBUG_EDIT
@ -411,7 +483,7 @@ el_gets(EditLine *el, int *nread)
#endif /* DEBUG_READ */ #endif /* DEBUG_READ */
break; break;
} }
if ((int) cmdnum >= el->el_map.nfunc) { /* BUG CHECK command */ if ((unsigned int)cmdnum >= 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);
@ -433,7 +505,24 @@ el_gets(EditLine *el, int *nread)
"Error command = %d\n", cmdnum); "Error command = %d\n", cmdnum);
} }
#endif /* DEBUG_READ */ #endif /* DEBUG_READ */
/* vi redo needs these way down the levels... */
el->el_state.thiscmd = cmdnum;
el->el_state.thisch = ch;
if (el->el_map.type == MAP_VI &&
el->el_map.current == el->el_map.key &&
el->el_chared.c_redo.pos < el->el_chared.c_redo.lim) {
if (cmdnum == VI_DELETE_PREV_CHAR &&
el->el_chared.c_redo.pos != el->el_chared.c_redo.buf
&& isprint((unsigned char)el->el_chared.c_redo.pos[-1]))
el->el_chared.c_redo.pos--;
else
*el->el_chared.c_redo.pos++ = ch;
}
retval = (*el->el_map.func[cmdnum]) (el, ch); retval = (*el->el_map.func[cmdnum]) (el, ch);
#ifdef DEBUG_READ
(void) fprintf(el->el_errfile,
"Returned state %d\n", retval );
#endif /* DEBUG_READ */
/* save the last command here */ /* save the last command here */
el->el_state.lastcmd = cmdnum; el->el_state.lastcmd = cmdnum;
@ -441,8 +530,6 @@ el_gets(EditLine *el, int *nread)
/* use any return value */ /* use any return value */
switch (retval) { switch (retval) {
case CC_CURSOR: case CC_CURSOR:
el->el_state.argument = 1;
el->el_state.doingarg = 0;
re_refresh_cursor(el); re_refresh_cursor(el);
break; break;
@ -452,29 +539,29 @@ el_gets(EditLine *el, int *nread)
/* FALLTHROUGH */ /* FALLTHROUGH */
case CC_REFRESH: case CC_REFRESH:
el->el_state.argument = 1;
el->el_state.doingarg = 0;
re_refresh(el); re_refresh(el);
break; break;
case CC_REFRESH_BEEP: case CC_REFRESH_BEEP:
el->el_state.argument = 1;
el->el_state.doingarg = 0;
re_refresh(el); re_refresh(el);
term_beep(el); term_beep(el);
break; break;
case CC_NORM: /* normal char */ case CC_NORM: /* normal char */
el->el_state.argument = 1;
el->el_state.doingarg = 0;
break; break;
case CC_ARGHACK: /* Suggested by Rich Salz */ case CC_ARGHACK: /* Suggested by Rich Salz */
/* <rsalz@pineapple.bbn.com> */ /* <rsalz@pineapple.bbn.com> */
break; /* keep going... */ continue; /* keep going... */
case CC_EOF: /* end of file typed */ case CC_EOF: /* end of file typed */
num = 0; if ((el->el_flags & UNBUFFERED) == 0)
num = 0;
else if (num == -1) {
*el->el_line.lastchar++ = CONTROL('d');
el->el_line.cursor = el->el_line.lastchar;
num = 1;
}
break; break;
case CC_NEWLINE: /* normal end of line */ case CC_NEWLINE: /* normal end of line */
@ -488,10 +575,8 @@ 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 */
el->el_state.argument = 1;
el->el_state.doingarg = 0;
break; break;
case CC_ERROR: case CC_ERROR:
@ -500,20 +585,26 @@ el_gets(EditLine *el, int *nread)
(void) fprintf(el->el_errfile, (void) fprintf(el->el_errfile,
"*** editor ERROR ***\r\n\n"); "*** editor ERROR ***\r\n\n");
#endif /* DEBUG_READ */ #endif /* DEBUG_READ */
el->el_state.argument = 1;
el->el_state.doingarg = 0;
term_beep(el); term_beep(el);
term__flush(); term__flush();
break; break;
} }
el->el_state.argument = 1;
el->el_state.doingarg = 0;
el->el_chared.c_vcmd.action = NOP;
if (el->el_flags & UNBUFFERED)
break;
} }
term__flush(); /* flush any buffered output */ term__flush(); /* flush any buffered output */
/* make sure the tty is set up correctly */ /* make sure the tty is set up correctly */
(void) tty_cookedmode(el); if ((el->el_flags & UNBUFFERED) == 0) {
if (el->el_flags & HANDLE_SIGNALS) read_finish(el);
sig_clr(el); if (nread)
if (nread) *nread = num;
*nread = num; } else {
if (nread)
*nread = el->el_line.lastchar - el->el_line.buffer;
}
return (num ? el->el_line.buffer : NULL); return (num ? el->el_line.buffer : NULL);
} }

58
lib/libedit/read.h Normal file
View File

@ -0,0 +1,58 @@
/*-
* Copyright (c) 2001 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Anthony Mallet.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* $NetBSD: read.h,v 1.4 2004/02/27 14:52:18 christos Exp $
* $FreeBSD$
*/
/*
* el.read.h: Character reading functions
*/
#ifndef _h_el_read
#define _h_el_read
typedef int (*el_rfunc_t)(EditLine *, char *);
typedef struct el_read_t {
el_rfunc_t read_char; /* Function to read a character */
} el_read_t;
protected int read_init(EditLine *);
protected void read_prepare(EditLine *);
protected void read_finish(EditLine *);
protected int el_read_setfn(EditLine *, el_rfunc_t);
protected el_rfunc_t el_read_getfn(EditLine *);
#endif /* _h_el_read */

View File

@ -13,11 +13,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.
* *
@ -33,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $NetBSD: refresh.c,v 1.16 2001/01/10 07:45:42 jdolecek Exp $ * $NetBSD: refresh.c,v 1.26 2003/08/07 16:44:33 agc Exp $
*/ */
#if !defined(lint) && !defined(SCCSID) #if !defined(lint) && !defined(SCCSID)
@ -47,6 +43,7 @@ __FBSDID("$FreeBSD$");
*/ */
#include "sys.h" #include "sys.h"
#include <stdio.h> #include <stdio.h>
#include <ctype.h>
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
@ -58,24 +55,24 @@ 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__strncopy(char *, char *, size_t); private void re__strncopy(char *, char *, size_t);
private void re__copy_and_pad(char *, char *, size_t); private void re__copy_and_pad(char *, const char *, size_t);
#ifdef DEBUG_REFRESH #ifdef DEBUG_REFRESH
private void re_printstr(EditLine *, char *, char *, char *); private void re_printstr(EditLine *, const char *, char *, char *);
#define __F el->el_errfile #define __F el->el_errfile
#define ELRE_ASSERT(a, b, c) do \ #define ELRE_ASSERT(a, b, c) do \
if (a) { \ if (/*CONSTCOND*/ a) { \
(void) fprintf b; \ (void) fprintf b; \
c; \ c; \
} \ } \
while (0) while (/*CONSTCOND*/0)
#define ELRE_DEBUG(a, b) ELRE_ASSERT(a,b,;) #define ELRE_DEBUG(a, b) ELRE_ASSERT(a,b,;)
/* re_printstr(): /* re_printstr():
* Print a string on the debugging pty * Print a string on the debugging pty
*/ */
private void private void
re_printstr(EditLine *el, char *str, char *f, char *t) re_printstr(EditLine *el, const char *str, char *f, char *t)
{ {
ELRE_DEBUG(1, (__F, "%s:\"", str)); ELRE_DEBUG(1, (__F, "%s:\"", str));
@ -96,8 +93,6 @@ private void
re_addc(EditLine *el, int c) re_addc(EditLine *el, int c)
{ {
c = (unsigned char)c;
if (isprint(c)) { if (isprint(c)) {
re_putc(el, c, 1); re_putc(el, c, 1);
return; return;
@ -208,6 +203,14 @@ re_refresh(EditLine *el)
el->el_refresh.r_cursor.h = 0; el->el_refresh.r_cursor.h = 0;
el->el_refresh.r_cursor.v = 0; el->el_refresh.r_cursor.v = 0;
if (el->el_line.cursor >= el->el_line.lastchar) {
if (el->el_map.current == el->el_map.alt
&& el->el_line.lastchar != el->el_line.buffer)
el->el_line.cursor = el->el_line.lastchar - 1;
else
el->el_line.cursor = el->el_line.lastchar;
}
cur.h = -1; /* set flag in case I'm not set */ cur.h = -1; /* set flag in case I'm not set */
cur.v = 0; cur.v = 0;
@ -317,7 +320,6 @@ re_goto_bottom(EditLine *el)
{ {
term_move_to_line(el, el->el_refresh.r_oldcv); term_move_to_line(el, el->el_refresh.r_oldcv);
term__putc('\r');
term__putc('\n'); term__putc('\n');
re_clear_display(el); re_clear_display(el);
term__flush(); term__flush();
@ -330,7 +332,8 @@ re_goto_bottom(EditLine *el)
*/ */
private void private void
/*ARGSUSED*/ /*ARGSUSED*/
re_insert(EditLine *el, char *d, int dat, int dlen, char *s, int num) re_insert(EditLine *el __unused,
char *d, int dat, int dlen, char *s, int num)
{ {
char *a, *b; char *a, *b;
@ -373,7 +376,8 @@ re_insert(EditLine *el, char *d, int dat, int dlen, char *s, int num)
*/ */
private void private void
/*ARGSUSED*/ /*ARGSUSED*/
re_delete(EditLine *el, char *d, int dat, int dlen, int num) re_delete(EditLine *el __unused,
char *d, int dat, int dlen, int num)
{ {
char *a, *b; char *a, *b;
@ -906,9 +910,9 @@ re_update_line(EditLine *el, char *old, char *new, int i)
* Copy string and pad with spaces * Copy string and pad with spaces
*/ */
private void private void
re__copy_and_pad(char *dst, char *src, size_t width) re__copy_and_pad(char *dst, const char *src, size_t width)
{ {
int i; size_t i;
for (i = 0; i < width; i++) { for (i = 0; i < width; i++) {
if (*src == '\0') if (*src == '\0')
@ -932,6 +936,14 @@ re_refresh_cursor(EditLine *el)
char *cp, c; char *cp, c;
int h, v, th; int h, v, th;
if (el->el_line.cursor >= el->el_line.lastchar) {
if (el->el_map.current == el->el_map.alt
&& el->el_line.lastchar != el->el_line.buffer)
el->el_line.cursor = el->el_line.lastchar - 1;
else
el->el_line.cursor = el->el_line.lastchar;
}
/* first we must find where the cursor is... */ /* first we must find where the cursor is... */
h = el->el_prompt.p_pos.h; h = el->el_prompt.p_pos.h;
v = el->el_prompt.p_pos.v; v = el->el_prompt.p_pos.v;
@ -939,7 +951,7 @@ re_refresh_cursor(EditLine *el)
/* do input buffer to el->el_line.cursor */ /* do input buffer to el->el_line.cursor */
for (cp = el->el_line.buffer; cp < el->el_line.cursor; cp++) { for (cp = el->el_line.buffer; cp < el->el_line.cursor; cp++) {
c = (unsigned char)*cp; c = *cp;
h++; /* all chars at least this long */ h++; /* all chars at least this long */
if (c == '\n') {/* handle newline in data part too */ if (c == '\n') {/* handle newline in data part too */
@ -1054,8 +1066,8 @@ re_fastaddc(EditLine *el)
re_fastputc(el, c); re_fastputc(el, c);
} else { } else {
re_fastputc(el, '\\'); re_fastputc(el, '\\');
re_fastputc(el, (int) ((((unsigned int) c >> 6) & 7) + '0')); re_fastputc(el, (int)(((((unsigned int)c) >> 6) & 3) + '0'));
re_fastputc(el, (int) ((((unsigned int) c >> 3) & 7) + '0')); re_fastputc(el, (int)(((((unsigned int)c) >> 3) & 7) + '0'));
re_fastputc(el, (c & 7) + '0'); re_fastputc(el, (c & 7) + '0');
} }
term__flush(); term__flush();

View File

@ -13,11 +13,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,7 +30,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)refresh.h 8.1 (Berkeley) 6/4/93 * @(#)refresh.h 8.1 (Berkeley) 6/4/93
* $NetBSD: refresh.h,v 1.3 2000/09/04 22:06:32 lukem Exp $ * $NetBSD: refresh.h,v 1.5 2003/08/07 16:44:33 agc Exp $
* $FreeBSD$ * $FreeBSD$
*/ */

View File

@ -13,11 +13,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.
* *
@ -33,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $NetBSD: search.c,v 1.10 2001/01/04 15:56:32 christos Exp $ * $NetBSD: search.c,v 1.20 2004/11/04 01:16:03 christos Exp $
*/ */
#if !defined(lint) && !defined(SCCSID) #if !defined(lint) && !defined(SCCSID)
@ -74,7 +70,8 @@ search_init(EditLine *el)
el->el_search.patlen = 0; el->el_search.patlen = 0;
el->el_search.patdir = -1; el->el_search.patdir = -1;
el->el_search.chacha = '\0'; el->el_search.chacha = '\0';
el->el_search.chadir = -1; el->el_search.chadir = CHAR_FWD;
el->el_search.chatflg = 0;
return (0); return (0);
} }
@ -223,8 +220,11 @@ ce_inc_search(EditLine *el, int dir)
if (el->el_search.patlen == 0) { /* first round */ if (el->el_search.patlen == 0) { /* first round */
pchar = ':'; pchar = ':';
#ifdef ANCHOR #ifdef ANCHOR
#define LEN 2
el->el_search.patbuf[el->el_search.patlen++] = '.'; el->el_search.patbuf[el->el_search.patlen++] = '.';
el->el_search.patbuf[el->el_search.patlen++] = '*'; el->el_search.patbuf[el->el_search.patlen++] = '*';
#else
#define LEN 0
#endif #endif
} }
done = redo = 0; done = redo = 0;
@ -233,7 +233,7 @@ ce_inc_search(EditLine *el, int dir)
*cp; *el->el_line.lastchar++ = *cp++) *cp; *el->el_line.lastchar++ = *cp++)
continue; continue;
*el->el_line.lastchar++ = pchar; *el->el_line.lastchar++ = pchar;
for (cp = &el->el_search.patbuf[1]; for (cp = &el->el_search.patbuf[LEN];
cp < &el->el_search.patbuf[el->el_search.patlen]; cp < &el->el_search.patbuf[el->el_search.patlen];
*el->el_line.lastchar++ = *cp++) *el->el_line.lastchar++ = *cp++)
continue; continue;
@ -246,7 +246,7 @@ ce_inc_search(EditLine *el, int dir)
switch (el->el_map.current[(unsigned char) ch]) { switch (el->el_map.current[(unsigned char) ch]) {
case ED_INSERT: case ED_INSERT:
case ED_DIGIT: case ED_DIGIT:
if (el->el_search.patlen > EL_BUFSIZ - 3) if (el->el_search.patlen >= EL_BUFSIZ - LEN)
term_beep(el); term_beep(el);
else { else {
el->el_search.patbuf[el->el_search.patlen++] = el->el_search.patbuf[el->el_search.patlen++] =
@ -267,8 +267,9 @@ ce_inc_search(EditLine *el, int dir)
redo++; redo++;
break; break;
case EM_DELETE_PREV_CHAR:
case ED_DELETE_PREV_CHAR: case ED_DELETE_PREV_CHAR:
if (el->el_search.patlen > 1) if (el->el_search.patlen > LEN)
done++; done++;
else else
term_beep(el); term_beep(el);
@ -283,17 +284,18 @@ ce_inc_search(EditLine *el, int dir)
case 0027: /* ^W: Append word */ case 0027: /* ^W: Append word */
/* No can do if globbing characters in pattern */ /* No can do if globbing characters in pattern */
for (cp = &el->el_search.patbuf[1];; cp++) for (cp = &el->el_search.patbuf[LEN];; cp++)
if (cp >= &el->el_search.patbuf[el->el_search.patlen]) { if (cp >= &el->el_search.patbuf[
el->el_search.patlen]) {
el->el_line.cursor += el->el_line.cursor +=
el->el_search.patlen - 1; el->el_search.patlen - LEN - 1;
cp = c__next_word(el->el_line.cursor, cp = c__next_word(el->el_line.cursor,
el->el_line.lastchar, 1, el->el_line.lastchar, 1,
ce__isword); ce__isword);
while (el->el_line.cursor < cp && while (el->el_line.cursor < cp &&
*el->el_line.cursor != '\n') { *el->el_line.cursor != '\n') {
if (el->el_search.patlen > if (el->el_search.patlen >=
EL_BUFSIZ - 3) { EL_BUFSIZ - LEN) {
term_beep(el); term_beep(el);
break; break;
} }
@ -335,13 +337,13 @@ ce_inc_search(EditLine *el, int dir)
/* Can't search if unmatched '[' */ /* Can't search if unmatched '[' */
for (cp = &el->el_search.patbuf[el->el_search.patlen-1], for (cp = &el->el_search.patbuf[el->el_search.patlen-1],
ch = ']'; ch = ']';
cp > el->el_search.patbuf; cp >= &el->el_search.patbuf[LEN];
cp--) cp--)
if (*cp == '[' || *cp == ']') { if (*cp == '[' || *cp == ']') {
ch = *cp; ch = *cp;
break; break;
} }
if (el->el_search.patlen > 1 && ch != '[') { if (el->el_search.patlen > LEN && ch != '[') {
if (redo && newdir == dir) { if (redo && newdir == dir) {
if (pchar == '?') { /* wrap around */ if (pchar == '?') { /* wrap around */
el->el_history.eventno = el->el_history.eventno =
@ -371,9 +373,8 @@ ce_inc_search(EditLine *el, int dir)
'\0'; '\0';
if (el->el_line.cursor < el->el_line.buffer || if (el->el_line.cursor < el->el_line.buffer ||
el->el_line.cursor > el->el_line.lastchar || el->el_line.cursor > el->el_line.lastchar ||
(ret = ce_search_line(el, (ret = ce_search_line(el, newdir))
&el->el_search.patbuf[1], == CC_ERROR) {
newdir)) == CC_ERROR) {
/* avoid c_setpat */ /* avoid c_setpat */
el->el_state.lastcmd = el->el_state.lastcmd =
(el_action_t) newdir; (el_action_t) newdir;
@ -386,11 +387,11 @@ ce_inc_search(EditLine *el, int dir)
el->el_line.lastchar : el->el_line.lastchar :
el->el_line.buffer; el->el_line.buffer;
(void) ce_search_line(el, (void) ce_search_line(el,
&el->el_search.patbuf[1],
newdir); newdir);
} }
} }
el->el_search.patbuf[--el->el_search.patlen] = el->el_search.patlen -= LEN;
el->el_search.patbuf[el->el_search.patlen] =
'\0'; '\0';
if (ret == CC_ERROR) { if (ret == CC_ERROR) {
term_beep(el); term_beep(el);
@ -446,29 +447,20 @@ cv_search(EditLine *el, int dir)
char tmpbuf[EL_BUFSIZ]; char tmpbuf[EL_BUFSIZ];
int tmplen; int tmplen;
tmplen = 0;
#ifdef ANCHOR #ifdef ANCHOR
tmpbuf[tmplen++] = '.'; tmpbuf[0] = '.';
tmpbuf[tmplen++] = '*'; tmpbuf[1] = '*';
#endif #endif
tmplen = LEN;
el->el_line.buffer[0] = '\0';
el->el_line.lastchar = el->el_line.buffer;
el->el_line.cursor = el->el_line.buffer;
el->el_search.patdir = dir; el->el_search.patdir = dir;
c_insert(el, 2); /* prompt + '\n' */ tmplen = c_gets(el, &tmpbuf[LEN],
*el->el_line.cursor++ = '\n'; dir == ED_SEARCH_PREV_HISTORY ? "\n/" : "\n?" );
*el->el_line.cursor++ = dir == ED_SEARCH_PREV_HISTORY ? '/' : '?'; if (tmplen == -1)
re_refresh(el); return CC_REFRESH;
#ifdef ANCHOR tmplen += LEN;
#define LEN 2
#else
#define LEN 0
#endif
tmplen = c_gets(el, &tmpbuf[LEN]) + LEN;
ch = tmpbuf[tmplen]; ch = tmpbuf[tmplen];
tmpbuf[tmplen] = '\0'; tmpbuf[tmplen] = '\0';
@ -477,9 +469,6 @@ cv_search(EditLine *el, int dir)
* Use the old pattern, but wild-card it. * Use the old pattern, but wild-card it.
*/ */
if (el->el_search.patlen == 0) { if (el->el_search.patlen == 0) {
el->el_line.buffer[0] = '\0';
el->el_line.lastchar = el->el_line.buffer;
el->el_line.cursor = el->el_line.buffer;
re_refresh(el); re_refresh(el);
return (CC_ERROR); return (CC_ERROR);
} }
@ -510,19 +499,15 @@ cv_search(EditLine *el, int dir)
el->el_state.lastcmd = (el_action_t) dir; /* avoid c_setpat */ el->el_state.lastcmd = (el_action_t) dir; /* avoid c_setpat */
el->el_line.cursor = el->el_line.lastchar = el->el_line.buffer; el->el_line.cursor = el->el_line.lastchar = el->el_line.buffer;
if ((dir == ED_SEARCH_PREV_HISTORY ? ed_search_prev_history(el, 0) : if ((dir == ED_SEARCH_PREV_HISTORY ? ed_search_prev_history(el, 0) :
ed_search_next_history(el, 0)) == CC_ERROR) { ed_search_next_history(el, 0)) == CC_ERROR) {
re_refresh(el); re_refresh(el);
return (CC_ERROR); return (CC_ERROR);
} else {
if (ch == 0033) {
re_refresh(el);
*el->el_line.lastchar++ = '\n';
*el->el_line.lastchar = '\0';
re_goto_bottom(el);
return (CC_NEWLINE);
} else
return (CC_REFRESH);
} }
if (ch == 0033) {
re_refresh(el);
return ed_newline(el, 0);
}
return (CC_REFRESH);
} }
@ -530,24 +515,39 @@ cv_search(EditLine *el, int dir)
* Look for a pattern inside a line * Look for a pattern inside a line
*/ */
protected el_action_t protected el_action_t
ce_search_line(EditLine *el, char *pattern, int dir) ce_search_line(EditLine *el, int dir)
{ {
char *cp; char *cp = el->el_line.cursor;
char *pattern = el->el_search.patbuf;
char oc, *ocp;
#ifdef ANCHOR
ocp = &pattern[1];
oc = *ocp;
*ocp = '^';
#else
ocp = pattern;
oc = *ocp;
#endif
if (dir == ED_SEARCH_PREV_HISTORY) { if (dir == ED_SEARCH_PREV_HISTORY) {
for (cp = el->el_line.cursor; cp >= el->el_line.buffer; cp--) for (; cp >= el->el_line.buffer; cp--) {
if (el_match(cp, pattern)) { if (el_match(cp, ocp)) {
*ocp = oc;
el->el_line.cursor = cp; el->el_line.cursor = cp;
return (CC_NORM); return (CC_NORM);
} }
}
*ocp = oc;
return (CC_ERROR); return (CC_ERROR);
} else { } else {
for (cp = el->el_line.cursor; *cp != '\0' && for (; *cp != '\0' && cp < el->el_line.limit; cp++) {
cp < el->el_line.limit; cp++) if (el_match(cp, ocp)) {
if (el_match(cp, pattern)) { *ocp = oc;
el->el_line.cursor = cp; el->el_line.cursor = cp;
return (CC_NORM); return (CC_NORM);
} }
}
*ocp = oc;
return (CC_ERROR); return (CC_ERROR);
} }
} }
@ -579,69 +579,53 @@ cv_repeat_srch(EditLine *el, int c)
} }
/* cv_csearch_back(): /* cv_csearch():
* Vi character search reverse * Vi character search
*/ */
protected el_action_t protected el_action_t
cv_csearch_back(EditLine *el, int ch, int count, int tflag) cv_csearch(EditLine *el, int direction, int ch, int count, int tflag)
{ {
char *cp; char *cp;
if (ch == 0)
return CC_ERROR;
if (ch == -1) {
char c;
if (el_getc(el, &c) != 1)
return ed_end_of_file(el, 0);
ch = c;
}
/* Save for ';' and ',' commands */
el->el_search.chacha = ch;
el->el_search.chadir = direction;
el->el_search.chatflg = tflag;
cp = el->el_line.cursor; cp = el->el_line.cursor;
while (count--) { while (count--) {
if (*cp == ch) if (*cp == ch)
cp--; cp += direction;
while (cp > el->el_line.buffer && *cp != ch) for (;;cp += direction) {
cp--; if (cp >= el->el_line.lastchar)
return CC_ERROR;
if (cp < el->el_line.buffer)
return CC_ERROR;
if (*cp == ch)
break;
}
} }
if (cp < el->el_line.buffer || (cp == el->el_line.buffer && *cp != ch)) if (tflag)
return (CC_ERROR); cp -= direction;
if (*cp == ch && tflag)
cp++;
el->el_line.cursor = cp; el->el_line.cursor = cp;
if (el->el_chared.c_vcmd.action & DELETE) { if (el->el_chared.c_vcmd.action != NOP) {
el->el_line.cursor++; if (direction > 0)
el->el_line.cursor++;
cv_delfini(el); cv_delfini(el);
return (CC_REFRESH); return CC_REFRESH;
} }
re_refresh_cursor(el); return CC_CURSOR;
return (CC_NORM);
}
/* cv_csearch_fwd():
* Vi character search forward
*/
protected el_action_t
cv_csearch_fwd(EditLine *el, int ch, int count, int tflag)
{
char *cp;
cp = el->el_line.cursor;
while (count--) {
if (*cp == ch)
cp++;
while (cp < el->el_line.lastchar && *cp != ch)
cp++;
}
if (cp >= el->el_line.lastchar)
return (CC_ERROR);
if (*cp == ch && tflag)
cp--;
el->el_line.cursor = cp;
if (el->el_chared.c_vcmd.action & DELETE) {
el->el_line.cursor++;
cv_delfini(el);
return (CC_REFRESH);
}
re_refresh_cursor(el);
return (CC_NORM);
} }

View File

@ -13,11 +13,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,7 +30,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)search.h 8.1 (Berkeley) 6/4/93 * @(#)search.h 8.1 (Berkeley) 6/4/93
* $NetBSD: search.h,v 1.4 1999/07/02 15:21:27 simonb Exp $ * $NetBSD: search.h,v 1.8 2003/10/18 23:27:36 christos Exp $
* $FreeBSD$ * $FreeBSD$
*/ */
@ -52,6 +48,7 @@ typedef struct el_search_t {
int patdir; /* Direction of the last search */ int patdir; /* Direction of the last search */
int chadir; /* Character search direction */ int chadir; /* Character search direction */
char chacha; /* Character we are looking for */ char chacha; /* Character we are looking for */
char chatflg; /* 0 if f, 1 if t */
} el_search_t; } el_search_t;
@ -62,9 +59,8 @@ protected int c_hmatch(EditLine *, const char *);
protected void c_setpat(EditLine *); protected void c_setpat(EditLine *);
protected el_action_t ce_inc_search(EditLine *, int); protected el_action_t ce_inc_search(EditLine *, int);
protected el_action_t cv_search(EditLine *, int); protected el_action_t cv_search(EditLine *, int);
protected el_action_t ce_search_line(EditLine *, char *, int); protected el_action_t ce_search_line(EditLine *, int);
protected el_action_t cv_repeat_srch(EditLine *, int); protected el_action_t cv_repeat_srch(EditLine *, int);
protected el_action_t cv_csearch_back(EditLine *, int, int, int); protected el_action_t cv_csearch(EditLine *, int, int, int, int);
protected el_action_t cv_csearch_fwd(EditLine *, int, int, int);
#endif /* _h_el_search */ #endif /* _h_el_search */

View File

@ -13,11 +13,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.
* *
@ -33,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $NetBSD: sig.c,v 1.7 2001/01/04 15:55:03 christos Exp $ * $NetBSD: sig.c,v 1.11 2003/08/07 16:44:33 agc Exp $
*/ */
#if !defined(lint) && !defined(SCCSID) #if !defined(lint) && !defined(SCCSID)
@ -119,9 +115,9 @@ sig_init(EditLine *el)
#undef _DO #undef _DO
(void) sigprocmask(SIG_BLOCK, &nset, &oset); (void) sigprocmask(SIG_BLOCK, &nset, &oset);
#define SIGSIZE (sizeof(sighdl) / sizeof(sighdl[0]) * sizeof(sig_t)) #define SIGSIZE (sizeof(sighdl) / sizeof(sighdl[0]) * sizeof(el_signalhandler_t))
el->el_signal = (sig_t *) el_malloc(SIGSIZE); el->el_signal = (el_signalhandler_t *) el_malloc(SIGSIZE);
if (el->el_signal == NULL) if (el->el_signal == NULL)
return (-1); return (-1);
for (i = 0; sighdl[i] != -1; i++) for (i = 0; sighdl[i] != -1; i++)
@ -161,7 +157,7 @@ sig_set(EditLine *el)
(void) sigprocmask(SIG_BLOCK, &nset, &oset); (void) sigprocmask(SIG_BLOCK, &nset, &oset);
for (i = 0; sighdl[i] != -1; i++) { for (i = 0; sighdl[i] != -1; i++) {
sig_t s; el_signalhandler_t s;
/* This could happen if we get interrupted */ /* This could happen if we get interrupted */
if ((s = signal(sighdl[i], sig_handler)) != sig_handler) if ((s = signal(sighdl[i], sig_handler)) != sig_handler)
el->el_signal[i] = s; el->el_signal[i] = s;

View File

@ -13,11 +13,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,7 +30,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)sig.h 8.1 (Berkeley) 6/4/93 * @(#)sig.h 8.1 (Berkeley) 6/4/93
* $NetBSD: sig.h,v 1.2 1997/01/11 06:48:11 lukem Exp $ * $NetBSD: sig.h,v 1.5 2003/08/07 16:44:33 agc Exp $
* $FreeBSD$ * $FreeBSD$
*/ */
@ -62,7 +58,8 @@
_DO(SIGCONT) \ _DO(SIGCONT) \
_DO(SIGWINCH) _DO(SIGWINCH)
typedef sig_t *el_signal_t; typedef void (*el_signalhandler_t)(int);
typedef el_signalhandler_t *el_signal_t;
protected void sig_end(EditLine*); protected void sig_end(EditLine*);
protected int sig_init(EditLine*); protected int sig_init(EditLine*);

View File

@ -13,11 +13,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,7 +30,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)sys.h 8.1 (Berkeley) 6/4/93 * @(#)sys.h 8.1 (Berkeley) 6/4/93
* $NetBSD: sys.h,v 1.3 1997/01/11 06:48:12 lukem Exp $ * $NetBSD: sys.h,v 1.9 2004/01/17 17:57:40 christos Exp $
* $FreeBSD$ * $FreeBSD$
*/ */
@ -74,20 +70,24 @@ typedef void *ioctl_t;
#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 #ifdef notdef
# undef REGEX # undef REGEX
# undef REGEXP # undef REGEXP
# include <malloc.h> # include <malloc.h>
typedef void (*sig_t)(int);
# ifdef __GNUC__ # ifdef __GNUC__
/* /*
* Broken hdrs. * Broken hdrs.
*/ */
extern int tgetent(const char *bp, char *name);
extern int tgetflag(const char *id);
extern int tgetnum(const char *id);
extern char *tgetstr(const char *id, char **area);
extern char *tgoto(const char *cap, int col, int row);
extern int tputs(const char *str, int affcnt, int (*putc)(int));
extern char *getenv(const char *); extern char *getenv(const char *);
extern int fprintf(FILE *, const char *, ...); extern int fprintf(FILE *, const char *, ...);
extern int sigsetmask(int); extern int sigsetmask(int);
extern int sigblock(int); extern int sigblock(int);
extern int ioctl(int, int, void *);
extern int fputc(int, FILE *); extern int fputc(int, FILE *);
extern int fgetc(FILE *); extern int fgetc(FILE *);
extern int fflush(FILE *); extern int fflush(FILE *);
@ -96,7 +96,6 @@ extern int toupper(int);
extern int errno, sys_nerr; extern int errno, sys_nerr;
extern char *sys_errlist[]; extern char *sys_errlist[];
extern void perror(const char *); extern void perror(const char *);
extern int read(int, const char*, int);
# include <string.h> # include <string.h>
# define strerror(e) sys_errlist[e] # define strerror(e) sys_errlist[e]
# endif # endif

View File

@ -13,11 +13,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.
* *
@ -33,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $NetBSD: term.c,v 1.31 2001/01/10 22:42:56 jdolecek Exp $ * $NetBSD: term.c,v 1.40 2004/05/22 23:21:28 christos Exp $
*/ */
#if !defined(lint) && !defined(SCCSID) #if !defined(lint) && !defined(SCCSID)
@ -47,13 +43,15 @@ __FBSDID("$FreeBSD$");
* We have to declare a static variable here, since the * We have to declare a static variable here, since the
* termcap putchar routine does not take an argument! * termcap putchar routine does not take an argument!
*/ */
#include "sys.h"
#include <stdio.h> #include <stdio.h>
#include <signal.h> #include <signal.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <termcap.h> #include <termcap.h>
#include <curses.h>
#include <ncurses.h>
#include <term.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
@ -258,7 +256,7 @@ private void term_setflags(EditLine *);
private int term_rebuffer_display(EditLine *); private int term_rebuffer_display(EditLine *);
private void term_free_display(EditLine *); private void term_free_display(EditLine *);
private int term_alloc_display(EditLine *); private int term_alloc_display(EditLine *);
private void term_alloc(EditLine *, const struct termcapstr *, 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 *);
@ -339,10 +337,10 @@ term_init(EditLine *el)
(void) memset(el->el_term.t_val, 0, T_val * sizeof(int)); (void) memset(el->el_term.t_val, 0, T_val * sizeof(int));
term_outfile = el->el_outfile; term_outfile = el->el_outfile;
term_init_arrow(el); term_init_arrow(el);
if (term_set(el, NULL) == -1) (void) term_set(el, NULL);
return (-1);
return (0); return (0);
} }
/* term_end(): /* term_end():
* Clean up the terminal stuff * Clean up the terminal stuff
*/ */
@ -359,6 +357,8 @@ term_end(EditLine *el)
el->el_term.t_str = NULL; el->el_term.t_str = NULL;
el_free((ptr_t) el->el_term.t_val); el_free((ptr_t) el->el_term.t_val);
el->el_term.t_val = NULL; el->el_term.t_val = NULL;
el_free((ptr_t) el->el_term.t_fkey);
el->el_term.t_fkey = NULL;
term_free_display(el); term_free_display(el);
} }
@ -367,7 +367,7 @@ term_end(EditLine *el)
* Maintain a string pool for termcap strings * Maintain a string pool for termcap strings
*/ */
private void private void
term_alloc(EditLine *el, const struct termcapstr *t, char *cap) term_alloc(EditLine *el, const struct termcapstr *t, const char *cap)
{ {
char termbuf[TC_BUFSIZE]; char termbuf[TC_BUFSIZE];
int tlen, clen; int tlen, clen;
@ -635,7 +635,8 @@ term_move_to_char(EditLine *el, int where)
* from col 0 * from col 0
*/ */
if (EL_CAN_TAB ? if (EL_CAN_TAB ?
(-del > (((unsigned int) where >> 3) + ((unsigned int)-del >
(((unsigned int) where >> 3) +
(where & 07))) (where & 07)))
: (-del > where)) { : (-del > where)) {
term__putc('\r'); /* do a CR */ term__putc('\r'); /* do a CR */
@ -655,7 +656,7 @@ term_move_to_char(EditLine *el, int where)
* Overstrike num characters * Overstrike num characters
*/ */
protected void protected void
term_overwrite(EditLine *el, char *cp, int n) term_overwrite(EditLine *el, const char *cp, int n)
{ {
if (n <= 0) if (n <= 0)
return; /* catch bugs */ return; /* catch bugs */
@ -863,12 +864,18 @@ term_clear_to_bottom(EditLine *el)
} }
#endif #endif
protected void
term_get(EditLine *el, const char **term)
{
*term = el->el_term.t_name;
}
/* term_set(): /* term_set():
* Read in the terminal capabilities from the requested terminal * Read in the terminal capabilities from the requested terminal
*/ */
protected int protected int
term_set(EditLine *el, char *term) term_set(EditLine *el, const char *term)
{ {
int i; int i;
char buf[TC_BUFSIZE]; char buf[TC_BUFSIZE];
@ -924,8 +931,11 @@ term_set(EditLine *el, char *term)
/* Get the size */ /* Get the size */
Val(T_co) = tgetnum("co"); Val(T_co) = tgetnum("co");
Val(T_li) = tgetnum("li"); Val(T_li) = tgetnum("li");
for (t = tstr; t->name != NULL; t++) for (t = tstr; t->name != NULL; t++) {
term_alloc(el, t, tgetstr(t->name, &area)); /* XXX: some systems tgetstr needs non const */
term_alloc(el, t, tgetstr(strchr(t->name, *t->name),
&area));
}
} }
if (Val(T_co) < 2) if (Val(T_co) < 2)
@ -944,6 +954,7 @@ term_set(EditLine *el, char *term)
return (-1); return (-1);
(void) sigprocmask(SIG_SETMASK, &oset, NULL); (void) sigprocmask(SIG_SETMASK, &oset, NULL);
term_bind_arrow(el); term_bind_arrow(el);
el->el_term.t_name = term;
return (i <= 0 ? -1 : 0); return (i <= 0 ? -1 : 0);
} }
@ -1105,7 +1116,7 @@ term_reset_arrow(EditLine *el)
* Set an arrow key binding * Set an arrow key binding
*/ */
protected int protected int
term_set_arrow(EditLine *el, char *name, key_value_t *fun, int type) term_set_arrow(EditLine *el, const char *name, key_value_t *fun, int type)
{ {
fkey_t *arrow = el->el_term.t_fkey; fkey_t *arrow = el->el_term.t_fkey;
int i; int i;
@ -1124,7 +1135,7 @@ term_set_arrow(EditLine *el, char *name, key_value_t *fun, int type)
* Clear an arrow key binding * Clear an arrow key binding
*/ */
protected int protected int
term_clear_arrow(EditLine *el, char *name) term_clear_arrow(EditLine *el, const char *name)
{ {
fkey_t *arrow = el->el_term.t_fkey; fkey_t *arrow = el->el_term.t_fkey;
int i; int i;
@ -1142,7 +1153,7 @@ term_clear_arrow(EditLine *el, char *name)
* Print the arrow key bindings * Print the arrow key bindings
*/ */
protected void protected void
term_print_arrow(EditLine *el, char *name) term_print_arrow(EditLine *el, const char *name)
{ {
int i; int i;
fkey_t *arrow = el->el_term.t_fkey; fkey_t *arrow = el->el_term.t_fkey;
@ -1239,7 +1250,8 @@ term__flush(void)
*/ */
protected int protected int
/*ARGSUSED*/ /*ARGSUSED*/
term_telltc(EditLine *el, int argc, char **argv) term_telltc(EditLine *el, int argc __unused,
const char **argv __unused)
{ {
const struct termcapstr *t; const struct termcapstr *t;
char **ts; char **ts;
@ -1274,11 +1286,12 @@ term_telltc(EditLine *el, int argc, char **argv)
*/ */
protected int protected int
/*ARGSUSED*/ /*ARGSUSED*/
term_settc(EditLine *el, int argc, char **argv) term_settc(EditLine *el, int argc __unused,
const char **argv)
{ {
const struct termcapstr *ts; const struct termcapstr *ts;
const struct termcapval *tv; const struct termcapval *tv;
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);
@ -1350,7 +1363,8 @@ term_settc(EditLine *el, int argc, char **argv)
*/ */
protected int protected int
/*ARGSUSED*/ /*ARGSUSED*/
term_echotc(EditLine *el, int argc, char **argv) term_echotc(EditLine *el, int argc __unused,
const char **argv)
{ {
char *cap, *scap, *ep; char *cap, *scap, *ep;
int arg_need, arg_cols, arg_rows; int arg_need, arg_cols, arg_rows;
@ -1409,7 +1423,7 @@ term_echotc(EditLine *el, int argc, char **argv)
} }
(void) fprintf(el->el_outfile, fmtd, 0); (void) fprintf(el->el_outfile, fmtd, 0);
#else #else
(void) fprintf(el->el_outfile, fmtd, el->el_tty.t_speed); (void) fprintf(el->el_outfile, fmtd, (int)el->el_tty.t_speed);
#endif #endif
return (0); return (0);
} else if (strcmp(*argv, "rows") == 0 || strcmp(*argv, "lines") == 0) { } else if (strcmp(*argv, "rows") == 0 || strcmp(*argv, "lines") == 0) {
@ -1428,8 +1442,10 @@ term_echotc(EditLine *el, int argc, char **argv)
scap = el->el_term.t_str[t - tstr]; scap = el->el_term.t_str[t - tstr];
break; break;
} }
if (t->name == NULL) if (t->name == NULL) {
scap = tgetstr(*argv, &area); /* XXX: some systems tgetstr needs non const */
scap = tgetstr(strchr(*argv, **argv), &area);
}
if (!scap || scap[0] == '\0') { if (!scap || scap[0] == '\0') {
if (!silent) if (!silent)
(void) fprintf(el->el_errfile, (void) fprintf(el->el_errfile,

View File

@ -13,11 +13,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,7 +30,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)term.h 8.1 (Berkeley) 6/4/93 * @(#)term.h 8.1 (Berkeley) 6/4/93
* $NetBSD: term.h,v 1.11 2000/11/11 22:18:58 christos Exp $ * $NetBSD: term.h,v 1.16 2005/03/15 00:10:40 christos Exp $
* $FreeBSD$ * $FreeBSD$
*/ */
@ -47,13 +43,14 @@
#include "histedit.h" #include "histedit.h"
typedef struct { /* Symbolic function key bindings */ typedef struct { /* Symbolic function key bindings */
char *name; /* name of the key */ const char *name; /* name of the key */
int key; /* Index in termcap table */ int key; /* Index in termcap table */
key_value_t fun; /* Function bound to it */ key_value_t fun; /* Function bound to it */
int type; /* Type of function */ int type; /* Type of function */
} fkey_t; } fkey_t;
typedef struct { typedef struct {
const char *t_name; /* the terminal name */
coord_t t_size; /* # lines and cols */ coord_t t_size; /* # lines and cols */
int t_flags; int t_flags;
#define TERM_CAN_INSERT 0x001 /* Has insert cap */ #define TERM_CAN_INSERT 0x001 /* Has insert cap */
@ -87,7 +84,7 @@ typedef struct {
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);
protected void term_overwrite(EditLine *, char *, int); protected void term_overwrite(EditLine *, const char *, int);
protected void term_insertwrite(EditLine *, char *, int); protected void term_insertwrite(EditLine *, char *, int);
protected void term_deletechars(EditLine *, int); protected void term_deletechars(EditLine *, int);
protected void term_clear_screen(EditLine *); protected void term_clear_screen(EditLine *);
@ -96,14 +93,15 @@ protected int term_change_size(EditLine *, int, int);
protected int term_get_size(EditLine *, int *, int *); protected int term_get_size(EditLine *, int *, int *);
protected int term_init(EditLine *); protected int term_init(EditLine *);
protected void term_bind_arrow(EditLine *); protected void term_bind_arrow(EditLine *);
protected void term_print_arrow(EditLine *, char *); protected void term_print_arrow(EditLine *, const char *);
protected int term_clear_arrow(EditLine *, char *); protected int term_clear_arrow(EditLine *, const char *);
protected int term_set_arrow(EditLine *, char *, key_value_t *, int); protected int term_set_arrow(EditLine *, const char *, key_value_t *, int);
protected void term_end(EditLine *); protected void term_end(EditLine *);
protected int term_set(EditLine *, char *); protected void term_get(EditLine *, const char **);
protected int term_settc(EditLine *, int, char **); protected int term_set(EditLine *, const char *);
protected int term_telltc(EditLine *, int, char **); protected int term_settc(EditLine *, int, const char **);
protected int term_echotc(EditLine *, int, char **); protected int term_telltc(EditLine *, int, const char **);
protected int term_echotc(EditLine *, int, const char **);
protected int term__putc(int); protected int term__putc(int);
protected void term__flush(void); protected void term__flush(void);
@ -117,6 +115,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)

View File

@ -13,11 +13,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.
* *
@ -33,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $NetBSD: tokenizer.c,v 1.6 2000/09/04 22:06:33 lukem Exp $ * $NetBSD: tokenizer.c,v 1.14 2003/12/05 13:37:48 lukem Exp $
*/ */
#if !defined(lint) && !defined(SCCSID) #if !defined(lint) && !defined(SCCSID)
@ -48,7 +44,7 @@ __FBSDID("$FreeBSD$");
#include "sys.h" #include "sys.h"
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include "tokenizer.h" #include "histedit.h"
typedef enum { typedef enum {
Q_none, Q_single, Q_double, Q_one, Q_doubleone Q_none, Q_single, Q_double, Q_one, Q_doubleone
@ -62,6 +58,7 @@ typedef enum {
#define WINCR 20 #define WINCR 20
#define AINCR 10 #define AINCR 10
#define tok_strdup(a) strdup(a)
#define tok_malloc(a) malloc(a) #define tok_malloc(a) malloc(a)
#define tok_free(a) free(a) #define tok_free(a) free(a)
#define tok_realloc(a, b) realloc(a, b) #define tok_realloc(a, b) realloc(a, b)
@ -107,16 +104,29 @@ tok_init(const char *ifs)
{ {
Tokenizer *tok = (Tokenizer *) tok_malloc(sizeof(Tokenizer)); Tokenizer *tok = (Tokenizer *) tok_malloc(sizeof(Tokenizer));
tok->ifs = strdup(ifs ? ifs : IFS); if (tok == NULL)
return NULL;
tok->ifs = tok_strdup(ifs ? ifs : IFS);
if (tok->ifs == NULL) {
tok_free((ptr_t)tok);
return NULL;
}
tok->argc = 0; tok->argc = 0;
tok->amax = AINCR; tok->amax = AINCR;
tok->argv = (char **) tok_malloc(sizeof(char *) * tok->amax); tok->argv = (char **) tok_malloc(sizeof(char *) * tok->amax);
if (tok->argv == NULL) if (tok->argv == NULL) {
return (NULL); tok_free((ptr_t)tok->ifs);
tok_free((ptr_t)tok);
return NULL;
}
tok->argv[0] = NULL; tok->argv[0] = NULL;
tok->wspace = (char *) tok_malloc(WINCR); tok->wspace = (char *) tok_malloc(WINCR);
if (tok->wspace == NULL) if (tok->wspace == NULL) {
return (NULL); tok_free((ptr_t)tok->argv);
tok_free((ptr_t)tok->ifs);
tok_free((ptr_t)tok);
return NULL;
}
tok->wmax = tok->wspace + WINCR; tok->wmax = tok->wspace + WINCR;
tok->wstart = tok->wspace; tok->wstart = tok->wspace;
tok->wptr = tok->wspace; tok->wptr = tok->wspace;
@ -158,21 +168,39 @@ tok_end(Tokenizer *tok)
/* tok_line(): /* tok_line():
* Bourne shell like tokenizing * Bourne shell (sh(1)) like tokenizing
* Return: * Arguments:
* -1: Internal error * tok current tokenizer state (setup with tok_init())
* 3: Quoted return * line line to parse
* 2: Unmatched double quote * Returns:
* 1: Unmatched single quote * -1 Internal error
* 0: Ok * 3 Quoted return
* 2 Unmatched double quote
* 1 Unmatched single quote
* 0 Ok
* Modifies (if return value is 0):
* argc number of arguments
* argv argument array
* cursorc if !NULL, argv element containing cursor
* cursorv if !NULL, offset in argv[cursorc] of cursor
*/ */
public int public int
tok_line(Tokenizer *tok, const char *line, int *argc, char ***argv) tok_line(Tokenizer *tok, const LineInfo *line,
int *argc, const char ***argv, int *cursorc, int *cursoro)
{ {
const char *ptr; const char *ptr;
int cc, co;
for (;;) { cc = co = -1;
switch (*(ptr = line++)) { ptr = line->buffer;
for (ptr = line->buffer; ;ptr++) {
if (ptr >= line->lastchar)
ptr = "";
if (ptr == line->cursor) {
cc = tok->argc;
co = tok->wptr - tok->wstart;
}
switch (*ptr) {
case '\'': case '\'':
tok->flags |= TOK_KEEP; tok->flags |= TOK_KEEP;
tok->flags &= ~TOK_EAT; tok->flags &= ~TOK_EAT;
@ -271,10 +299,7 @@ tok_line(Tokenizer *tok, const char *line, int *argc, char ***argv)
tok->flags &= ~TOK_EAT; tok->flags &= ~TOK_EAT;
switch (tok->quote) { switch (tok->quote) {
case Q_none: case Q_none:
tok_finish(tok); goto tok_line_outok;
*argv = tok->argv;
*argc = tok->argc;
return (0);
case Q_single: case Q_single:
case Q_double: case Q_double:
@ -304,10 +329,7 @@ tok_line(Tokenizer *tok, const char *line, int *argc, char ***argv)
tok->flags &= ~TOK_EAT; tok->flags &= ~TOK_EAT;
return (3); return (3);
} }
tok_finish(tok); goto tok_line_outok;
*argv = tok->argv;
*argc = tok->argc;
return (0);
case Q_single: case Q_single:
return (1); return (1);
@ -367,20 +389,20 @@ tok_line(Tokenizer *tok, const char *line, int *argc, char ***argv)
if (tok->wptr >= tok->wmax - 4) { if (tok->wptr >= tok->wmax - 4) {
size_t size = tok->wmax - tok->wspace + WINCR; size_t size = tok->wmax - tok->wspace + WINCR;
char *s = (char *) tok_realloc(tok->wspace, size); char *s = (char *) tok_realloc(tok->wspace, size);
/* SUPPRESS 22 */
int offs = s - tok->wspace;
if (s == NULL) if (s == NULL)
return (-1); return (-1);
if (offs != 0) { if (s != tok->wspace) {
int i; int i;
for (i = 0; i < tok->argc; i++) for (i = 0; i < tok->argc; i++) {
tok->argv[i] = tok->argv[i] + offs; tok->argv[i] =
tok->wptr = tok->wptr + offs; (tok->argv[i] - tok->wspace) + s;
tok->wstart = tok->wstart + offs; }
tok->wmax = s + size; tok->wptr = (tok->wptr - tok->wspace) + s;
tok->wstart = (tok->wstart - tok->wspace) + s;
tok->wspace = s; tok->wspace = s;
} }
tok->wmax = s + size;
} }
if (tok->argc >= tok->amax - 4) { if (tok->argc >= tok->amax - 4) {
char **p; char **p;
@ -392,4 +414,32 @@ tok_line(Tokenizer *tok, const char *line, int *argc, char ***argv)
tok->argv = p; tok->argv = p;
} }
} }
tok_line_outok:
if (cc == -1 && co == -1) {
cc = tok->argc;
co = tok->wptr - tok->wstart;
}
if (cursorc != NULL)
*cursorc = cc;
if (cursoro != NULL)
*cursoro = co;
tok_finish(tok);
*argv = (const char **)tok->argv;
*argc = tok->argc;
return (0);
}
/* tok_str():
* Simpler version of tok_line, taking a NUL terminated line
* and splitting into words, ignoring cursor state.
*/
public int
tok_str(Tokenizer *tok, const char *line, int *argc, const char ***argv)
{
LineInfo li;
memset(&li, 0, sizeof(li));
li.buffer = line;
li.cursor = li.lastchar = strchr(line, '\0');
return (tok_line(tok, &li, argc, argv, NULL, NULL));
} }

View File

@ -1,54 +0,0 @@
/*-
* Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Christos Zoulas of Cornell University.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)tokenizer.h 8.1 (Berkeley) 6/4/93
* $NetBSD: tokenizer.h,v 1.3 1999/07/02 15:21:27 simonb Exp $
* $FreeBSD$
*/
/*
* tokenizer.h: Header file for tokenizer routines
*/
#ifndef _h_tokenizer
#define _h_tokenizer
typedef struct tokenizer Tokenizer;
Tokenizer *tok_init(const char *);
void tok_reset(Tokenizer *);
void tok_end(Tokenizer *);
int tok_line(Tokenizer *, const char *, int *, char ***);
#endif /* _h_tokenizer */

View File

@ -13,11 +13,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.
* *
@ -33,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* $NetBSD: tty.c,v 1.14 2001/01/09 17:31:04 jdolecek Exp $ * $NetBSD: tty.c,v 1.23 2005/06/01 11:37:52 lukem Exp $
*/ */
#if !defined(lint) && !defined(SCCSID) #if !defined(lint) && !defined(SCCSID)
@ -45,20 +41,21 @@ __FBSDID("$FreeBSD$");
/* /*
* tty.c: tty interface stuff * tty.c: tty interface stuff
*/ */
#include <assert.h>
#include "sys.h" #include "sys.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;
typedef struct ttymap_t { typedef struct ttymap_t {
int nch, och; /* Internal and termio rep of chars */ int nch, och; /* Internal and termio rep of chars */
el_action_t bind[3]; /* emacs, vi, and vi-cmd */ el_action_t bind[3]; /* emacs, vi, and vi-cmd */
} ttymap_t; } ttymap_t;
private const ttyperm_t ttyperm = { private const ttyperm_t ttyperm = {
@ -122,11 +119,11 @@ private const ttychar_t ttychar = {
private const ttymap_t tty_map[] = { private const ttymap_t tty_map[] = {
#ifdef VERASE #ifdef VERASE
{C_ERASE, VERASE, {C_ERASE, VERASE,
{ED_DELETE_PREV_CHAR, VI_DELETE_PREV_CHAR, ED_PREV_CHAR}}, {EM_DELETE_PREV_CHAR, VI_DELETE_PREV_CHAR, ED_PREV_CHAR}},
#endif /* VERASE */ #endif /* VERASE */
#ifdef VERASE2 #ifdef VERASE2
{C_ERASE2, VERASE2, {C_ERASE2, VERASE2,
{ED_DELETE_PREV_CHAR, VI_DELETE_PREV_CHAR, ED_PREV_CHAR}}, {EM_DELETE_PREV_CHAR, VI_DELETE_PREV_CHAR, ED_PREV_CHAR}},
#endif /* VERASE2 */ #endif /* VERASE2 */
#ifdef VKILL #ifdef VKILL
{C_KILL, VKILL, {C_KILL, VKILL,
@ -453,6 +450,7 @@ private const ttymodes_t ttymodes[] = {
#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__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 *);
private speed_t tty__getspeed(struct termios *); private speed_t tty__getspeed(struct termios *);
@ -544,7 +542,7 @@ tty_init(EditLine *el)
*/ */
protected void protected void
/*ARGSUSED*/ /*ARGSUSED*/
tty_end(EditLine *el) tty_end(EditLine *el __unused)
{ {
/* XXX: Maybe reset to an initial state? */ /* XXX: Maybe reset to an initial state? */
@ -564,6 +562,113 @@ tty__getspeed(struct termios *td)
return (spd); return (spd);
} }
/* tty__getspeed():
* Return the index of the asked char in the c_cc array
*/
private int
tty__getcharindex(int i)
{
switch (i) {
#ifdef VINTR
case C_INTR:
return VINTR;
#endif /* VINTR */
#ifdef VQUIT
case C_QUIT:
return VQUIT;
#endif /* VQUIT */
#ifdef VERASE
case C_ERASE:
return VERASE;
#endif /* VERASE */
#ifdef VKILL
case C_KILL:
return VKILL;
#endif /* VKILL */
#ifdef VEOF
case C_EOF:
return VEOF;
#endif /* VEOF */
#ifdef VEOL
case C_EOL:
return VEOL;
#endif /* VEOL */
#ifdef VEOL2
case C_EOL2:
return VEOL2;
#endif /* VEOL2 */
#ifdef VSWTCH
case C_SWTCH:
return VSWTCH;
#endif /* VSWTCH */
#ifdef VDSWTCH
case C_DSWTCH:
return VDSWTCH;
#endif /* VDSWTCH */
#ifdef VERASE2
case C_ERASE2:
return VERASE2;
#endif /* VERASE2 */
#ifdef VSTART
case C_START:
return VSTART;
#endif /* VSTART */
#ifdef VSTOP
case C_STOP:
return VSTOP;
#endif /* VSTOP */
#ifdef VWERASE
case C_WERASE:
return VWERASE;
#endif /* VWERASE */
#ifdef VSUSP
case C_SUSP:
return VSUSP;
#endif /* VSUSP */
#ifdef VDSUSP
case C_DSUSP:
return VDSUSP;
#endif /* VDSUSP */
#ifdef VREPRINT
case C_REPRINT:
return VREPRINT;
#endif /* VREPRINT */
#ifdef VDISCARD
case C_DISCARD:
return VDISCARD;
#endif /* VDISCARD */
#ifdef VLNEXT
case C_LNEXT:
return VLNEXT;
#endif /* VLNEXT */
#ifdef VSTATUS
case C_STATUS:
return VSTATUS;
#endif /* VSTATUS */
#ifdef VPAGE
case C_PAGE:
return VPAGE;
#endif /* VPAGE */
#ifdef VPGOFF
case C_PGOFF:
return VPGOFF;
#endif /* VPGOFF */
#ifdef VKILL2
case C_KILL2:
return VKILL2;
#endif /* KILL2 */
#ifdef VMIN
case C_MIN:
return VMIN;
#endif /* VMIN */
#ifdef VTIME
case C_TIME:
return VTIME;
#endif /* VTIME */
default:
return -1;
}
}
/* tty__getchar(): /* tty__getchar():
* Get the tty characters * Get the tty characters
@ -990,13 +1095,14 @@ tty_noquotemode(EditLine *el)
*/ */
protected int protected int
/*ARGSUSED*/ /*ARGSUSED*/
tty_stty(EditLine *el, int argc, char **argv) tty_stty(EditLine *el, int argc __unused, const char **argv)
{ {
const ttymodes_t *m; const ttymodes_t *m;
char x, *d; char x;
int aflag = 0; int aflag = 0;
char *s; const char *s, *d;
char *name; const char *name;
struct termios *tios = &el->el_tty.t_ex;
int z = EX_IO; int z = EX_IO;
if (argv == NULL) if (argv == NULL)
@ -1011,14 +1117,17 @@ tty_stty(EditLine *el, int argc, char **argv)
break; break;
case 'd': case 'd':
argv++; argv++;
tios = &el->el_tty.t_ed;
z = ED_IO; z = ED_IO;
break; break;
case 'x': case 'x':
argv++; argv++;
tios = &el->el_tty.t_ex;
z = EX_IO; z = EX_IO;
break; break;
case 'q': case 'q':
argv++; argv++;
tios = &el->el_tty.t_ts;
z = QU_IO; z = QU_IO;
break; break;
default: default:
@ -1068,6 +1177,7 @@ tty_stty(EditLine *el, int argc, char **argv)
return (0); return (0);
} }
while (argv && (s = *argv++)) { while (argv && (s = *argv++)) {
const char *p;
switch (*s) { switch (*s) {
case '+': case '+':
case '-': case '-':
@ -1078,8 +1188,11 @@ tty_stty(EditLine *el, int argc, char **argv)
break; break;
} }
d = s; d = s;
p = strchr(s, '=');
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))
break; break;
if (!m->m_name) { if (!m->m_name) {
@ -1087,6 +1200,16 @@ tty_stty(EditLine *el, int argc, char **argv)
"%s: Invalid argument `%s'.\n", name, d); "%s: Invalid argument `%s'.\n", name, d);
return (-1); return (-1);
} }
if (p) {
int c = ffs((int)m->m_value);
int v = *++p ? parse__escape((const char **) &p) :
el->el_tty.t_vdisable;
assert(c-- != 0);
c = tty__getcharindex(c);
assert(c != -1);
tios->c_cc[c] = v;
continue;
}
switch (x) { switch (x) {
case '+': case '+':
el->el_tty.t_t[z][m->m_type].t_setmask |= m->m_value; el->el_tty.t_t[z][m->m_type].t_setmask |= m->m_value;

View File

@ -13,11 +13,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,7 +30,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* @(#)tty.h 8.1 (Berkeley) 6/4/93 * @(#)tty.h 8.1 (Berkeley) 6/4/93
* $NetBSD: tty.h,v 1.7 1999/09/26 14:37:47 lukem Exp $ * $NetBSD: tty.h,v 1.11 2005/06/01 11:37:52 lukem Exp $
* $FreeBSD$ * $FreeBSD$
*/ */
@ -453,16 +449,16 @@
#define MD_NN 5 #define MD_NN 5
typedef struct { typedef struct {
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];
protected int tty_init(EditLine *); protected int tty_init(EditLine *);
protected void tty_end(EditLine *); protected void tty_end(EditLine *);
protected int tty_stty(EditLine *, int, char**); protected int tty_stty(EditLine *, int, const char **);
protected int tty_rawmode(EditLine *); protected int tty_rawmode(EditLine *);
protected int tty_cookedmode(EditLine *); protected int tty_cookedmode(EditLine *);
protected int tty_quotemode(EditLine *); protected int tty_quotemode(EditLine *);

File diff suppressed because it is too large Load Diff