diff options
| author | Eli Zaretskii | 2014-10-04 18:09:11 +0300 |
|---|---|---|
| committer | Eli Zaretskii | 2014-10-04 18:09:11 +0300 |
| commit | 58242892925c82a15592bccd900ee977d830d265 (patch) | |
| tree | 8a87cbf61044921bce68a5f5d243834eebd640d0 /src | |
| parent | 16f54832c0ddd0cc553d4231d95778ed91ed5218 (diff) | |
| download | emacs-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.c | 34 |
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) |