aboutsummaryrefslogtreecommitdiff
path: root/lib/libedit/tty.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libedit/tty.c')
-rw-r--r--lib/libedit/tty.c155
1 files changed, 139 insertions, 16 deletions
diff --git a/lib/libedit/tty.c b/lib/libedit/tty.c
index b4c9f4f4e10e..e2b99327ea96 100644
--- a/lib/libedit/tty.c
+++ b/lib/libedit/tty.c
@@ -13,11 +13,7 @@
* 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
+ * 3. 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.
*
@@ -33,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* 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)
@@ -45,20 +41,21 @@ __FBSDID("$FreeBSD$");
/*
* tty.c: tty interface stuff
*/
+#include <assert.h>
#include "sys.h"
#include "tty.h"
#include "el.h"
typedef struct ttymodes_t {
const char *m_name;
- u_int m_value;
+ unsigned int m_value;
int m_type;
} ttymodes_t;
typedef struct ttymap_t {
int nch, och; /* Internal and termio rep of chars */
el_action_t bind[3]; /* emacs, vi, and vi-cmd */
-} ttymap_t;
+} ttymap_t;
private const ttyperm_t ttyperm = {
@@ -122,11 +119,11 @@ private const ttychar_t ttychar = {
private const ttymap_t tty_map[] = {
#ifdef 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 */
#ifdef 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 */
#ifdef VKILL
{C_KILL, VKILL,
@@ -453,6 +450,7 @@ private const ttymodes_t ttymodes[] = {
#define tty__geteightbit(td) (((td)->c_cflag & CSIZE) == CS8)
#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__setchar(struct termios *, unsigned char *);
private speed_t tty__getspeed(struct termios *);
@@ -544,7 +542,7 @@ tty_init(EditLine *el)
*/
protected void
/*ARGSUSED*/
-tty_end(EditLine *el)
+tty_end(EditLine *el __unused)
{
/* XXX: Maybe reset to an initial state? */
@@ -564,6 +562,113 @@ tty__getspeed(struct termios *td)
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():
* Get the tty characters
@@ -990,13 +1095,14 @@ tty_noquotemode(EditLine *el)
*/
protected int
/*ARGSUSED*/
-tty_stty(EditLine *el, int argc, char **argv)
+tty_stty(EditLine *el, int argc __unused, const char **argv)
{
const ttymodes_t *m;
- char x, *d;
+ char x;
int aflag = 0;
- char *s;
- char *name;
+ const char *s, *d;
+ const char *name;
+ struct termios *tios = &el->el_tty.t_ex;
int z = EX_IO;
if (argv == NULL)
@@ -1011,14 +1117,17 @@ tty_stty(EditLine *el, int argc, char **argv)
break;
case 'd':
argv++;
+ tios = &el->el_tty.t_ed;
z = ED_IO;
break;
case 'x':
argv++;
+ tios = &el->el_tty.t_ex;
z = EX_IO;
break;
case 'q':
argv++;
+ tios = &el->el_tty.t_ts;
z = QU_IO;
break;
default:
@@ -1068,6 +1177,7 @@ tty_stty(EditLine *el, int argc, char **argv)
return (0);
}
while (argv && (s = *argv++)) {
+ const char *p;
switch (*s) {
case '+':
case '-':
@@ -1078,8 +1188,11 @@ tty_stty(EditLine *el, int argc, char **argv)
break;
}
d = s;
+ p = strchr(s, '=');
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;
if (!m->m_name) {
@@ -1087,6 +1200,16 @@ tty_stty(EditLine *el, int argc, char **argv)
"%s: Invalid argument `%s'.\n", name, d);
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) {
case '+':
el->el_tty.t_t[z][m->m_type].t_setmask |= m->m_value;