add the new function utf_ptradj() which does the same as utf_widthadj()

except it doesn't return a value and is much cheaper (no internal con-
version to UCS-2, just range checking on the multibytes)
This commit is contained in:
tg 2006-11-09 00:39:27 +00:00
parent fb9c6e30bb
commit 39057dd592
2 changed files with 31 additions and 6 deletions

34
edit.c
View File

@ -5,7 +5,7 @@
#include "sh.h"
__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.59 2006/11/09 00:28:36 tg Exp $");
__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.60 2006/11/09 00:39:27 tg Exp $");
/* tty driver characters we are interested in */
typedef struct {
@ -897,6 +897,30 @@ utf_widthadj(const char *src, const char **dst)
return (wcxwidth(wc));
}
void
utf_ptradj(char *src, char **dst)
{
size_t len;
if (!Flag(FUTFHACK) || *(unsigned char *)src < 0xC2)
len = 1;
else if (*(unsigned char *)src < 0xE0)
len = 2;
else if (*(unsigned char *)src < 0xF0)
len = 3;
else
len = 1;
if (len > 1)
if ((*(unsigned char *)(src + 1) & 0xC0) != 0x80)
len = 1;
if (len > 2)
if ((*(unsigned char *)(src + 2) & 0xC0) != 0x80)
len = 2;
if (dst)
*dst = src + len;
}
char *
utf_getcpfromcols(char *p, int cols)
{
@ -1742,7 +1766,7 @@ x_del_char(int c __attribute__((unused)))
cp = xcp;
while (i < x_arg) {
utf_widthadj(cp, (const char **)&cp2);
utf_ptradj(cp, &cp2);
if (cp2 > xep)
break;
cp = cp2;
@ -1873,7 +1897,7 @@ x_bword(void)
}
x_goto(cp);
for (cp = xcp; cp < (xcp + nb); ++nc)
utf_widthadj(cp, (const char **)&cp);
utf_ptradj(cp, &cp);
return nc;
}
@ -1898,7 +1922,7 @@ x_fword(int move)
}
}
for (cp2 = xcp; cp2 < cp; ++nc)
utf_widthadj(cp2, (const char **)&cp2);
utf_ptradj(cp2, &cp2);
if (move)
x_goto(cp);
return nc;
@ -2023,7 +2047,7 @@ x_mv_forw(int c __attribute__((unused)))
return KSTD;
}
while (x_arg--) {
utf_widthadj(cp, (const char **)&cp2);
utf_ptradj(cp, &cp2);
if (cp2 > xep)
break;
cp = cp2;

3
sh.h
View File

@ -8,7 +8,7 @@
/* $OpenBSD: c_test.h,v 1.4 2004/12/20 11:34:26 otto Exp $ */
/* $OpenBSD: tty.h,v 1.5 2004/12/20 11:34:26 otto Exp $ */
#define MKSH_SH_H_ID "$MirOS: src/bin/mksh/sh.h,v 1.54 2006/11/09 00:11:39 tg Exp $"
#define MKSH_SH_H_ID "$MirOS: src/bin/mksh/sh.h,v 1.55 2006/11/09 00:39:27 tg Exp $"
#define MKSH_VERSION "R29 2006/11/08"
#if HAVE_SYS_PARAM_H
@ -1059,6 +1059,7 @@ int x_bind(const char *, const char *, int, int);
/* UTF-8 hack stuff */
int utf_widthadj(const char *, const char **);
#define utf_width(x) utf_widthadj(x, NULL);
void utf_ptradj(char *, char **);
/* eval.c */
char *substitute(const char *, int);
char **eval(char **, int);