src/hb-utf-private.hh | 42 ++++++++++++++++++++++++++++-------------- test/api/test-buffer.c | 1 + 2 files changed, 29 insertions(+), 14 deletions(-)
New commits: commit 6f13b6d62daae4989e3cc2fe4b168e5c59650964 Author: Behdad Esfahbod <[email protected]> Date: Thu Jul 10 19:31:40 2014 -0400 When parsing UTF-16, generate invalid codepoint for lonely low surrogate Test passes now. diff --git a/src/hb-utf-private.hh b/src/hb-utf-private.hh index b9a6519..11f23cc 100644 --- a/src/hb-utf-private.hh +++ b/src/hb-utf-private.hh @@ -121,20 +121,27 @@ hb_utf_next (const uint16_t *text, { hb_codepoint_t c = *text++; - if (unlikely (hb_in_range<hb_codepoint_t> (c, 0xd800, 0xdbff))) + if (likely (!hb_in_range<hb_codepoint_t> (c, 0xd800, 0xdfff))) { - /* high surrogate */ + *unicode = c; + return text; + } + + if (likely (hb_in_range<hb_codepoint_t> (c, 0xd800, 0xdbff))) + { + /* High-surrogate in c */ hb_codepoint_t l; if (text < end && ((l = *text), likely (hb_in_range<hb_codepoint_t> (l, 0xdc00, 0xdfff)))) { - /* low surrogate */ + /* Low-surrogate in l */ *unicode = (c << 10) + l - ((0xd800 << 10) - 0x10000 + 0xdc00); text++; - } else - *unicode = -1; - } else - *unicode = c; + return text; + } + } + /* Lonely / out-of-order surrogate. */ + *unicode = -1; return text; } @@ -145,20 +152,27 @@ hb_utf_prev (const uint16_t *text, { hb_codepoint_t c = *--text; - if (unlikely (hb_in_range<hb_codepoint_t> (c, 0xdc00, 0xdfff))) + if (likely (!hb_in_range<hb_codepoint_t> (c, 0xd800, 0xdfff))) { - /* low surrogate */ + *unicode = c; + return text; + } + + if (likely (hb_in_range<hb_codepoint_t> (c, 0xdc00, 0xdfff))) + { + /* Low-surrogate in c */ hb_codepoint_t h; if (start < text && ((h = *(text - 1)), likely (hb_in_range<hb_codepoint_t> (h, 0xd800, 0xdbff)))) { - /* high surrogate */ + /* High-surrogate in h */ *unicode = (h << 10) + c - ((0xd800 << 10) - 0x10000 + 0xdc00); text--; - } else - *unicode = -1; - } else - *unicode = c; + return text; + } + } + /* Lonely / out-of-order surrogate. */ + *unicode = -1; return text; } commit 24b2ba9dfa7c35769cd843a07079ef88fa594bf8 Author: Behdad Esfahbod <[email protected]> Date: Thu Jul 10 19:31:16 2014 -0400 [test-buffer] Add test for lonely low-surrogate Currenty fails. Ouch! diff --git a/test/api/test-buffer.c b/test/api/test-buffer.c index 13465ef..0b70cf9 100644 --- a/test/api/test-buffer.c +++ b/test/api/test-buffer.c @@ -704,6 +704,7 @@ static const utf16_conversion_test_t utf16_conversion_tests[] = { {{0x41, 0xD800, 0xDF02}, {-1}}, {{0x41, 0x61, 0xD800, 0xDF02}, {0x61, -1}}, {{0x41, 0xD800, 0x61, 0xDF02}, {-1, 0x61}}, + {{0x41, 0xDF00, 0x61}, {-1}}, {{0x41, 0x61}, {0}} }; _______________________________________________ HarfBuzz mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/harfbuzz
