Henri Verbeet : usp10: Use bsearch() to lookup the script range in get_char_script().

Alexandre Julliard julliard at winehq.org
Wed Mar 8 16:01:38 CST 2017


Module: wine
Branch: master
Commit: 3c704c2c16237167d356cbc174602aebe3b08bcf
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3c704c2c16237167d356cbc174602aebe3b08bcf

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Mar  7 08:57:29 2017 +0100

usp10: Use bsearch() to lookup the script range in get_char_script().

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Aric Stewart <aric at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/usp10/usp10.c          | 45 +++++++++++++++++++++++----------------------
 dlls/usp10/usp10_internal.h |  3 +++
 2 files changed, 26 insertions(+), 22 deletions(-)

diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c
index 6711347..8a8a62f 100644
--- a/dlls/usp10/usp10.c
+++ b/dlls/usp10/usp10.c
@@ -43,7 +43,7 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(uniscribe);
 
-static const struct
+static const struct usp10_script_range
 {
     enum usp10_script script;
     DWORD rangeFirst;
@@ -51,7 +51,7 @@ static const struct
     enum usp10_script numericScript;
     enum usp10_script punctScript;
 }
-scriptRanges[] =
+script_ranges[] =
 {
     /* Basic Latin: U+0000–U+007A */
     { Script_Latin,      0x00,   0x07a ,  Script_Numeric, Script_Punctuation},
@@ -296,8 +296,6 @@ scriptRanges[] =
     { Script_Osmanya,    0x10480, 0x104AF,  Script_Osmanya_Numeric, 0},
     /* Mathematical Alphanumeric Symbols: U+1D400–U+1D7FF */
     { Script_MathAlpha,  0x1D400, 0x1D7FF,  0, 0},
-    /* END */
-    { SCRIPT_UNDEFINED,  0, 0, 0}
 };
 
 /* this must be in order so that the index matches the Script value */
@@ -888,13 +886,25 @@ static inline DWORD decode_surrogate_pair(LPCWSTR str, INT index, INT end)
     return 0;
 }
 
+static int usp10_compare_script_range(const void *key, const void *value)
+{
+    const struct usp10_script_range *range = value;
+    const DWORD *ch = key;
+
+    if (*ch < range->rangeFirst)
+        return -1;
+    if (*ch > range->rangeLast)
+        return 1;
+    return 0;
+}
+
 static enum usp10_script get_char_script(const WCHAR *str, unsigned int index,
         unsigned int end, unsigned int *consumed)
 {
     static const WCHAR latin_punc[] = {'#','$','&','\'',',',';','<','>','?','@','\\','^','_','`','{','|','}','~', 0x00a0, 0};
+    struct usp10_script_range *range;
     WORD type = 0, type2 = 0;
     DWORD ch;
-    int i;
 
     *consumed = 1;
 
@@ -936,24 +946,15 @@ static enum usp10_script get_char_script(const WCHAR *str, unsigned int index,
     else
         ch = str[index];
 
-    i = 0;
-    do
-    {
-        if (ch < scriptRanges[i].rangeFirst || scriptRanges[i].script == SCRIPT_UNDEFINED)
-            break;
-
-        if (ch >= scriptRanges[i].rangeFirst && ch <= scriptRanges[i].rangeLast)
-        {
-            if (scriptRanges[i].numericScript && (type & C1_DIGIT || type2 == C2_ARABICNUMBER))
-                return scriptRanges[i].numericScript;
-            if (scriptRanges[i].punctScript && type & C1_PUNCT)
-                return scriptRanges[i].punctScript;
-            return scriptRanges[i].script;
-        }
-        i++;
-    } while (1);
+    if (!(range = bsearch(&ch, script_ranges, ARRAY_SIZE(script_ranges),
+            sizeof(*script_ranges), usp10_compare_script_range)))
+        return Script_Undefined;
 
-    return SCRIPT_UNDEFINED;
+    if (range->numericScript && (type & C1_DIGIT || type2 == C2_ARABICNUMBER))
+        return range->numericScript;
+    if (range->punctScript && type & C1_PUNCT)
+        return range->punctScript;
+    return range->script;
 }
 
 static int compare_FindGlyph(const void *a, const void* b)
diff --git a/dlls/usp10/usp10_internal.h b/dlls/usp10/usp10_internal.h
index dd1b9fa..989620d 100644
--- a/dlls/usp10/usp10_internal.h
+++ b/dlls/usp10/usp10_internal.h
@@ -24,6 +24,9 @@
             ( (ULONG)_x2 <<  8 ) |     \
               (ULONG)_x1         )
 
+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
+#endif
 
 enum usp10_script
 {




More information about the wine-cvs mailing list