Fix reordering of bidi text in an isolate inside an override

* src/bidi.c (bidi_resolve_explicit): Override the orig_type value
of FSI with either LRI or RLI, as determined by the first strong
directional character in the isolate.  This prevents failure to
isolate when the FSI...PDI text is inside a directional override.
(Bug#22786)
This commit is contained in:
Eli Zaretskii 2016-03-01 18:41:04 +02:00
parent 60e0596402
commit 14810299f2

View file

@ -1919,8 +1919,6 @@ bidi_resolve_explicit (struct bidi_it *bidi_it)
{
eassert (bidi_it->prev.charpos == bidi_it->charpos - 1);
prev_type = bidi_it->prev.orig_type;
if (prev_type == FSI)
prev_type = bidi_it->type_after_wn;
}
}
/* Don't move at end of buffer/string. */
@ -1935,8 +1933,6 @@ bidi_resolve_explicit (struct bidi_it *bidi_it)
emacs_abort ();
bidi_it->bytepos += bidi_it->ch_len;
prev_type = bidi_it->orig_type;
if (prev_type == FSI)
prev_type = bidi_it->type_after_wn;
}
else /* EOB or end of string */
prev_type = NEUTRAL_B;
@ -2091,10 +2087,17 @@ bidi_resolve_explicit (struct bidi_it *bidi_it)
if (typ1 != STRONG_R && typ1 != STRONG_AL)
{
type = LRI;
/* Override orig_type, which will be needed when we come to
examine the next character, which is the first character
inside the isolate. */
bidi_it->orig_type = type;
goto fsi_as_lri;
}
else
type = RLI;
{
type = RLI;
bidi_it->orig_type = type;
}
/* FALLTHROUGH */
case RLI: /* X5a */
if (override == NEUTRAL_DIR)