multibyte search-character-{for,back}ward
This commit is contained in:
parent
72f958edea
commit
33ac6cb0d9
79
edit.c
79
edit.c
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
#include "sh.h"
|
#include "sh.h"
|
||||||
|
|
||||||
__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.48 2006/11/05 17:34:39 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.49 2006/11/05 17:54:46 tg Exp $");
|
||||||
|
|
||||||
/* tty driver characters we are interested in */
|
/* tty driver characters we are interested in */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -862,6 +862,7 @@ x_escape(const char *s, size_t len, int (*putbuf_func) (const char *, size_t))
|
||||||
static size_t mbxtowc(unsigned *, const char *);
|
static size_t mbxtowc(unsigned *, const char *);
|
||||||
static size_t wcxtomb(char *, unsigned);
|
static size_t wcxtomb(char *, unsigned);
|
||||||
static int wcxwidth(unsigned);
|
static int wcxwidth(unsigned);
|
||||||
|
static int x_e_getmbc(char *);
|
||||||
|
|
||||||
/* UTF-8 hack: high-level functions */
|
/* UTF-8 hack: high-level functions */
|
||||||
|
|
||||||
|
@ -1481,6 +1482,32 @@ static struct x_defbindings const x_defbindings[] = {
|
||||||
{ XFUNC_del_char | 0x80, 2, '3' },
|
{ XFUNC_del_char | 0x80, 2, '3' },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int
|
||||||
|
x_e_getmbc(char *sbuf)
|
||||||
|
{
|
||||||
|
int c, pos = 0;
|
||||||
|
unsigned char *buf = (unsigned char *)sbuf;
|
||||||
|
|
||||||
|
memset(buf, 0, 4);
|
||||||
|
buf[pos++] = c = x_e_getc();
|
||||||
|
if (c == -1)
|
||||||
|
return (-1);
|
||||||
|
if (Flag(FUTFHACK)) {
|
||||||
|
if ((buf[0] >= 0xC2) && (buf[0] < 0xF0)) {
|
||||||
|
buf[pos++] = c = x_e_getc();
|
||||||
|
if (c == -1)
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
if ((buf[0] >= 0xE0) && (buf[0] < 0xF0)) {
|
||||||
|
buf[pos++] = c = x_e_getc();
|
||||||
|
if (c == -1)
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buf[pos] = '\0';
|
||||||
|
return (pos);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
x_emacs(char *buf, size_t len)
|
x_emacs(char *buf, size_t len)
|
||||||
{
|
{
|
||||||
|
@ -1990,29 +2017,36 @@ x_mv_back(int c __attribute__((unused)))
|
||||||
static int
|
static int
|
||||||
x_mv_forw(int c __attribute__((unused)))
|
x_mv_forw(int c __attribute__((unused)))
|
||||||
{
|
{
|
||||||
int nleft = xep - xcp;
|
char *cp = xcp, *cp2;
|
||||||
|
|
||||||
if (!nleft) {
|
if (xcp == xep) {
|
||||||
x_e_putc2(7);
|
x_e_putc2(7);
|
||||||
return KSTD;
|
return KSTD;
|
||||||
}
|
}
|
||||||
if (x_arg > nleft)
|
while (x_arg--) {
|
||||||
x_arg = nleft;
|
utf_widthadj(cp, (const char **)&cp2);
|
||||||
x_goto(xcp + x_arg);
|
if (cp2 > xep)
|
||||||
|
break;
|
||||||
|
cp = cp2;
|
||||||
|
}
|
||||||
|
x_goto(cp);
|
||||||
return KSTD;
|
return KSTD;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
x_search_char_forw(int c)
|
x_search_char_forw(int c __attribute__((unused)))
|
||||||
{
|
{
|
||||||
char *cp = xcp;
|
char *cp = xcp;
|
||||||
|
char tmp[4];
|
||||||
|
|
||||||
*xep = '\0';
|
*xep = '\0';
|
||||||
c = x_e_getc();
|
if (x_e_getmbc(tmp) < 0) {
|
||||||
|
x_e_putc2(7);
|
||||||
|
return KSTD;
|
||||||
|
}
|
||||||
while (x_arg--) {
|
while (x_arg--) {
|
||||||
if (c < 0 ||
|
if ((cp = (cp == xep) ? NULL : strstr(cp + 1, tmp)) == NULL &&
|
||||||
((cp = (cp == xep) ? NULL : strchr(cp + 1, c)) == NULL &&
|
(cp = strstr(xbuf, tmp)) == NULL) {
|
||||||
(cp = strchr(xbuf, c)) == NULL)) {
|
|
||||||
x_e_putc2(7);
|
x_e_putc2(7);
|
||||||
return KSTD;
|
return KSTD;
|
||||||
}
|
}
|
||||||
|
@ -2022,20 +2056,35 @@ x_search_char_forw(int c)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
x_search_char_back(int c)
|
x_search_char_back(int c __attribute__((unused)))
|
||||||
{
|
{
|
||||||
char *cp = xcp, *p;
|
char *cp = xcp, *p;
|
||||||
|
char tmp[4];
|
||||||
|
int b;
|
||||||
|
|
||||||
c = x_e_getc();
|
if (x_e_getmbc(tmp) < 0) {
|
||||||
|
x_e_putc2(7);
|
||||||
|
return KSTD;
|
||||||
|
}
|
||||||
for (; x_arg--; cp = p)
|
for (; x_arg--; cp = p)
|
||||||
for (p = cp; ; ) {
|
for (p = cp; ; ) {
|
||||||
if (p-- == xbuf)
|
if (p-- == xbuf)
|
||||||
p = xep;
|
p = xep;
|
||||||
if (c < 0 || p == cp) {
|
if (p == cp) {
|
||||||
x_e_putc2(7);
|
x_e_putc2(7);
|
||||||
return KSTD;
|
return KSTD;
|
||||||
}
|
}
|
||||||
if (*p == c)
|
if ((tmp[1] && ((p+1) > xep)) ||
|
||||||
|
(tmp[2] && ((p+2) > xep)))
|
||||||
|
continue;
|
||||||
|
b = 1;
|
||||||
|
if (*p != tmp[0])
|
||||||
|
b = 0;
|
||||||
|
if (b && tmp[1] && p[1] != tmp[1])
|
||||||
|
b = 0;
|
||||||
|
if (b && tmp[2] && p[2] != tmp[2])
|
||||||
|
b = 0;
|
||||||
|
if (b)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
x_goto(cp);
|
x_goto(cp);
|
||||||
|
|
Loading…
Reference in New Issue