diff options
| author | Eli Zaretskii | 2014-09-13 20:49:40 +0300 |
|---|---|---|
| committer | Eli Zaretskii | 2014-09-13 20:49:40 +0300 |
| commit | 924d744508c5b6268e73258ccc7282cc1297fae7 (patch) | |
| tree | 4087954aa6cd987663abba2c7e690be80aedd8b8 /src | |
| parent | eb71ffc65e57e72798c9e1326a0e804380b94b56 (diff) | |
| download | emacs-924d744508c5b6268e73258ccc7282cc1297fae7.tar.gz emacs-924d744508c5b6268e73258ccc7282cc1297fae7.zip | |
Use the level stack for initial level below bidi_level_of_next_char.
This still crashes in TUTORIAL.he.
Diffstat (limited to 'src')
| -rw-r--r-- | src/bidi.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/bidi.c b/src/bidi.c index 6fe937671da..41e4bbb2ed6 100644 --- a/src/bidi.c +++ b/src/bidi.c | |||
| @@ -1953,7 +1953,7 @@ bidi_resolve_explicit_1 (struct bidi_it *bidi_it) | |||
| 1953 | static int | 1953 | static int |
| 1954 | bidi_resolve_explicit (struct bidi_it *bidi_it) | 1954 | bidi_resolve_explicit (struct bidi_it *bidi_it) |
| 1955 | { | 1955 | { |
| 1956 | int prev_level = bidi_it->resolved_level; | 1956 | int prev_level = bidi_it->level_stack[bidi_it->stack_idx].level; |
| 1957 | int new_level = bidi_resolve_explicit_1 (bidi_it); | 1957 | int new_level = bidi_resolve_explicit_1 (bidi_it); |
| 1958 | ptrdiff_t eob = bidi_it->string.s ? bidi_it->string.schars : ZV; | 1958 | ptrdiff_t eob = bidi_it->string.s ? bidi_it->string.schars : ZV; |
| 1959 | const unsigned char *s | 1959 | const unsigned char *s |
| @@ -2035,7 +2035,7 @@ bidi_resolve_weak (struct bidi_it *bidi_it) | |||
| 2035 | { | 2035 | { |
| 2036 | bidi_type_t type; | 2036 | bidi_type_t type; |
| 2037 | bidi_dir_t override; | 2037 | bidi_dir_t override; |
| 2038 | int prev_level = bidi_it->resolved_level; | 2038 | int prev_level = bidi_it->level_stack[bidi_it->stack_idx].level; |
| 2039 | int new_level = bidi_resolve_explicit (bidi_it); | 2039 | int new_level = bidi_resolve_explicit (bidi_it); |
| 2040 | int next_char; | 2040 | int next_char; |
| 2041 | bidi_type_t type_of_next; | 2041 | bidi_type_t type_of_next; |
| @@ -2283,9 +2283,9 @@ bidi_resolve_neutral_1 (bidi_type_t prev_type, bidi_type_t next_type, int lev) | |||
| 2283 | static bidi_type_t | 2283 | static bidi_type_t |
| 2284 | bidi_resolve_neutral (struct bidi_it *bidi_it) | 2284 | bidi_resolve_neutral (struct bidi_it *bidi_it) |
| 2285 | { | 2285 | { |
| 2286 | int prev_level = bidi_it->resolved_level; | 2286 | int prev_level = bidi_it->level_stack[bidi_it->stack_idx].level; |
| 2287 | bidi_type_t type = bidi_resolve_weak (bidi_it); | 2287 | bidi_type_t type = bidi_resolve_weak (bidi_it); |
| 2288 | int current_level = bidi_it->resolved_level; | 2288 | int current_level = bidi_it->level_stack[bidi_it->stack_idx].level; |
| 2289 | 2289 | ||
| 2290 | if (!(type == STRONG_R | 2290 | if (!(type == STRONG_R |
| 2291 | || type == STRONG_L | 2291 | || type == STRONG_L |
| @@ -2517,7 +2517,7 @@ bidi_level_of_next_char (struct bidi_it *bidi_it) | |||
| 2517 | state must be already cached, so there's no need to know the | 2517 | state must be already cached, so there's no need to know the |
| 2518 | embedding level of the previous character, since we will be | 2518 | embedding level of the previous character, since we will be |
| 2519 | returning to our caller shortly. */ | 2519 | returning to our caller shortly. */ |
| 2520 | prev_level = bidi_it->resolved_level; | 2520 | prev_level = bidi_it->level_stack[bidi_it->stack_idx].level; |
| 2521 | eassert (prev_level >= 0); | 2521 | eassert (prev_level >= 0); |
| 2522 | } | 2522 | } |
| 2523 | next_for_neutral = bidi_it->next_for_neutral; | 2523 | next_for_neutral = bidi_it->next_for_neutral; |
| @@ -2685,6 +2685,8 @@ bidi_level_of_next_char (struct bidi_it *bidi_it) | |||
| 2685 | level++; | 2685 | level++; |
| 2686 | } | 2686 | } |
| 2687 | 2687 | ||
| 2688 | /* FIXME: Exempt explicit directional characters from the assignment | ||
| 2689 | below, and remove the PDF hack above. */ | ||
| 2688 | bidi_it->resolved_level = level; | 2690 | bidi_it->resolved_level = level; |
| 2689 | return level; | 2691 | return level; |
| 2690 | } | 2692 | } |
| @@ -2822,6 +2824,11 @@ bidi_move_to_visually_next (struct bidi_it *bidi_it) | |||
| 2822 | in the cache, which at this point should not happen. If | 2824 | in the cache, which at this point should not happen. If |
| 2823 | it does, we will infloop. */ | 2825 | it does, we will infloop. */ |
| 2824 | eassert (next_level >= 0); | 2826 | eassert (next_level >= 0); |
| 2827 | /* If next_level is not consistent with incr, we might | ||
| 2828 | infloop. */ | ||
| 2829 | eassert (incr > 0 | ||
| 2830 | ? next_level > expected_next_level | ||
| 2831 | : next_level < expected_next_level); | ||
| 2825 | expected_next_level += incr; | 2832 | expected_next_level += incr; |
| 2826 | level_to_search += incr; | 2833 | level_to_search += incr; |
| 2827 | bidi_find_other_level_edge (bidi_it, level_to_search, !ascending); | 2834 | bidi_find_other_level_edge (bidi_it, level_to_search, !ascending); |