+2024-09-15 Bruno Haible <bruno@clisp.org>
+
+ unilbrk: Fix conflicts between rules.
+ * lib/unilbrk/u8-possible-linebreaks.c (u8_possible_linebreaks_loop):
+ Avoid side effect of (LB18) on (LB14) and (LB15a). Avoid side effect
+ of (LB19a) on (LB18).
+ * lib/unilbrk/u16-possible-linebreaks.c (u16_possible_linebreaks_loop):
+ Likewise.
+ * lib/unilbrk/u32-possible-linebreaks.c (u32_possible_linebreaks_loop):
+ Likewise.
+
2024-09-15 Bruno Haible <bruno@clisp.org>
unilbrk: Enable most cases of Unicode rule (LB29).
last_prop = LBP_AL1;
seen_space = NULL;
}
- else if (last_prop == LBP_ZW || seen_space != NULL)
+ else if (last_prop == LBP_ZW
+ || (seen_space != NULL
+ /* (LB14) has higher priority than (LB18). */
+ && !(last_prop == LBP_OP1 || last_prop == LBP_OP2)
+ /* (LB15a) has higher priority than (LB18). */
+ && !(last_prop == LBP_QU2)))
{
/* (LB8) Break after zero-width space. */
/* (LB18) Break after spaces.
*p = UC_BREAK_POSSIBLE;
}
else if (((prop == LBP_QU1 || prop == LBP_QU2 || prop == LBP_QU3)
- && (! prev_ea || ! EA (lookahead1_prop_ea)))
+ && (! prev_ea || ! EA (lookahead1_prop_ea))
+ /* (LB18) has higher priority than (LB19a). */
+ && prev_prop != LBP_SP)
|| ((prev_prop == LBP_QU1 || prev_prop == LBP_QU2 || prev_prop == LBP_QU3)
&& (! prev2_ea || ! ea)))
{
last_prop = LBP_AL1;
seen_space = NULL;
}
- else if (last_prop == LBP_ZW || seen_space != NULL)
+ else if (last_prop == LBP_ZW
+ || (seen_space != NULL
+ /* (LB14) has higher priority than (LB18). */
+ && !(last_prop == LBP_OP1 || last_prop == LBP_OP2)
+ /* (LB15a) has higher priority than (LB18). */
+ && !(last_prop == LBP_QU2)))
{
/* (LB8) Break after zero-width space. */
/* (LB18) Break after spaces.
*p = UC_BREAK_POSSIBLE;
}
else if (((prop == LBP_QU1 || prop == LBP_QU2 || prop == LBP_QU3)
- && (! prev_ea || ! EA (lookahead1_prop_ea)))
+ && (! prev_ea || ! EA (lookahead1_prop_ea))
+ /* (LB18) has higher priority than (LB19a). */
+ && prev_prop != LBP_SP)
|| ((prev_prop == LBP_QU1 || prev_prop == LBP_QU2 || prev_prop == LBP_QU3)
&& (! prev2_ea || ! ea)))
{
last_prop = LBP_AL1;
seen_space = NULL;
}
- else if (last_prop == LBP_ZW || seen_space != NULL)
+ else if (last_prop == LBP_ZW
+ || (seen_space != NULL
+ /* (LB14) has higher priority than (LB18). */
+ && !(last_prop == LBP_OP1 || last_prop == LBP_OP2)
+ /* (LB15a) has higher priority than (LB18). */
+ && !(last_prop == LBP_QU2)))
{
/* (LB8) Break after zero-width space. */
/* (LB18) Break after spaces.
*p = UC_BREAK_POSSIBLE;
}
else if (((prop == LBP_QU1 || prop == LBP_QU2 || prop == LBP_QU3)
- && (! prev_ea || ! EA (lookahead1_prop_ea)))
+ && (! prev_ea || ! EA (lookahead1_prop_ea))
+ /* (LB18) has higher priority than (LB19a). */
+ && prev_prop != LBP_SP)
|| ((prev_prop == LBP_QU1 || prev_prop == LBP_QU2 || prev_prop == LBP_QU3)
&& (! prev2_ea || ! ea)))
{