]> Savannah Git Hosting - gnulib.git/commitdiff
unilbrk: Update handling of Hebrew letter + hyphen for Unicode 10.0.0.
authorBruno Haible <bruno@clisp.org>
Wed, 29 Dec 2021 08:12:34 +0000 (09:12 +0100)
committerBruno Haible <bruno@clisp.org>
Wed, 29 Dec 2021 08:13:12 +0000 (09:13 +0100)
* lib/unilbrk/lbrktables.h (LBP_HL_BA): New enum value.
* lib/unilbrk/u8-possible-linebreaks.c (u8_possible_linebreaks): Add
code for handling break-after character after Hebrew letter.
* lib/unilbrk/u16-possible-linebreaks.c (u16_possible_linebreaks):
Likewise.
* lib/unilbrk/u32-possible-linebreaks.c (u32_possible_linebreaks):
Likewise.
* tests/unilbrk/test-u8-possible-linebreaks.c (main): Add a test
regarding break-after character after Hebrew letter.
* tests/unilbrk/test-u16-possible-linebreaks.c (main): Likewise.
* tests/unilbrk/test-u32-possible-linebreaks.c (main): Likewise.

ChangeLog
lib/unilbrk/lbrktables.h
lib/unilbrk/u16-possible-linebreaks.c
lib/unilbrk/u32-possible-linebreaks.c
lib/unilbrk/u8-possible-linebreaks.c
tests/unilbrk/test-u16-possible-linebreaks.c
tests/unilbrk/test-u32-possible-linebreaks.c
tests/unilbrk/test-u8-possible-linebreaks.c

index ed9e63b8516c32737fa7b3dd7c2de8e4976ca679..1ef0bc80ed88c5bc690c1b8a63e46fc619c10c25 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2021-12-29  Bruno Haible  <bruno@clisp.org>
+
+       unilbrk: Update handling of Hebrew letter + hyphen for Unicode 10.0.0.
+       * lib/unilbrk/lbrktables.h (LBP_HL_BA): New enum value.
+       * lib/unilbrk/u8-possible-linebreaks.c (u8_possible_linebreaks): Add
+       code for handling break-after character after Hebrew letter.
+       * lib/unilbrk/u16-possible-linebreaks.c (u16_possible_linebreaks):
+       Likewise.
+       * lib/unilbrk/u32-possible-linebreaks.c (u32_possible_linebreaks):
+       Likewise.
+       * tests/unilbrk/test-u8-possible-linebreaks.c (main): Add a test
+       regarding break-after character after Hebrew letter.
+       * tests/unilbrk/test-u16-possible-linebreaks.c (main): Likewise.
+       * tests/unilbrk/test-u32-possible-linebreaks.c (main): Likewise.
+
 2021-12-28  Paul Eggert  <eggert@cs.ucla.edu>
 
        nstrftime: improve handling of invalid formats
index 9c8f0bb7453c5f7d9f1c7b0a143c505128cde850..31ce91ac179226ba74196a1a128f1ed027667478 100644 (file)
@@ -72,7 +72,9 @@ enum
   LBP_ZWJ = 27, /* zero width joiner */
   LBP_EB = 28, /* emoji base */
   LBP_EM = 29, /* emoji modifier */
-  LBP_XX = 37  /* unknown */
+  LBP_XX = 37, /* unknown */
+  /* Artificial values that exist only at runtime, not in the tables. */
+  LBP_HL_BA = 100
 };
 
 #include "lbrkprop1.h"
index 7ad88367c7cf60f18bc82ee1fc49f2393edb3d41..ee117304500d7cddf5c8097750b5128be1f8eea5 100644 (file)
@@ -165,6 +165,11 @@ u16_possible_linebreaks (const uint16_t *s, size_t n, const char *encoding, char
                             ? UC_BREAK_POSSIBLE
                             : UC_BREAK_PROHIBITED);
                     }
+                  else if (prev_prop == LBP_HL_BA)
+                    {
+                      /* (LB21a) Don't break after Hebrew + Hyphen/Break-After.  */
+                      *p = UC_BREAK_PROHIBITED;
+                    }
                   else
                     {
                       switch (unilbrk_table [last_prop] [prop])
@@ -186,7 +191,9 @@ u16_possible_linebreaks (const uint16_t *s, size_t n, const char *encoding, char
                   seen_space = NULL;
                 }
 
-              prev_prop = prop;
+              prev_prop = (prev_prop == LBP_HL && (prop == LBP_HY || prop == LBP_BA)
+                           ? LBP_HL_BA
+                           : prop);
             }
 
           if (prop == LBP_RI)
index 0c84ff4f1a797f186a7ee4a05a7eecc1ae3f142a..d36e2db8826545cfb0815ef043a9684dcb77a1ae 100644 (file)
@@ -159,6 +159,11 @@ u32_possible_linebreaks (const uint32_t *s, size_t n, const char *encoding, char
                             ? UC_BREAK_POSSIBLE
                             : UC_BREAK_PROHIBITED);
                     }
+                  else if (prev_prop == LBP_HL_BA)
+                    {
+                      /* (LB21a) Don't break after Hebrew + Hyphen/Break-After.  */
+                      *p = UC_BREAK_PROHIBITED;
+                    }
                   else
                     {
                       switch (unilbrk_table [last_prop] [prop])
@@ -180,7 +185,9 @@ u32_possible_linebreaks (const uint32_t *s, size_t n, const char *encoding, char
                   seen_space = NULL;
                 }
 
-              prev_prop = prop;
+              prev_prop = (prev_prop == LBP_HL && (prop == LBP_HY || prop == LBP_BA)
+                           ? LBP_HL_BA
+                           : prop);
             }
 
           if (prop == LBP_RI)
index b631ddeec62d90cbeb5d48243ab3d085cf4aef82..06b914af91ee37dad6aa7e16e372e882b760812c 100644 (file)
@@ -165,6 +165,11 @@ u8_possible_linebreaks (const uint8_t *s, size_t n, const char *encoding, char *
                             ? UC_BREAK_POSSIBLE
                             : UC_BREAK_PROHIBITED);
                     }
+                  else if (prev_prop == LBP_HL_BA)
+                    {
+                      /* (LB21a) Don't break after Hebrew + Hyphen/Break-After.  */
+                      *p = UC_BREAK_PROHIBITED;
+                    }
                   else
                     {
                       switch (unilbrk_table [last_prop] [prop])
@@ -186,7 +191,9 @@ u8_possible_linebreaks (const uint8_t *s, size_t n, const char *encoding, char *
                   seen_space = NULL;
                 }
 
-              prev_prop = prop;
+              prev_prop = (prev_prop == LBP_HL && (prop == LBP_HY || prop == LBP_BA)
+                           ? LBP_HL_BA
+                           : prop);
             }
 
           if (prop == LBP_RI)
index 87d712fcc6422e5429d85720316cb15e89fee27e..fedaa9d842841533be6e1de1421ede2e3d7bcdc9 100644 (file)
@@ -179,5 +179,22 @@ main ()
     free (p);
   }
 
+  /* Test special behaviour of hyphen/break-after character after
+     Hebrew letter.  */
+  {
+    static const uint16_t input[10] = /* "ab-אב-αβ-ω" */
+      { 'a', 'b', '-', 0x05D0, 0x05D1, '-', 0x03B1, 0x03B2, '-', 0x03C9 };
+    char *p = (char *) malloc (SIZEOF (input));
+    size_t i;
+
+    u16_possible_linebreaks (input, SIZEOF (input), "UTF-8", p);
+    for (i = 0; i < 10; i++)
+      {
+        ASSERT (p[i] == (i == 3 || i == 9 ? UC_BREAK_POSSIBLE :
+                         UC_BREAK_PROHIBITED));
+      }
+    free (p);
+  }
+
   return 0;
 }
index c140ca3b55463a9268a2d6d96aef80470c9aaca6..1d8dfb122bcd8b25f01ea16685a30b6bdfd707a5 100644 (file)
@@ -179,5 +179,22 @@ main ()
     free (p);
   }
 
+  /* Test special behaviour of hyphen/break-after character after
+     Hebrew letter.  */
+  {
+    static const uint32_t input[10] = /* "ab-אב-αβ-ω" */
+      { 'a', 'b', '-', 0x05D0, 0x05D1, '-', 0x03B1, 0x03B2, '-', 0x03C9 };
+    char *p = (char *) malloc (SIZEOF (input));
+    size_t i;
+
+    u32_possible_linebreaks (input, SIZEOF (input), "UTF-8", p);
+    for (i = 0; i < 10; i++)
+      {
+        ASSERT (p[i] == (i == 3 || i == 9 ? UC_BREAK_POSSIBLE :
+                         UC_BREAK_PROHIBITED));
+      }
+    free (p);
+  }
+
   return 0;
 }
index 0fdb66d3678407b9163a8fdb3b9db0ad583dfb83..cad7b7afa3e5610cb7a9294fa2a9c629721941d3 100644 (file)
@@ -164,5 +164,22 @@ main ()
     free (p);
   }
 
+  /* Test special behaviour of hyphen/break-after character after
+     Hebrew letter.  */
+  {
+    static const uint8_t input[15] = /* "ab-אב-αβ-ω" */
+      "ab-\327\220\327\221-\316\261\316\262-\317\211";
+    char *p = (char *) malloc (SIZEOF (input));
+    size_t i;
+
+    u8_possible_linebreaks (input, SIZEOF (input), "UTF-8", p);
+    for (i = 0; i < 15; i++)
+      {
+        ASSERT (p[i] == (i == 3 || i == 13 ? UC_BREAK_POSSIBLE :
+                         UC_BREAK_PROHIBITED));
+      }
+    free (p);
+  }
+
   return 0;
 }