simplify. and, a few byte compares are cheaper than a structure
copy and a structure compare gain: 103t 4d 1i loss: had to move some code even though no diff (cvs issue)
This commit is contained in:
156
edit.c
156
edit.c
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
#include "sh.h"
|
#include "sh.h"
|
||||||
|
|
||||||
__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.66 2006/11/10 03:23:48 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.67 2006/11/10 04:31:04 tg Exp $");
|
||||||
|
|
||||||
/* tty driver characters we are interested in */
|
/* tty driver characters we are interested in */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -39,7 +39,6 @@ void x_free_words(int, char **);
|
|||||||
int x_escape(const char *, size_t, int (*) (const char *, size_t));
|
int x_escape(const char *, size_t, int (*) (const char *, size_t));
|
||||||
int x_emacs(char *, size_t);
|
int x_emacs(char *, size_t);
|
||||||
void x_init_emacs(void);
|
void x_init_emacs(void);
|
||||||
void x_emacs_keys(X_chars *);
|
|
||||||
int x_vi(char *, size_t);
|
int x_vi(char *, size_t);
|
||||||
|
|
||||||
#if defined(TIOCGWINSZ) && defined(SIGWINCH)
|
#if defined(TIOCGWINSZ) && defined(SIGWINCH)
|
||||||
@ -173,69 +172,6 @@ x_puts(const u_char *s)
|
|||||||
shf_putc(*s++, shl_out);
|
shf_putc(*s++, shl_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
x_mode(bool onoff)
|
|
||||||
{
|
|
||||||
static bool x_cur_mode;
|
|
||||||
bool prev;
|
|
||||||
|
|
||||||
if (x_cur_mode == onoff)
|
|
||||||
return x_cur_mode;
|
|
||||||
prev = x_cur_mode;
|
|
||||||
x_cur_mode = onoff;
|
|
||||||
|
|
||||||
if (onoff) {
|
|
||||||
struct termios cb;
|
|
||||||
X_chars oldchars;
|
|
||||||
|
|
||||||
oldchars = edchars;
|
|
||||||
cb = tty_state;
|
|
||||||
|
|
||||||
edchars.erase = cb.c_cc[VERASE];
|
|
||||||
edchars.kill = cb.c_cc[VKILL];
|
|
||||||
edchars.intr = cb.c_cc[VINTR];
|
|
||||||
edchars.quit = cb.c_cc[VQUIT];
|
|
||||||
edchars.eof = cb.c_cc[VEOF];
|
|
||||||
#ifdef VWERASE
|
|
||||||
edchars.werase = cb.c_cc[VWERASE];
|
|
||||||
#endif
|
|
||||||
cb.c_iflag &= ~(INLCR | ICRNL);
|
|
||||||
cb.c_lflag &= ~(ISIG | ICANON | ECHO);
|
|
||||||
#ifdef VLNEXT
|
|
||||||
/* osf/1 processes lnext when ~icanon */
|
|
||||||
cb.c_cc[VLNEXT] = _POSIX_VDISABLE;
|
|
||||||
#endif
|
|
||||||
/* sunos 4.1.x & osf/1 processes discard(flush) when ~icanon */
|
|
||||||
#ifdef VDISCARD
|
|
||||||
cb.c_cc[VDISCARD] = _POSIX_VDISABLE;
|
|
||||||
#endif
|
|
||||||
cb.c_cc[VTIME] = 0;
|
|
||||||
cb.c_cc[VMIN] = 1;
|
|
||||||
|
|
||||||
tcsetattr(tty_fd, TCSADRAIN, &cb);
|
|
||||||
|
|
||||||
/* Convert unset values to internal 'unset' value */
|
|
||||||
if (edchars.erase == _POSIX_VDISABLE)
|
|
||||||
edchars.erase = -1;
|
|
||||||
if (edchars.kill == _POSIX_VDISABLE)
|
|
||||||
edchars.kill = -1;
|
|
||||||
if (edchars.intr == _POSIX_VDISABLE)
|
|
||||||
edchars.intr = -1;
|
|
||||||
if (edchars.quit == _POSIX_VDISABLE)
|
|
||||||
edchars.quit = -1;
|
|
||||||
if (edchars.eof == _POSIX_VDISABLE)
|
|
||||||
edchars.eof = -1;
|
|
||||||
if (edchars.werase == _POSIX_VDISABLE)
|
|
||||||
edchars.werase = -1;
|
|
||||||
if (memcmp(&edchars, &oldchars, sizeof(edchars)) != 0) {
|
|
||||||
x_emacs_keys(&edchars);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
tcsetattr(tty_fd, TCSADRAIN, &tty_state);
|
|
||||||
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
/* Misc common code for vi/emacs */
|
/* Misc common code for vi/emacs */
|
||||||
|
|
||||||
@ -2705,7 +2641,7 @@ x_bind(const char *a1, const char *a2,
|
|||||||
x_tab[prefix][key] = f | ((*m1) ? 0x80 : 0);
|
x_tab[prefix][key] = f | ((*m1) ? 0x80 : 0);
|
||||||
x_atab[prefix][key] = sp;
|
x_atab[prefix][key] = sp;
|
||||||
|
|
||||||
/* Track what the user has bound so x_emacs_keys() won't toast things */
|
/* Track what the user has bound so x_mode(true) won't toast things */
|
||||||
if (f == XFUNC_insert)
|
if (f == XFUNC_insert)
|
||||||
x_bound[(prefix * X_TABSZ + key) / 8] &=
|
x_bound[(prefix * X_TABSZ + key) / 8] &=
|
||||||
~(1 << ((prefix * X_TABSZ + key) % 8));
|
~(1 << ((prefix * X_TABSZ + key) % 8));
|
||||||
@ -2753,23 +2689,6 @@ bind_if_not_bound(int p, int k, int func)
|
|||||||
x_tab[p][k] = func;
|
x_tab[p][k] = func;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
x_emacs_keys(X_chars *ec)
|
|
||||||
{
|
|
||||||
if (ec->erase >= 0) {
|
|
||||||
bind_if_not_bound(0, ec->erase, XFUNC_del_back);
|
|
||||||
bind_if_not_bound(1, ec->erase, XFUNC_del_bword);
|
|
||||||
}
|
|
||||||
if (ec->kill >= 0)
|
|
||||||
bind_if_not_bound(0, ec->kill, XFUNC_del_line);
|
|
||||||
if (ec->werase >= 0)
|
|
||||||
bind_if_not_bound(0, ec->werase, XFUNC_del_bword);
|
|
||||||
if (ec->intr >= 0)
|
|
||||||
bind_if_not_bound(0, ec->intr, XFUNC_abort);
|
|
||||||
if (ec->quit >= 0)
|
|
||||||
bind_if_not_bound(0, ec->quit, XFUNC_noop);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
x_set_mark(int c __attribute__((unused)))
|
x_set_mark(int c __attribute__((unused)))
|
||||||
{
|
{
|
||||||
@ -3355,6 +3274,77 @@ x_lastcp(void)
|
|||||||
return (xlp);
|
return (xlp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
x_mode(bool onoff)
|
||||||
|
{
|
||||||
|
static bool x_cur_mode;
|
||||||
|
bool prev;
|
||||||
|
|
||||||
|
if (x_cur_mode == onoff)
|
||||||
|
return x_cur_mode;
|
||||||
|
prev = x_cur_mode;
|
||||||
|
x_cur_mode = onoff;
|
||||||
|
|
||||||
|
if (onoff) {
|
||||||
|
struct termios cb;
|
||||||
|
|
||||||
|
cb = tty_state;
|
||||||
|
|
||||||
|
edchars.erase = cb.c_cc[VERASE];
|
||||||
|
edchars.kill = cb.c_cc[VKILL];
|
||||||
|
edchars.intr = cb.c_cc[VINTR];
|
||||||
|
edchars.quit = cb.c_cc[VQUIT];
|
||||||
|
edchars.eof = cb.c_cc[VEOF];
|
||||||
|
#ifdef VWERASE
|
||||||
|
edchars.werase = cb.c_cc[VWERASE];
|
||||||
|
#endif
|
||||||
|
cb.c_iflag &= ~(INLCR | ICRNL);
|
||||||
|
cb.c_lflag &= ~(ISIG | ICANON | ECHO);
|
||||||
|
#ifdef VLNEXT
|
||||||
|
/* osf/1 processes lnext when ~icanon */
|
||||||
|
cb.c_cc[VLNEXT] = _POSIX_VDISABLE;
|
||||||
|
#endif
|
||||||
|
/* sunos 4.1.x & osf/1 processes discard(flush) when ~icanon */
|
||||||
|
#ifdef VDISCARD
|
||||||
|
cb.c_cc[VDISCARD] = _POSIX_VDISABLE;
|
||||||
|
#endif
|
||||||
|
cb.c_cc[VTIME] = 0;
|
||||||
|
cb.c_cc[VMIN] = 1;
|
||||||
|
|
||||||
|
tcsetattr(tty_fd, TCSADRAIN, &cb);
|
||||||
|
|
||||||
|
/* Convert unset values to internal 'unset' value */
|
||||||
|
if (edchars.erase == _POSIX_VDISABLE)
|
||||||
|
edchars.erase = -1;
|
||||||
|
if (edchars.kill == _POSIX_VDISABLE)
|
||||||
|
edchars.kill = -1;
|
||||||
|
if (edchars.intr == _POSIX_VDISABLE)
|
||||||
|
edchars.intr = -1;
|
||||||
|
if (edchars.quit == _POSIX_VDISABLE)
|
||||||
|
edchars.quit = -1;
|
||||||
|
if (edchars.eof == _POSIX_VDISABLE)
|
||||||
|
edchars.eof = -1;
|
||||||
|
if (edchars.werase == _POSIX_VDISABLE)
|
||||||
|
edchars.werase = -1;
|
||||||
|
|
||||||
|
if (edchars.erase >= 0) {
|
||||||
|
bind_if_not_bound(0, edchars.erase, XFUNC_del_back);
|
||||||
|
bind_if_not_bound(1, edchars.erase, XFUNC_del_bword);
|
||||||
|
}
|
||||||
|
if (edchars.kill >= 0)
|
||||||
|
bind_if_not_bound(0, edchars.kill, XFUNC_del_line);
|
||||||
|
if (edchars.werase >= 0)
|
||||||
|
bind_if_not_bound(0, edchars.werase, XFUNC_del_bword);
|
||||||
|
if (edchars.intr >= 0)
|
||||||
|
bind_if_not_bound(0, edchars.intr, XFUNC_abort);
|
||||||
|
if (edchars.quit >= 0)
|
||||||
|
bind_if_not_bound(0, edchars.quit, XFUNC_noop);
|
||||||
|
} else
|
||||||
|
tcsetattr(tty_fd, TCSADRAIN, &tty_state);
|
||||||
|
|
||||||
|
return prev;
|
||||||
|
}
|
||||||
|
|
||||||
/* +++ vi editing mode +++ */
|
/* +++ vi editing mode +++ */
|
||||||
|
|
||||||
#define Ctrl(c) (c&0x1f)
|
#define Ctrl(c) (c&0x1f)
|
||||||
|
Reference in New Issue
Block a user