+2010-11-16 Vladimir Serbinenko <phcoder@gmail.com>
+
+ Make better UTF compliant.
+
+ * grub-core/normal/charset.c (grub_utf8_to_utf16): Handle 6- and 7-byte
+ sequences as incorrect.
+ (grub_is_valid_utf8): Likewise.
+ (grub_utf8_to_ucs4): Likewise.
+ (grub_ucs4_to_utf8): Handle codepoints outside of BMP.
+ (grub_ucs4_to_utf8_alloc): Likewise.
+ * include/grub/charset.h (grub_utf16_to_utf8): Likewise.
+
2010-11-16 Vladimir Serbinenko <phcoder@gmail.com>
Make legacy_source behave like source.
count = 3;
code = c & GRUB_UINT8_3_TRAILINGBITS;
}
- else if ((c & GRUB_UINT8_6_LEADINGBITS) == GRUB_UINT8_5_LEADINGBITS)
- {
- count = 4;
- code = c & GRUB_UINT8_2_TRAILINGBITS;
- }
- else if ((c & GRUB_UINT8_7_LEADINGBITS) == GRUB_UINT8_6_LEADINGBITS)
- {
- count = 5;
- code = c & GRUB_UINT8_1_TRAILINGBIT;
- }
else
return -1;
}
/* No surrogates in UCS-4... */
*dest++ = '?';
}
- else
+ else if (code < 0x10000)
{
if (dest + 2 >= destend)
break;
*dest++ = ((code >> 6) & 0x3F) | 0x80;
*dest++ = (code & 0x3F) | 0x80;
}
+ else
+ {
+ if (dest + 3 >= destend)
+ break;
+ *dest++ = (code >> 18) | 0xF0;
+ *dest++ = ((code >> 12) & 0x3F) | 0x80;
+ *dest++ = ((code >> 6) & 0x3F) | 0x80;
+ *dest++ = (code & 0x3F) | 0x80;
+ }
}
*dest = 0;
}
|| (code >= 0xD800 && code <= 0xDBFF))
/* No surrogates in UCS-4... */
cnt++;
- else
+ else if (code < 0x10000)
cnt += 3;
+ else
+ cnt += 4;
}
cnt++;
count = 3;
code = c & 0x07;
}
- else if ((c & 0xfc) == 0xf8)
- {
- count = 4;
- code = c & 0x03;
- }
- else if ((c & 0xfe) == 0xfc)
- {
- count = 5;
- code = c & 0x01;
- }
else
return 0;
}
count = 3;
code = c & 0x07;
}
- else if ((c & 0xfc) == 0xf8)
- {
- count = 4;
- code = c & 0x03;
- }
- else if ((c & 0xfe) == 0xfc)
- {
- count = 5;
- code = c & 0x01;
- }
else
{
/* invalid */
/* Error... */
*dest++ = '?';
}
- else
+ else if (code < 0x10000)
{
*dest++ = (code >> 12) | 0xE0;
*dest++ = ((code >> 6) & 0x3F) | 0x80;
*dest++ = (code & 0x3F) | 0x80;
}
+ else
+ {
+ *dest++ = (code >> 18) | 0xF0;
+ *dest++ = ((code >> 12) & 0x3F) | 0x80;
+ *dest++ = ((code >> 6) & 0x3F) | 0x80;
+ *dest++ = (code & 0x3F) | 0x80;
+ }
}
}