diff options
Diffstat (limited to 'src/bidi.c')
| -rw-r--r-- | src/bidi.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/bidi.c b/src/bidi.c index cb86b20b38e..6fe937671da 100644 --- a/src/bidi.c +++ b/src/bidi.c | |||
| @@ -429,12 +429,12 @@ bidi_push_embedding_level (struct bidi_it *bidi_it, | |||
| 429 | bidi_it->stack_idx++; | 429 | bidi_it->stack_idx++; |
| 430 | eassert (bidi_it->stack_idx < BIDI_MAXDEPTH+2+1); | 430 | eassert (bidi_it->stack_idx < BIDI_MAXDEPTH+2+1); |
| 431 | st = &bidi_it->level_stack[bidi_it->stack_idx]; | 431 | st = &bidi_it->level_stack[bidi_it->stack_idx]; |
| 432 | eassert (level <= (1 << 7)); | ||
| 432 | st->level = level; | 433 | st->level = level; |
| 433 | st->override = override; | 434 | st->override = override; |
| 434 | st->isolate_status = isolate_status; | 435 | st->isolate_status = isolate_status; |
| 435 | if (isolate_status) | 436 | if (isolate_status) |
| 436 | { | 437 | { |
| 437 | st->prev = bidi_it->prev; | ||
| 438 | st->last_strong = bidi_it->last_strong; | 438 | st->last_strong = bidi_it->last_strong; |
| 439 | st->prev_for_neutral = bidi_it->prev_for_neutral; | 439 | st->prev_for_neutral = bidi_it->prev_for_neutral; |
| 440 | st->next_for_neutral = bidi_it->next_for_neutral; | 440 | st->next_for_neutral = bidi_it->next_for_neutral; |
| @@ -449,6 +449,8 @@ bidi_push_embedding_level (struct bidi_it *bidi_it, | |||
| 449 | static int | 449 | static int |
| 450 | bidi_pop_embedding_level (struct bidi_it *bidi_it) | 450 | bidi_pop_embedding_level (struct bidi_it *bidi_it) |
| 451 | { | 451 | { |
| 452 | int level; | ||
| 453 | |||
| 452 | /* UAX#9 says to ignore invalid PDFs (X7, last bullet) | 454 | /* UAX#9 says to ignore invalid PDFs (X7, last bullet) |
| 453 | and PDIs (X6a, 2nd bullet). */ | 455 | and PDIs (X6a, 2nd bullet). */ |
| 454 | if (bidi_it->stack_idx > 0) | 456 | if (bidi_it->stack_idx > 0) |
| @@ -460,7 +462,15 @@ bidi_pop_embedding_level (struct bidi_it *bidi_it) | |||
| 460 | st = bidi_it->level_stack[bidi_it->stack_idx]; | 462 | st = bidi_it->level_stack[bidi_it->stack_idx]; |
| 461 | if (isolate_status) | 463 | if (isolate_status) |
| 462 | { | 464 | { |
| 463 | bidi_it->prev = st.prev; | 465 | /* PREV is used in W1 for resolving WEAK_NSM. By the time |
| 466 | we get to an NSM, we must have gotten past at least one | ||
| 467 | character: the PDI that ends the isolate from which we | ||
| 468 | are popping here. So PREV will have been filled up by | ||
| 469 | the time we first use it. We initialize it here to | ||
| 470 | UNKNOWN_BT to be able to catch any blunders in this | ||
| 471 | logic. */ | ||
| 472 | bidi_it->prev.orig_type = bidi_it->prev.type_after_w1 | ||
| 473 | = bidi_it->prev.type = UNKNOWN_BT; | ||
| 464 | bidi_it->last_strong = st.last_strong; | 474 | bidi_it->last_strong = st.last_strong; |
| 465 | bidi_it->prev_for_neutral = st.prev_for_neutral; | 475 | bidi_it->prev_for_neutral = st.prev_for_neutral; |
| 466 | bidi_it->next_for_neutral = st.next_for_neutral; | 476 | bidi_it->next_for_neutral = st.next_for_neutral; |
| @@ -469,7 +479,9 @@ bidi_pop_embedding_level (struct bidi_it *bidi_it) | |||
| 469 | } | 479 | } |
| 470 | bidi_it->stack_idx--; | 480 | bidi_it->stack_idx--; |
| 471 | } | 481 | } |
| 472 | return bidi_it->level_stack[bidi_it->stack_idx].level; | 482 | level = bidi_it->level_stack[bidi_it->stack_idx].level; |
| 483 | eassert (0 <= level && level <= BIDI_MAXDEPTH + 1); | ||
| 484 | return level; | ||
| 473 | } | 485 | } |
| 474 | 486 | ||
| 475 | /* Record in SAVED_INFO the information about the current character. */ | 487 | /* Record in SAVED_INFO the information about the current character. */ |