aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEli Zaretskii2016-03-01 18:41:04 +0200
committerEli Zaretskii2016-03-01 18:41:04 +0200
commit14810299f24986b746bcd89032ade2eef2d15ceb (patch)
treee0506bf9d6883115c7efd578b1e826f8b329cf79 /src
parent60e05964023bed0ac888219a638e206523f5134a (diff)
downloademacs-14810299f24986b746bcd89032ade2eef2d15ceb.tar.gz
emacs-14810299f24986b746bcd89032ade2eef2d15ceb.zip
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)
Diffstat (limited to 'src')
-rw-r--r--src/bidi.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/bidi.c b/src/bidi.c
index 9b714543dd2..e7787054e23 100644
--- a/src/bidi.c
+++ b/src/bidi.c
@@ -1919,8 +1919,6 @@ bidi_resolve_explicit (struct bidi_it *bidi_it)
1919 { 1919 {
1920 eassert (bidi_it->prev.charpos == bidi_it->charpos - 1); 1920 eassert (bidi_it->prev.charpos == bidi_it->charpos - 1);
1921 prev_type = bidi_it->prev.orig_type; 1921 prev_type = bidi_it->prev.orig_type;
1922 if (prev_type == FSI)
1923 prev_type = bidi_it->type_after_wn;
1924 } 1922 }
1925 } 1923 }
1926 /* Don't move at end of buffer/string. */ 1924 /* Don't move at end of buffer/string. */
@@ -1935,8 +1933,6 @@ bidi_resolve_explicit (struct bidi_it *bidi_it)
1935 emacs_abort (); 1933 emacs_abort ();
1936 bidi_it->bytepos += bidi_it->ch_len; 1934 bidi_it->bytepos += bidi_it->ch_len;
1937 prev_type = bidi_it->orig_type; 1935 prev_type = bidi_it->orig_type;
1938 if (prev_type == FSI)
1939 prev_type = bidi_it->type_after_wn;
1940 } 1936 }
1941 else /* EOB or end of string */ 1937 else /* EOB or end of string */
1942 prev_type = NEUTRAL_B; 1938 prev_type = NEUTRAL_B;
@@ -2091,10 +2087,17 @@ bidi_resolve_explicit (struct bidi_it *bidi_it)
2091 if (typ1 != STRONG_R && typ1 != STRONG_AL) 2087 if (typ1 != STRONG_R && typ1 != STRONG_AL)
2092 { 2088 {
2093 type = LRI; 2089 type = LRI;
2090 /* Override orig_type, which will be needed when we come to
2091 examine the next character, which is the first character
2092 inside the isolate. */
2093 bidi_it->orig_type = type;
2094 goto fsi_as_lri; 2094 goto fsi_as_lri;
2095 } 2095 }
2096 else 2096 else
2097 type = RLI; 2097 {
2098 type = RLI;
2099 bidi_it->orig_type = type;
2100 }
2098 /* FALLTHROUGH */ 2101 /* FALLTHROUGH */
2099 case RLI: /* X5a */ 2102 case RLI: /* X5a */
2100 if (override == NEUTRAL_DIR) 2103 if (override == NEUTRAL_DIR)