* 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-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
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"
? 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])
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)
? 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])
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)
? 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])
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)
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;
}
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;
}
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;
}