Revert "Imported Upstream version 1.2.7"
[platform/upstream/harfbuzz.git] / src / hb-utf-private.hh
index 74cf5d6..14d3c2e 100644 (file)
@@ -146,11 +146,11 @@ struct hb_utf16_t
       return text;
     }
 
-    if (likely (c <= 0xDBFFu && text < end))
+    if (likely (hb_in_range (c, 0xD800u, 0xDBFFu)))
     {
       /* High-surrogate in c */
-      hb_codepoint_t l = *text;
-      if (likely (hb_in_range (l, 0xDC00u, 0xDFFFu)))
+      hb_codepoint_t l;
+      if (text < end && ((l = *text), likely (hb_in_range (l, 0xDC00u, 0xDFFFu))))
       {
        /* Low-surrogate in l */
        *unicode = (c << 10) + l - ((0xD800u << 10) - 0x10000u + 0xDC00u);
@@ -170,7 +170,8 @@ struct hb_utf16_t
        hb_codepoint_t *unicode,
        hb_codepoint_t replacement)
   {
-    hb_codepoint_t c = *--text;
+    const uint16_t *end = text--;
+    hb_codepoint_t c = *text;
 
     if (likely (!hb_in_range (c, 0xD800u, 0xDFFFu)))
     {
@@ -178,22 +179,14 @@ struct hb_utf16_t
       return text;
     }
 
-    if (likely (c >= 0xDC00u && start < text))
-    {
-      /* Low-surrogate in c */
-      hb_codepoint_t h = text[-1];
-      if (likely (hb_in_range (h, 0xD800u, 0xDBFFu)))
-      {
-        /* High-surrogate in h */
-        *unicode = (h << 10) + c - ((0xD800u << 10) - 0x10000u + 0xDC00u);
-        text--;
-        return text;
-      }
-    }
+    if (likely (start < text && hb_in_range (c, 0xDC00u, 0xDFFFu)))
+      text--;
+
+    if (likely (next (text, end, unicode, replacement) == end))
+      return text;
 
-    /* Lonely / out-of-order surrogate. */
     *unicode = replacement;
-    return text;
+    return end - 1;
   }
 
 
@@ -218,9 +211,14 @@ struct hb_utf32_t
        hb_codepoint_t *unicode,
        hb_codepoint_t replacement)
   {
-    hb_codepoint_t c = *unicode = *text++;
-    if (validate && unlikely (c >= 0xD800u && (c <= 0xDFFFu || c > 0x10FFFFu)))
-      *unicode = replacement;
+    hb_codepoint_t c = *text++;
+    if (validate && unlikely (c > 0x10FFFFu || hb_in_range (c, 0xD800u, 0xDFFFu)))
+      goto error;
+    *unicode = c;
+    return text;
+
+  error:
+    *unicode = replacement;
     return text;
   }
 
@@ -230,10 +228,8 @@ struct hb_utf32_t
        hb_codepoint_t *unicode,
        hb_codepoint_t replacement)
   {
-    hb_codepoint_t c = *unicode = *--text;
-    if (validate && unlikely (c >= 0xD800u && (c <= 0xDFFFu || c > 0x10FFFFu)))
-      *unicode = replacement;
-    return text;
+    next (text - 1, text, unicode, replacement);
+    return text - 1;
   }
 
   static inline unsigned int