aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEli Zaretskii2014-10-04 18:09:11 +0300
committerEli Zaretskii2014-10-04 18:09:11 +0300
commit58242892925c82a15592bccd900ee977d830d265 (patch)
tree8a87cbf61044921bce68a5f5d243834eebd640d0 /src
parent16f54832c0ddd0cc553d4231d95778ed91ed5218 (diff)
downloademacs-58242892925c82a15592bccd900ee977d830d265.tar.gz
emacs-58242892925c82a15592bccd900ee977d830d265.zip
Move SOS calculation into push/pop embedding level; fix N1/N2 w/isolates.
Diffstat (limited to 'src')
-rw-r--r--src/bidi.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/src/bidi.c b/src/bidi.c
index eee2a9c623b..c7a66198ff9 100644
--- a/src/bidi.c
+++ b/src/bidi.c
@@ -423,6 +423,7 @@ bidi_push_embedding_level (struct bidi_it *bidi_it,
423 int level, bidi_dir_t override, bool isolate_status) 423 int level, bidi_dir_t override, bool isolate_status)
424{ 424{
425 struct bidi_stack *st; 425 struct bidi_stack *st;
426 int prev_level = bidi_it->level_stack[bidi_it->stack_idx].level;
426 427
427 bidi_it->stack_idx++; 428 bidi_it->stack_idx++;
428 eassert (bidi_it->stack_idx < BIDI_MAXDEPTH+2+1); 429 eassert (bidi_it->stack_idx < BIDI_MAXDEPTH+2+1);
@@ -438,6 +439,9 @@ bidi_push_embedding_level (struct bidi_it *bidi_it,
438 st->next_for_neutral = bidi_it->next_for_neutral; 439 st->next_for_neutral = bidi_it->next_for_neutral;
439 st->sos = bidi_it->sos; 440 st->sos = bidi_it->sos;
440 } 441 }
442 /* We've got a new isolating sequence, compute the directional type
443 of sos and initialize per-sequence variables (UAX#9, clause X10). */
444 bidi_set_sos_type (bidi_it, prev_level, level);
441} 445}
442 446
443/* Pop from the stack the embedding level, the directional override 447/* Pop from the stack the embedding level, the directional override
@@ -454,6 +458,8 @@ bidi_pop_embedding_level (struct bidi_it *bidi_it)
454 { 458 {
455 bool isolate_status 459 bool isolate_status
456 = bidi_it->level_stack[bidi_it->stack_idx].isolate_status; 460 = bidi_it->level_stack[bidi_it->stack_idx].isolate_status;
461 int old_level = bidi_it->level_stack[bidi_it->stack_idx].level;
462
457 struct bidi_stack st; 463 struct bidi_stack st;
458 464
459 st = bidi_it->level_stack[bidi_it->stack_idx]; 465 st = bidi_it->level_stack[bidi_it->stack_idx];
@@ -473,6 +479,10 @@ bidi_pop_embedding_level (struct bidi_it *bidi_it)
473 bidi_it->next_for_neutral = st.next_for_neutral; 479 bidi_it->next_for_neutral = st.next_for_neutral;
474 bidi_it->sos = st.sos; 480 bidi_it->sos = st.sos;
475 } 481 }
482 else
483 bidi_set_sos_type (bidi_it, old_level,
484 bidi_it->level_stack[bidi_it->stack_idx - 1].level);
485
476 bidi_it->stack_idx--; 486 bidi_it->stack_idx--;
477 } 487 }
478 level = bidi_it->level_stack[bidi_it->stack_idx].level; 488 level = bidi_it->level_stack[bidi_it->stack_idx].level;
@@ -1996,14 +2006,7 @@ bidi_resolve_weak (struct bidi_it *bidi_it)
1996 || type == PDF)); 2006 || type == PDF));
1997 2007
1998 eassert (prev_level >= 0); 2008 eassert (prev_level >= 0);
1999 if (new_level > prev_level 2009 if (bidi_it->type == NEUTRAL_B)
2000 /* When the embedding level goes down, we only need to compute
2001 the type of sos if this level is not an isolate, because the
2002 sos type of the isolating sequence was already computed and
2003 saved on the stack. */
2004 || (new_level < prev_level
2005 && !bidi_it->level_stack[bidi_it->stack_idx].isolate_status)
2006 || bidi_it->type == NEUTRAL_B)
2007 { 2010 {
2008 /* We've got a new isolating sequence, compute the directional 2011 /* We've got a new isolating sequence, compute the directional
2009 type of sos and initialize per-run variables (UAX#9, clause 2012 type of sos and initialize per-run variables (UAX#9, clause
@@ -2336,6 +2339,8 @@ bidi_resolve_neutral (struct bidi_it *bidi_it)
2336 are dealing with now. We also cache the scanned iterator 2339 are dealing with now. We also cache the scanned iterator
2337 states, to salvage some of the effort later. */ 2340 states, to salvage some of the effort later. */
2338 do { 2341 do {
2342 int old_sidx, new_sidx;
2343
2339 /* Paragraph separators have their levels fully resolved 2344 /* Paragraph separators have their levels fully resolved
2340 at this point, so cache them as resolved. */ 2345 at this point, so cache them as resolved. */
2341 bidi_cache_iterator_state (bidi_it, type == NEUTRAL_B); 2346 bidi_cache_iterator_state (bidi_it, type == NEUTRAL_B);
@@ -2344,10 +2349,19 @@ bidi_resolve_neutral (struct bidi_it *bidi_it)
2344 if (bidi_it->type_after_w1 != WEAK_BN /* W1/Retaining */ 2349 if (bidi_it->type_after_w1 != WEAK_BN /* W1/Retaining */
2345 && bidi_it->type != WEAK_BN) 2350 && bidi_it->type != WEAK_BN)
2346 bidi_remember_char (&bidi_it->prev, bidi_it); 2351 bidi_remember_char (&bidi_it->prev, bidi_it);
2352 old_sidx = bidi_it->stack_idx;
2347 type = bidi_resolve_weak (bidi_it); 2353 type = bidi_resolve_weak (bidi_it);
2348 /* Skip level runs excluded from this isolating run sequence. */ 2354 /* Skip level runs excluded from this isolating run sequence. */
2349 if (bidi_it->level_stack[bidi_it->stack_idx].level > current_level 2355 new_sidx = bidi_it->stack_idx;
2350 && bidi_it->level_stack[bidi_it->stack_idx].isolate_status) 2356 if (bidi_it->level_stack[new_sidx].level > current_level
2357 && (bidi_it->level_stack[new_sidx].isolate_status
2358 /* This is for when we have an isolate initiator
2359 immediately followed by an embedding or
2360 override initiator, in which case we get the
2361 level stack pushed twice by the single call to
2362 bidi_resolve_weak above. */
2363 || (new_sidx > old_sidx + 1
2364 && bidi_it->level_stack[new_sidx - 1].isolate_status)))
2351 { 2365 {
2352 while (bidi_it->level_stack[bidi_it->stack_idx].level 2366 while (bidi_it->level_stack[bidi_it->stack_idx].level
2353 > current_level) 2367 > current_level)