bug-gnulib@gnu.org mirror (unofficial)
 help / color / mirror / Atom feed
* unictype/mirror: Update to Unicode 15.1.0
@ 2024-02-23 17:52 Bruno Haible
  0 siblings, 0 replies; only message in thread
From: Bruno Haible @ 2024-02-23 17:52 UTC (permalink / raw)
  To: bug-gnulib

The data for the Unicode character mirroring was not up-to-date, because
the data table was fixed in the code. But new mirroring pairs were added
in Unicode 5.0.0 (10), 5.1.0 (5), 6.1.0 (1), 11.1.0 (28), 14.0.0 (4).

This patch fixes it.


2024-02-23  Bruno Haible  <bruno@clisp.org>

	unictype/mirror: Update to Unicode 15.1.0.
	Reported by Daurnimator <quae@daurnimator.com> in
	<https://lists.gnu.org/archive/html/bug-libunistring/2016-11/msg00010.html>.
	* lib/gen-uni-tables.c (struct mirror_pair): New type.
	(mirror_pairs): Don't initialize statically.
	(mirror_pairs_count): New variable.
	(fill_mirror): New function.
	(get_mirror_value): Update.
	(main): Expect the file name of BidiMirroring.txt as command-line
	argument. Invoke fill_mirror.
	* lib/unictype/mirror.h: Regenerated.

diff --git a/lib/gen-uni-tables.c b/lib/gen-uni-tables.c
index 90d33abab1..3ebcd833ff 100644
--- a/lib/gen-uni-tables.c
+++ b/lib/gen-uni-tables.c
@@ -26,6 +26,7 @@
                       /usr/local/share/www.unicode.org/Public/15.1.0/ucd/Scripts.txt \
                       /usr/local/share/www.unicode.org/Public/15.1.0/ucd/Blocks.txt \
                       /usr/local/share/www.unicode.org/Public/3.0-Update1/PropList-3.0.1.txt \
+                      /usr/local/share/www.unicode.org/Public/15.1.0/ucd/BidiMirroring.txt \
                       /usr/local/share/www.unicode.org/Public/15.1.0/ucd/EastAsianWidth.txt \
                       /usr/local/share/www.unicode.org/Public/15.1.0/ucd/LineBreak.txt \
                       /usr/local/share/www.unicode.org/Public/15.1.0/ucd/auxiliary/WordBreakProperty.txt \
@@ -2440,63 +2441,167 @@ output_numeric (const char *filename, const char *version)
 /* See Unicode 3.0 book, section 4.7,
        UAX #9.  */
 
-/* List of mirrored character pairs.  This is a subset of the characters
-   having the BidiMirrored property.  */
-static unsigned int mirror_pairs[][2] =
-{
-  { 0x0028, 0x0029 },
-  { 0x003C, 0x003E },
-  { 0x005B, 0x005D },
-  { 0x007B, 0x007D },
-  { 0x00AB, 0x00BB },
-  { 0x2039, 0x203A },
-  { 0x2045, 0x2046 },
-  { 0x207D, 0x207E },
-  { 0x208D, 0x208E },
-  { 0x2208, 0x220B },
-  { 0x220A, 0x220D },
-  { 0x223C, 0x223D },
-  { 0x2243, 0x22CD },
-  { 0x2252, 0x2253 },
-  { 0x2254, 0x2255 },
-  { 0x2264, 0x2265 },
-  { 0x2266, 0x2267 },
-  { 0x226A, 0x226B },
-  { 0x2276, 0x2277 },
-  { 0x2278, 0x2279 },
-  { 0x227A, 0x227B },
-  { 0x227C, 0x227D },
-  { 0x2282, 0x2283 },
-  { 0x2286, 0x2287 },
-  { 0x228F, 0x2290 },
-  { 0x2291, 0x2292 },
-  { 0x22A2, 0x22A3 },
-  { 0x22B0, 0x22B1 },
-  { 0x22B2, 0x22B3 },
-  { 0x22B4, 0x22B5 },
-  { 0x22B6, 0x22B7 },
-  { 0x22C9, 0x22CA },
-  { 0x22CB, 0x22CC },
-  { 0x22D0, 0x22D1 },
-  { 0x22D6, 0x22D7 },
-  { 0x22D8, 0x22D9 },
-  { 0x22DA, 0x22DB },
-  { 0x22DC, 0x22DD },
-  { 0x22DE, 0x22DF },
-  { 0x22F0, 0x22F1 },
-  { 0x2308, 0x2309 },
-  { 0x230A, 0x230B },
-  { 0x2329, 0x232A },
-  { 0x3008, 0x3009 },
-  { 0x300A, 0x300B },
-  { 0x300C, 0x300D },
-  { 0x300E, 0x300F },
-  { 0x3010, 0x3011 },
-  { 0x3014, 0x3015 },
-  { 0x3016, 0x3017 },
-  { 0x3018, 0x3019 },
-  { 0x301A, 0x301B }
-};
+/* A pair of mirrored characters.  */
+struct mirror_pair { unsigned int uc[2]; };
+
+/* List of mirrored character pairs, from the BidiMirroring.txt file.
+   This is a subset of the characters having the BidiMirrored property.  */
+static struct mirror_pair mirror_pairs[1000];
+static unsigned int mirror_pairs_count;
+
+/* Stores in mirror_pairs[] the mirrored character pairs from the
+   BidiMirroring.txt file.  */
+static void
+fill_mirror (const char *bidimirroring_filename)
+{
+  FILE *stream;
+  char field0[FIELDLEN];
+  char field1[FIELDLEN];
+  char field2[FIELDLEN];
+  int lineno = 0;
+
+  stream = fopen (bidimirroring_filename, "r");
+  if (stream == NULL)
+    {
+      fprintf (stderr, "error during fopen of '%s'\n", bidimirroring_filename);
+      exit (1);
+    }
+
+  mirror_pairs_count = 0;
+  for (;;)
+    {
+      int n;
+      int c;
+      unsigned int uc1;
+      unsigned int uc2;
+      unsigned int i;
+
+      lineno++;
+      c = getc (stream);
+      if (c == EOF)
+        break;
+      if (c == '\n')
+        continue;
+      if (c == '#')
+        {
+          do c = getc (stream); while (c != EOF && c != '\n');
+          continue;
+        }
+      ungetc (c, stream);
+      n = getfield (stream, field0, ';');
+      do c = getc (stream); while (c == ' ');
+      ungetc (c, stream);
+      n += getfield (stream, field1, '#');
+      n += getfield (stream, field2, '\n');
+      if (n == 0)
+        break;
+      if (n != 3)
+        {
+          fprintf (stderr, "short line in '%s':%d\n",
+                   bidimirroring_filename, lineno);
+          exit (1);
+        }
+      /* Remove trailing spaces from field1.  */
+      while (strlen (field1) > 0 && field1[strlen (field1) - 1] == ' ')
+        field1[strlen (field1) - 1] = '\0';
+      /* The line should contain two characters.  */
+      uc1 = strtoul (field0, NULL, 16);
+      uc2 = strtoul (field1, NULL, 16);
+      if (uc1 == 0 || uc2 == 0 || uc1 == uc2)
+        {
+          fprintf (stderr, "parse error at '%s':%d\n",
+                   bidimirroring_filename, lineno);
+          exit (1);
+        }
+      /* Verify that uc1 and uc2 are in range.  */
+      if (!(uc1 < 0x110000))
+        {
+          fprintf (stderr, "%s mentions 0x%04X, which is out-of-range.\n",
+                   bidimirroring_filename, uc1);
+          exit (1);
+        }
+      if (!(uc2 < 0x110000))
+        {
+          fprintf (stderr, "%s mentions 0x%04X, which is out-of-range.\n",
+                   bidimirroring_filename, uc2);
+          exit (1);
+        }
+      /* Have we seen uc1 or uc2 already?  */
+      for (i = 0; i < mirror_pairs_count; i++)
+        {
+          if (uc1 == mirror_pairs[i].uc[0])
+            {
+              fprintf (stderr, "%s: mapping conflict for 0x%04X\n",
+                       bidimirroring_filename, uc1);
+              exit (1);
+            }
+          if (uc2 == mirror_pairs[i].uc[1])
+            {
+              fprintf (stderr, "%s: mapping conflict for 0x%04X\n",
+                       bidimirroring_filename, uc2);
+              exit (1);
+            }
+        }
+      for (i = 0; i < mirror_pairs_count; i++)
+        if (uc1 == mirror_pairs[i].uc[1] || uc2 == mirror_pairs[i].uc[0])
+          break;
+      if (i < mirror_pairs_count)
+        {
+          if (uc1 != mirror_pairs[i].uc[1])
+            {
+              /* uc1 != mirror_pairs[i].uc[1], uc2 == mirror_pairs[i].uc[0] */
+              fprintf (stderr, "%s: mapping conflict for 0x%04X\n",
+                       bidimirroring_filename, uc2);
+              exit (1);
+            }
+          if (uc2 != mirror_pairs[i].uc[0])
+            {
+              /* uc1 == mirror_pairs[i].uc[1], uc2 != mirror_pairs[i].uc[0] */
+              fprintf (stderr, "%s: mapping conflict for 0x%04X\n",
+                       bidimirroring_filename, uc1);
+              exit (1);
+            }
+          /* uc1 == mirror_pairs[i].uc[1], uc2 == mirror_pairs[i].uc[0].
+             (uc1, uc2) is the reverse pair of a pair that we already had
+             encountered: (uc2, uc1).  */
+        }
+      else
+        {
+          /* A new pair.  */
+          if (mirror_pairs_count == SIZEOF (mirror_pairs))
+            {
+              fprintf (stderr, "%s contains more pairs than expected, "
+                       "increase mirror_pairs' size.\n",
+                       bidimirroring_filename);
+              exit (1);
+            }
+          mirror_pairs[mirror_pairs_count].uc[0] = uc1;
+          mirror_pairs[mirror_pairs_count].uc[1] = uc2;
+          mirror_pairs_count++;
+        }
+      /* Verify that uc1 and uc2 have the BidiMirrored property.  */
+      if (!(unicode_attributes[uc1].name != NULL
+            && unicode_attributes[uc1].mirrored))
+        {
+          fprintf (stderr, "%s mentions 0x%04X, which is not BidiMirrored\n",
+                           bidimirroring_filename, uc1);
+          exit (1);
+        }
+      if (!(unicode_attributes[uc2].name != NULL
+            && unicode_attributes[uc2].mirrored))
+        {
+          fprintf (stderr, "%s mentions 0x%04X, which is not BidiMirrored\n",
+                           bidimirroring_filename, uc2);
+          exit (1);
+        }
+    }
+
+  if (ferror (stream) || fclose (stream))
+    {
+      fprintf (stderr, "error reading from '%s'\n", bidimirroring_filename);
+      exit (1);
+    }
+}
 
 static int
 get_mirror_value (unsigned int ch)
@@ -2508,15 +2613,15 @@ get_mirror_value (unsigned int ch)
   mirrored = (unicode_attributes[ch].name != NULL
               && unicode_attributes[ch].mirrored);
   mirror_char = 0xfffd;
-  for (i = 0; i < sizeof (mirror_pairs) / sizeof (mirror_pairs[0]); i++)
-    if (ch == mirror_pairs[i][0])
+  for (i = 0; i < mirror_pairs_count; i++)
+    if (ch == mirror_pairs[i].uc[0])
       {
-        mirror_char = mirror_pairs[i][1];
+        mirror_char = mirror_pairs[i].uc[1];
         break;
       }
-    else if (ch == mirror_pairs[i][1])
+    else if (ch == mirror_pairs[i].uc[1])
       {
-        mirror_char = mirror_pairs[i][0];
+        mirror_char = mirror_pairs[i].uc[0];
         break;
       }
   if (mirrored)
@@ -11829,6 +11934,7 @@ main (int argc, char * argv[])
   const char *scripts_filename;
   const char *blocks_filename;
   const char *proplist30_filename;
+  const char *bidimirroring_filename;
   const char *eastasianwidth_filename;
   const char *linebreak_filename;
   const char *wordbreakproperty_filename;
@@ -11838,9 +11944,9 @@ main (int argc, char * argv[])
   const char *casefolding_filename;
   const char *version;
 
-  if (argc != 17)
+  if (argc != 18)
     {
-      fprintf (stderr, "Usage: %s UnicodeData.txt PropList.txt DerivedCoreProperties.txt emoji-data.txt ArabicShaping.txt Scripts.txt Blocks.txt PropList-3.0.1.txt EastAsianWidth.txt LineBreak.txt WordBreakProperty.txt GraphemeBreakProperty.txt CompositionExclusions.txt SpecialCasing.txt CaseFolding.txt version\n",
+      fprintf (stderr, "Usage: %s UnicodeData.txt PropList.txt DerivedCoreProperties.txt emoji-data.txt ArabicShaping.txt Scripts.txt Blocks.txt PropList-3.0.1.txt BidiMirroring.txt EastAsianWidth.txt LineBreak.txt WordBreakProperty.txt GraphemeBreakProperty.txt CompositionExclusions.txt SpecialCasing.txt CaseFolding.txt version\n",
                argv[0]);
       exit (1);
     }
@@ -11853,14 +11959,15 @@ main (int argc, char * argv[])
   scripts_filename = argv[6];
   blocks_filename = argv[7];
   proplist30_filename = argv[8];
-  eastasianwidth_filename = argv[9];
-  linebreak_filename = argv[10];
-  wordbreakproperty_filename = argv[11];
-  graphemebreakproperty_filename = argv[12];
-  compositionexclusions_filename = argv[13];
-  specialcasing_filename = argv[14];
-  casefolding_filename = argv[15];
-  version = argv[16];
+  bidimirroring_filename = argv[9];
+  eastasianwidth_filename = argv[10];
+  linebreak_filename = argv[11];
+  wordbreakproperty_filename = argv[12];
+  graphemebreakproperty_filename = argv[13];
+  compositionexclusions_filename = argv[14];
+  specialcasing_filename = argv[15];
+  casefolding_filename = argv[16];
+  version = argv[17];
 
   fill_attributes (unicodedata_filename);
   clear_properties ();
@@ -11871,6 +11978,7 @@ main (int argc, char * argv[])
   fill_arabicshaping (arabicshaping_filename);
   fill_scripts (scripts_filename);
   fill_blocks (blocks_filename);
+  fill_mirror (bidimirroring_filename);
   fill_width (eastasianwidth_filename);
   fill_org_lbp (linebreak_filename);
   fill_org_wbp (wordbreakproperty_filename);
@@ -11954,6 +12062,7 @@ main (int argc, char * argv[])
  *        /media/nas/bruno/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/15.1.0/ucd/Scripts.txt \\
  *        /media/nas/bruno/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/15.1.0/ucd/Blocks.txt \\
  *        /media/nas/bruno/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/3.0.1/PropList-3.0.1.txt \\
+ *        /media/nas/bruno/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/15.1.0/ucd/BidiMirroring.txt \\
  *        /media/nas/bruno/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/15.1.0/ucd/EastAsianWidth.txt \\
  *        /media/nas/bruno/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/15.1.0/ucd/LineBreak.txt \\
  *        /media/nas/bruno/www-archive/software/i18n/unicode/ftp.unicode.org/ArchiveVersions/15.1.0/ucd/auxiliary/WordBreakProperty.txt \\
diff --git a/lib/unictype/mirror.h b/lib/unictype/mirror.h
index 598fbc747b..b29241151c 100644
--- a/lib/unictype/mirror.h
+++ b/lib/unictype/mirror.h
@@ -210,7 +210,7 @@ u_mirror =
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-        0,     0, 61635, 61634, 61633, 61632,     0,     0,
+        0,     0,     1,    -1,     1,    -1,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
@@ -222,7 +222,7 @@ u_mirror =
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-        0,     0,     0, 59746, 59745,     0,     0,     0,
+        0,     0,     0,     1,    -1,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
@@ -284,37 +284,37 @@ u_mirror =
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0, 56828, 56827, 56826, 56825,     0,     0,     0,
-        3, 56820,     3,    -3, 56817,    -3,     0,     0,
-        0, 56812,     0,     0,     0, 56808, 56807,     0,
-        0,     0, 56803, 56802, 56801, 56800,     0, 56798,
-    56797, 56796, 56795,     0, 56793,     0, 56791,     0,
+        3,     3,     3,    -3,    -3,    -3,     0,     0,
+        0, 56812,     0,     0,     0,  2016, 56807,     0,
+        0,     0, 56803, 56802, 56801, 56800,     0,  2527,
+     1923,  1914,  1918,     0,  2250,     0, 56791,     0,
         0,     0,     0, 56786, 56785, 56784, 56783, 56782,
     56781, 56780, 56779, 56778,     0,     0,     0,     0,
         0, 56772,     0, 56770,     1,    -1, 56767, 56766,
-    56765, 56764, 56763,   138, 56761, 56760, 56759, 56758,
-    56757, 56756, 56755, 56754, 56753,     0,     0,     0,
+    56765, 56764, 56763,   138, 56761,     7, 56759, 56758,
+    56757, 56756, 56755, 56754,    -7,     0,     0,     0,
         0,     0,     1,    -1,     1,    -1,     0,     0,
         0,     0,     0,     0,     0,     0,     0, 56734,
     56733,     0, 56731,     0,     1,    -1,     1,    -1,
-    56725, 56724,     1,    -1,     0,     0, 56719, 56718,
-    56717, 56716, 56715, 56714, 56713, 56712,     1,    -1,
-        1,    -1,     1,    -1,     1,    -1, 56703, 56702,
-    56701, 56700,     1,    -1, 56697, 56696,     1,    -1,
-    56693, 56692, 56691, 56690, 56689,     0,     0,     1,
+        1,    -1,     1,    -1,     0,     0,     1,    -1,
+        1,    -1,     1,    -1,     1,    -1,     1,    -1,
+        1,    -1,     1,    -1,     1,    -1,     1,    -1,
+        1,    -1,     1,    -1,     1,    -1,     1,    -1,
+        1,    -1,     1,    -1, 56689,     0,     0,     1,
        -1,     1,    -1,     0,     0,     0,     0,     0,
-    56677,     0,     0,     0,     0,     0,     0,     0,
-        0,     0,     1,    -1,     0,     0, 56663, 56662,
-    56661, 56660, 56659, 56658, 56657, 56656, 56655, 56654,
+     1824,     0,     0,     0,     0,     0,     0,     0,
+        0,     0,     1,    -1,     0,     0,  2104, 56662,
+     2108,  2106, 56659,  2106, 56657, 56656, 56655, 56654,
         1,    -1,     1,    -1,     1,    -1,     1,    -1,
-    56645,     0,     0,     0,     0,     0, 56639, 56638,
+     1316,     0,     0,     0,     0,     0, 56639, 56638,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     1,    -1,     1,    -1,  -138,     0,     0,
         1,    -1,     0,     0,     0,     0,     1,    -1,
         1,    -1,     1,    -1,     1,    -1,     1,    -1,
-    56605, 56604, 56603, 56602, 56601, 56600, 56599, 56598,
-    56597, 56596, 56595, 56594, 56593, 56592,     0,     0,
-        1,    -1, 56587, 56586, 56585, 56584, 56583, 56582,
-    56581, 56580, 56579, 56578, 56577, 56576, 56575, 56574,
+        1,    -1,     1,    -1,     1,    -1,     1,    -1,
+        1,    -1,     1,    -1,     1,    -1,     0,     0,
+        1,    -1,     8,     8,     8, 56584,     7,     7,
+    56581, 56580,    -8,    -8,    -8,    -7,    -7, 56574,
         0,     0,     0,     0,     0,     0,     0,     0,
         1,    -1,     1,    -1,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
@@ -344,8 +344,8 @@ u_mirror =
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-    55445, 55444, 55443, 55442, 55441, 55440, 55439, 55438,
-    55437, 55436, 55435, 55434, 55433, 55432,     0,     0,
+        1,    -1,     1,    -1,     1,    -1,     1,    -1,
+        1,    -1,     1,    -1,     1,    -1,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
@@ -355,62 +355,62 @@ u_mirror =
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-    55357,     0,     0, 55354, 55353, 55352, 55351,     0,
-    55349, 55348,     0, 55346, 55345, 55344,     0,     0,
-        0,     0,     0, 55338, 55337, 55336, 55335,     0,
-        0,     0,     0,     0, 55329, 55328, 55327,     0,
-        0,     0, 55323, 55322, 55321, 55320, 55319, 55318,
-    55317, 55316, 55315, 55314, 55313, 55312, 55311, 55310,
+    55357,     0,     0,     1,    -1,     1,    -1,     0,
+        1,    -1,     0,     2, 55345,    -2,     0,     0,
+        0,     0,     0, 55338, 55337,     1,    -1,     0,
+        0,     0,     0,     0, -1316,     1,    -1,     0,
+        0,     0,     1,    -1,     1,    -1,     1,    -1,
+        1,    -1,     1,    -1,     1,    -1,     1,    -1,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-        0,     0,     0, 54906, 54905, 54904, 54903, 54902,
-    54901, 54900, 54899, 54898, 54897, 54896, 54895, 54894,
-    54893, 54892, 54891, 54890, 54889, 54888, 54887, 54886,
-    54885,     0,     0, 54882, 54881, 54880, 54879, 54878,
-    54877,     0, 54875, 54874, 54873, 54872, 54871, 54870,
-    54869, 54868, 54867, 54866, 54865, 54864, 54863, 54862,
+        0,     0,     0,     1,    -1,     1,    -1,     1,
+       -1,     1,    -1,     1,    -1,     3,     1,    -1,
+       -3,     1,    -1,     1,    -1,     1,    -1,     1,
+       -1,     0,     0, -1914, 54881, 54880, 54879, 54878,
+    -1918,     0, 54875, -1923,     1,    -1, 54871, 54870,
+        1,    -1,     1,    -1,     1,    -1,     1,    -1,
         0,     0,     0,     0,     0,     0,     0,     0,
-    54853,     0,     0,     0,     0,     0,     0,     0,
-    54845, 54844, 54843, 54842, 54841, 54840,     0,     0,
-        0, 54836,     0,     0,     0,     0, 54831, 54830,
-    54829, 54828, 54827,     0, 54825, 54824,     0,     0,
-    54821, 54820, 54819, 54818, 54817,     0,     0,     0,
+    -1824,     0,     0,     0,     0,     0,     0,     0,
+        1,    -1, 54843, 54842,     1,    -1,     0,     0,
+        0, 54836,     0,     0,     0,     0, 54831,     1,
+       -1,     1,    -1,     0,     1,    -1,     0,     0,
+        1,    -1,     1,    -1, 54817,     0,     0,     0,
         0, 54812,     0, 54810, 54809, 54808,     0,     0,
-    54805, 54804,     0,     0,     0,     0,     0,     0,
-        0,     0,     0,     0, 54793, 54792, 54791, 54790,
-    54789, 54788,     0,     0, 54785, 54784,     0,     0,
+        1,    -1,     0,     0,     0,     0,     0,     0,
+        0,     0,     0,     0, 54793, -2016, 54791, 54790,
+        1,    -1,     0,     0,     1,    -1,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0, 54771, 54770, 54769, 54768, 54767, 54766,
     54765, 54764, 54763, 54762, 54761, 54760, 54759, 54758,
     54757, 54756, 54755, 54754, 54753,     0, 54751, 54750,
     54749, 54748,     0,     0, 54745,     0, 54743,     0,
-        0, 54740,     0, 54738, 54737, 54736, 54735,     0,
-        0,     0,     0,     0, 54729, 54728,     0,     0,
-        0,     0,     0,     0, 54721, 54720, 54719,     0,
+        0, 54740,     0,     1,    -1,     1,    -1,     0,
+        0,     0,     0,     0,     1,    -1,     0,     0,
+        0,     0,     0,     0,     1,    -1, 54719,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0, 54694,
     54693,     0,     0,     0,     0,     0,     0,     0,
-        0,     0,     0,     0, 54681, 54680,     0,     0,
+        0,     0,     0,     0,     1,    -1,     0,     0,
         0,     0, 54675, 54674, 54673, 54672,     0, 54670,
     54669,     0,     0, 54666, 54665,     0,     0,     0,
-        0, 54660, 54659, 54658, 54657, 54656, 54655, 54654,
-    54653, 54652, 54651, 54650, 54649, 54648, 54647, 54646,
-    54645, 54644, 54643, 54642, 54641, 54640, 54639, 54638,
-    54637, 54636, 54635, 54634, 54633, 54632, 54631, 54630,
-    54629, 54628, 54627, 54626, 54625, 54624, 54623, 54622,
-    54621, 54620, 54619, 54618,     0,     0, 54615, 54614,
-    54613, 54612, 54611, 54610, 54609, 54608,     0, 54606,
-    54605, 54604, 54603, 54602, 54601, 54600, 54599, 54598,
-    54597, 54596, 54595, 54594, 54593, 54592, 54591, 54590,
-    54589, 54588, 54587, 54586, 54585, 54584, 54583, 54582,
-    54581, 54580, 54579, 54578, 54577, 54576, 54575, 54574,
-    54573, 54572, 54571, 54570, 54569, 54568, 54567,     0,
-        0,     0,     0,     0, 54561,     0, 54559,     0,
-        0,     0, 54555, 54554, 54553, 54552, 54551,     0,
-        0,     0,     0,     0, 54545, 54544, 54543,     0,
-        0,     0,     0, 54538,     0,     0,     0, 54534,
-    54533, 54532, 54531, 54530,     0, 54528,     0,     0,
+        0,     1,    -1,     1,    -1,     1,    -1,     1,
+       -1,     1,    -1,     1,    -1,     1,    -1,     1,
+       -1,     1,    -1,     1,    -1,     1,    -1,     1,
+       -1,     1,    -1,     1,    -1,     1,    -1,     1,
+       -1,     1,    -1,     1,    -1,     1,    -1,     1,
+       -1,     1,    -1, 54618,     0,     0,     1,    -1,
+        1,    -1,     1,    -1,     1,    -1,     0,     1,
+       -1,     1,    -1,     1,    -1,     1,    -1,     1,
+       -1,     1,    -1,     1,    -1,     1,    -1,     1,
+       -1,     1,    -1,     1,    -1,     1,    -1,     1,
+       -1,     1,    -1,     1,    -1,     1,    -1,     1,
+       -1,     1,    -1,     1,    -1,     1,    -1,     0,
+        0,     0,     0,     0, 54561,     0, -2104,     0,
+        0,     0, 54555, -2106, -2108, -2106, 54551,     0,
+        0,     0,     0,     0,     1,    -1, -2250,     0,
+        0,     0,     0, 54538,     0,     0,     0,     1,
+       -1,     1,    -1, 54530,     0, 54528,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
@@ -426,19 +426,19 @@ u_mirror =
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-        0,     0,     0,     0,     0,     0, 54271,     0,
-        0,     0, 53755, 53754, 53753, 53752,     0,     0,
-        0, 53748, 53747,     0, 53745, 53744,     0,     0,
+        0,     0,     0,     0,     0,     0, -2527,     0,
+        0,     0,     1,    -1,     1,    -1,     0,     0,
+        0,     1,    -1,     0,     1,    -1,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-        0,     0,     0,     0, 53729, 53728,     0,     0,
-    53725, 53724, 53723, 53722, 53721, 53720, 53719, 53718,
-    53717, 53716,     0,     0,     0,     0,     0,     0,
+        0,     0,     0,     0,     1,    -1,     0,     0,
+        1,    -1,     1,    -1,     1,    -1,     1,    -1,
+        1,    -1,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-        0,     0,     0,     0,     0, 53672, 53671, 53670,
-    53669, 53668, 53667, 53666, 53665,     0,     0,     0,
+        0,     0,     0,     0,     0,     1,    -1,     1,
+       -1,     1,    -1,     1,    -1,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
@@ -470,24 +470,24 @@ u_mirror =
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-        0,   420,   419,   418,   417,   416,   415,     0,
-        0,     0,     0,     0,   409,   408,     0,     0,
+        0,     1,    -1,     1,    -1,     1,    -1,     0,
+        0,     0,     0,     0,     1,    -1,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-      245,   244,     0,     0,     0,     0,     0,     0,
+        1,    -1,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-        0,     0,     0,     0,   225,     0,   223,     0,
+        0,     0,     0,     0,     2,     0,    -2,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-        0,     0,     0,   194,     0,   192,     0,     0,
+        0,     0,     0,     2,     0,    -2,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
-        0,     0,     0,   162,     0,   160,     0,   158,
-      157,     0,   155,   154,     0,     0,     0,     0,
+        0,     0,     0,     2,     0,    -2,     0,     1,
+       -1,     0,     1,    -1,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,
         0,     0,     0,     0,     0,     0,     0,     0,





^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2024-02-23 18:06 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-02-23 17:52 unictype/mirror: Update to Unicode 15.1.0 Bruno Haible

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).