save 464 text with restructuring

This commit is contained in:
tg 2006-11-09 22:38:31 +00:00
parent 3c33cbcecc
commit 68caa9afdd
1 changed files with 59 additions and 79 deletions

58
edit.c
View File

@ -5,7 +5,7 @@
#include "sh.h"
__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.62 2006/11/09 21:20:49 tg Exp $");
__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.63 2006/11/09 22:38:31 tg Exp $");
/* tty driver characters we are interested in */
typedef struct {
@ -943,17 +943,13 @@ utf_getcpfromcols(char *p, int cols)
__RCSID("_MirOS: src/lib/libc/i18n/wcwidth.c,v 1.4 2006/11/01 20:01:20 tg Exp $");
struct wcxwidth_interval {
unsigned first;
unsigned last;
};
/* auxiliary function for binary search in interval table */
static inline int wcxwidth_bisearch(unsigned, const struct wcxwidth_interval *, size_t);
/* sorted list of non-overlapping intervals of non-spacing characters */
/* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */
static const struct wcxwidth_interval wcxwidth_combining[] = {
static int
wcxwidth(unsigned c)
{
static const struct cbset {
unsigned short first;
unsigned short last;
} comb[] = {
{ 0x0300, 0x036F }, { 0x0483, 0x0486 }, { 0x0488, 0x0489 },
{ 0x0591, 0x05B9 }, { 0x05BB, 0x05BD }, { 0x05BF, 0x05BF },
{ 0x05C1, 0x05C2 }, { 0x05C4, 0x05C5 }, { 0x05C7, 0x05C7 },
@ -995,42 +991,26 @@ static const struct wcxwidth_interval wcxwidth_combining[] = {
{ 0xA80B, 0xA80B }, { 0xA825, 0xA826 }, { 0xFB1E, 0xFB1E },
{ 0xFE00, 0xFE0F }, { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF },
{ 0xFFF9, 0xFFFB }
};
};
size_t min = 0, mid, max = sizeof (comb) / sizeof (struct cbset) - 1;
static int
wcxwidth_bisearch(unsigned ucs, const struct wcxwidth_interval *table, size_t max)
{
size_t min = 0, mid;
if (ucs >= table[0].first && ucs <= table[max].last) {
while (max >= min) {
mid = (min + max) / 2;
if (ucs > table[mid].last)
min = mid + 1;
else if (ucs < table[mid].first)
max = mid - 1;
else
return (1);
}
}
return (0);
}
static int
wcxwidth(unsigned c)
{
/* test for 8-bit control characters */
if (c < 32 || (c >= 0x7f && c < 0xa0))
return (c ? -1 : 0);
/* binary search in table of non-spacing characters */
if (wcxwidth_bisearch(c, wcxwidth_combining,
sizeof (wcxwidth_combining) / sizeof (struct wcxwidth_interval) - 1))
if (c >= comb[0].first && c <= comb[max].last)
while (max >= min) {
mid = (min + max) / 2;
if (c > comb[mid].last)
min = mid + 1;
else if (c < comb[mid].first)
max = mid - 1;
else
return (0);
}
/* if we arrive here, c is not a combining or C0/C1 control char */
return ((c >= 0x1100 && (
c <= 0x115f || /* Hangul Jamo init. consonants */
c == 0x2329 || c == 0x232a ||