]> code.delx.au - gnu-emacs/commitdiff
Fix reordering of bidi text in an isolate inside an override
authorEli Zaretskii <eliz@gnu.org>
Tue, 1 Mar 2016 16:41:04 +0000 (18:41 +0200)
committerEli Zaretskii <eliz@gnu.org>
Tue, 1 Mar 2016 16:41:04 +0000 (18:41 +0200)
* 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)

src/bidi.c

index 9b714543dd2580b78d74afc8c32f1a42d7f769b5..e7787054e236b4b8313c962961bb02fba35b49ea 100644 (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)