summaryrefslogtreecommitdiff
path: root/lib/libedit
diff options
context:
space:
mode:
authorchristos <christos@NetBSD.org>2000-11-11 22:18:57 +0000
committerchristos <christos@NetBSD.org>2000-11-11 22:18:57 +0000
commitff59a2faddea84bf67d6d5bfefd122463e352005 (patch)
tree004fdf1e5869f97a2c8c939d4ff2e7df883730ed /lib/libedit
parent890463ed5e992b4d15ff866200191fad79a02714 (diff)
- add support for home and end keys.
- improve debugging support
Diffstat (limited to 'lib/libedit')
-rw-r--r--lib/libedit/chared.c6
-rw-r--r--lib/libedit/el.c8
-rw-r--r--lib/libedit/el.h8
-rw-r--r--lib/libedit/key.c49
-rw-r--r--lib/libedit/map.c14
-rw-r--r--lib/libedit/read.c6
-rw-r--r--lib/libedit/term.c33
-rw-r--r--lib/libedit/term.h6
8 files changed, 83 insertions, 47 deletions
diff --git a/lib/libedit/chared.c b/lib/libedit/chared.c
index 93db66557e6..a4d0768000d 100644
--- a/lib/libedit/chared.c
+++ b/lib/libedit/chared.c
@@ -1,4 +1,4 @@
-/* $NetBSD: chared.c,v 1.9 2000/09/04 22:06:28 lukem Exp $ */
+/* $NetBSD: chared.c,v 1.10 2000/11/11 22:18:57 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -41,7 +41,7 @@
#if 0
static char sccsid[] = "@(#)chared.c 8.1 (Berkeley) 6/4/93";
#else
-__RCSID("$NetBSD: chared.c,v 1.9 2000/09/04 22:06:28 lukem Exp $");
+__RCSID("$NetBSD: chared.c,v 1.10 2000/11/11 22:18:57 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -341,7 +341,7 @@ cv_delfini(EditLine *el)
case NOP:
case INSERT:
default:
- abort();
+ EL_ABORT((el->el_errfile, "Bad oaction %d\n", oaction));
break;
}
diff --git a/lib/libedit/el.c b/lib/libedit/el.c
index c66894e1b62..a7487fc07dd 100644
--- a/lib/libedit/el.c
+++ b/lib/libedit/el.c
@@ -1,4 +1,4 @@
-/* $NetBSD: el.c,v 1.19 2000/09/04 22:06:29 lukem Exp $ */
+/* $NetBSD: el.c,v 1.20 2000/11/11 22:18:57 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -41,7 +41,7 @@
#if 0
static char sccsid[] = "@(#)el.c 8.2 (Berkeley) 1/3/94";
#else
-__RCSID("$NetBSD: el.c,v 1.19 2000/09/04 22:06:29 lukem Exp $");
+__RCSID("$NetBSD: el.c,v 1.20 2000/11/11 22:18:57 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -223,7 +223,7 @@ el_set(EditLine *el, int op, ...)
default:
rv = -1;
- abort();
+ EL_ABORT((el->el_errfile, "Bad op %d\n", op));
break;
}
break;
@@ -341,7 +341,7 @@ el_get(EditLine *el, int op, void *ret)
default:
rv = -1;
- abort();
+ EL_ABORT((el->errfile, "Bad op %d\n", op));
break;
}
break;
diff --git a/lib/libedit/el.h b/lib/libedit/el.h
index 8e586e2dbb0..8c81ee8243b 100644
--- a/lib/libedit/el.h
+++ b/lib/libedit/el.h
@@ -1,4 +1,4 @@
-/* $NetBSD: el.h,v 1.6 2000/09/04 22:06:29 lukem Exp $ */
+/* $NetBSD: el.h,v 1.7 2000/11/11 22:18:57 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -133,4 +133,10 @@ struct editline {
protected int el_editmode(EditLine *, int, char **);
+#ifdef DEBUG
+#define EL_ABORT(a) (void) (fprintf(el->el_errfile, "%s, %d: ", \
+ __FILE__, __LINE__), fprintf a, abort())
+#else
+#define EL_ABORT(a) abort()
+#endif
#endif /* _h_el */
diff --git a/lib/libedit/key.c b/lib/libedit/key.c
index d2c487cfaf8..4f5a299639c 100644
--- a/lib/libedit/key.c
+++ b/lib/libedit/key.c
@@ -1,4 +1,4 @@
-/* $NetBSD: key.c,v 1.8 2000/10/04 16:21:39 sommerfeld Exp $ */
+/* $NetBSD: key.c,v 1.9 2000/11/11 22:18:57 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -41,7 +41,7 @@
#if 0
static char sccsid[] = "@(#)key.c 8.1 (Berkeley) 6/4/93";
#else
-__RCSID("$NetBSD: key.c,v 1.8 2000/10/04 16:21:39 sommerfeld Exp $");
+__RCSID("$NetBSD: key.c,v 1.9 2000/11/11 22:18:57 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -86,11 +86,12 @@ struct key_node_t {
};
private int node_trav(EditLine *, key_node_t *, char *,
- key_value_t *);
-private int node__try(key_node_t *, char *, key_value_t *, int);
+ key_value_t *);
+private int node__try(EditLine *, key_node_t *, char *,
+ key_value_t *, int);
private key_node_t *node__get(int);
-private void node__put(key_node_t *);
-private int node__delete(key_node_t **, char *);
+private void node__put(EditLine *, key_node_t *);
+private int node__delete(EditLine *, key_node_t **, char *);
private int node_lookup(EditLine *, char *, key_node_t *, int);
private int node_enum(EditLine *, key_node_t *, int);
private int key__decode_char(char *, int, int);
@@ -159,7 +160,7 @@ protected void
key_reset(EditLine *el)
{
- node__put(el->el_key.map);
+ node__put(el, el->el_key.map);
el->el_key.map = NULL;
return;
}
@@ -207,7 +208,7 @@ key_add(EditLine *el, char *key, key_value_t *val, int ntype)
/* it is properly initialized */
/* Now recurse through el->el_key.map */
- (void) node__try(el->el_key.map, key, val, ntype);
+ (void) node__try(el, el->el_key.map, key, val, ntype);
return;
}
@@ -244,7 +245,7 @@ key_delete(EditLine *el, char *key)
if (el->el_key.map == NULL)
return (0);
- (void) node__delete(&el->el_key.map, key);
+ (void) node__delete(el, &el->el_key.map, key);
return (0);
}
@@ -312,7 +313,7 @@ node_trav(EditLine *el, key_node_t *ptr, char *ch, key_value_t *val)
* Find a node that matches *str or allocate a new one
*/
private int
-node__try(key_node_t *ptr, char *str, key_value_t *val, int ntype)
+node__try(EditLine *el, key_node_t *ptr, char *str, key_value_t *val, int ntype)
{
if (ptr->ch != *str) {
@@ -328,7 +329,7 @@ node__try(key_node_t *ptr, char *str, key_value_t *val, int ntype)
if (*++str == '\0') {
/* we're there */
if (ptr->next != NULL) {
- node__put(ptr->next);
+ node__put(el, ptr->next);
/* lose longer keys with this prefix */
ptr->next = NULL;
}
@@ -342,7 +343,8 @@ node__try(key_node_t *ptr, char *str, key_value_t *val, int ntype)
el_free((ptr_t) ptr->val.str);
break;
default:
- abort();
+ EL_ABORT((el->el_errfile, "Bad XK_ type %d\n",
+ ptr->type));
break;
}
@@ -355,14 +357,14 @@ node__try(key_node_t *ptr, char *str, key_value_t *val, int ntype)
ptr->val.str = strdup(val->str);
break;
default:
- abort();
+ EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype));
break;
}
} else {
/* still more chars to go */
if (ptr->next == NULL)
ptr->next = node__get(*str); /* setup new node */
- (void) node__try(ptr->next, str, val, ntype);
+ (void) node__try(el, ptr->next, str, val, ntype);
}
return (0);
}
@@ -372,7 +374,7 @@ node__try(key_node_t *ptr, char *str, key_value_t *val, int ntype)
* Delete node that matches str
*/
private int
-node__delete(key_node_t **inptr, char *str)
+node__delete(EditLine *el, key_node_t **inptr, char *str)
{
key_node_t *ptr;
key_node_t *prev_ptr = NULL;
@@ -397,9 +399,10 @@ node__delete(key_node_t **inptr, char *str)
else
prev_ptr->sibling = ptr->sibling;
ptr->sibling = NULL;
- node__put(ptr);
+ node__put(el, ptr);
return (1);
- } else if (ptr->next != NULL && node__delete(&ptr->next, str) == 1) {
+ } else if (ptr->next != NULL &&
+ node__delete(el, &ptr->next, str) == 1) {
if (ptr->next != NULL)
return (0);
if (prev_ptr == NULL)
@@ -407,7 +410,7 @@ node__delete(key_node_t **inptr, char *str)
else
prev_ptr->sibling = ptr->sibling;
ptr->sibling = NULL;
- node__put(ptr);
+ node__put(el, ptr);
return (1);
} else {
return (0);
@@ -419,16 +422,16 @@ node__delete(key_node_t **inptr, char *str)
* Puts a tree of nodes onto free list using free(3).
*/
private void
-node__put(key_node_t *ptr)
+node__put(EditLine *el, key_node_t *ptr)
{
if (ptr == NULL)
return;
if (ptr->next != NULL) {
- node__put(ptr->next);
+ node__put(el, ptr->next);
ptr->next = NULL;
}
- node__put(ptr->sibling);
+ node__put(el, ptr->sibling);
switch (ptr->type) {
case XK_CMD:
@@ -440,7 +443,7 @@ node__put(key_node_t *ptr)
el_free((ptr_t) ptr->val.str);
break;
default:
- abort();
+ EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ptr->type));
break;
}
el_free((ptr_t) ptr);
@@ -590,7 +593,7 @@ key_kprint(EditLine *el, char *key, key_value_t *val, int ntype)
break;
default:
- abort();
+ EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype));
break;
}
else
diff --git a/lib/libedit/map.c b/lib/libedit/map.c
index dcb388bad9e..ff0bf1f04cb 100644
--- a/lib/libedit/map.c
+++ b/lib/libedit/map.c
@@ -1,4 +1,4 @@
-/* $NetBSD: map.c,v 1.11 2000/09/04 22:06:30 lukem Exp $ */
+/* $NetBSD: map.c,v 1.12 2000/11/11 22:18:57 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -41,7 +41,7 @@
#if 0
static char sccsid[] = "@(#)map.c 8.1 (Berkeley) 6/4/93";
#else
-__RCSID("$NetBSD: map.c,v 1.11 2000/09/04 22:06:30 lukem Exp $");
+__RCSID("$NetBSD: map.c,v 1.12 2000/11/11 22:18:57 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -903,11 +903,11 @@ map_init(EditLine *el)
*/
#ifdef MAP_DEBUG
if (sizeof(el_map_emacs) != N_KEYS * sizeof(el_action_t))
- abort();
+ EL_ABORT((el->errfile, "Emacs map incorrect\n"));
if (sizeof(el_map_vi_command) != N_KEYS * sizeof(el_action_t))
- abort();
+ EL_ABORT((el->errfile, "Vi command map incorrect\n"));
if (sizeof(el_map_vi_insert) != N_KEYS * sizeof(el_action_t))
- abort();
+ EL_ABORT((el->errfile, "Vi insert map incorrect\n"));
#endif
el->el_map.alt = (el_action_t *)el_malloc(sizeof(el_action_t) * N_KEYS);
@@ -1189,7 +1189,7 @@ map_print_some_keys(EditLine *el, el_action_t *map, int first, int last)
first, el->el_map.alt[first]);
}
#endif
- abort();
+ EL_ABORT((el->el_errfile, "Error printing keys\n"));
}
@@ -1371,7 +1371,7 @@ map_bind(EditLine *el, int argc, char **argv)
break;
default:
- abort();
+ EL_ABORT((el->el_errfile, "Bad XK_ type\n", ntype));
break;
}
return (0);
diff --git a/lib/libedit/read.c b/lib/libedit/read.c
index fde9646c92b..b7a98d7d8d0 100644
--- a/lib/libedit/read.c
+++ b/lib/libedit/read.c
@@ -1,4 +1,4 @@
-/* $NetBSD: read.c,v 1.17 2000/09/04 22:06:31 lukem Exp $ */
+/* $NetBSD: read.c,v 1.18 2000/11/11 22:18:58 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -41,7 +41,7 @@
#if 0
static char sccsid[] = "@(#)read.c 8.1 (Berkeley) 6/4/93";
#else
-__RCSID("$NetBSD: read.c,v 1.17 2000/09/04 22:06:31 lukem Exp $");
+__RCSID("$NetBSD: read.c,v 1.18 2000/11/11 22:18:58 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -238,7 +238,7 @@ read_getcmd(EditLine *el, el_action_t *cmdnum, char *ch)
break;
#endif
default:
- abort();
+ EL_ABORT((el->el_errfile, "Bad XK_ type \n"));
break;
}
}
diff --git a/lib/libedit/term.c b/lib/libedit/term.c
index 33d81d85877..d69ef3f973d 100644
--- a/lib/libedit/term.c
+++ b/lib/libedit/term.c
@@ -1,4 +1,4 @@
-/* $NetBSD: term.c,v 1.24 2000/10/04 16:21:39 sommerfeld Exp $ */
+/* $NetBSD: term.c,v 1.25 2000/11/11 22:18:58 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -41,7 +41,7 @@
#if 0
static char sccsid[] = "@(#)term.c 8.2 (Berkeley) 4/30/95";
#else
-__RCSID("$NetBSD: term.c,v 1.24 2000/10/04 16:21:39 sommerfeld Exp $");
+__RCSID("$NetBSD: term.c,v 1.25 2000/11/11 22:18:58 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -224,7 +224,11 @@ private struct termcapstr {
{ "RI", "cursor right multiple" },
#define T_UP 35
{ "UP", "cursor up multiple" },
-#define T_str 36
+#define T_kh 36
+ { "kh", "send cursor home" },
+#define T_at7 37
+ { "@7", "send cursor end" },
+#define T_str 38
{ NULL, NULL }
};
@@ -1008,6 +1012,15 @@ term_init_arrow(EditLine *el)
arrow[A_K_RT].fun.cmd = ED_NEXT_CHAR;
arrow[A_K_RT].type = XK_CMD;
+ arrow[A_K_HO].name = "home";
+ arrow[A_K_HO].key = T_kh;
+ arrow[A_K_HO].fun.cmd = ED_MOVE_TO_BEG;
+ arrow[A_K_HO].type = XK_CMD;
+
+ arrow[A_K_EN].name = "end";
+ arrow[A_K_EN].key = T_at7;
+ arrow[A_K_EN].fun.cmd = ED_MOVE_TO_END;
+ arrow[A_K_EN].type = XK_CMD;
}
@@ -1022,29 +1035,41 @@ term_reset_arrow(EditLine *el)
static char strB[] = {033, '[', 'B', '\0'};
static char strC[] = {033, '[', 'C', '\0'};
static char strD[] = {033, '[', 'D', '\0'};
+ static char strH[] = {033, '[', 'H', '\0'};
+ static char strF[] = {033, '[', 'F', '\0'};
static char stOA[] = {033, 'O', 'A', '\0'};
static char stOB[] = {033, 'O', 'B', '\0'};
static char stOC[] = {033, 'O', 'C', '\0'};
static char stOD[] = {033, 'O', 'D', '\0'};
+ static char stOH[] = {033, 'O', 'H', '\0'};
+ static char stOF[] = {033, 'O', 'F', '\0'};
key_add(el, strA, &arrow[A_K_UP].fun, arrow[A_K_UP].type);
key_add(el, strB, &arrow[A_K_DN].fun, arrow[A_K_DN].type);
key_add(el, strC, &arrow[A_K_RT].fun, arrow[A_K_RT].type);
key_add(el, strD, &arrow[A_K_LT].fun, arrow[A_K_LT].type);
+ key_add(el, strH, &arrow[A_K_HO].fun, arrow[A_K_HO].type);
+ key_add(el, strF, &arrow[A_K_EN].fun, arrow[A_K_EN].type);
key_add(el, stOA, &arrow[A_K_UP].fun, arrow[A_K_UP].type);
key_add(el, stOB, &arrow[A_K_DN].fun, arrow[A_K_DN].type);
key_add(el, stOC, &arrow[A_K_RT].fun, arrow[A_K_RT].type);
key_add(el, stOD, &arrow[A_K_LT].fun, arrow[A_K_LT].type);
+ key_add(el, stOH, &arrow[A_K_HO].fun, arrow[A_K_HO].type);
+ key_add(el, stOF, &arrow[A_K_EN].fun, arrow[A_K_EN].type);
if (el->el_map.type == MAP_VI) {
key_add(el, &strA[1], &arrow[A_K_UP].fun, arrow[A_K_UP].type);
key_add(el, &strB[1], &arrow[A_K_DN].fun, arrow[A_K_DN].type);
key_add(el, &strC[1], &arrow[A_K_RT].fun, arrow[A_K_RT].type);
key_add(el, &strD[1], &arrow[A_K_LT].fun, arrow[A_K_LT].type);
+ key_add(el, &strH[1], &arrow[A_K_HO].fun, arrow[A_K_HO].type);
+ key_add(el, &strF[1], &arrow[A_K_EN].fun, arrow[A_K_EN].type);
key_add(el, &stOA[1], &arrow[A_K_UP].fun, arrow[A_K_UP].type);
key_add(el, &stOB[1], &arrow[A_K_DN].fun, arrow[A_K_DN].type);
key_add(el, &stOC[1], &arrow[A_K_RT].fun, arrow[A_K_RT].type);
key_add(el, &stOD[1], &arrow[A_K_LT].fun, arrow[A_K_LT].type);
+ key_add(el, &stOH[1], &arrow[A_K_HO].fun, arrow[A_K_HO].type);
+ key_add(el, &stOF[1], &arrow[A_K_EN].fun, arrow[A_K_EN].type);
}
}
@@ -1123,7 +1148,7 @@ term_bind_arrow(EditLine *el)
term_reset_arrow(el);
- for (i = 0; i < 4; i++) {
+ for (i = 0; i < A_K_NKEYS; i++) {
p = el->el_term.t_str[arrow[i].key];
if (p && *p) {
j = (unsigned char) *p;
diff --git a/lib/libedit/term.h b/lib/libedit/term.h
index 9a9378eaa66..21296f1d1dd 100644
--- a/lib/libedit/term.h
+++ b/lib/libedit/term.h
@@ -1,4 +1,4 @@
-/* $NetBSD: term.h,v 1.10 2000/09/04 22:06:33 lukem Exp $ */
+/* $NetBSD: term.h,v 1.11 2000/11/11 22:18:58 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -80,7 +80,9 @@ typedef struct {
#define A_K_UP 1
#define A_K_LT 2
#define A_K_RT 3
-#define A_K_NKEYS 4
+#define A_K_HO 4
+#define A_K_EN 5
+#define A_K_NKEYS 6
protected void term_move_to_line(EditLine *, int);
protected void term_move_to_char(EditLine *, int);