< prev index next >

src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.c

Print this page

        

@@ -21,11 +21,10 @@
 
 typedef struct {
     unsigned char category;
     unsigned char combining;
     unsigned char bidi_class;
-    unsigned char mirrored;
     unsigned char east_asian_width;
     unsigned char script;
     unsigned char linebreak_class;
 } UCDRecord;
 

@@ -41,11 +40,11 @@
 typedef struct {
     unsigned int start;
     short count, index;
 } Reindex;
 
-#include "unicodedata_db.h"
+#include "ucdn_db.h"
 
 /* constants required for Hangul (de)composition */
 #define SBASE 0xAC00
 #define LBASE 0x1100
 #define VBASE 0x1161

@@ -89,23 +88,33 @@
     }
 
     return &decomp_data[index];
 }
 
-static int get_comp_index(uint32_t code, const Reindex *idx)
+static int compare_reindex(const void *a, const void *b)
 {
-    int i;
+    Reindex *ra = (Reindex *)a;
+    Reindex *rb = (Reindex *)b;
 
-    for (i = 0; idx[i].start; i++) {
-        const Reindex *cur = &idx[i];
-        if (code < cur->start)
+    if (ra->start < rb->start)
             return -1;
-        if (code <= cur->start + cur->count) {
-            return cur->index + (code - cur->start);
-        }
-    }
+    else if (ra->start > (rb->start + rb->count))
+        return 1;
+    else
+        return 0;
+}
+
+static int get_comp_index(uint32_t code, const Reindex *idx, size_t len)
+{
+    Reindex *res;
+    Reindex r = {0, 0, 0};
+    r.start = code;
+    res = (Reindex *) bsearch(&r, idx, len, sizeof(Reindex), compare_reindex);
 
+    if (res != NULL)
+        return res->index + (code - res->start);
+    else
     return -1;
 }
 
 static int compare_mp(const void *a, const void *b)
 {

@@ -125,12 +134,12 @@
 {
     BracketPair bp = {0,0,2};
     BracketPair *res;
 
     bp.from = code;
-    res = bsearch(&bp, bracket_pairs, BIDI_BRACKET_LEN, sizeof(BracketPair),
-            compare_bp);
+    res = (BracketPair *) bsearch(&bp, bracket_pairs, BIDI_BRACKET_LEN,
+                                 sizeof(BracketPair), compare_bp);
     return res;
 }
 
 static int hangul_pair_decompose(uint32_t code, uint32_t *a, uint32_t *b)
 {

@@ -152,35 +161,30 @@
     }
 }
 
 static int hangul_pair_compose(uint32_t *code, uint32_t a, uint32_t b)
 {
-    if (b < VBASE || b >= (TBASE + TCOUNT))
-        return 0;
-
-    if ((a < LBASE || a >= (LBASE + LCOUNT))
-            && (a < SBASE || a >= (SBASE + SCOUNT)))
-        return 0;
-
-    if (a >= SBASE) {
+    if (a >= SBASE && a < (SBASE + SCOUNT) && b >= TBASE && b < (TBASE + TCOUNT)) {
         /* LV,T */
         *code = a + (b - TBASE);
         return 3;
-    } else {
+    } else if (a >= LBASE && a < (LBASE + LCOUNT) && b >= VBASE && b < (VBASE + VCOUNT)) {
         /* L,V */
         int li = a - LBASE;
         int vi = b - VBASE;
         *code = SBASE + li * NCOUNT + vi * TCOUNT;
         return 2;
+    } else {
+        return 0;
     }
 }
 
 static uint32_t decode_utf16(const unsigned short **code_ptr)
 {
     const unsigned short *code = *code_ptr;
 
-    if ((code[0] & 0xd800) != 0xd800) {
+    if (code[0] < 0xd800 || code[0] > 0xdc00) {
         *code_ptr += 1;
         return (uint32_t)code[0];
     } else {
         *code_ptr += 2;
         return 0x10000 + ((uint32_t)code[1] - 0xdc00) +

@@ -213,11 +217,11 @@
     return get_ucd_record(code)->bidi_class;
 }
 
 int ucdn_get_mirrored(uint32_t code)
 {
-    return get_ucd_record(code)->mirrored;
+    return ucdn_mirror(code) != code;
 }
 
 int ucdn_get_script(uint32_t code)
 {
     return get_ucd_record(code)->script;

@@ -262,16 +266,13 @@
 uint32_t ucdn_mirror(uint32_t code)
 {
     MirrorPair mp = {0};
     MirrorPair *res;
 
-    if (get_ucd_record(code)->mirrored == 0)
-        return code;
-
     mp.from = code;
-    res = bsearch(&mp, mirror_pairs, BIDI_MIRROR_LEN, sizeof(MirrorPair),
-            compare_mp);
+    res = (MirrorPair *) bsearch(&mp, mirror_pairs, BIDI_MIRROR_LEN,
+                                sizeof(MirrorPair), compare_mp);
 
     if (res == NULL)
         return code;
     else
         return res->to;

@@ -324,12 +325,12 @@
     int l, r, index, indexi, offset;
 
     if (hangul_pair_compose(code, a, b))
         return 1;
 
-    l = get_comp_index(a, nfc_first);
-    r = get_comp_index(b, nfc_last);
+    l = get_comp_index(a, nfc_first, sizeof(nfc_first) / sizeof(Reindex));
+    r = get_comp_index(b, nfc_last, sizeof(nfc_last) / sizeof(Reindex));
 
     if (l < 0 || r < 0)
         return 0;
 
     indexi = l * TOTAL_LAST + r;
< prev index next >