[PATCH 5/6] libport: Add support for singleton decomposition.

Huw Davies huw at codeweavers.com
Fri Feb 8 04:41:26 CST 2019


Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/kernel32/tests/locale.c |   6 +
 libs/port/decompose.c        | 314 +++++++++++++++++++++++++++--------
 tools/make_unicode           |  18 +-
 3 files changed, 267 insertions(+), 71 deletions(-)

diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index 1e25122c23..d877c65ec6 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -5685,6 +5685,11 @@ static void test_NormalizeString(void)
     static const WCHAR part1_str10[] = {0x309B,0};
     static const WCHAR part1_nfkc10[] = {0x20,0x3099,0};
 
+    /* ANGSTROM SIGN */
+    static const WCHAR part1_str11[] = {0x212B,0};
+    static const WCHAR part1_nfc11[] = {0xC5,0};
+    static const WCHAR part1_nfd11[] = {'A',0x030A,0};
+
     struct test_data_normal {
         const WCHAR *str;
         const WCHAR *expected[4];
@@ -5713,6 +5718,7 @@ static void test_NormalizeString(void)
         { part1_str8, { part1_str8, part1_nfd8, part1_str8, part1_nfd8 }, { 1, 0, 1, 0 } },
         { part1_str9, { part1_str9, part1_str9, part1_nfkc9, part1_nfkc9 }, { 1, 0, 1, 0 } },
         { part1_str10, { part1_str10, part1_str10, part1_nfkc10, part1_nfkc10 }, { 1, 0, 1, 0 } },
+        { part1_str11, { part1_nfc11, part1_nfd11, part1_nfc11, part1_nfd11 }, { 1, 0, 1, 0 } },
         { 0 }
     };
     const struct test_data_normal *ptest = test_arr;
diff --git a/libs/port/decompose.c b/libs/port/decompose.c
index c46906921a..e8305d938b 100644
--- a/libs/port/decompose.c
+++ b/libs/port/decompose.c
@@ -4,16 +4,16 @@
 
 #include "wine/unicode.h"
 
-static const WCHAR table[4704] =
+static const WCHAR table[5856] =
 {
     /* index */
     0x0110, 0x0120, 0x0130, 0x0140, 0x0150, 0x0100, 0x0160, 0x0100,
     0x0100, 0x0170, 0x0180, 0x0190, 0x01a0, 0x01b0, 0x0100, 0x01c0,
     0x01d0, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
     0x0100, 0x0100, 0x0100, 0x01e0, 0x0100, 0x0100, 0x01f0, 0x0200,
-    0x0100, 0x0210, 0x0220, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
-    0x0100, 0x0100, 0x0230, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
-    0x0240, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0210, 0x0220, 0x0230, 0x0240, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0100, 0x0100, 0x0250, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0260, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
     0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
     0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
     0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
@@ -38,73 +38,85 @@ static const WCHAR table[4704] =
     0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
     0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
     0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
-    0x0100, 0x0100, 0x0100, 0x0250, 0x0100, 0x0100, 0x0100, 0x0100,
+    0x0100, 0x0270, 0x0280, 0x0290, 0x0100, 0x0100, 0x0100, 0x0100,
     /* null sub-index */
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
     /* sub-index 00 */
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0280, 0x02a0, 0x02c0, 0x02e0,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02c0, 0x02e0, 0x0300, 0x0320,
     /* sub-index 01 */
-    0x0300, 0x0320, 0x0340, 0x0360, 0x0380, 0x03a0, 0x03c0, 0x03e0,
-    0x0260, 0x0260, 0x0400, 0x0420, 0x0440, 0x0460, 0x0480, 0x04a0,
+    0x0340, 0x0360, 0x0380, 0x03a0, 0x03c0, 0x03e0, 0x0400, 0x0420,
+    0x02a0, 0x02a0, 0x0440, 0x0460, 0x0480, 0x04a0, 0x04c0, 0x04e0,
     /* sub-index 02 */
-    0x04c0, 0x04e0, 0x0500, 0x0520, 0x0260, 0x0260, 0x0260, 0x0260,
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
+    0x0500, 0x0520, 0x0540, 0x0560, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
     /* sub-index 03 */
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0540, 0x0260, 0x0260, 0x0260,
-    0x0560, 0x0580, 0x05a0, 0x05c0, 0x05e0, 0x0600, 0x0260, 0x0260,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x0580, 0x02a0, 0x02a0, 0x05a0,
+    0x05c0, 0x05e0, 0x0600, 0x0620, 0x0640, 0x0660, 0x02a0, 0x02a0,
     /* sub-index 04 */
-    0x0620, 0x0640, 0x0260, 0x0660, 0x0260, 0x0680, 0x0260, 0x06a0,
-    0x0260, 0x0260, 0x0260, 0x0260, 0x06c0, 0x06e0, 0x0700, 0x0720,
+    0x0680, 0x06a0, 0x02a0, 0x06c0, 0x02a0, 0x06e0, 0x02a0, 0x0700,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x0720, 0x0740, 0x0760, 0x0780,
     /* sub-index 06 */
-    0x0260, 0x0260, 0x0740, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0760, 0x0780, 0x0260, 0x0260,
+    0x02a0, 0x02a0, 0x07a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x07c0, 0x07e0, 0x02a0, 0x02a0,
     /* sub-index 09 */
-    0x0260, 0x0260, 0x07a0, 0x07c0, 0x0260, 0x07e0, 0x0260, 0x0260,
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0800, 0x0820, 0x0260, 0x0260,
+    0x02a0, 0x02a0, 0x0800, 0x0820, 0x02a0, 0x0840, 0x02a0, 0x02a0,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x0860, 0x0880, 0x02a0, 0x02a0,
     /* sub-index 0a */
-    0x0260, 0x0260, 0x0260, 0x0840, 0x0260, 0x0860, 0x0260, 0x0260,
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
+    0x02a0, 0x02a0, 0x02a0, 0x08a0, 0x02a0, 0x08c0, 0x02a0, 0x02a0,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
     /* sub-index 0b */
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0880, 0x08a0, 0x0260, 0x0260,
-    0x0260, 0x08c0, 0x0260, 0x0260, 0x08e0, 0x0260, 0x0260, 0x0260,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x08e0, 0x0900, 0x02a0, 0x02a0,
+    0x02a0, 0x0920, 0x02a0, 0x02a0, 0x0940, 0x02a0, 0x02a0, 0x02a0,
     /* sub-index 0c */
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0900, 0x0260, 0x0260, 0x0260,
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0920, 0x0260, 0x0260, 0x0260,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x0960, 0x02a0, 0x02a0, 0x02a0,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x0980, 0x02a0, 0x02a0, 0x02a0,
     /* sub-index 0d */
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0940, 0x0260, 0x0260, 0x0260,
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0960, 0x0260, 0x0260,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x09a0, 0x02a0, 0x02a0, 0x02a0,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x09c0, 0x02a0, 0x02a0,
     /* sub-index 0f */
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0980, 0x09a0, 0x09c0, 0x09e0,
-    0x0a00, 0x0a20, 0x0a40, 0x0a60, 0x0260, 0x0260, 0x0260, 0x0260,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x09e0, 0x0a00, 0x0a20, 0x0a40,
+    0x0a60, 0x0a80, 0x0aa0, 0x0ac0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
     /* sub-index 10 */
-    0x0260, 0x0260, 0x0a80, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
+    0x02a0, 0x02a0, 0x0ae0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
     /* sub-index 1b */
-    0x0aa0, 0x0ac0, 0x0260, 0x0ae0, 0x0b00, 0x0260, 0x0260, 0x0260,
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
+    0x0b00, 0x0b20, 0x02a0, 0x0b40, 0x0b60, 0x02a0, 0x02a0, 0x02a0,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
     /* sub-index 1e */
-    0x0b20, 0x0b40, 0x0b60, 0x0b80, 0x0ba0, 0x0bc0, 0x0be0, 0x0c00,
-    0x0c20, 0x0c40, 0x0c60, 0x0c80, 0x0ca0, 0x0cc0, 0x0ce0, 0x0d00,
+    0x0b80, 0x0ba0, 0x0bc0, 0x0be0, 0x0c00, 0x0c20, 0x0c40, 0x0c60,
+    0x0c80, 0x0ca0, 0x0cc0, 0x0ce0, 0x0d00, 0x0d20, 0x0d40, 0x0d60,
     /* sub-index 1f */
-    0x0d20, 0x0d40, 0x0d60, 0x0d80, 0x0da0, 0x0dc0, 0x0de0, 0x0e00,
-    0x0e20, 0x0e40, 0x0e60, 0x0e80, 0x0ea0, 0x0ec0, 0x0ee0, 0x0f00,
+    0x0d80, 0x0da0, 0x0dc0, 0x0de0, 0x0e00, 0x0e20, 0x0e40, 0x0e60,
+    0x0e80, 0x0ea0, 0x0ec0, 0x0ee0, 0x0f00, 0x0f20, 0x0f40, 0x0f60,
+    /* sub-index 20 */
+    0x0f80, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
     /* sub-index 21 */
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
-    0x0260, 0x0f20, 0x0f40, 0x0260, 0x0f60, 0x0260, 0x0260, 0x0260,
+    0x02a0, 0x02a0, 0x0fa0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
+    0x02a0, 0x0fc0, 0x0fe0, 0x02a0, 0x1000, 0x02a0, 0x02a0, 0x02a0,
     /* sub-index 22 */
-    0x0f80, 0x0260, 0x0fa0, 0x0260, 0x0fc0, 0x0260, 0x0fe0, 0x1000,
-    0x1020, 0x0260, 0x1040, 0x0260, 0x0260, 0x0260, 0x1060, 0x0260,
+    0x1020, 0x02a0, 0x1040, 0x02a0, 0x1060, 0x02a0, 0x1080, 0x10a0,
+    0x10c0, 0x02a0, 0x10e0, 0x02a0, 0x02a0, 0x02a0, 0x1100, 0x02a0,
+    /* sub-index 23 */
+    0x02a0, 0x02a0, 0x1120, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
     /* sub-index 2a */
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x1080, 0x0260, 0x0260,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x1140, 0x02a0, 0x02a0,
     /* sub-index 30 */
-    0x0260, 0x0260, 0x0260, 0x0260, 0x10a0, 0x10c0, 0x10e0, 0x1100,
-    0x0260, 0x1120, 0x1140, 0x1160, 0x1180, 0x11a0, 0x0260, 0x11c0,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x1160, 0x1180, 0x11a0, 0x11c0,
+    0x02a0, 0x11e0, 0x1200, 0x1220, 0x1240, 0x1260, 0x02a0, 0x1280,
+    /* sub-index f9 */
+    0x12a0, 0x12c0, 0x12e0, 0x1300, 0x1320, 0x1340, 0x1360, 0x1380,
+    0x13a0, 0x13c0, 0x13e0, 0x1400, 0x1420, 0x1440, 0x1460, 0x1480,
+    /* sub-index fa */
+    0x14a0, 0x14c0, 0x14e0, 0x1500, 0x1520, 0x1540, 0x1560, 0x1580,
+    0x15a0, 0x15c0, 0x15e0, 0x1600, 0x1620, 0x1640, 0x02a0, 0x02a0,
     /* sub-index fb */
-    0x0260, 0x11e0, 0x1200, 0x1220, 0x1240, 0x0260, 0x0260, 0x0260,
-    0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
+    0x02a0, 0x1660, 0x1680, 0x16a0, 0x16c0, 0x02a0, 0x02a0, 0x02a0,
+    0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
     /* null mapping */
     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -221,13 +233,18 @@ static const WCHAR table[4704] =
     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
     /* 0x0340 .. 0x034f */
-    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0300, 0x0000, 0x0301, 0x0000, 0x0000, 0x0000, 0x0313, 0x0000,
     0x0308, 0x0301, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0370 .. 0x037f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x02b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x003b, 0x0000, 0x0000, 0x0000,
     /* 0x0380 .. 0x038f */
     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
-    0x0000, 0x0000, 0x00a8, 0x0301, 0x0391, 0x0301, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x00a8, 0x0301, 0x0391, 0x0301, 0x00b7, 0x0000,
     0x0395, 0x0301, 0x0397, 0x0301, 0x0399, 0x0301, 0x0000, 0x0000,
     0x039f, 0x0301, 0x0000, 0x0000, 0x03a5, 0x0301, 0x03a9, 0x0301,
     /* 0x0390 .. 0x039f */
@@ -571,10 +588,10 @@ static const WCHAR table[4704] =
     0x03a9, 0x0313, 0x03a9, 0x0314, 0x1f68, 0x0300, 0x1f69, 0x0300,
     0x1f68, 0x0301, 0x1f69, 0x0301, 0x1f68, 0x0342, 0x1f69, 0x0342,
     /* 0x1f70 .. 0x1f7f */
-    0x03b1, 0x0300, 0x0000, 0x0000, 0x03b5, 0x0300, 0x0000, 0x0000,
-    0x03b7, 0x0300, 0x0000, 0x0000, 0x03b9, 0x0300, 0x0000, 0x0000,
-    0x03bf, 0x0300, 0x0000, 0x0000, 0x03c5, 0x0300, 0x0000, 0x0000,
-    0x03c9, 0x0300, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x03b1, 0x0300, 0x03ac, 0x0000, 0x03b5, 0x0300, 0x03ad, 0x0000,
+    0x03b7, 0x0300, 0x03ae, 0x0000, 0x03b9, 0x0300, 0x03af, 0x0000,
+    0x03bf, 0x0300, 0x03cc, 0x0000, 0x03c5, 0x0300, 0x03cd, 0x0000,
+    0x03c9, 0x0300, 0x03ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
     /* 0x1f80 .. 0x1f8f */
     0x1f00, 0x0345, 0x1f01, 0x0345, 0x1f02, 0x0345, 0x1f03, 0x0345,
     0x1f04, 0x0345, 0x1f05, 0x0345, 0x1f06, 0x0345, 0x1f07, 0x0345,
@@ -593,28 +610,38 @@ static const WCHAR table[4704] =
     /* 0x1fb0 .. 0x1fbf */
     0x03b1, 0x0306, 0x03b1, 0x0304, 0x1f70, 0x0345, 0x03b1, 0x0345,
     0x03ac, 0x0345, 0x0000, 0x0000, 0x03b1, 0x0342, 0x1fb6, 0x0345,
-    0x0391, 0x0306, 0x0391, 0x0304, 0x0391, 0x0300, 0x0000, 0x0000,
-    0x0391, 0x0345, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0391, 0x0306, 0x0391, 0x0304, 0x0391, 0x0300, 0x0386, 0x0000,
+    0x0391, 0x0345, 0x0000, 0x0000, 0x03b9, 0x0000, 0x0000, 0x0000,
     /* 0x1fc0 .. 0x1fcf */
     0x0000, 0x0000, 0x00a8, 0x0342, 0x1f74, 0x0345, 0x03b7, 0x0345,
     0x03ae, 0x0345, 0x0000, 0x0000, 0x03b7, 0x0342, 0x1fc6, 0x0345,
-    0x0395, 0x0300, 0x0000, 0x0000, 0x0397, 0x0300, 0x0000, 0x0000,
+    0x0395, 0x0300, 0x0388, 0x0000, 0x0397, 0x0300, 0x0389, 0x0000,
     0x0397, 0x0345, 0x1fbf, 0x0300, 0x1fbf, 0x0301, 0x1fbf, 0x0342,
     /* 0x1fd0 .. 0x1fdf */
-    0x03b9, 0x0306, 0x03b9, 0x0304, 0x03ca, 0x0300, 0x0000, 0x0000,
+    0x03b9, 0x0306, 0x03b9, 0x0304, 0x03ca, 0x0300, 0x0390, 0x0000,
     0x0000, 0x0000, 0x0000, 0x0000, 0x03b9, 0x0342, 0x03ca, 0x0342,
-    0x0399, 0x0306, 0x0399, 0x0304, 0x0399, 0x0300, 0x0000, 0x0000,
+    0x0399, 0x0306, 0x0399, 0x0304, 0x0399, 0x0300, 0x038a, 0x0000,
     0x0000, 0x0000, 0x1ffe, 0x0300, 0x1ffe, 0x0301, 0x1ffe, 0x0342,
     /* 0x1fe0 .. 0x1fef */
-    0x03c5, 0x0306, 0x03c5, 0x0304, 0x03cb, 0x0300, 0x0000, 0x0000,
+    0x03c5, 0x0306, 0x03c5, 0x0304, 0x03cb, 0x0300, 0x03b0, 0x0000,
     0x03c1, 0x0313, 0x03c1, 0x0314, 0x03c5, 0x0342, 0x03cb, 0x0342,
-    0x03a5, 0x0306, 0x03a5, 0x0304, 0x03a5, 0x0300, 0x0000, 0x0000,
-    0x03a1, 0x0314, 0x00a8, 0x0300, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x03a5, 0x0306, 0x03a5, 0x0304, 0x03a5, 0x0300, 0x038e, 0x0000,
+    0x03a1, 0x0314, 0x00a8, 0x0300, 0x0385, 0x0000, 0x0060, 0x0000,
     /* 0x1ff0 .. 0x1fff */
     0x0000, 0x0000, 0x0000, 0x0000, 0x1f7c, 0x0345, 0x03c9, 0x0345,
     0x03ce, 0x0345, 0x0000, 0x0000, 0x03c9, 0x0342, 0x1ff6, 0x0345,
-    0x039f, 0x0300, 0x0000, 0x0000, 0x03a9, 0x0300, 0x0000, 0x0000,
-    0x03a9, 0x0345, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x039f, 0x0300, 0x038c, 0x0000, 0x03a9, 0x0300, 0x038f, 0x0000,
+    0x03a9, 0x0345, 0x00b4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x2000 .. 0x200f */
+    0x2002, 0x0000, 0x2003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x2120 .. 0x212f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x03a9, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x004b, 0x0000, 0x00c5, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
     /* 0x2190 .. 0x219f */
     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -670,6 +697,11 @@ static const WCHAR table[4704] =
     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
     0x0000, 0x0000, 0x0000, 0x0000, 0x22b2, 0x0338, 0x22b3, 0x0338,
     0x22b4, 0x0338, 0x22b5, 0x0338, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x2320 .. 0x232f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x3008, 0x0000, 0x3009, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
     /* 0x2ad0 .. 0x2adf */
     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -725,6 +757,156 @@ static const WCHAR table[4704] =
     0x30a6, 0x3099, 0x0000, 0x0000, 0x0000, 0x0000, 0x30ef, 0x3099,
     0x30f0, 0x3099, 0x30f1, 0x3099, 0x30f2, 0x3099, 0x0000, 0x0000,
     0x0000, 0x0000, 0x0000, 0x0000, 0x30fd, 0x3099, 0x0000, 0x0000,
+    /* 0xf900 .. 0xf90f */
+    0x8c48, 0x0000, 0x66f4, 0x0000, 0x8eca, 0x0000, 0x8cc8, 0x0000,
+    0x6ed1, 0x0000, 0x4e32, 0x0000, 0x53e5, 0x0000, 0x9f9c, 0x0000,
+    0x9f9c, 0x0000, 0x5951, 0x0000, 0x91d1, 0x0000, 0x5587, 0x0000,
+    0x5948, 0x0000, 0x61f6, 0x0000, 0x7669, 0x0000, 0x7f85, 0x0000,
+    /* 0xf910 .. 0xf91f */
+    0x863f, 0x0000, 0x87ba, 0x0000, 0x88f8, 0x0000, 0x908f, 0x0000,
+    0x6a02, 0x0000, 0x6d1b, 0x0000, 0x70d9, 0x0000, 0x73de, 0x0000,
+    0x843d, 0x0000, 0x916a, 0x0000, 0x99f1, 0x0000, 0x4e82, 0x0000,
+    0x5375, 0x0000, 0x6b04, 0x0000, 0x721b, 0x0000, 0x862d, 0x0000,
+    /* 0xf920 .. 0xf92f */
+    0x9e1e, 0x0000, 0x5d50, 0x0000, 0x6feb, 0x0000, 0x85cd, 0x0000,
+    0x8964, 0x0000, 0x62c9, 0x0000, 0x81d8, 0x0000, 0x881f, 0x0000,
+    0x5eca, 0x0000, 0x6717, 0x0000, 0x6d6a, 0x0000, 0x72fc, 0x0000,
+    0x90ce, 0x0000, 0x4f86, 0x0000, 0x51b7, 0x0000, 0x52de, 0x0000,
+    /* 0xf930 .. 0xf93f */
+    0x64c4, 0x0000, 0x6ad3, 0x0000, 0x7210, 0x0000, 0x76e7, 0x0000,
+    0x8001, 0x0000, 0x8606, 0x0000, 0x865c, 0x0000, 0x8def, 0x0000,
+    0x9732, 0x0000, 0x9b6f, 0x0000, 0x9dfa, 0x0000, 0x788c, 0x0000,
+    0x797f, 0x0000, 0x7da0, 0x0000, 0x83c9, 0x0000, 0x9304, 0x0000,
+    /* 0xf940 .. 0xf94f */
+    0x9e7f, 0x0000, 0x8ad6, 0x0000, 0x58df, 0x0000, 0x5f04, 0x0000,
+    0x7c60, 0x0000, 0x807e, 0x0000, 0x7262, 0x0000, 0x78ca, 0x0000,
+    0x8cc2, 0x0000, 0x96f7, 0x0000, 0x58d8, 0x0000, 0x5c62, 0x0000,
+    0x6a13, 0x0000, 0x6dda, 0x0000, 0x6f0f, 0x0000, 0x7d2f, 0x0000,
+    /* 0xf950 .. 0xf95f */
+    0x7e37, 0x0000, 0x964b, 0x0000, 0x52d2, 0x0000, 0x808b, 0x0000,
+    0x51dc, 0x0000, 0x51cc, 0x0000, 0x7a1c, 0x0000, 0x7dbe, 0x0000,
+    0x83f1, 0x0000, 0x9675, 0x0000, 0x8b80, 0x0000, 0x62cf, 0x0000,
+    0x6a02, 0x0000, 0x8afe, 0x0000, 0x4e39, 0x0000, 0x5be7, 0x0000,
+    /* 0xf960 .. 0xf96f */
+    0x6012, 0x0000, 0x7387, 0x0000, 0x7570, 0x0000, 0x5317, 0x0000,
+    0x78fb, 0x0000, 0x4fbf, 0x0000, 0x5fa9, 0x0000, 0x4e0d, 0x0000,
+    0x6ccc, 0x0000, 0x6578, 0x0000, 0x7d22, 0x0000, 0x53c3, 0x0000,
+    0x585e, 0x0000, 0x7701, 0x0000, 0x8449, 0x0000, 0x8aaa, 0x0000,
+    /* 0xf970 .. 0xf97f */
+    0x6bba, 0x0000, 0x8fb0, 0x0000, 0x6c88, 0x0000, 0x62fe, 0x0000,
+    0x82e5, 0x0000, 0x63a0, 0x0000, 0x7565, 0x0000, 0x4eae, 0x0000,
+    0x5169, 0x0000, 0x51c9, 0x0000, 0x6881, 0x0000, 0x7ce7, 0x0000,
+    0x826f, 0x0000, 0x8ad2, 0x0000, 0x91cf, 0x0000, 0x52f5, 0x0000,
+    /* 0xf980 .. 0xf98f */
+    0x5442, 0x0000, 0x5973, 0x0000, 0x5eec, 0x0000, 0x65c5, 0x0000,
+    0x6ffe, 0x0000, 0x792a, 0x0000, 0x95ad, 0x0000, 0x9a6a, 0x0000,
+    0x9e97, 0x0000, 0x9ece, 0x0000, 0x529b, 0x0000, 0x66c6, 0x0000,
+    0x6b77, 0x0000, 0x8f62, 0x0000, 0x5e74, 0x0000, 0x6190, 0x0000,
+    /* 0xf990 .. 0xf99f */
+    0x6200, 0x0000, 0x649a, 0x0000, 0x6f23, 0x0000, 0x7149, 0x0000,
+    0x7489, 0x0000, 0x79ca, 0x0000, 0x7df4, 0x0000, 0x806f, 0x0000,
+    0x8f26, 0x0000, 0x84ee, 0x0000, 0x9023, 0x0000, 0x934a, 0x0000,
+    0x5217, 0x0000, 0x52a3, 0x0000, 0x54bd, 0x0000, 0x70c8, 0x0000,
+    /* 0xf9a0 .. 0xf9af */
+    0x88c2, 0x0000, 0x8aaa, 0x0000, 0x5ec9, 0x0000, 0x5ff5, 0x0000,
+    0x637b, 0x0000, 0x6bae, 0x0000, 0x7c3e, 0x0000, 0x7375, 0x0000,
+    0x4ee4, 0x0000, 0x56f9, 0x0000, 0x5be7, 0x0000, 0x5dba, 0x0000,
+    0x601c, 0x0000, 0x73b2, 0x0000, 0x7469, 0x0000, 0x7f9a, 0x0000,
+    /* 0xf9b0 .. 0xf9bf */
+    0x8046, 0x0000, 0x9234, 0x0000, 0x96f6, 0x0000, 0x9748, 0x0000,
+    0x9818, 0x0000, 0x4f8b, 0x0000, 0x79ae, 0x0000, 0x91b4, 0x0000,
+    0x96b8, 0x0000, 0x60e1, 0x0000, 0x4e86, 0x0000, 0x50da, 0x0000,
+    0x5bee, 0x0000, 0x5c3f, 0x0000, 0x6599, 0x0000, 0x6a02, 0x0000,
+    /* 0xf9c0 .. 0xf9cf */
+    0x71ce, 0x0000, 0x7642, 0x0000, 0x84fc, 0x0000, 0x907c, 0x0000,
+    0x9f8d, 0x0000, 0x6688, 0x0000, 0x962e, 0x0000, 0x5289, 0x0000,
+    0x677b, 0x0000, 0x67f3, 0x0000, 0x6d41, 0x0000, 0x6e9c, 0x0000,
+    0x7409, 0x0000, 0x7559, 0x0000, 0x786b, 0x0000, 0x7d10, 0x0000,
+    /* 0xf9d0 .. 0xf9df */
+    0x985e, 0x0000, 0x516d, 0x0000, 0x622e, 0x0000, 0x9678, 0x0000,
+    0x502b, 0x0000, 0x5d19, 0x0000, 0x6dea, 0x0000, 0x8f2a, 0x0000,
+    0x5f8b, 0x0000, 0x6144, 0x0000, 0x6817, 0x0000, 0x7387, 0x0000,
+    0x9686, 0x0000, 0x5229, 0x0000, 0x540f, 0x0000, 0x5c65, 0x0000,
+    /* 0xf9e0 .. 0xf9ef */
+    0x6613, 0x0000, 0x674e, 0x0000, 0x68a8, 0x0000, 0x6ce5, 0x0000,
+    0x7406, 0x0000, 0x75e2, 0x0000, 0x7f79, 0x0000, 0x88cf, 0x0000,
+    0x88e1, 0x0000, 0x91cc, 0x0000, 0x96e2, 0x0000, 0x533f, 0x0000,
+    0x6eba, 0x0000, 0x541d, 0x0000, 0x71d0, 0x0000, 0x7498, 0x0000,
+    /* 0xf9f0 .. 0xf9ff */
+    0x85fa, 0x0000, 0x96a3, 0x0000, 0x9c57, 0x0000, 0x9e9f, 0x0000,
+    0x6797, 0x0000, 0x6dcb, 0x0000, 0x81e8, 0x0000, 0x7acb, 0x0000,
+    0x7b20, 0x0000, 0x7c92, 0x0000, 0x72c0, 0x0000, 0x7099, 0x0000,
+    0x8b58, 0x0000, 0x4ec0, 0x0000, 0x8336, 0x0000, 0x523a, 0x0000,
+    /* 0xfa00 .. 0xfa0f */
+    0x5207, 0x0000, 0x5ea6, 0x0000, 0x62d3, 0x0000, 0x7cd6, 0x0000,
+    0x5b85, 0x0000, 0x6d1e, 0x0000, 0x66b4, 0x0000, 0x8f3b, 0x0000,
+    0x884c, 0x0000, 0x964d, 0x0000, 0x898b, 0x0000, 0x5ed3, 0x0000,
+    0x5140, 0x0000, 0x55c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0xfa10 .. 0xfa1f */
+    0x585a, 0x0000, 0x0000, 0x0000, 0x6674, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x51de, 0x0000, 0x732a, 0x0000, 0x76ca, 0x0000,
+    0x793c, 0x0000, 0x795e, 0x0000, 0x7965, 0x0000, 0x798f, 0x0000,
+    0x9756, 0x0000, 0x7cbe, 0x0000, 0x7fbd, 0x0000, 0x0000, 0x0000,
+    /* 0xfa20 .. 0xfa2f */
+    0x8612, 0x0000, 0x0000, 0x0000, 0x8af8, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x9038, 0x0000, 0x90fd, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x98ef, 0x0000, 0x98fc, 0x0000,
+    0x9928, 0x0000, 0x9db4, 0x0000, 0x90de, 0x0000, 0x96b7, 0x0000,
+    /* 0xfa30 .. 0xfa3f */
+    0x4fae, 0x0000, 0x50e7, 0x0000, 0x514d, 0x0000, 0x52c9, 0x0000,
+    0x52e4, 0x0000, 0x5351, 0x0000, 0x559d, 0x0000, 0x5606, 0x0000,
+    0x5668, 0x0000, 0x5840, 0x0000, 0x58a8, 0x0000, 0x5c64, 0x0000,
+    0x5c6e, 0x0000, 0x6094, 0x0000, 0x6168, 0x0000, 0x618e, 0x0000,
+    /* 0xfa40 .. 0xfa4f */
+    0x61f2, 0x0000, 0x654f, 0x0000, 0x65e2, 0x0000, 0x6691, 0x0000,
+    0x6885, 0x0000, 0x6d77, 0x0000, 0x6e1a, 0x0000, 0x6f22, 0x0000,
+    0x716e, 0x0000, 0x722b, 0x0000, 0x7422, 0x0000, 0x7891, 0x0000,
+    0x793e, 0x0000, 0x7949, 0x0000, 0x7948, 0x0000, 0x7950, 0x0000,
+    /* 0xfa50 .. 0xfa5f */
+    0x7956, 0x0000, 0x795d, 0x0000, 0x798d, 0x0000, 0x798e, 0x0000,
+    0x7a40, 0x0000, 0x7a81, 0x0000, 0x7bc0, 0x0000, 0x7df4, 0x0000,
+    0x7e09, 0x0000, 0x7e41, 0x0000, 0x7f72, 0x0000, 0x8005, 0x0000,
+    0x81ed, 0x0000, 0x8279, 0x0000, 0x8279, 0x0000, 0x8457, 0x0000,
+    /* 0xfa60 .. 0xfa6f */
+    0x8910, 0x0000, 0x8996, 0x0000, 0x8b01, 0x0000, 0x8b39, 0x0000,
+    0x8cd3, 0x0000, 0x8d08, 0x0000, 0x8fb6, 0x0000, 0x9038, 0x0000,
+    0x96e3, 0x0000, 0x97ff, 0x0000, 0x983b, 0x0000, 0x6075, 0x0000,
+    0x0000, 0x0000, 0x8218, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0xfa70 .. 0xfa7f */
+    0x4e26, 0x0000, 0x51b5, 0x0000, 0x5168, 0x0000, 0x4f80, 0x0000,
+    0x5145, 0x0000, 0x5180, 0x0000, 0x52c7, 0x0000, 0x52fa, 0x0000,
+    0x559d, 0x0000, 0x5555, 0x0000, 0x5599, 0x0000, 0x55e2, 0x0000,
+    0x585a, 0x0000, 0x58b3, 0x0000, 0x5944, 0x0000, 0x5954, 0x0000,
+    /* 0xfa80 .. 0xfa8f */
+    0x5a62, 0x0000, 0x5b28, 0x0000, 0x5ed2, 0x0000, 0x5ed9, 0x0000,
+    0x5f69, 0x0000, 0x5fad, 0x0000, 0x60d8, 0x0000, 0x614e, 0x0000,
+    0x6108, 0x0000, 0x618e, 0x0000, 0x6160, 0x0000, 0x61f2, 0x0000,
+    0x6234, 0x0000, 0x63c4, 0x0000, 0x641c, 0x0000, 0x6452, 0x0000,
+    /* 0xfa90 .. 0xfa9f */
+    0x6556, 0x0000, 0x6674, 0x0000, 0x6717, 0x0000, 0x671b, 0x0000,
+    0x6756, 0x0000, 0x6b79, 0x0000, 0x6bba, 0x0000, 0x6d41, 0x0000,
+    0x6edb, 0x0000, 0x6ecb, 0x0000, 0x6f22, 0x0000, 0x701e, 0x0000,
+    0x716e, 0x0000, 0x77a7, 0x0000, 0x7235, 0x0000, 0x72af, 0x0000,
+    /* 0xfaa0 .. 0xfaaf */
+    0x732a, 0x0000, 0x7471, 0x0000, 0x7506, 0x0000, 0x753b, 0x0000,
+    0x761d, 0x0000, 0x761f, 0x0000, 0x76ca, 0x0000, 0x76db, 0x0000,
+    0x76f4, 0x0000, 0x774a, 0x0000, 0x7740, 0x0000, 0x78cc, 0x0000,
+    0x7ab1, 0x0000, 0x7bc0, 0x0000, 0x7c7b, 0x0000, 0x7d5b, 0x0000,
+    /* 0xfab0 .. 0xfabf */
+    0x7df4, 0x0000, 0x7f3e, 0x0000, 0x8005, 0x0000, 0x8352, 0x0000,
+    0x83ef, 0x0000, 0x8779, 0x0000, 0x8941, 0x0000, 0x8986, 0x0000,
+    0x8996, 0x0000, 0x8abf, 0x0000, 0x8af8, 0x0000, 0x8acb, 0x0000,
+    0x8b01, 0x0000, 0x8afe, 0x0000, 0x8aed, 0x0000, 0x8b39, 0x0000,
+    /* 0xfac0 .. 0xfacf */
+    0x8b8a, 0x0000, 0x8d08, 0x0000, 0x8f38, 0x0000, 0x9072, 0x0000,
+    0x9199, 0x0000, 0x9276, 0x0000, 0x967c, 0x0000, 0x96e3, 0x0000,
+    0x9756, 0x0000, 0x97db, 0x0000, 0x97ff, 0x0000, 0x980b, 0x0000,
+    0x983b, 0x0000, 0x9b12, 0x0000, 0x9f9c, 0x0000, 0x0000, 0x0000,
+    /* 0xfad0 .. 0xfadf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x3b9d, 0x0000, 0x4018, 0x0000,
+    0x4039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x9f43, 0x0000, 0x9f8e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
     /* 0xfb10 .. 0xfb1f */
     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -2041,7 +2223,7 @@ unsigned int DECLSPEC_HIDDEN wine_decompose( int flags, WCHAR ch, WCHAR *dst, un
     if (!ptr)
     {
         ptr = table + table[table[ch >> 8] + ((ch >> 4) & 0x0f)] + 2 * (ch & 0xf);
-        len = 2;
+        len = ptr[1] ? 2 : 1;
     }
 
     if (!*ptr) return 1;
diff --git a/tools/make_unicode b/tools/make_unicode
index 3a9fefe474..dbf640abe7 100755
--- a/tools/make_unicode
+++ b/tools/make_unicode
@@ -528,11 +528,19 @@ sub READ_DEFAULTS($)
                 $decomp_table[$src] = [ hex $1, hex $2 ];
                 push @compose_table, [ hex $1, hex $2, $src ];
             }
-            elsif ($decomp =~ /^(<[a-z]+>\s)*([0-9a-fA-F]+)$/ &&
-                   (($src >= 0xf900 && $src < 0xfb00) || ($src >= 0xfe30 && $src < 0xfffd)))
+            elsif ($decomp =~ /^([0-9a-fA-F]+)$/)
             {
-                # Single char decomposition in the compatibility range
-                $compatmap_table[$src] = hex $2;
+                # Single char decomposition
+                if (hex $1 < 65536)
+                {
+                    $decomp_table[$src] = [ hex $1, 0 ];
+                }
+
+                if (($src >= 0xf900 && $src < 0xfb00) || ($src >= 0xfe30 && $src < 0xfffd))
+                {
+                    # Single char decomposition in the compatibility range
+                    $compatmap_table[$src] = hex $1;
+                }
             }
         }
         else
@@ -2494,7 +2502,7 @@ unsigned int DECLSPEC_HIDDEN wine_decompose( int flags, WCHAR ch, WCHAR *dst, un
     if (!ptr)
     {
         ptr = table + table[table[ch >> 8] + ((ch >> 4) & 0x0f)] + 2 * (ch & 0xf);
-        len = 2;
+        len = ptr[1] ? 2 : 1;
     }
 
     if (!*ptr) return 1;
-- 
2.18.0




More information about the wine-devel mailing list