--- rxvt-unicode/src/misc.C 2004/12/12 06:30:25 1.19 +++ rxvt-unicode/src/misc.C 2005/01/16 23:55:42 1.24 @@ -38,7 +38,7 @@ char *dst = r; while (len--) { - int l = wcrtomb (dst, *str++, mbs); + ssize_t l = wcrtomb (dst, *str++, mbs); if (l < 0) *dst++ = '?'; else @@ -47,7 +47,7 @@ *dst++ = 0; - return r; + return (char *)rxvt_realloc (r, dst - r); } wchar_t * @@ -57,7 +57,7 @@ wchar_t *r = (wchar_t *)rxvt_malloc ((len + 1) * sizeof (wchar_t)); - if (mbstowcs (r, str, len + 1) < 0) + if ((ssize_t)mbstowcs (r, str, len + 1) < 0) *r = 0; return r; @@ -73,7 +73,7 @@ while (len--) { - unicode_t w = *str++; + unicode_t w = *str++ & UNICODE_MASK; if (w < 0x000080) *p++ = w; @@ -93,9 +93,9 @@ *p++ = '?'; } - *p = 0; + *p++ = 0; - return r; + return (char *)rxvt_realloc (r, p - r); } wchar_t * @@ -103,16 +103,21 @@ { if (len < 0) len = strlen (str); - wchar_t *r = (wchar_t *)rxvt_malloc ((len + 1) * sizeof (wchar_t)); - wchar_t *p = r; + wchar_t *r = (wchar_t *)rxvt_malloc ((len + 1) * sizeof (wchar_t)), + *p = r; - unsigned char *s = (unsigned char *)str; + unsigned char *s = (unsigned char *)str, + *e = s + len; - while (len--) + for (;;) { - if (s[0] < 0x80) + len = e - s; + + if (len == 0) + break; + else if (s[0] < 0x80) *p++ = *s++; - else if (len > 0 + else if (len >= 2 && s[0] >= 0xc2 && s[0] <= 0xdf && (s[1] & 0xc0) == 0x80) { @@ -120,7 +125,7 @@ | (s[1] & 0x3f); s += 2; } - else if (len > 1 + else if (len >= 3 && ( (s[0] == 0xe0 && s[1] >= 0xa0 && s[1] <= 0xbf) || (s[0] >= 0xe1 && s[0] <= 0xec && s[1] >= 0x80 && s[1] <= 0xbf) || (s[0] == 0xed && s[1] >= 0x80 && s[1] <= 0x9f) @@ -133,7 +138,7 @@ | (s[2] & 0x3f); s += 3; } - else if (len > 2 + else if (len >= 4 && ( (s[0] == 0xf0 && s[1] >= 0x90 && s[1] <= 0xbf) || (s[0] >= 0xf1 && s[0] <= 0xf3 && s[1] >= 0x80 && s[1] <= 0xbf) || (s[0] == 0xf4 && s[1] >= 0x80 && s[1] <= 0x8f)