aboutsummaryrefslogtreecommitdiffstats
path: root/src/bidi.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bidi.c')
-rw-r--r--src/bidi.c18
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,
449static int 449static int
450bidi_pop_embedding_level (struct bidi_it *bidi_it) 450bidi_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. */