From 39057dd592973d6618287f28a176dddec4f467a4 Mon Sep 17 00:00:00 2001 From: tg Date: Thu, 9 Nov 2006 00:39:27 +0000 Subject: [PATCH] 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) --- edit.c | 34 +++++++++++++++++++++++++++++----- sh.h | 3 ++- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/edit.c b/edit.c index 553c410..8e5e2b6 100644 --- a/edit.c +++ b/edit.c @@ -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; diff --git a/sh.h b/sh.h index a78d91c..1eafa27 100644 --- a/sh.h +++ b/sh.h @@ -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);