Port better to POSIX hosts lacking _setjmp.
[bpt/emacs.git] / src / bidi.c
1 /* Low-level bidirectional buffer/string-scanning functions for GNU Emacs.
2 Copyright (C) 2000-2001, 2004-2005, 2009-2012
3 Free Software Foundation, Inc.
4
5 This file is part of GNU Emacs.
6
7 GNU Emacs is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
19
20 /* Written by Eli Zaretskii <eliz@gnu.org>.
21
22 A sequential implementation of the Unicode Bidirectional algorithm,
23 (UBA) as per UAX#9, a part of the Unicode Standard.
24
25 Unlike the reference and most other implementations, this one is
26 designed to be called once for every character in the buffer or
27 string.
28
29 The main entry point is bidi_move_to_visually_next. Each time it
30 is called, it finds the next character in the visual order, and
31 returns its information in a special structure. The caller is then
32 expected to process this character for display or any other
33 purposes, and call bidi_move_to_visually_next for the next
34 character. See the comments in bidi_move_to_visually_next for more
35 details about its algorithm that finds the next visual-order
36 character by resolving their levels on the fly.
37
38 Two other entry points are bidi_paragraph_init and
39 bidi_mirror_char. The first determines the base direction of a
40 paragraph, while the second returns the mirrored version of its
41 argument character.
42
43 A few auxiliary entry points are used to initialize the bidi
44 iterator for iterating an object (buffer or string), push and pop
45 the bidi iterator state, and save and restore the state of the bidi
46 cache.
47
48 If you want to understand the code, you will have to read it
49 together with the relevant portions of UAX#9. The comments include
50 references to UAX#9 rules, for that very reason.
51
52 A note about references to UAX#9 rules: if the reference says
53 something like "X9/Retaining", it means that you need to refer to
54 rule X9 and to its modifications described in the "Implementation
55 Notes" section of UAX#9, under "Retaining Format Codes". */
56
57 #include <config.h>
58 #include <stdio.h>
59
60 #include "lisp.h"
61 #include "character.h"
62 #include "buffer.h"
63 #include "dispextern.h"
64
65 static bool bidi_initialized = 0;
66
67 static Lisp_Object bidi_type_table, bidi_mirror_table;
68
69 #define LRM_CHAR 0x200E
70 #define RLM_CHAR 0x200F
71 #define BIDI_EOB -1
72
73 /* Data type for describing the bidirectional character categories. */
74 typedef enum {
75 UNKNOWN_BC,
76 NEUTRAL,
77 WEAK,
78 STRONG
79 } bidi_category_t;
80
81 /* UAX#9 says to search only for L, AL, or R types of characters, and
82 ignore RLE, RLO, LRE, and LRO, when determining the base paragraph
83 level. Yudit indeed ignores them. This variable is therefore set
84 by default to ignore them, but clearing it will take them into
85 account. */
86 extern bool bidi_ignore_explicit_marks_for_paragraph_level EXTERNALLY_VISIBLE;
87 bool bidi_ignore_explicit_marks_for_paragraph_level = 1;
88
89 static Lisp_Object paragraph_start_re, paragraph_separate_re;
90 static Lisp_Object Qparagraph_start, Qparagraph_separate;
91
92 \f
93 /***********************************************************************
94 Utilities
95 ***********************************************************************/
96
97 /* Return the bidi type of a character CH, subject to the current
98 directional OVERRIDE. */
99 static inline bidi_type_t
100 bidi_get_type (int ch, bidi_dir_t override)
101 {
102 bidi_type_t default_type;
103
104 if (ch == BIDI_EOB)
105 return NEUTRAL_B;
106 if (ch < 0 || ch > MAX_CHAR)
107 emacs_abort ();
108
109 default_type = (bidi_type_t) XINT (CHAR_TABLE_REF (bidi_type_table, ch));
110 /* Every valid character code, even those that are unassigned by the
111 UCD, have some bidi-class property, according to
112 DerivedBidiClass.txt file. Therefore, if we ever get UNKNOWN_BT
113 (= zero) code from CHAR_TABLE_REF, that's a bug. */
114 if (default_type == UNKNOWN_BT)
115 emacs_abort ();
116
117 if (override == NEUTRAL_DIR)
118 return default_type;
119
120 switch (default_type)
121 {
122 /* Although UAX#9 does not tell, it doesn't make sense to
123 override NEUTRAL_B and LRM/RLM characters. */
124 case NEUTRAL_B:
125 case LRE:
126 case LRO:
127 case RLE:
128 case RLO:
129 case PDF:
130 return default_type;
131 default:
132 switch (ch)
133 {
134 case LRM_CHAR:
135 case RLM_CHAR:
136 return default_type;
137 default:
138 if (override == L2R) /* X6 */
139 return STRONG_L;
140 else if (override == R2L)
141 return STRONG_R;
142 else
143 emacs_abort (); /* can't happen: handled above */
144 }
145 }
146 }
147
148 static inline void
149 bidi_check_type (bidi_type_t type)
150 {
151 eassert (UNKNOWN_BT <= type && type <= NEUTRAL_ON);
152 }
153
154 /* Given a bidi TYPE of a character, return its category. */
155 static inline bidi_category_t
156 bidi_get_category (bidi_type_t type)
157 {
158 switch (type)
159 {
160 case UNKNOWN_BT:
161 return UNKNOWN_BC;
162 case STRONG_L:
163 case STRONG_R:
164 case STRONG_AL:
165 case LRE:
166 case LRO:
167 case RLE:
168 case RLO:
169 return STRONG;
170 case PDF: /* ??? really?? */
171 case WEAK_EN:
172 case WEAK_ES:
173 case WEAK_ET:
174 case WEAK_AN:
175 case WEAK_CS:
176 case WEAK_NSM:
177 case WEAK_BN:
178 return WEAK;
179 case NEUTRAL_B:
180 case NEUTRAL_S:
181 case NEUTRAL_WS:
182 case NEUTRAL_ON:
183 return NEUTRAL;
184 default:
185 emacs_abort ();
186 }
187 }
188
189 /* Return the mirrored character of C, if it has one. If C has no
190 mirrored counterpart, return C.
191 Note: The conditions in UAX#9 clause L4 regarding the surrounding
192 context must be tested by the caller. */
193 int
194 bidi_mirror_char (int c)
195 {
196 Lisp_Object val;
197
198 if (c == BIDI_EOB)
199 return c;
200 if (c < 0 || c > MAX_CHAR)
201 emacs_abort ();
202
203 val = CHAR_TABLE_REF (bidi_mirror_table, c);
204 if (INTEGERP (val))
205 {
206 int v;
207
208 /* When debugging, check before assigning to V, so that the check
209 isn't broken by undefined behavior due to int overflow. */
210 eassert (CHAR_VALID_P (XINT (val)));
211
212 v = XINT (val);
213
214 /* Minimal test we must do in optimized builds, to prevent weird
215 crashes further down the road. */
216 if (v < 0 || v > MAX_CHAR)
217 emacs_abort ();
218
219 return v;
220 }
221
222 return c;
223 }
224
225 /* Determine the start-of-run (sor) directional type given the two
226 embedding levels on either side of the run boundary. Also, update
227 the saved info about previously seen characters, since that info is
228 generally valid for a single level run. */
229 static inline void
230 bidi_set_sor_type (struct bidi_it *bidi_it, int level_before, int level_after)
231 {
232 int higher_level = (level_before > level_after ? level_before : level_after);
233
234 /* The prev_was_pdf gork is required for when we have several PDFs
235 in a row. In that case, we want to compute the sor type for the
236 next level run only once: when we see the first PDF. That's
237 because the sor type depends only on the higher of the two levels
238 that we find on the two sides of the level boundary (see UAX#9,
239 clause X10), and so we don't need to know the final embedding
240 level to which we descend after processing all the PDFs. */
241 if (!bidi_it->prev_was_pdf || level_before < level_after)
242 /* FIXME: should the default sor direction be user selectable? */
243 bidi_it->sor = ((higher_level & 1) != 0 ? R2L : L2R);
244 if (level_before > level_after)
245 bidi_it->prev_was_pdf = 1;
246
247 bidi_it->prev.type = UNKNOWN_BT;
248 bidi_it->last_strong.type = bidi_it->last_strong.type_after_w1
249 = bidi_it->last_strong.orig_type = UNKNOWN_BT;
250 bidi_it->prev_for_neutral.type = (bidi_it->sor == R2L ? STRONG_R : STRONG_L);
251 bidi_it->prev_for_neutral.charpos = bidi_it->charpos;
252 bidi_it->prev_for_neutral.bytepos = bidi_it->bytepos;
253 bidi_it->next_for_neutral.type = bidi_it->next_for_neutral.type_after_w1
254 = bidi_it->next_for_neutral.orig_type = UNKNOWN_BT;
255 bidi_it->ignore_bn_limit = -1; /* meaning it's unknown */
256 }
257
258 /* Push the current embedding level and override status; reset the
259 current level to LEVEL and the current override status to OVERRIDE. */
260 static inline void
261 bidi_push_embedding_level (struct bidi_it *bidi_it,
262 int level, bidi_dir_t override)
263 {
264 bidi_it->stack_idx++;
265 eassert (bidi_it->stack_idx < BIDI_MAXLEVEL);
266 bidi_it->level_stack[bidi_it->stack_idx].level = level;
267 bidi_it->level_stack[bidi_it->stack_idx].override = override;
268 }
269
270 /* Pop the embedding level and directional override status from the
271 stack, and return the new level. */
272 static inline int
273 bidi_pop_embedding_level (struct bidi_it *bidi_it)
274 {
275 /* UAX#9 says to ignore invalid PDFs. */
276 if (bidi_it->stack_idx > 0)
277 bidi_it->stack_idx--;
278 return bidi_it->level_stack[bidi_it->stack_idx].level;
279 }
280
281 /* Record in SAVED_INFO the information about the current character. */
282 static inline void
283 bidi_remember_char (struct bidi_saved_info *saved_info,
284 struct bidi_it *bidi_it)
285 {
286 saved_info->charpos = bidi_it->charpos;
287 saved_info->bytepos = bidi_it->bytepos;
288 saved_info->type = bidi_it->type;
289 bidi_check_type (bidi_it->type);
290 saved_info->type_after_w1 = bidi_it->type_after_w1;
291 bidi_check_type (bidi_it->type_after_w1);
292 saved_info->orig_type = bidi_it->orig_type;
293 bidi_check_type (bidi_it->orig_type);
294 }
295
296 /* Copy the bidi iterator from FROM to TO. To save cycles, this only
297 copies the part of the level stack that is actually in use. */
298 static inline void
299 bidi_copy_it (struct bidi_it *to, struct bidi_it *from)
300 {
301 int i;
302
303 /* Copy everything except the level stack and beyond. */
304 memcpy (to, from, offsetof (struct bidi_it, level_stack[0]));
305
306 /* Copy the active part of the level stack. */
307 to->level_stack[0] = from->level_stack[0]; /* level zero is always in use */
308 for (i = 1; i <= from->stack_idx; i++)
309 to->level_stack[i] = from->level_stack[i];
310 }
311
312 \f
313 /***********************************************************************
314 Caching the bidi iterator states
315 ***********************************************************************/
316
317 #define BIDI_CACHE_CHUNK 200
318 static struct bidi_it *bidi_cache;
319 static ptrdiff_t bidi_cache_size = 0;
320 enum { elsz = sizeof (struct bidi_it) };
321 static ptrdiff_t bidi_cache_idx; /* next unused cache slot */
322 static ptrdiff_t bidi_cache_last_idx; /* slot of last cache hit */
323 static ptrdiff_t bidi_cache_start = 0; /* start of cache for this
324 "stack" level */
325
326 /* 5-slot stack for saving the start of the previous level of the
327 cache. xdisp.c maintains a 5-slot stack for its iterator state,
328 and we need the same size of our stack. */
329 static ptrdiff_t bidi_cache_start_stack[IT_STACK_SIZE];
330 static int bidi_cache_sp;
331
332 /* Size of header used by bidi_shelve_cache. */
333 enum
334 {
335 bidi_shelve_header_size
336 = (sizeof (bidi_cache_idx) + sizeof (bidi_cache_start_stack)
337 + sizeof (bidi_cache_sp) + sizeof (bidi_cache_start)
338 + sizeof (bidi_cache_last_idx))
339 };
340
341 /* Reset the cache state to the empty state. We only reset the part
342 of the cache relevant to iteration of the current object. Previous
343 objects, which are pushed on the display iterator's stack, are left
344 intact. This is called when the cached information is no more
345 useful for the current iteration, e.g. when we were reseated to a
346 new position on the same object. */
347 static inline void
348 bidi_cache_reset (void)
349 {
350 bidi_cache_idx = bidi_cache_start;
351 bidi_cache_last_idx = -1;
352 }
353
354 /* Shrink the cache to its minimal size. Called when we init the bidi
355 iterator for reordering a buffer or a string that does not come
356 from display properties, because that means all the previously
357 cached info is of no further use. */
358 static inline void
359 bidi_cache_shrink (void)
360 {
361 if (bidi_cache_size > BIDI_CACHE_CHUNK)
362 {
363 bidi_cache = xrealloc (bidi_cache, BIDI_CACHE_CHUNK * elsz);
364 bidi_cache_size = BIDI_CACHE_CHUNK;
365 }
366 bidi_cache_reset ();
367 }
368
369 static inline void
370 bidi_cache_fetch_state (ptrdiff_t idx, struct bidi_it *bidi_it)
371 {
372 int current_scan_dir = bidi_it->scan_dir;
373
374 if (idx < bidi_cache_start || idx >= bidi_cache_idx)
375 emacs_abort ();
376
377 bidi_copy_it (bidi_it, &bidi_cache[idx]);
378 bidi_it->scan_dir = current_scan_dir;
379 bidi_cache_last_idx = idx;
380 }
381
382 /* Find a cached state with a given CHARPOS and resolved embedding
383 level less or equal to LEVEL. if LEVEL is -1, disregard the
384 resolved levels in cached states. DIR, if non-zero, means search
385 in that direction from the last cache hit. */
386 static inline ptrdiff_t
387 bidi_cache_search (ptrdiff_t charpos, int level, int dir)
388 {
389 ptrdiff_t i, i_start;
390
391 if (bidi_cache_idx > bidi_cache_start)
392 {
393 if (bidi_cache_last_idx == -1)
394 bidi_cache_last_idx = bidi_cache_idx - 1;
395 if (charpos < bidi_cache[bidi_cache_last_idx].charpos)
396 {
397 dir = -1;
398 i_start = bidi_cache_last_idx - 1;
399 }
400 else if (charpos > (bidi_cache[bidi_cache_last_idx].charpos
401 + bidi_cache[bidi_cache_last_idx].nchars - 1))
402 {
403 dir = 1;
404 i_start = bidi_cache_last_idx + 1;
405 }
406 else if (dir)
407 i_start = bidi_cache_last_idx;
408 else
409 {
410 dir = -1;
411 i_start = bidi_cache_idx - 1;
412 }
413
414 if (dir < 0)
415 {
416 /* Linear search for now; FIXME! */
417 for (i = i_start; i >= bidi_cache_start; i--)
418 if (bidi_cache[i].charpos <= charpos
419 && charpos < bidi_cache[i].charpos + bidi_cache[i].nchars
420 && (level == -1 || bidi_cache[i].resolved_level <= level))
421 return i;
422 }
423 else
424 {
425 for (i = i_start; i < bidi_cache_idx; i++)
426 if (bidi_cache[i].charpos <= charpos
427 && charpos < bidi_cache[i].charpos + bidi_cache[i].nchars
428 && (level == -1 || bidi_cache[i].resolved_level <= level))
429 return i;
430 }
431 }
432
433 return -1;
434 }
435
436 /* Find a cached state where the resolved level changes to a value
437 that is lower than LEVEL, and return its cache slot index. DIR is
438 the direction to search, starting with the last used cache slot.
439 If DIR is zero, we search backwards from the last occupied cache
440 slot. BEFORE means return the index of the slot that
441 is ``before'' the level change in the search direction. That is,
442 given the cached levels like this:
443
444 1122333442211
445 AB C
446
447 and assuming we are at the position cached at the slot marked with
448 C, searching backwards (DIR = -1) for LEVEL = 2 will return the
449 index of slot B or A, depending whether BEFORE is, respectively,
450 true or false. */
451 static ptrdiff_t
452 bidi_cache_find_level_change (int level, int dir, bool before)
453 {
454 if (bidi_cache_idx)
455 {
456 ptrdiff_t i = dir ? bidi_cache_last_idx : bidi_cache_idx - 1;
457 int incr = before ? 1 : 0;
458
459 eassert (!dir || bidi_cache_last_idx >= 0);
460
461 if (!dir)
462 dir = -1;
463 else if (!incr)
464 i += dir;
465
466 if (dir < 0)
467 {
468 while (i >= bidi_cache_start + incr)
469 {
470 if (bidi_cache[i - incr].resolved_level >= 0
471 && bidi_cache[i - incr].resolved_level < level)
472 return i;
473 i--;
474 }
475 }
476 else
477 {
478 while (i < bidi_cache_idx - incr)
479 {
480 if (bidi_cache[i + incr].resolved_level >= 0
481 && bidi_cache[i + incr].resolved_level < level)
482 return i;
483 i++;
484 }
485 }
486 }
487
488 return -1;
489 }
490
491 static inline void
492 bidi_cache_ensure_space (ptrdiff_t idx)
493 {
494 /* Enlarge the cache as needed. */
495 if (idx >= bidi_cache_size)
496 {
497 /* The bidi cache cannot be larger than the largest Lisp string
498 or buffer. */
499 ptrdiff_t string_or_buffer_bound
500 = max (BUF_BYTES_MAX, STRING_BYTES_BOUND);
501
502 /* Also, it cannot be larger than what C can represent. */
503 ptrdiff_t c_bound
504 = (min (PTRDIFF_MAX, SIZE_MAX) - bidi_shelve_header_size) / elsz;
505
506 bidi_cache
507 = xpalloc (bidi_cache, &bidi_cache_size,
508 max (BIDI_CACHE_CHUNK, idx - bidi_cache_size + 1),
509 min (string_or_buffer_bound, c_bound), elsz);
510 }
511 }
512
513 static inline void
514 bidi_cache_iterator_state (struct bidi_it *bidi_it, bool resolved)
515 {
516 ptrdiff_t idx;
517
518 /* We should never cache on backward scans. */
519 if (bidi_it->scan_dir == -1)
520 emacs_abort ();
521 idx = bidi_cache_search (bidi_it->charpos, -1, 1);
522
523 if (idx < 0)
524 {
525 idx = bidi_cache_idx;
526 bidi_cache_ensure_space (idx);
527 /* Character positions should correspond to cache positions 1:1.
528 If we are outside the range of cached positions, the cache is
529 useless and must be reset. */
530 if (idx > bidi_cache_start &&
531 (bidi_it->charpos > (bidi_cache[idx - 1].charpos
532 + bidi_cache[idx - 1].nchars)
533 || bidi_it->charpos < bidi_cache[bidi_cache_start].charpos))
534 {
535 bidi_cache_reset ();
536 idx = bidi_cache_start;
537 }
538 if (bidi_it->nchars <= 0)
539 emacs_abort ();
540 bidi_copy_it (&bidi_cache[idx], bidi_it);
541 if (!resolved)
542 bidi_cache[idx].resolved_level = -1;
543 }
544 else
545 {
546 /* Copy only the members which could have changed, to avoid
547 costly copying of the entire struct. */
548 bidi_cache[idx].type = bidi_it->type;
549 bidi_check_type (bidi_it->type);
550 bidi_cache[idx].type_after_w1 = bidi_it->type_after_w1;
551 bidi_check_type (bidi_it->type_after_w1);
552 if (resolved)
553 bidi_cache[idx].resolved_level = bidi_it->resolved_level;
554 else
555 bidi_cache[idx].resolved_level = -1;
556 bidi_cache[idx].invalid_levels = bidi_it->invalid_levels;
557 bidi_cache[idx].invalid_rl_levels = bidi_it->invalid_rl_levels;
558 bidi_cache[idx].next_for_neutral = bidi_it->next_for_neutral;
559 bidi_cache[idx].next_for_ws = bidi_it->next_for_ws;
560 bidi_cache[idx].ignore_bn_limit = bidi_it->ignore_bn_limit;
561 bidi_cache[idx].disp_pos = bidi_it->disp_pos;
562 bidi_cache[idx].disp_prop = bidi_it->disp_prop;
563 }
564
565 bidi_cache_last_idx = idx;
566 if (idx >= bidi_cache_idx)
567 bidi_cache_idx = idx + 1;
568 }
569
570 static inline bidi_type_t
571 bidi_cache_find (ptrdiff_t charpos, int level, struct bidi_it *bidi_it)
572 {
573 ptrdiff_t i = bidi_cache_search (charpos, level, bidi_it->scan_dir);
574
575 if (i >= bidi_cache_start)
576 {
577 bidi_dir_t current_scan_dir = bidi_it->scan_dir;
578
579 bidi_copy_it (bidi_it, &bidi_cache[i]);
580 bidi_cache_last_idx = i;
581 /* Don't let scan direction from the cached state override
582 the current scan direction. */
583 bidi_it->scan_dir = current_scan_dir;
584 return bidi_it->type;
585 }
586
587 return UNKNOWN_BT;
588 }
589
590 static inline int
591 bidi_peek_at_next_level (struct bidi_it *bidi_it)
592 {
593 if (bidi_cache_idx == bidi_cache_start || bidi_cache_last_idx == -1)
594 emacs_abort ();
595 return bidi_cache[bidi_cache_last_idx + bidi_it->scan_dir].resolved_level;
596 }
597
598 \f
599 /***********************************************************************
600 Pushing and popping the bidi iterator state
601 ***********************************************************************/
602
603 /* Push the bidi iterator state in preparation for reordering a
604 different object, e.g. display string found at certain buffer
605 position. Pushing the bidi iterator boils down to saving its
606 entire state on the cache and starting a new cache "stacked" on top
607 of the current cache. */
608 void
609 bidi_push_it (struct bidi_it *bidi_it)
610 {
611 /* Save the current iterator state in its entirety after the last
612 used cache slot. */
613 bidi_cache_ensure_space (bidi_cache_idx);
614 bidi_cache[bidi_cache_idx++] = *bidi_it;
615
616 /* Push the current cache start onto the stack. */
617 eassert (bidi_cache_sp < IT_STACK_SIZE);
618 bidi_cache_start_stack[bidi_cache_sp++] = bidi_cache_start;
619
620 /* Start a new level of cache, and make it empty. */
621 bidi_cache_start = bidi_cache_idx;
622 bidi_cache_last_idx = -1;
623 }
624
625 /* Restore the iterator state saved by bidi_push_it and return the
626 cache to the corresponding state. */
627 void
628 bidi_pop_it (struct bidi_it *bidi_it)
629 {
630 if (bidi_cache_start <= 0)
631 emacs_abort ();
632
633 /* Reset the next free cache slot index to what it was before the
634 call to bidi_push_it. */
635 bidi_cache_idx = bidi_cache_start - 1;
636
637 /* Restore the bidi iterator state saved in the cache. */
638 *bidi_it = bidi_cache[bidi_cache_idx];
639
640 /* Pop the previous cache start from the stack. */
641 if (bidi_cache_sp <= 0)
642 emacs_abort ();
643 bidi_cache_start = bidi_cache_start_stack[--bidi_cache_sp];
644
645 /* Invalidate the last-used cache slot data. */
646 bidi_cache_last_idx = -1;
647 }
648
649 static ptrdiff_t bidi_cache_total_alloc;
650
651 /* Stash away a copy of the cache and its control variables. */
652 void *
653 bidi_shelve_cache (void)
654 {
655 unsigned char *databuf;
656 ptrdiff_t alloc;
657
658 /* Empty cache. */
659 if (bidi_cache_idx == 0)
660 return NULL;
661
662 alloc = (bidi_shelve_header_size
663 + bidi_cache_idx * sizeof (struct bidi_it));
664 databuf = xmalloc (alloc);
665 bidi_cache_total_alloc += alloc;
666
667 memcpy (databuf, &bidi_cache_idx, sizeof (bidi_cache_idx));
668 memcpy (databuf + sizeof (bidi_cache_idx),
669 bidi_cache, bidi_cache_idx * sizeof (struct bidi_it));
670 memcpy (databuf + sizeof (bidi_cache_idx)
671 + bidi_cache_idx * sizeof (struct bidi_it),
672 bidi_cache_start_stack, sizeof (bidi_cache_start_stack));
673 memcpy (databuf + sizeof (bidi_cache_idx)
674 + bidi_cache_idx * sizeof (struct bidi_it)
675 + sizeof (bidi_cache_start_stack),
676 &bidi_cache_sp, sizeof (bidi_cache_sp));
677 memcpy (databuf + sizeof (bidi_cache_idx)
678 + bidi_cache_idx * sizeof (struct bidi_it)
679 + sizeof (bidi_cache_start_stack) + sizeof (bidi_cache_sp),
680 &bidi_cache_start, sizeof (bidi_cache_start));
681 memcpy (databuf + sizeof (bidi_cache_idx)
682 + bidi_cache_idx * sizeof (struct bidi_it)
683 + sizeof (bidi_cache_start_stack) + sizeof (bidi_cache_sp)
684 + sizeof (bidi_cache_start),
685 &bidi_cache_last_idx, sizeof (bidi_cache_last_idx));
686
687 return databuf;
688 }
689
690 /* Restore the cache state from a copy stashed away by
691 bidi_shelve_cache, and free the buffer used to stash that copy.
692 JUST_FREE means free the buffer, but don't restore the
693 cache; used when the corresponding iterator is discarded instead of
694 being restored. */
695 void
696 bidi_unshelve_cache (void *databuf, bool just_free)
697 {
698 unsigned char *p = databuf;
699
700 if (!p)
701 {
702 if (!just_free)
703 {
704 /* A NULL pointer means an empty cache. */
705 bidi_cache_start = 0;
706 bidi_cache_sp = 0;
707 bidi_cache_reset ();
708 }
709 }
710 else
711 {
712 if (just_free)
713 {
714 ptrdiff_t idx;
715
716 memcpy (&idx, p, sizeof (bidi_cache_idx));
717 bidi_cache_total_alloc
718 -= bidi_shelve_header_size + idx * sizeof (struct bidi_it);
719 }
720 else
721 {
722 memcpy (&bidi_cache_idx, p, sizeof (bidi_cache_idx));
723 bidi_cache_ensure_space (bidi_cache_idx);
724 memcpy (bidi_cache, p + sizeof (bidi_cache_idx),
725 bidi_cache_idx * sizeof (struct bidi_it));
726 memcpy (bidi_cache_start_stack,
727 p + sizeof (bidi_cache_idx)
728 + bidi_cache_idx * sizeof (struct bidi_it),
729 sizeof (bidi_cache_start_stack));
730 memcpy (&bidi_cache_sp,
731 p + sizeof (bidi_cache_idx)
732 + bidi_cache_idx * sizeof (struct bidi_it)
733 + sizeof (bidi_cache_start_stack),
734 sizeof (bidi_cache_sp));
735 memcpy (&bidi_cache_start,
736 p + sizeof (bidi_cache_idx)
737 + bidi_cache_idx * sizeof (struct bidi_it)
738 + sizeof (bidi_cache_start_stack) + sizeof (bidi_cache_sp),
739 sizeof (bidi_cache_start));
740 memcpy (&bidi_cache_last_idx,
741 p + sizeof (bidi_cache_idx)
742 + bidi_cache_idx * sizeof (struct bidi_it)
743 + sizeof (bidi_cache_start_stack) + sizeof (bidi_cache_sp)
744 + sizeof (bidi_cache_start),
745 sizeof (bidi_cache_last_idx));
746 bidi_cache_total_alloc
747 -= (bidi_shelve_header_size
748 + bidi_cache_idx * sizeof (struct bidi_it));
749 }
750
751 xfree (p);
752 }
753 }
754
755 \f
756 /***********************************************************************
757 Initialization
758 ***********************************************************************/
759 static void
760 bidi_initialize (void)
761 {
762 bidi_type_table = uniprop_table (intern ("bidi-class"));
763 if (NILP (bidi_type_table))
764 emacs_abort ();
765 staticpro (&bidi_type_table);
766
767 bidi_mirror_table = uniprop_table (intern ("mirroring"));
768 if (NILP (bidi_mirror_table))
769 emacs_abort ();
770 staticpro (&bidi_mirror_table);
771
772 Qparagraph_start = intern ("paragraph-start");
773 staticpro (&Qparagraph_start);
774 paragraph_start_re = Fsymbol_value (Qparagraph_start);
775 if (!STRINGP (paragraph_start_re))
776 paragraph_start_re = build_string ("\f\\|[ \t]*$");
777 staticpro (&paragraph_start_re);
778 Qparagraph_separate = intern ("paragraph-separate");
779 staticpro (&Qparagraph_separate);
780 paragraph_separate_re = Fsymbol_value (Qparagraph_separate);
781 if (!STRINGP (paragraph_separate_re))
782 paragraph_separate_re = build_string ("[ \t\f]*$");
783 staticpro (&paragraph_separate_re);
784
785 bidi_cache_sp = 0;
786 bidi_cache_total_alloc = 0;
787
788 bidi_initialized = 1;
789 }
790
791 /* Do whatever UAX#9 clause X8 says should be done at paragraph's
792 end. */
793 static inline void
794 bidi_set_paragraph_end (struct bidi_it *bidi_it)
795 {
796 bidi_it->invalid_levels = 0;
797 bidi_it->invalid_rl_levels = -1;
798 bidi_it->stack_idx = 0;
799 bidi_it->resolved_level = bidi_it->level_stack[0].level;
800 }
801
802 /* Initialize the bidi iterator from buffer/string position CHARPOS. */
803 void
804 bidi_init_it (ptrdiff_t charpos, ptrdiff_t bytepos, bool frame_window_p,
805 struct bidi_it *bidi_it)
806 {
807 if (! bidi_initialized)
808 bidi_initialize ();
809 if (charpos >= 0)
810 bidi_it->charpos = charpos;
811 if (bytepos >= 0)
812 bidi_it->bytepos = bytepos;
813 bidi_it->frame_window_p = frame_window_p;
814 bidi_it->nchars = -1; /* to be computed in bidi_resolve_explicit_1 */
815 bidi_it->first_elt = 1;
816 bidi_set_paragraph_end (bidi_it);
817 bidi_it->new_paragraph = 1;
818 bidi_it->separator_limit = -1;
819 bidi_it->type = NEUTRAL_B;
820 bidi_it->type_after_w1 = NEUTRAL_B;
821 bidi_it->orig_type = NEUTRAL_B;
822 bidi_it->prev_was_pdf = 0;
823 bidi_it->prev.type = bidi_it->prev.type_after_w1
824 = bidi_it->prev.orig_type = UNKNOWN_BT;
825 bidi_it->last_strong.type = bidi_it->last_strong.type_after_w1
826 = bidi_it->last_strong.orig_type = UNKNOWN_BT;
827 bidi_it->next_for_neutral.charpos = -1;
828 bidi_it->next_for_neutral.type
829 = bidi_it->next_for_neutral.type_after_w1
830 = bidi_it->next_for_neutral.orig_type = UNKNOWN_BT;
831 bidi_it->prev_for_neutral.charpos = -1;
832 bidi_it->prev_for_neutral.type
833 = bidi_it->prev_for_neutral.type_after_w1
834 = bidi_it->prev_for_neutral.orig_type = UNKNOWN_BT;
835 bidi_it->sor = L2R; /* FIXME: should it be user-selectable? */
836 bidi_it->disp_pos = -1; /* invalid/unknown */
837 bidi_it->disp_prop = 0;
838 /* We can only shrink the cache if we are at the bottom level of its
839 "stack". */
840 if (bidi_cache_start == 0)
841 bidi_cache_shrink ();
842 else
843 bidi_cache_reset ();
844 }
845
846 /* Perform initializations for reordering a new line of bidi text. */
847 static void
848 bidi_line_init (struct bidi_it *bidi_it)
849 {
850 bidi_it->scan_dir = 1; /* FIXME: do we need to have control on this? */
851 bidi_it->resolved_level = bidi_it->level_stack[0].level;
852 bidi_it->level_stack[0].override = NEUTRAL_DIR; /* X1 */
853 bidi_it->invalid_levels = 0;
854 bidi_it->invalid_rl_levels = -1;
855 /* Setting this to zero will force its recomputation the first time
856 we need it for W5. */
857 bidi_it->next_en_pos = 0;
858 bidi_it->next_en_type = UNKNOWN_BT;
859 bidi_it->next_for_ws.type = UNKNOWN_BT;
860 bidi_set_sor_type (bidi_it,
861 (bidi_it->paragraph_dir == R2L ? 1 : 0),
862 bidi_it->level_stack[0].level); /* X10 */
863
864 bidi_cache_reset ();
865 }
866
867 \f
868 /***********************************************************************
869 Fetching characters
870 ***********************************************************************/
871
872 /* Count bytes in string S between BEG/BEGBYTE and END. BEG and END
873 are zero-based character positions in S, BEGBYTE is byte position
874 corresponding to BEG. UNIBYTE means S is a unibyte string. */
875 static inline ptrdiff_t
876 bidi_count_bytes (const unsigned char *s, const ptrdiff_t beg,
877 const ptrdiff_t begbyte, const ptrdiff_t end, bool unibyte)
878 {
879 ptrdiff_t pos = beg;
880 const unsigned char *p = s + begbyte, *start = p;
881
882 if (unibyte)
883 p = s + end;
884 else
885 {
886 if (!CHAR_HEAD_P (*p))
887 emacs_abort ();
888
889 while (pos < end)
890 {
891 p += BYTES_BY_CHAR_HEAD (*p);
892 pos++;
893 }
894 }
895
896 return p - start;
897 }
898
899 /* Fetch and returns the character at byte position BYTEPOS. If S is
900 non-NULL, fetch the character from string S; otherwise fetch the
901 character from the current buffer. UNIBYTE means S is a
902 unibyte string. */
903 static inline int
904 bidi_char_at_pos (ptrdiff_t bytepos, const unsigned char *s, bool unibyte)
905 {
906 if (s)
907 {
908 if (unibyte)
909 return s[bytepos];
910 else
911 return STRING_CHAR (s + bytepos);
912 }
913 else
914 return FETCH_MULTIBYTE_CHAR (bytepos);
915 }
916
917 /* Fetch and return the character at BYTEPOS/CHARPOS. If that
918 character is covered by a display string, treat the entire run of
919 covered characters as a single character, either u+2029 or u+FFFC,
920 and return their combined length in CH_LEN and NCHARS. DISP_POS
921 specifies the character position of the next display string, or -1
922 if not yet computed. When the next character is at or beyond that
923 position, the function updates DISP_POS with the position of the
924 next display string. *DISP_PROP non-zero means that there's really
925 a display string at DISP_POS, as opposed to when we searched till
926 DISP_POS without finding one. If *DISP_PROP is 2, it means the
927 display spec is of the form `(space ...)', which is replaced with
928 u+2029 to handle it as a paragraph separator. STRING->s is the C
929 string to iterate, or NULL if iterating over a buffer or a Lisp
930 string; in the latter case, STRING->lstring is the Lisp string. */
931 static inline int
932 bidi_fetch_char (ptrdiff_t bytepos, ptrdiff_t charpos, ptrdiff_t *disp_pos,
933 int *disp_prop, struct bidi_string_data *string,
934 bool frame_window_p, ptrdiff_t *ch_len, ptrdiff_t *nchars)
935 {
936 int ch;
937 ptrdiff_t endpos
938 = (string->s || STRINGP (string->lstring)) ? string->schars : ZV;
939 struct text_pos pos;
940 int len;
941
942 /* If we got past the last known position of display string, compute
943 the position of the next one. That position could be at CHARPOS. */
944 if (charpos < endpos && charpos > *disp_pos)
945 {
946 SET_TEXT_POS (pos, charpos, bytepos);
947 *disp_pos = compute_display_string_pos (&pos, string, frame_window_p,
948 disp_prop);
949 }
950
951 /* Fetch the character at BYTEPOS. */
952 if (charpos >= endpos)
953 {
954 ch = BIDI_EOB;
955 *ch_len = 1;
956 *nchars = 1;
957 *disp_pos = endpos;
958 *disp_prop = 0;
959 }
960 else if (charpos >= *disp_pos && *disp_prop)
961 {
962 ptrdiff_t disp_end_pos;
963
964 /* We don't expect to find ourselves in the middle of a display
965 property. Hopefully, it will never be needed. */
966 if (charpos > *disp_pos)
967 emacs_abort ();
968 /* Text covered by `display' properties and overlays with
969 display properties or display strings is handled as a single
970 character that represents the entire run of characters
971 covered by the display property. */
972 if (*disp_prop == 2)
973 {
974 /* `(space ...)' display specs are handled as paragraph
975 separators for the purposes of the reordering; see UAX#9
976 section 3 and clause HL1 in section 4.3 there. */
977 ch = 0x2029;
978 }
979 else
980 {
981 /* All other display specs are handled as the Unicode Object
982 Replacement Character. */
983 ch = 0xFFFC;
984 }
985 disp_end_pos = compute_display_string_end (*disp_pos, string);
986 if (disp_end_pos < 0)
987 {
988 /* Somebody removed the display string from the buffer
989 behind our back. Recover by processing this buffer
990 position as if no display property were present there to
991 begin with. */
992 *disp_prop = 0;
993 goto normal_char;
994 }
995 *nchars = disp_end_pos - *disp_pos;
996 if (*nchars <= 0)
997 emacs_abort ();
998 if (string->s)
999 *ch_len = bidi_count_bytes (string->s, *disp_pos, bytepos,
1000 disp_end_pos, string->unibyte);
1001 else if (STRINGP (string->lstring))
1002 *ch_len = bidi_count_bytes (SDATA (string->lstring), *disp_pos,
1003 bytepos, disp_end_pos, string->unibyte);
1004 else
1005 *ch_len = CHAR_TO_BYTE (disp_end_pos) - bytepos;
1006 }
1007 else
1008 {
1009 normal_char:
1010 if (string->s)
1011 {
1012
1013 if (!string->unibyte)
1014 {
1015 ch = STRING_CHAR_AND_LENGTH (string->s + bytepos, len);
1016 *ch_len = len;
1017 }
1018 else
1019 {
1020 ch = UNIBYTE_TO_CHAR (string->s[bytepos]);
1021 *ch_len = 1;
1022 }
1023 }
1024 else if (STRINGP (string->lstring))
1025 {
1026 if (!string->unibyte)
1027 {
1028 ch = STRING_CHAR_AND_LENGTH (SDATA (string->lstring) + bytepos,
1029 len);
1030 *ch_len = len;
1031 }
1032 else
1033 {
1034 ch = UNIBYTE_TO_CHAR (SREF (string->lstring, bytepos));
1035 *ch_len = 1;
1036 }
1037 }
1038 else
1039 {
1040 ch = STRING_CHAR_AND_LENGTH (BYTE_POS_ADDR (bytepos), len);
1041 *ch_len = len;
1042 }
1043 *nchars = 1;
1044 }
1045
1046 /* If we just entered a run of characters covered by a display
1047 string, compute the position of the next display string. */
1048 if (charpos + *nchars <= endpos && charpos + *nchars > *disp_pos
1049 && *disp_prop)
1050 {
1051 SET_TEXT_POS (pos, charpos + *nchars, bytepos + *ch_len);
1052 *disp_pos = compute_display_string_pos (&pos, string, frame_window_p,
1053 disp_prop);
1054 }
1055
1056 return ch;
1057 }
1058
1059 \f
1060 /***********************************************************************
1061 Determining paragraph direction
1062 ***********************************************************************/
1063
1064 /* Check if buffer position CHARPOS/BYTEPOS is the end of a paragraph.
1065 Value is the non-negative length of the paragraph separator
1066 following the buffer position, -1 if position is at the beginning
1067 of a new paragraph, or -2 if position is neither at beginning nor
1068 at end of a paragraph. */
1069 static ptrdiff_t
1070 bidi_at_paragraph_end (ptrdiff_t charpos, ptrdiff_t bytepos)
1071 {
1072 Lisp_Object sep_re;
1073 Lisp_Object start_re;
1074 ptrdiff_t val;
1075
1076 sep_re = paragraph_separate_re;
1077 start_re = paragraph_start_re;
1078
1079 val = fast_looking_at (sep_re, charpos, bytepos, ZV, ZV_BYTE, Qnil);
1080 if (val < 0)
1081 {
1082 if (fast_looking_at (start_re, charpos, bytepos, ZV, ZV_BYTE, Qnil) >= 0)
1083 val = -1;
1084 else
1085 val = -2;
1086 }
1087
1088 return val;
1089 }
1090
1091 /* On my 2005-vintage machine, searching back for paragraph start
1092 takes ~1 ms per line. And bidi_paragraph_init is called 4 times
1093 when user types C-p. The number below limits each call to
1094 bidi_paragraph_init to about 10 ms. */
1095 #define MAX_PARAGRAPH_SEARCH 7500
1096
1097 /* Find the beginning of this paragraph by looking back in the buffer.
1098 Value is the byte position of the paragraph's beginning, or
1099 BEGV_BYTE if paragraph_start_re is still not found after looking
1100 back MAX_PARAGRAPH_SEARCH lines in the buffer. */
1101 static ptrdiff_t
1102 bidi_find_paragraph_start (ptrdiff_t pos, ptrdiff_t pos_byte)
1103 {
1104 Lisp_Object re = paragraph_start_re;
1105 ptrdiff_t limit = ZV, limit_byte = ZV_BYTE;
1106 ptrdiff_t n = 0;
1107
1108 while (pos_byte > BEGV_BYTE
1109 && n++ < MAX_PARAGRAPH_SEARCH
1110 && fast_looking_at (re, pos, pos_byte, limit, limit_byte, Qnil) < 0)
1111 {
1112 /* FIXME: What if the paragraph beginning is covered by a
1113 display string? And what if a display string covering some
1114 of the text over which we scan back includes
1115 paragraph_start_re? */
1116 pos = find_next_newline_no_quit (pos - 1, -1);
1117 pos_byte = CHAR_TO_BYTE (pos);
1118 }
1119 if (n >= MAX_PARAGRAPH_SEARCH)
1120 pos_byte = BEGV_BYTE;
1121 return pos_byte;
1122 }
1123
1124 /* On a 3.4 GHz machine, searching forward for a strong directional
1125 character in a long paragraph full of weaks or neutrals takes about
1126 1 ms for each 20K characters. The number below limits each call to
1127 bidi_paragraph_init to less than 10 ms even on slow machines. */
1128 #define MAX_STRONG_CHAR_SEARCH 100000
1129
1130 /* Determine the base direction, a.k.a. base embedding level, of the
1131 paragraph we are about to iterate through. If DIR is either L2R or
1132 R2L, just use that. Otherwise, determine the paragraph direction
1133 from the first strong directional character of the paragraph.
1134
1135 NO_DEFAULT_P means don't default to L2R if the paragraph
1136 has no strong directional characters and both DIR and
1137 bidi_it->paragraph_dir are NEUTRAL_DIR. In that case, search back
1138 in the buffer until a paragraph is found with a strong character,
1139 or until hitting BEGV. In the latter case, fall back to L2R. This
1140 flag is used in current-bidi-paragraph-direction.
1141
1142 Note that this function gives the paragraph separator the same
1143 direction as the preceding paragraph, even though Emacs generally
1144 views the separator as not belonging to any paragraph. */
1145 void
1146 bidi_paragraph_init (bidi_dir_t dir, struct bidi_it *bidi_it, bool no_default_p)
1147 {
1148 ptrdiff_t bytepos = bidi_it->bytepos;
1149 bool string_p = bidi_it->string.s || STRINGP (bidi_it->string.lstring);
1150 ptrdiff_t pstartbyte;
1151 /* Note that begbyte is a byte position, while end is a character
1152 position. Yes, this is ugly, but we are trying to avoid costly
1153 calls to BYTE_TO_CHAR and its ilk. */
1154 ptrdiff_t begbyte = string_p ? 0 : BEGV_BYTE;
1155 ptrdiff_t end = string_p ? bidi_it->string.schars : ZV;
1156
1157 /* Special case for an empty buffer. */
1158 if (bytepos == begbyte && bidi_it->charpos == end)
1159 dir = L2R;
1160 /* We should never be called at EOB or before BEGV. */
1161 else if (bidi_it->charpos >= end || bytepos < begbyte)
1162 emacs_abort ();
1163
1164 if (dir == L2R)
1165 {
1166 bidi_it->paragraph_dir = L2R;
1167 bidi_it->new_paragraph = 0;
1168 }
1169 else if (dir == R2L)
1170 {
1171 bidi_it->paragraph_dir = R2L;
1172 bidi_it->new_paragraph = 0;
1173 }
1174 else if (dir == NEUTRAL_DIR) /* P2 */
1175 {
1176 int ch;
1177 ptrdiff_t ch_len, nchars;
1178 ptrdiff_t pos, disp_pos = -1;
1179 int disp_prop = 0;
1180 bidi_type_t type;
1181 const unsigned char *s;
1182
1183 if (!bidi_initialized)
1184 bidi_initialize ();
1185
1186 /* If we are inside a paragraph separator, we are just waiting
1187 for the separator to be exhausted; use the previous paragraph
1188 direction. But don't do that if we have been just reseated,
1189 because we need to reinitialize below in that case. */
1190 if (!bidi_it->first_elt
1191 && bidi_it->charpos < bidi_it->separator_limit)
1192 return;
1193
1194 /* If we are on a newline, get past it to where the next
1195 paragraph might start. But don't do that at BEGV since then
1196 we are potentially in a new paragraph that doesn't yet
1197 exist. */
1198 pos = bidi_it->charpos;
1199 s = (STRINGP (bidi_it->string.lstring)
1200 ? SDATA (bidi_it->string.lstring)
1201 : bidi_it->string.s);
1202 if (bytepos > begbyte
1203 && bidi_char_at_pos (bytepos, s, bidi_it->string.unibyte) == '\n')
1204 {
1205 bytepos++;
1206 pos++;
1207 }
1208
1209 /* We are either at the beginning of a paragraph or in the
1210 middle of it. Find where this paragraph starts. */
1211 if (string_p)
1212 {
1213 /* We don't support changes of paragraph direction inside a
1214 string. It is treated as a single paragraph. */
1215 pstartbyte = 0;
1216 }
1217 else
1218 pstartbyte = bidi_find_paragraph_start (pos, bytepos);
1219 bidi_it->separator_limit = -1;
1220 bidi_it->new_paragraph = 0;
1221
1222 /* The following loop is run more than once only if NO_DEFAULT_P,
1223 and only if we are iterating on a buffer. */
1224 do {
1225 ptrdiff_t pos1;
1226
1227 bytepos = pstartbyte;
1228 if (!string_p)
1229 pos = BYTE_TO_CHAR (bytepos);
1230 ch = bidi_fetch_char (bytepos, pos, &disp_pos, &disp_prop,
1231 &bidi_it->string,
1232 bidi_it->frame_window_p, &ch_len, &nchars);
1233 type = bidi_get_type (ch, NEUTRAL_DIR);
1234
1235 pos1 = pos;
1236 for (pos += nchars, bytepos += ch_len;
1237 ((bidi_get_category (type) != STRONG)
1238 || (bidi_ignore_explicit_marks_for_paragraph_level
1239 && (type == RLE || type == RLO
1240 || type == LRE || type == LRO)))
1241 /* Stop when searched too far into an abnormally large
1242 paragraph full of weak or neutral characters. */
1243 && pos - pos1 < MAX_STRONG_CHAR_SEARCH;
1244 type = bidi_get_type (ch, NEUTRAL_DIR))
1245 {
1246 if (pos >= end)
1247 {
1248 /* Pretend there's a paragraph separator at end of
1249 buffer/string. */
1250 type = NEUTRAL_B;
1251 break;
1252 }
1253 if (!string_p
1254 && type == NEUTRAL_B
1255 && bidi_at_paragraph_end (pos, bytepos) >= -1)
1256 break;
1257 /* Fetch next character and advance to get past it. */
1258 ch = bidi_fetch_char (bytepos, pos, &disp_pos,
1259 &disp_prop, &bidi_it->string,
1260 bidi_it->frame_window_p, &ch_len, &nchars);
1261 pos += nchars;
1262 bytepos += ch_len;
1263 }
1264 if ((type == STRONG_R || type == STRONG_AL) /* P3 */
1265 || (!bidi_ignore_explicit_marks_for_paragraph_level
1266 && (type == RLO || type == RLE)))
1267 bidi_it->paragraph_dir = R2L;
1268 else if (type == STRONG_L
1269 || (!bidi_ignore_explicit_marks_for_paragraph_level
1270 && (type == LRO || type == LRE)))
1271 bidi_it->paragraph_dir = L2R;
1272 if (!string_p
1273 && no_default_p && bidi_it->paragraph_dir == NEUTRAL_DIR)
1274 {
1275 /* If this paragraph is at BEGV, default to L2R. */
1276 if (pstartbyte == BEGV_BYTE)
1277 bidi_it->paragraph_dir = L2R; /* P3 and HL1 */
1278 else
1279 {
1280 ptrdiff_t prevpbyte = pstartbyte;
1281 ptrdiff_t p = BYTE_TO_CHAR (pstartbyte), pbyte = pstartbyte;
1282
1283 /* Find the beginning of the previous paragraph, if any. */
1284 while (pbyte > BEGV_BYTE && prevpbyte >= pstartbyte)
1285 {
1286 /* FXIME: What if p is covered by a display
1287 string? See also a FIXME inside
1288 bidi_find_paragraph_start. */
1289 p--;
1290 pbyte = CHAR_TO_BYTE (p);
1291 prevpbyte = bidi_find_paragraph_start (p, pbyte);
1292 }
1293 pstartbyte = prevpbyte;
1294 }
1295 }
1296 } while (!string_p
1297 && no_default_p && bidi_it->paragraph_dir == NEUTRAL_DIR);
1298 }
1299 else
1300 emacs_abort ();
1301
1302 /* Contrary to UAX#9 clause P3, we only default the paragraph
1303 direction to L2R if we have no previous usable paragraph
1304 direction. This is allowed by the HL1 clause. */
1305 if (bidi_it->paragraph_dir != L2R && bidi_it->paragraph_dir != R2L)
1306 bidi_it->paragraph_dir = L2R; /* P3 and HL1 ``higher-level protocols'' */
1307 if (bidi_it->paragraph_dir == R2L)
1308 bidi_it->level_stack[0].level = 1;
1309 else
1310 bidi_it->level_stack[0].level = 0;
1311
1312 bidi_line_init (bidi_it);
1313 }
1314
1315 \f
1316 /***********************************************************************
1317 Resolving explicit and implicit levels.
1318 The rest of this file constitutes the core of the UBA implementation.
1319 ***********************************************************************/
1320
1321 static inline bool
1322 bidi_explicit_dir_char (int ch)
1323 {
1324 bidi_type_t ch_type;
1325
1326 if (!bidi_initialized)
1327 emacs_abort ();
1328 ch_type = (bidi_type_t) XINT (CHAR_TABLE_REF (bidi_type_table, ch));
1329 return (ch_type == LRE || ch_type == LRO
1330 || ch_type == RLE || ch_type == RLO
1331 || ch_type == PDF);
1332 }
1333
1334 /* A helper function for bidi_resolve_explicit. It advances to the
1335 next character in logical order and determines the new embedding
1336 level and directional override, but does not take into account
1337 empty embeddings. */
1338 static int
1339 bidi_resolve_explicit_1 (struct bidi_it *bidi_it)
1340 {
1341 int curchar;
1342 bidi_type_t type;
1343 int current_level;
1344 int new_level;
1345 bidi_dir_t override;
1346 bool string_p = bidi_it->string.s || STRINGP (bidi_it->string.lstring);
1347
1348 /* If reseat()'ed, don't advance, so as to start iteration from the
1349 position where we were reseated. bidi_it->bytepos can be less
1350 than BEGV_BYTE after reseat to BEGV. */
1351 if (bidi_it->bytepos < (string_p ? 0 : BEGV_BYTE)
1352 || bidi_it->first_elt)
1353 {
1354 bidi_it->first_elt = 0;
1355 if (string_p)
1356 {
1357 const unsigned char *p
1358 = (STRINGP (bidi_it->string.lstring)
1359 ? SDATA (bidi_it->string.lstring)
1360 : bidi_it->string.s);
1361
1362 if (bidi_it->charpos < 0)
1363 bidi_it->charpos = 0;
1364 bidi_it->bytepos = bidi_count_bytes (p, 0, 0, bidi_it->charpos,
1365 bidi_it->string.unibyte);
1366 }
1367 else
1368 {
1369 if (bidi_it->charpos < BEGV)
1370 bidi_it->charpos = BEGV;
1371 bidi_it->bytepos = CHAR_TO_BYTE (bidi_it->charpos);
1372 }
1373 }
1374 /* Don't move at end of buffer/string. */
1375 else if (bidi_it->charpos < (string_p ? bidi_it->string.schars : ZV))
1376 {
1377 /* Advance to the next character, skipping characters covered by
1378 display strings (nchars > 1). */
1379 if (bidi_it->nchars <= 0)
1380 emacs_abort ();
1381 bidi_it->charpos += bidi_it->nchars;
1382 if (bidi_it->ch_len == 0)
1383 emacs_abort ();
1384 bidi_it->bytepos += bidi_it->ch_len;
1385 }
1386
1387 current_level = bidi_it->level_stack[bidi_it->stack_idx].level; /* X1 */
1388 override = bidi_it->level_stack[bidi_it->stack_idx].override;
1389 new_level = current_level;
1390
1391 if (bidi_it->charpos >= (string_p ? bidi_it->string.schars : ZV))
1392 {
1393 curchar = BIDI_EOB;
1394 bidi_it->ch_len = 1;
1395 bidi_it->nchars = 1;
1396 bidi_it->disp_pos = (string_p ? bidi_it->string.schars : ZV);
1397 bidi_it->disp_prop = 0;
1398 }
1399 else
1400 {
1401 /* Fetch the character at BYTEPOS. If it is covered by a
1402 display string, treat the entire run of covered characters as
1403 a single character u+FFFC. */
1404 curchar = bidi_fetch_char (bidi_it->bytepos, bidi_it->charpos,
1405 &bidi_it->disp_pos, &bidi_it->disp_prop,
1406 &bidi_it->string, bidi_it->frame_window_p,
1407 &bidi_it->ch_len, &bidi_it->nchars);
1408 }
1409 bidi_it->ch = curchar;
1410
1411 /* Don't apply directional override here, as all the types we handle
1412 below will not be affected by the override anyway, and we need
1413 the original type unaltered. The override will be applied in
1414 bidi_resolve_weak. */
1415 type = bidi_get_type (curchar, NEUTRAL_DIR);
1416 bidi_it->orig_type = type;
1417 bidi_check_type (bidi_it->orig_type);
1418
1419 if (type != PDF)
1420 bidi_it->prev_was_pdf = 0;
1421
1422 bidi_it->type_after_w1 = UNKNOWN_BT;
1423
1424 switch (type)
1425 {
1426 case RLE: /* X2 */
1427 case RLO: /* X4 */
1428 bidi_it->type_after_w1 = type;
1429 bidi_check_type (bidi_it->type_after_w1);
1430 type = WEAK_BN; /* X9/Retaining */
1431 if (bidi_it->ignore_bn_limit <= -1)
1432 {
1433 if (current_level <= BIDI_MAXLEVEL - 4)
1434 {
1435 /* Compute the least odd embedding level greater than
1436 the current level. */
1437 new_level = ((current_level + 1) & ~1) + 1;
1438 if (bidi_it->type_after_w1 == RLE)
1439 override = NEUTRAL_DIR;
1440 else
1441 override = R2L;
1442 if (current_level == BIDI_MAXLEVEL - 4)
1443 bidi_it->invalid_rl_levels = 0;
1444 bidi_push_embedding_level (bidi_it, new_level, override);
1445 }
1446 else
1447 {
1448 bidi_it->invalid_levels++;
1449 /* See the commentary about invalid_rl_levels below. */
1450 if (bidi_it->invalid_rl_levels < 0)
1451 bidi_it->invalid_rl_levels = 0;
1452 bidi_it->invalid_rl_levels++;
1453 }
1454 }
1455 else if (bidi_it->prev.type_after_w1 == WEAK_EN /* W5/Retaining */
1456 || (bidi_it->next_en_pos > bidi_it->charpos
1457 && bidi_it->next_en_type == WEAK_EN))
1458 type = WEAK_EN;
1459 break;
1460 case LRE: /* X3 */
1461 case LRO: /* X5 */
1462 bidi_it->type_after_w1 = type;
1463 bidi_check_type (bidi_it->type_after_w1);
1464 type = WEAK_BN; /* X9/Retaining */
1465 if (bidi_it->ignore_bn_limit <= -1)
1466 {
1467 if (current_level <= BIDI_MAXLEVEL - 5)
1468 {
1469 /* Compute the least even embedding level greater than
1470 the current level. */
1471 new_level = ((current_level + 2) & ~1);
1472 if (bidi_it->type_after_w1 == LRE)
1473 override = NEUTRAL_DIR;
1474 else
1475 override = L2R;
1476 bidi_push_embedding_level (bidi_it, new_level, override);
1477 }
1478 else
1479 {
1480 bidi_it->invalid_levels++;
1481 /* invalid_rl_levels counts invalid levels encountered
1482 while the embedding level was already too high for
1483 LRE/LRO, but not for RLE/RLO. That is because
1484 there may be exactly one PDF which we should not
1485 ignore even though invalid_levels is non-zero.
1486 invalid_rl_levels helps to know what PDF is
1487 that. */
1488 if (bidi_it->invalid_rl_levels >= 0)
1489 bidi_it->invalid_rl_levels++;
1490 }
1491 }
1492 else if (bidi_it->prev.type_after_w1 == WEAK_EN /* W5/Retaining */
1493 || (bidi_it->next_en_pos > bidi_it->charpos
1494 && bidi_it->next_en_type == WEAK_EN))
1495 type = WEAK_EN;
1496 break;
1497 case PDF: /* X7 */
1498 bidi_it->type_after_w1 = type;
1499 bidi_check_type (bidi_it->type_after_w1);
1500 type = WEAK_BN; /* X9/Retaining */
1501 if (bidi_it->ignore_bn_limit <= -1)
1502 {
1503 if (!bidi_it->invalid_rl_levels)
1504 {
1505 new_level = bidi_pop_embedding_level (bidi_it);
1506 bidi_it->invalid_rl_levels = -1;
1507 if (bidi_it->invalid_levels)
1508 bidi_it->invalid_levels--;
1509 /* else nothing: UAX#9 says to ignore invalid PDFs */
1510 }
1511 if (!bidi_it->invalid_levels)
1512 new_level = bidi_pop_embedding_level (bidi_it);
1513 else
1514 {
1515 bidi_it->invalid_levels--;
1516 bidi_it->invalid_rl_levels--;
1517 }
1518 }
1519 else if (bidi_it->prev.type_after_w1 == WEAK_EN /* W5/Retaining */
1520 || (bidi_it->next_en_pos > bidi_it->charpos
1521 && bidi_it->next_en_type == WEAK_EN))
1522 type = WEAK_EN;
1523 break;
1524 default:
1525 /* Nothing. */
1526 break;
1527 }
1528
1529 bidi_it->type = type;
1530 bidi_check_type (bidi_it->type);
1531
1532 return new_level;
1533 }
1534
1535 /* Given an iterator state in BIDI_IT, advance one character position
1536 in the buffer/string to the next character (in the logical order),
1537 resolve any explicit embeddings and directional overrides, and
1538 return the embedding level of the character after resolving
1539 explicit directives and ignoring empty embeddings. */
1540 static int
1541 bidi_resolve_explicit (struct bidi_it *bidi_it)
1542 {
1543 int prev_level = bidi_it->level_stack[bidi_it->stack_idx].level;
1544 int new_level = bidi_resolve_explicit_1 (bidi_it);
1545 ptrdiff_t eob = bidi_it->string.s ? bidi_it->string.schars : ZV;
1546 const unsigned char *s
1547 = (STRINGP (bidi_it->string.lstring)
1548 ? SDATA (bidi_it->string.lstring)
1549 : bidi_it->string.s);
1550
1551 if (prev_level < new_level
1552 && bidi_it->type == WEAK_BN
1553 && bidi_it->ignore_bn_limit == -1 /* only if not already known */
1554 && bidi_it->charpos < eob /* not already at EOB */
1555 && bidi_explicit_dir_char (bidi_char_at_pos (bidi_it->bytepos
1556 + bidi_it->ch_len, s,
1557 bidi_it->string.unibyte)))
1558 {
1559 /* Avoid pushing and popping embedding levels if the level run
1560 is empty, as this breaks level runs where it shouldn't.
1561 UAX#9 removes all the explicit embedding and override codes,
1562 so empty embeddings disappear without a trace. We need to
1563 behave as if we did the same. */
1564 struct bidi_it saved_it;
1565 int level = prev_level;
1566
1567 bidi_copy_it (&saved_it, bidi_it);
1568
1569 while (bidi_explicit_dir_char (bidi_char_at_pos (bidi_it->bytepos
1570 + bidi_it->ch_len, s,
1571 bidi_it->string.unibyte)))
1572 {
1573 /* This advances to the next character, skipping any
1574 characters covered by display strings. */
1575 level = bidi_resolve_explicit_1 (bidi_it);
1576 /* If string.lstring was relocated inside bidi_resolve_explicit_1,
1577 a pointer to its data is no longer valid. */
1578 if (STRINGP (bidi_it->string.lstring))
1579 s = SDATA (bidi_it->string.lstring);
1580 }
1581
1582 if (bidi_it->nchars <= 0)
1583 emacs_abort ();
1584 if (level == prev_level) /* empty embedding */
1585 saved_it.ignore_bn_limit = bidi_it->charpos + bidi_it->nchars;
1586 else /* this embedding is non-empty */
1587 saved_it.ignore_bn_limit = -2;
1588
1589 bidi_copy_it (bidi_it, &saved_it);
1590 if (bidi_it->ignore_bn_limit > -1)
1591 {
1592 /* We pushed a level, but we shouldn't have. Undo that. */
1593 if (!bidi_it->invalid_rl_levels)
1594 {
1595 new_level = bidi_pop_embedding_level (bidi_it);
1596 bidi_it->invalid_rl_levels = -1;
1597 if (bidi_it->invalid_levels)
1598 bidi_it->invalid_levels--;
1599 }
1600 if (!bidi_it->invalid_levels)
1601 new_level = bidi_pop_embedding_level (bidi_it);
1602 else
1603 {
1604 bidi_it->invalid_levels--;
1605 bidi_it->invalid_rl_levels--;
1606 }
1607 }
1608 }
1609
1610 if (bidi_it->type == NEUTRAL_B) /* X8 */
1611 {
1612 bidi_set_paragraph_end (bidi_it);
1613 /* This is needed by bidi_resolve_weak below, and in L1. */
1614 bidi_it->type_after_w1 = bidi_it->type;
1615 bidi_check_type (bidi_it->type_after_w1);
1616 }
1617
1618 return new_level;
1619 }
1620
1621 /* Advance in the buffer/string, resolve weak types and return the
1622 type of the next character after weak type resolution. */
1623 static bidi_type_t
1624 bidi_resolve_weak (struct bidi_it *bidi_it)
1625 {
1626 bidi_type_t type;
1627 bidi_dir_t override;
1628 int prev_level = bidi_it->level_stack[bidi_it->stack_idx].level;
1629 int new_level = bidi_resolve_explicit (bidi_it);
1630 int next_char;
1631 bidi_type_t type_of_next;
1632 struct bidi_it saved_it;
1633 ptrdiff_t eob
1634 = ((STRINGP (bidi_it->string.lstring) || bidi_it->string.s)
1635 ? bidi_it->string.schars : ZV);
1636
1637 type = bidi_it->type;
1638 override = bidi_it->level_stack[bidi_it->stack_idx].override;
1639
1640 if (type == UNKNOWN_BT
1641 || type == LRE
1642 || type == LRO
1643 || type == RLE
1644 || type == RLO
1645 || type == PDF)
1646 emacs_abort ();
1647
1648 if (new_level != prev_level
1649 || bidi_it->type == NEUTRAL_B)
1650 {
1651 /* We've got a new embedding level run, compute the directional
1652 type of sor and initialize per-run variables (UAX#9, clause
1653 X10). */
1654 bidi_set_sor_type (bidi_it, prev_level, new_level);
1655 }
1656 else if (type == NEUTRAL_S || type == NEUTRAL_WS
1657 || type == WEAK_BN || type == STRONG_AL)
1658 bidi_it->type_after_w1 = type; /* needed in L1 */
1659 bidi_check_type (bidi_it->type_after_w1);
1660
1661 /* Level and directional override status are already recorded in
1662 bidi_it, and do not need any change; see X6. */
1663 if (override == R2L) /* X6 */
1664 type = STRONG_R;
1665 else if (override == L2R)
1666 type = STRONG_L;
1667 else
1668 {
1669 if (type == WEAK_NSM) /* W1 */
1670 {
1671 /* Note that we don't need to consider the case where the
1672 prev character has its type overridden by an RLO or LRO,
1673 because then either the type of this NSM would have been
1674 also overridden, or the previous character is outside the
1675 current level run, and thus not relevant to this NSM.
1676 This is why NSM gets the type_after_w1 of the previous
1677 character. */
1678 if (bidi_it->prev.type_after_w1 != UNKNOWN_BT
1679 /* if type_after_w1 is NEUTRAL_B, this NSM is at sor */
1680 && bidi_it->prev.type_after_w1 != NEUTRAL_B)
1681 type = bidi_it->prev.type_after_w1;
1682 else if (bidi_it->sor == R2L)
1683 type = STRONG_R;
1684 else if (bidi_it->sor == L2R)
1685 type = STRONG_L;
1686 else /* shouldn't happen! */
1687 emacs_abort ();
1688 }
1689 if (type == WEAK_EN /* W2 */
1690 && bidi_it->last_strong.type_after_w1 == STRONG_AL)
1691 type = WEAK_AN;
1692 else if (type == STRONG_AL) /* W3 */
1693 type = STRONG_R;
1694 else if ((type == WEAK_ES /* W4 */
1695 && bidi_it->prev.type_after_w1 == WEAK_EN
1696 && bidi_it->prev.orig_type == WEAK_EN)
1697 || (type == WEAK_CS
1698 && ((bidi_it->prev.type_after_w1 == WEAK_EN
1699 && bidi_it->prev.orig_type == WEAK_EN)
1700 || bidi_it->prev.type_after_w1 == WEAK_AN)))
1701 {
1702 const unsigned char *s
1703 = (STRINGP (bidi_it->string.lstring)
1704 ? SDATA (bidi_it->string.lstring)
1705 : bidi_it->string.s);
1706
1707 next_char = (bidi_it->charpos + bidi_it->nchars >= eob
1708 ? BIDI_EOB
1709 : bidi_char_at_pos (bidi_it->bytepos + bidi_it->ch_len,
1710 s, bidi_it->string.unibyte));
1711 type_of_next = bidi_get_type (next_char, override);
1712
1713 if (type_of_next == WEAK_BN
1714 || bidi_explicit_dir_char (next_char))
1715 {
1716 bidi_copy_it (&saved_it, bidi_it);
1717 while (bidi_resolve_explicit (bidi_it) == new_level
1718 && bidi_it->type == WEAK_BN)
1719 ;
1720 type_of_next = bidi_it->type;
1721 bidi_copy_it (bidi_it, &saved_it);
1722 }
1723
1724 /* If the next character is EN, but the last strong-type
1725 character is AL, that next EN will be changed to AN when
1726 we process it in W2 above. So in that case, this ES
1727 should not be changed into EN. */
1728 if (type == WEAK_ES
1729 && type_of_next == WEAK_EN
1730 && bidi_it->last_strong.type_after_w1 != STRONG_AL)
1731 type = WEAK_EN;
1732 else if (type == WEAK_CS)
1733 {
1734 if (bidi_it->prev.type_after_w1 == WEAK_AN
1735 && (type_of_next == WEAK_AN
1736 /* If the next character is EN, but the last
1737 strong-type character is AL, EN will be later
1738 changed to AN when we process it in W2 above.
1739 So in that case, this ES should not be
1740 changed into EN. */
1741 || (type_of_next == WEAK_EN
1742 && bidi_it->last_strong.type_after_w1 == STRONG_AL)))
1743 type = WEAK_AN;
1744 else if (bidi_it->prev.type_after_w1 == WEAK_EN
1745 && type_of_next == WEAK_EN
1746 && bidi_it->last_strong.type_after_w1 != STRONG_AL)
1747 type = WEAK_EN;
1748 }
1749 }
1750 else if (type == WEAK_ET /* W5: ET with EN before or after it */
1751 || type == WEAK_BN) /* W5/Retaining */
1752 {
1753 if (bidi_it->prev.type_after_w1 == WEAK_EN) /* ET/BN w/EN before it */
1754 type = WEAK_EN;
1755 else if (bidi_it->next_en_pos > bidi_it->charpos
1756 && bidi_it->next_en_type != WEAK_BN)
1757 {
1758 if (bidi_it->next_en_type == WEAK_EN) /* ET/BN with EN after it */
1759 type = WEAK_EN;
1760 }
1761 else if (bidi_it->next_en_pos >=0)
1762 {
1763 ptrdiff_t en_pos = bidi_it->charpos + bidi_it->nchars;
1764 const unsigned char *s = (STRINGP (bidi_it->string.lstring)
1765 ? SDATA (bidi_it->string.lstring)
1766 : bidi_it->string.s);
1767
1768 if (bidi_it->nchars <= 0)
1769 emacs_abort ();
1770 next_char
1771 = (bidi_it->charpos + bidi_it->nchars >= eob
1772 ? BIDI_EOB
1773 : bidi_char_at_pos (bidi_it->bytepos + bidi_it->ch_len, s,
1774 bidi_it->string.unibyte));
1775 type_of_next = bidi_get_type (next_char, override);
1776
1777 if (type_of_next == WEAK_ET
1778 || type_of_next == WEAK_BN
1779 || bidi_explicit_dir_char (next_char))
1780 {
1781 bidi_copy_it (&saved_it, bidi_it);
1782 while (bidi_resolve_explicit (bidi_it) == new_level
1783 && (bidi_it->type == WEAK_BN
1784 || bidi_it->type == WEAK_ET))
1785 ;
1786 type_of_next = bidi_it->type;
1787 en_pos = bidi_it->charpos;
1788 bidi_copy_it (bidi_it, &saved_it);
1789 }
1790 /* Remember this position, to speed up processing of the
1791 next ETs. */
1792 bidi_it->next_en_pos = en_pos;
1793 if (type_of_next == WEAK_EN)
1794 {
1795 /* If the last strong character is AL, the EN we've
1796 found will become AN when we get to it (W2). */
1797 if (bidi_it->last_strong.type_after_w1 == STRONG_AL)
1798 type_of_next = WEAK_AN;
1799 else if (type == WEAK_BN)
1800 type = NEUTRAL_ON; /* W6/Retaining */
1801 else
1802 type = WEAK_EN;
1803 }
1804 else if (type_of_next == NEUTRAL_B)
1805 /* Record the fact that there are no more ENs from
1806 here to the end of paragraph, to avoid entering the
1807 loop above ever again in this paragraph. */
1808 bidi_it->next_en_pos = -1;
1809 /* Record the type of the character where we ended our search. */
1810 bidi_it->next_en_type = type_of_next;
1811 }
1812 }
1813 }
1814
1815 if (type == WEAK_ES || type == WEAK_ET || type == WEAK_CS /* W6 */
1816 || (type == WEAK_BN
1817 && (bidi_it->prev.type_after_w1 == WEAK_CS /* W6/Retaining */
1818 || bidi_it->prev.type_after_w1 == WEAK_ES
1819 || bidi_it->prev.type_after_w1 == WEAK_ET)))
1820 type = NEUTRAL_ON;
1821
1822 /* Store the type we've got so far, before we clobber it with strong
1823 types in W7 and while resolving neutral types. But leave alone
1824 the original types that were recorded above, because we will need
1825 them for the L1 clause. */
1826 if (bidi_it->type_after_w1 == UNKNOWN_BT)
1827 bidi_it->type_after_w1 = type;
1828 bidi_check_type (bidi_it->type_after_w1);
1829
1830 if (type == WEAK_EN) /* W7 */
1831 {
1832 if ((bidi_it->last_strong.type_after_w1 == STRONG_L)
1833 || (bidi_it->last_strong.type == UNKNOWN_BT && bidi_it->sor == L2R))
1834 type = STRONG_L;
1835 }
1836
1837 bidi_it->type = type;
1838 bidi_check_type (bidi_it->type);
1839 return type;
1840 }
1841
1842 /* Resolve the type of a neutral character according to the type of
1843 surrounding strong text and the current embedding level. */
1844 static inline bidi_type_t
1845 bidi_resolve_neutral_1 (bidi_type_t prev_type, bidi_type_t next_type, int lev)
1846 {
1847 /* N1: European and Arabic numbers are treated as though they were R. */
1848 if (next_type == WEAK_EN || next_type == WEAK_AN)
1849 next_type = STRONG_R;
1850 if (prev_type == WEAK_EN || prev_type == WEAK_AN)
1851 prev_type = STRONG_R;
1852
1853 if (next_type == prev_type) /* N1 */
1854 return next_type;
1855 else if ((lev & 1) == 0) /* N2 */
1856 return STRONG_L;
1857 else
1858 return STRONG_R;
1859 }
1860
1861 static bidi_type_t
1862 bidi_resolve_neutral (struct bidi_it *bidi_it)
1863 {
1864 int prev_level = bidi_it->level_stack[bidi_it->stack_idx].level;
1865 bidi_type_t type = bidi_resolve_weak (bidi_it);
1866 int current_level = bidi_it->level_stack[bidi_it->stack_idx].level;
1867
1868 if (!(type == STRONG_R
1869 || type == STRONG_L
1870 || type == WEAK_BN
1871 || type == WEAK_EN
1872 || type == WEAK_AN
1873 || type == NEUTRAL_B
1874 || type == NEUTRAL_S
1875 || type == NEUTRAL_WS
1876 || type == NEUTRAL_ON))
1877 emacs_abort ();
1878
1879 if ((type != NEUTRAL_B /* Don't risk entering the long loop below if
1880 we are already at paragraph end. */
1881 && bidi_get_category (type) == NEUTRAL)
1882 || (type == WEAK_BN && prev_level == current_level))
1883 {
1884 if (bidi_it->next_for_neutral.type != UNKNOWN_BT)
1885 type = bidi_resolve_neutral_1 (bidi_it->prev_for_neutral.type,
1886 bidi_it->next_for_neutral.type,
1887 current_level);
1888 /* The next two "else if" clauses are shortcuts for the
1889 important special case when we have a long sequence of
1890 neutral or WEAK_BN characters, such as whitespace or nulls or
1891 other control characters, on the base embedding level of the
1892 paragraph, and that sequence goes all the way to the end of
1893 the paragraph and follows a character whose resolved
1894 directionality is identical to the base embedding level.
1895 (This is what happens in a buffer with plain L2R text that
1896 happens to include long sequences of control characters.) By
1897 virtue of N1, the result of examining this long sequence will
1898 always be either STRONG_L or STRONG_R, depending on the base
1899 embedding level. So we use this fact directly instead of
1900 entering the expensive loop in the "else" clause. */
1901 else if (current_level == 0
1902 && bidi_it->prev_for_neutral.type == STRONG_L
1903 && !bidi_explicit_dir_char (bidi_it->ch))
1904 type = bidi_resolve_neutral_1 (bidi_it->prev_for_neutral.type,
1905 STRONG_L, current_level);
1906 else if (/* current level is 1 */
1907 current_level == 1
1908 /* base embedding level is also 1 */
1909 && bidi_it->level_stack[0].level == 1
1910 /* previous character is one of those considered R for
1911 the purposes of W5 */
1912 && (bidi_it->prev_for_neutral.type == STRONG_R
1913 || bidi_it->prev_for_neutral.type == WEAK_EN
1914 || bidi_it->prev_for_neutral.type == WEAK_AN)
1915 && !bidi_explicit_dir_char (bidi_it->ch))
1916 type = bidi_resolve_neutral_1 (bidi_it->prev_for_neutral.type,
1917 STRONG_R, current_level);
1918 else
1919 {
1920 /* Arrrgh!! The UAX#9 algorithm is too deeply entrenched in
1921 the assumption of batch-style processing; see clauses W4,
1922 W5, and especially N1, which require to look far forward
1923 (as well as back) in the buffer/string. May the fleas of
1924 a thousand camels infest the armpits of those who design
1925 supposedly general-purpose algorithms by looking at their
1926 own implementations, and fail to consider other possible
1927 implementations! */
1928 struct bidi_it saved_it;
1929 bidi_type_t next_type;
1930
1931 if (bidi_it->scan_dir == -1)
1932 emacs_abort ();
1933
1934 bidi_copy_it (&saved_it, bidi_it);
1935 /* Scan the text forward until we find the first non-neutral
1936 character, and then use that to resolve the neutral we
1937 are dealing with now. We also cache the scanned iterator
1938 states, to salvage some of the effort later. */
1939 bidi_cache_iterator_state (bidi_it, 0);
1940 do {
1941 /* Record the info about the previous character, so that
1942 it will be cached below with this state. */
1943 if (bidi_it->type_after_w1 != WEAK_BN /* W1/Retaining */
1944 && bidi_it->type != WEAK_BN)
1945 bidi_remember_char (&bidi_it->prev, bidi_it);
1946 type = bidi_resolve_weak (bidi_it);
1947 /* Paragraph separators have their levels fully resolved
1948 at this point, so cache them as resolved. */
1949 bidi_cache_iterator_state (bidi_it, type == NEUTRAL_B);
1950 /* FIXME: implement L1 here, by testing for a newline and
1951 resetting the level for any sequence of whitespace
1952 characters adjacent to it. */
1953 } while (!(type == NEUTRAL_B
1954 || (type != WEAK_BN
1955 && bidi_get_category (type) != NEUTRAL)
1956 /* This is all per level run, so stop when we
1957 reach the end of this level run. */
1958 || (bidi_it->level_stack[bidi_it->stack_idx].level
1959 != current_level)));
1960
1961 bidi_remember_char (&saved_it.next_for_neutral, bidi_it);
1962
1963 switch (type)
1964 {
1965 case STRONG_L:
1966 case STRONG_R:
1967 case STRONG_AL:
1968 /* Actually, STRONG_AL cannot happen here, because
1969 bidi_resolve_weak converts it to STRONG_R, per W3. */
1970 eassert (type != STRONG_AL);
1971 next_type = type;
1972 break;
1973 case WEAK_EN:
1974 case WEAK_AN:
1975 /* N1: ``European and Arabic numbers are treated as
1976 though they were R.'' */
1977 next_type = STRONG_R;
1978 break;
1979 case WEAK_BN:
1980 if (!bidi_explicit_dir_char (bidi_it->ch))
1981 emacs_abort (); /* can't happen: BNs are skipped */
1982 /* FALLTHROUGH */
1983 case NEUTRAL_B:
1984 /* Marched all the way to the end of this level run.
1985 We need to use the eor type, whose information is
1986 stored by bidi_set_sor_type in the prev_for_neutral
1987 member. */
1988 if (saved_it.type != WEAK_BN
1989 || bidi_get_category (bidi_it->prev.type_after_w1) == NEUTRAL)
1990 next_type = bidi_it->prev_for_neutral.type;
1991 else
1992 {
1993 /* This is a BN which does not adjoin neutrals.
1994 Leave its type alone. */
1995 bidi_copy_it (bidi_it, &saved_it);
1996 return bidi_it->type;
1997 }
1998 break;
1999 default:
2000 emacs_abort ();
2001 }
2002 type = bidi_resolve_neutral_1 (saved_it.prev_for_neutral.type,
2003 next_type, current_level);
2004 saved_it.next_for_neutral.type = next_type;
2005 saved_it.type = type;
2006 bidi_check_type (next_type);
2007 bidi_check_type (type);
2008 bidi_copy_it (bidi_it, &saved_it);
2009 }
2010 }
2011 return type;
2012 }
2013
2014 /* Given an iterator state in BIDI_IT, advance one character position
2015 in the buffer/string to the next character (in the logical order),
2016 resolve the bidi type of that next character, and return that
2017 type. */
2018 static bidi_type_t
2019 bidi_type_of_next_char (struct bidi_it *bidi_it)
2020 {
2021 bidi_type_t type;
2022
2023 /* This should always be called during a forward scan. */
2024 if (bidi_it->scan_dir != 1)
2025 emacs_abort ();
2026
2027 /* Reset the limit until which to ignore BNs if we step out of the
2028 area where we found only empty levels. */
2029 if ((bidi_it->ignore_bn_limit > -1
2030 && bidi_it->ignore_bn_limit <= bidi_it->charpos)
2031 || (bidi_it->ignore_bn_limit == -2
2032 && !bidi_explicit_dir_char (bidi_it->ch)))
2033 bidi_it->ignore_bn_limit = -1;
2034
2035 type = bidi_resolve_neutral (bidi_it);
2036
2037 return type;
2038 }
2039
2040 /* Given an iterator state BIDI_IT, advance one character position in
2041 the buffer/string to the next character (in the current scan
2042 direction), resolve the embedding and implicit levels of that next
2043 character, and return the resulting level. */
2044 static int
2045 bidi_level_of_next_char (struct bidi_it *bidi_it)
2046 {
2047 bidi_type_t type;
2048 int level, prev_level = -1;
2049 struct bidi_saved_info next_for_neutral;
2050 ptrdiff_t next_char_pos = -2;
2051
2052 if (bidi_it->scan_dir == 1)
2053 {
2054 ptrdiff_t eob
2055 = ((bidi_it->string.s || STRINGP (bidi_it->string.lstring))
2056 ? bidi_it->string.schars : ZV);
2057
2058 /* There's no sense in trying to advance if we hit end of text. */
2059 if (bidi_it->charpos >= eob)
2060 return bidi_it->resolved_level;
2061
2062 /* Record the info about the previous character. */
2063 if (bidi_it->type_after_w1 != WEAK_BN /* W1/Retaining */
2064 && bidi_it->type != WEAK_BN)
2065 bidi_remember_char (&bidi_it->prev, bidi_it);
2066 if (bidi_it->type_after_w1 == STRONG_R
2067 || bidi_it->type_after_w1 == STRONG_L
2068 || bidi_it->type_after_w1 == STRONG_AL)
2069 bidi_remember_char (&bidi_it->last_strong, bidi_it);
2070 /* FIXME: it sounds like we don't need both prev and
2071 prev_for_neutral members, but I'm leaving them both for now. */
2072 if (bidi_it->type == STRONG_R || bidi_it->type == STRONG_L
2073 || bidi_it->type == WEAK_EN || bidi_it->type == WEAK_AN)
2074 bidi_remember_char (&bidi_it->prev_for_neutral, bidi_it);
2075
2076 /* If we overstepped the characters used for resolving neutrals
2077 and whitespace, invalidate their info in the iterator. */
2078 if (bidi_it->charpos >= bidi_it->next_for_neutral.charpos)
2079 bidi_it->next_for_neutral.type = UNKNOWN_BT;
2080 if (bidi_it->next_en_pos >= 0
2081 && bidi_it->charpos >= bidi_it->next_en_pos)
2082 {
2083 bidi_it->next_en_pos = 0;
2084 bidi_it->next_en_type = UNKNOWN_BT;
2085 }
2086 if (bidi_it->next_for_ws.type != UNKNOWN_BT
2087 && bidi_it->charpos >= bidi_it->next_for_ws.charpos)
2088 bidi_it->next_for_ws.type = UNKNOWN_BT;
2089
2090 /* This must be taken before we fill the iterator with the info
2091 about the next char. If we scan backwards, the iterator
2092 state must be already cached, so there's no need to know the
2093 embedding level of the previous character, since we will be
2094 returning to our caller shortly. */
2095 prev_level = bidi_it->level_stack[bidi_it->stack_idx].level;
2096 }
2097 next_for_neutral = bidi_it->next_for_neutral;
2098
2099 /* Perhaps the character we want is already cached. If it is, the
2100 call to bidi_cache_find below will return a type other than
2101 UNKNOWN_BT. */
2102 if (bidi_cache_idx > bidi_cache_start && !bidi_it->first_elt)
2103 {
2104 int bob = ((bidi_it->string.s || STRINGP (bidi_it->string.lstring))
2105 ? 0 : 1);
2106 if (bidi_it->scan_dir > 0)
2107 {
2108 if (bidi_it->nchars <= 0)
2109 emacs_abort ();
2110 next_char_pos = bidi_it->charpos + bidi_it->nchars;
2111 }
2112 else if (bidi_it->charpos >= bob)
2113 /* Implementation note: we allow next_char_pos to be as low as
2114 0 for buffers or -1 for strings, and that is okay because
2115 that's the "position" of the sentinel iterator state we
2116 cached at the beginning of the iteration. */
2117 next_char_pos = bidi_it->charpos - 1;
2118 if (next_char_pos >= bob - 1)
2119 type = bidi_cache_find (next_char_pos, -1, bidi_it);
2120 else
2121 type = UNKNOWN_BT;
2122 }
2123 else
2124 type = UNKNOWN_BT;
2125 if (type != UNKNOWN_BT)
2126 {
2127 /* Don't lose the information for resolving neutrals! The
2128 cached states could have been cached before their
2129 next_for_neutral member was computed. If we are on our way
2130 forward, we can simply take the info from the previous
2131 state. */
2132 if (bidi_it->scan_dir == 1
2133 && bidi_it->next_for_neutral.type == UNKNOWN_BT)
2134 bidi_it->next_for_neutral = next_for_neutral;
2135
2136 /* If resolved_level is -1, it means this state was cached
2137 before it was completely resolved, so we cannot return
2138 it. */
2139 if (bidi_it->resolved_level != -1)
2140 return bidi_it->resolved_level;
2141 }
2142 if (bidi_it->scan_dir == -1)
2143 /* If we are going backwards, the iterator state is already cached
2144 from previous scans, and should be fully resolved. */
2145 emacs_abort ();
2146
2147 if (type == UNKNOWN_BT)
2148 type = bidi_type_of_next_char (bidi_it);
2149
2150 if (type == NEUTRAL_B)
2151 return bidi_it->resolved_level;
2152
2153 level = bidi_it->level_stack[bidi_it->stack_idx].level;
2154 if ((bidi_get_category (type) == NEUTRAL /* && type != NEUTRAL_B */)
2155 || (type == WEAK_BN && prev_level == level))
2156 {
2157 if (bidi_it->next_for_neutral.type == UNKNOWN_BT)
2158 emacs_abort ();
2159
2160 /* If the cached state shows a neutral character, it was not
2161 resolved by bidi_resolve_neutral, so do it now. */
2162 type = bidi_resolve_neutral_1 (bidi_it->prev_for_neutral.type,
2163 bidi_it->next_for_neutral.type,
2164 level);
2165 }
2166
2167 if (!(type == STRONG_R
2168 || type == STRONG_L
2169 || type == WEAK_BN
2170 || type == WEAK_EN
2171 || type == WEAK_AN))
2172 emacs_abort ();
2173 bidi_it->type = type;
2174 bidi_check_type (bidi_it->type);
2175
2176 /* For L1 below, we need to know, for each WS character, whether
2177 it belongs to a sequence of WS characters preceding a newline
2178 or a TAB or a paragraph separator. */
2179 if (bidi_it->orig_type == NEUTRAL_WS
2180 && bidi_it->next_for_ws.type == UNKNOWN_BT)
2181 {
2182 int ch;
2183 ptrdiff_t clen = bidi_it->ch_len;
2184 ptrdiff_t bpos = bidi_it->bytepos;
2185 ptrdiff_t cpos = bidi_it->charpos;
2186 ptrdiff_t disp_pos = bidi_it->disp_pos;
2187 ptrdiff_t nc = bidi_it->nchars;
2188 struct bidi_string_data bs = bidi_it->string;
2189 bidi_type_t chtype;
2190 bool fwp = bidi_it->frame_window_p;
2191 int dpp = bidi_it->disp_prop;
2192
2193 if (bidi_it->nchars <= 0)
2194 emacs_abort ();
2195 do {
2196 ch = bidi_fetch_char (bpos += clen, cpos += nc, &disp_pos, &dpp, &bs,
2197 fwp, &clen, &nc);
2198 if (ch == '\n' || ch == BIDI_EOB)
2199 chtype = NEUTRAL_B;
2200 else
2201 chtype = bidi_get_type (ch, NEUTRAL_DIR);
2202 } while (chtype == NEUTRAL_WS || chtype == WEAK_BN
2203 || bidi_explicit_dir_char (ch)); /* L1/Retaining */
2204 bidi_it->next_for_ws.type = chtype;
2205 bidi_check_type (bidi_it->next_for_ws.type);
2206 bidi_it->next_for_ws.charpos = cpos;
2207 bidi_it->next_for_ws.bytepos = bpos;
2208 }
2209
2210 /* Resolve implicit levels, with a twist: PDFs get the embedding
2211 level of the embedding they terminate. See below for the
2212 reason. */
2213 if (bidi_it->orig_type == PDF
2214 /* Don't do this if this formatting code didn't change the
2215 embedding level due to invalid or empty embeddings. */
2216 && prev_level != level)
2217 {
2218 /* Don't look in UAX#9 for the reason for this: it's our own
2219 private quirk. The reason is that we want the formatting
2220 codes to be delivered so that they bracket the text of their
2221 embedding. For example, given the text
2222
2223 {RLO}teST{PDF}
2224
2225 we want it to be displayed as
2226
2227 {PDF}STet{RLO}
2228
2229 not as
2230
2231 STet{RLO}{PDF}
2232
2233 which will result because we bump up the embedding level as
2234 soon as we see the RLO and pop it as soon as we see the PDF,
2235 so RLO itself has the same embedding level as "teST", and
2236 thus would be normally delivered last, just before the PDF.
2237 The switch below fiddles with the level of PDF so that this
2238 ugly side effect does not happen.
2239
2240 (This is, of course, only important if the formatting codes
2241 are actually displayed, but Emacs does need to display them
2242 if the user wants to.) */
2243 level = prev_level;
2244 }
2245 else if (bidi_it->orig_type == NEUTRAL_B /* L1 */
2246 || bidi_it->orig_type == NEUTRAL_S
2247 || bidi_it->ch == '\n' || bidi_it->ch == BIDI_EOB
2248 || (bidi_it->orig_type == NEUTRAL_WS
2249 && (bidi_it->next_for_ws.type == NEUTRAL_B
2250 || bidi_it->next_for_ws.type == NEUTRAL_S)))
2251 level = bidi_it->level_stack[0].level;
2252 else if ((level & 1) == 0) /* I1 */
2253 {
2254 if (type == STRONG_R)
2255 level++;
2256 else if (type == WEAK_EN || type == WEAK_AN)
2257 level += 2;
2258 }
2259 else /* I2 */
2260 {
2261 if (type == STRONG_L || type == WEAK_EN || type == WEAK_AN)
2262 level++;
2263 }
2264
2265 bidi_it->resolved_level = level;
2266 return level;
2267 }
2268
2269 /* Move to the other edge of a level given by LEVEL. If END_FLAG,
2270 we are at the end of a level, and we need to prepare to
2271 resume the scan of the lower level.
2272
2273 If this level's other edge is cached, we simply jump to it, filling
2274 the iterator structure with the iterator state on the other edge.
2275 Otherwise, we walk the buffer or string until we come back to the
2276 same level as LEVEL.
2277
2278 Note: we are not talking here about a ``level run'' in the UAX#9
2279 sense of the term, but rather about a ``level'' which includes
2280 all the levels higher than it. In other words, given the levels
2281 like this:
2282
2283 11111112222222333333334443343222222111111112223322111
2284 A B C
2285
2286 and assuming we are at point A scanning left to right, this
2287 function moves to point C, whereas the UAX#9 ``level 2 run'' ends
2288 at point B. */
2289 static void
2290 bidi_find_other_level_edge (struct bidi_it *bidi_it, int level, bool end_flag)
2291 {
2292 int dir = end_flag ? -bidi_it->scan_dir : bidi_it->scan_dir;
2293 ptrdiff_t idx;
2294
2295 /* Try the cache first. */
2296 if ((idx = bidi_cache_find_level_change (level, dir, end_flag))
2297 >= bidi_cache_start)
2298 bidi_cache_fetch_state (idx, bidi_it);
2299 else
2300 {
2301 int new_level;
2302
2303 /* If we are at end of level, its edges must be cached. */
2304 if (end_flag)
2305 emacs_abort ();
2306
2307 bidi_cache_iterator_state (bidi_it, 1);
2308 do {
2309 new_level = bidi_level_of_next_char (bidi_it);
2310 bidi_cache_iterator_state (bidi_it, 1);
2311 } while (new_level >= level);
2312 }
2313 }
2314
2315 void
2316 bidi_move_to_visually_next (struct bidi_it *bidi_it)
2317 {
2318 int old_level, new_level, next_level;
2319 struct bidi_it sentinel;
2320 struct gcpro gcpro1;
2321
2322 if (bidi_it->charpos < 0 || bidi_it->bytepos < 0)
2323 emacs_abort ();
2324
2325 if (bidi_it->scan_dir == 0)
2326 {
2327 bidi_it->scan_dir = 1; /* default to logical order */
2328 }
2329
2330 /* The code below can call eval, and thus cause GC. If we are
2331 iterating a Lisp string, make sure it won't be GCed. */
2332 if (STRINGP (bidi_it->string.lstring))
2333 GCPRO1 (bidi_it->string.lstring);
2334
2335 /* If we just passed a newline, initialize for the next line. */
2336 if (!bidi_it->first_elt
2337 && (bidi_it->ch == '\n' || bidi_it->ch == BIDI_EOB))
2338 bidi_line_init (bidi_it);
2339
2340 /* Prepare the sentinel iterator state, and cache it. When we bump
2341 into it, scanning backwards, we'll know that the last non-base
2342 level is exhausted. */
2343 if (bidi_cache_idx == bidi_cache_start)
2344 {
2345 bidi_copy_it (&sentinel, bidi_it);
2346 if (bidi_it->first_elt)
2347 {
2348 sentinel.charpos--; /* cached charpos needs to be monotonic */
2349 sentinel.bytepos--;
2350 sentinel.ch = '\n'; /* doesn't matter, but why not? */
2351 sentinel.ch_len = 1;
2352 sentinel.nchars = 1;
2353 }
2354 bidi_cache_iterator_state (&sentinel, 1);
2355 }
2356
2357 old_level = bidi_it->resolved_level;
2358 new_level = bidi_level_of_next_char (bidi_it);
2359
2360 /* Reordering of resolved levels (clause L2) is implemented by
2361 jumping to the other edge of the level and flipping direction of
2362 scanning the text whenever we find a level change. */
2363 if (new_level != old_level)
2364 {
2365 bool ascending = new_level > old_level;
2366 int level_to_search = ascending ? old_level + 1 : old_level;
2367 int incr = ascending ? 1 : -1;
2368 int expected_next_level = old_level + incr;
2369
2370 /* Jump (or walk) to the other edge of this level. */
2371 bidi_find_other_level_edge (bidi_it, level_to_search, !ascending);
2372 /* Switch scan direction and peek at the next character in the
2373 new direction. */
2374 bidi_it->scan_dir = -bidi_it->scan_dir;
2375
2376 /* The following loop handles the case where the resolved level
2377 jumps by more than one. This is typical for numbers inside a
2378 run of text with left-to-right embedding direction, but can
2379 also happen in other situations. In those cases the decision
2380 where to continue after a level change, and in what direction,
2381 is tricky. For example, given a text like below:
2382
2383 abcdefgh
2384 11336622
2385
2386 (where the numbers below the text show the resolved levels),
2387 the result of reordering according to UAX#9 should be this:
2388
2389 efdcghba
2390
2391 This is implemented by the loop below which flips direction
2392 and jumps to the other edge of the level each time it finds
2393 the new level not to be the expected one. The expected level
2394 is always one more or one less than the previous one. */
2395 next_level = bidi_peek_at_next_level (bidi_it);
2396 while (next_level != expected_next_level)
2397 {
2398 expected_next_level += incr;
2399 level_to_search += incr;
2400 bidi_find_other_level_edge (bidi_it, level_to_search, !ascending);
2401 bidi_it->scan_dir = -bidi_it->scan_dir;
2402 next_level = bidi_peek_at_next_level (bidi_it);
2403 }
2404
2405 /* Finally, deliver the next character in the new direction. */
2406 next_level = bidi_level_of_next_char (bidi_it);
2407 }
2408
2409 /* Take note when we have just processed the newline that precedes
2410 the end of the paragraph. The next time we are about to be
2411 called, set_iterator_to_next will automatically reinit the
2412 paragraph direction, if needed. We do this at the newline before
2413 the paragraph separator, because the next character might not be
2414 the first character of the next paragraph, due to the bidi
2415 reordering, whereas we _must_ know the paragraph base direction
2416 _before_ we process the paragraph's text, since the base
2417 direction affects the reordering. */
2418 if (bidi_it->scan_dir == 1
2419 && (bidi_it->ch == '\n' || bidi_it->ch == BIDI_EOB))
2420 {
2421 /* The paragraph direction of the entire string, once
2422 determined, is in effect for the entire string. Setting the
2423 separator limit to the end of the string prevents
2424 bidi_paragraph_init from being called automatically on this
2425 string. */
2426 if (bidi_it->string.s || STRINGP (bidi_it->string.lstring))
2427 bidi_it->separator_limit = bidi_it->string.schars;
2428 else if (bidi_it->bytepos < ZV_BYTE)
2429 {
2430 ptrdiff_t sep_len
2431 = bidi_at_paragraph_end (bidi_it->charpos + bidi_it->nchars,
2432 bidi_it->bytepos + bidi_it->ch_len);
2433 if (bidi_it->nchars <= 0)
2434 emacs_abort ();
2435 if (sep_len >= 0)
2436 {
2437 bidi_it->new_paragraph = 1;
2438 /* Record the buffer position of the last character of the
2439 paragraph separator. */
2440 bidi_it->separator_limit
2441 = bidi_it->charpos + bidi_it->nchars + sep_len;
2442 }
2443 }
2444 }
2445
2446 if (bidi_it->scan_dir == 1 && bidi_cache_idx > bidi_cache_start)
2447 {
2448 /* If we are at paragraph's base embedding level and beyond the
2449 last cached position, the cache's job is done and we can
2450 discard it. */
2451 if (bidi_it->resolved_level == bidi_it->level_stack[0].level
2452 && bidi_it->charpos > (bidi_cache[bidi_cache_idx - 1].charpos
2453 + bidi_cache[bidi_cache_idx - 1].nchars - 1))
2454 bidi_cache_reset ();
2455 /* But as long as we are caching during forward scan, we must
2456 cache each state, or else the cache integrity will be
2457 compromised: it assumes cached states correspond to buffer
2458 positions 1:1. */
2459 else
2460 bidi_cache_iterator_state (bidi_it, 1);
2461 }
2462
2463 if (STRINGP (bidi_it->string.lstring))
2464 UNGCPRO;
2465 }
2466
2467 /* This is meant to be called from within the debugger, whenever you
2468 wish to examine the cache contents. */
2469 void bidi_dump_cached_states (void) EXTERNALLY_VISIBLE;
2470 void
2471 bidi_dump_cached_states (void)
2472 {
2473 ptrdiff_t i;
2474 int ndigits = 1;
2475
2476 if (bidi_cache_idx == 0)
2477 {
2478 fprintf (stderr, "The cache is empty.\n");
2479 return;
2480 }
2481 fprintf (stderr, "Total of %"pD"d state%s in cache:\n",
2482 bidi_cache_idx, bidi_cache_idx == 1 ? "" : "s");
2483
2484 for (i = bidi_cache[bidi_cache_idx - 1].charpos; i > 0; i /= 10)
2485 ndigits++;
2486 fputs ("ch ", stderr);
2487 for (i = 0; i < bidi_cache_idx; i++)
2488 fprintf (stderr, "%*c", ndigits, bidi_cache[i].ch);
2489 fputs ("\n", stderr);
2490 fputs ("lvl ", stderr);
2491 for (i = 0; i < bidi_cache_idx; i++)
2492 fprintf (stderr, "%*d", ndigits, bidi_cache[i].resolved_level);
2493 fputs ("\n", stderr);
2494 fputs ("pos ", stderr);
2495 for (i = 0; i < bidi_cache_idx; i++)
2496 fprintf (stderr, "%*"pD"d", ndigits, bidi_cache[i].charpos);
2497 fputs ("\n", stderr);
2498 }