This commit is contained in:
Glenn Maynard
2003-01-06 01:19:22 +00:00
parent 531b11e9e3
commit 72d26bb3db
+29 -39
View File
@@ -858,48 +858,40 @@ bool regex(CString pattern, CString str)
/* UTF-8 decoding code from glib. */ /* UTF-8 decoding code from glib. */
char *utf8_find_next_char (const char *p, const char *end) char *utf8_find_next_char (const char *p, const char *end)
{ {
if (*p) { if (end)
if (end) for (++p; p < end && (*p & 0xc0) == 0x80; ++p)
for (++p; p < end && (*p & 0xc0) == 0x80; ++p) ;
; else if (*p) {
else for (++p; (*p & 0xc0) == 0x80; ++p)
for (++p; (*p & 0xc0) == 0x80; ++p) ;
; }
} return (p == end) ? NULL : (char *)p;
return (p == end) ? NULL : (char *)p;
} }
#define UTF8_GET \ int masks[7] = { 0, 0x7f, 0x1f, 0x0f, 0x07, 0x03, 0x01 };
int utf8_get_char_len (const char *pp)
{
const unsigned char *p = (const unsigned char *) pp;
if (*p < 128) return 1;
else if ((*p & 0xe0) == 0xc0) return 2;
else if ((*p & 0xf0) == 0xe0) return 3;
else if ((*p & 0xf8) == 0xf0) return 4;
else if ((*p & 0xfc) == 0xf8) return 5;
else if ((*p & 0xfe) == 0xfc) return 6;
return -1;
}
longchar utf8_get_char (const char *p) longchar utf8_get_char (const char *p)
{ {
int i, mask = 0, len; int len = utf8_get_char_len(p);
longchar result; if(len == -1)
unsigned char c = (unsigned char) *p; return 0xFFFF;
if (c < 128) { int mask = masks[len];
len = 1;
mask = 0x7f;
} else if ((c & 0xe0) == 0xc0) {
len = 2;
mask = 0x1f;
} else if ((c & 0xf0) == 0xe0) {
len = 3;
mask = 0x0f;
} else if ((c & 0xf8) == 0xf0) {
len = 4;
mask = 0x07;
} else if ((c & 0xfc) == 0xf8) {
len = 5;
mask = 0x03;
} else if ((c & 0xfe) == 0xfc) {
len = 6;
mask = 0x01;
} else
return (longchar)-1;
result = longchar(p[0] & mask); longchar result = longchar(p[0] & mask);
for (i = 1; i < len; ++i) { for (int i = 1; i < len; ++i) {
if ((p[i] & 0xc0) != 0x80) if ((p[i] & 0xc0) != 0x80)
return (longchar) -1; return (longchar) -1;
@@ -916,12 +908,10 @@ lstring CStringToLstring(const CString &str)
lstring ret; lstring ret;
while(ptr) while(ptr && ptr != end)
{ {
longchar c = utf8_get_char (ptr); longchar c = utf8_get_char (ptr);
if(c != longchar(-1)) ret.push_back(c);
ret.push_back(c);
ptr = utf8_find_next_char (ptr, end); ptr = utf8_find_next_char (ptr, end);
} }