]> git.eshelyaron.com Git - emacs.git/commitdiff
Support bidi reordering of text covered by display properties.
authorEli Zaretskii <eliz@gnu.org>
Sat, 4 Jun 2011 07:41:44 +0000 (10:41 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sat, 4 Jun 2011 07:41:44 +0000 (10:41 +0300)
 src/bidi.c (bidi_copy_it): Use offsetof instead of emulating it.
 (bidi_fetch_char, bidi_fetch_char_advance): New functions.
 (bidi_cache_search, bidi_cache_iterator_state)
 (bidi_paragraph_init, bidi_resolve_explicit, bidi_resolve_weak)
 (bidi_level_of_next_char, bidi_move_to_visually_next): Support
 character positions inside a run of characters covered by a
 display string.
 (bidi_paragraph_init, bidi_resolve_explicit_1)
 (bidi_level_of_next_char): Call bidi_fetch_char and
 bidi_fetch_char_advance instead of FETCH_CHAR and
 FETCH_CHAR_ADVANCE.
 (bidi_init_it): Initialize new members.
 (LRE_CHAR, RLE_CHAR, PDF_CHAR, LRO_CHAR, RLO_CHAR): Remove macro
 definitions.
 (bidi_explicit_dir_char): Lookup character type in bidi_type_table,
 instead of using explicit *_CHAR codes.
 (bidi_resolve_explicit, bidi_resolve_weak): Use
 FETCH_MULTIBYTE_CHAR instead of FETCH_CHAR, as reordering of
 bidirectional text is supported only in multibyte buffers.
 (bidi_init_it): Accept additional argument FRAME_WINDOW_P and use
 it to initialize the frame_window_p member of struct bidi_it.
 (bidi_cache_iterator_state, bidi_resolve_explicit_1)
 (bidi_resolve_explicit, bidi_resolve_weak)
 (bidi_level_of_next_char, bidi_move_to_visually_next): Abort if
 bidi_it->nchars is non-positive.
 (bidi_level_of_next_char): Don't try to lookup the cache for the
 next/previous character if nothing is cached there yet, or if we
 were just reseat()'ed to a new position.
 src/xdisp.c (set_cursor_from_row): Set start and stop points
 according to the row's direction when priming the loop that looks
 for the glyph on which to display cursor.
 (single_display_spec_intangible_p): Function deleted.
 (display_prop_intangible_p): Reimplement to call
 handle_display_spec instead of single_display_spec_intangible_p.
 Accept 3 additional arguments needed by handle_display_spec.  This
 fixes incorrect cursor motion across display property with complex
 values: lists, `(when COND...)' forms, etc.
 (single_display_spec_string_p): Support property values that are
 lists with the argument STRING its top-level element.
 (display_prop_string_p): Fix the condition for processing a
 property that is a list to be consistent with handle_display_spec.
 (handle_display_spec): New function, refactored from the
 last portion of handle_display_prop.
 (compute_display_string_pos): Accept additional argument
 FRAME_WINDOW_P.  Call handle_display_spec to determine whether the
 value of a `display' property is a "replacing spec".
 (handle_single_display_spec): Accept 2 additional arguments BUFPOS
 and FRAME_WINDOW_P.  If IT is NULL, don't set up the iterator from
 the display property, but just return a value indicating whether
 the display property will replace the characters it covers.
 (Fcurrent_bidi_paragraph_direction): Initialize the nchars and
 frame_window_p members of struct bidi_it.
 (compute_display_string_pos, compute_display_string_end): New
 functions.
 (push_it): Accept second argument POSITION, where pop_it should
 jump to continue iteration.
 (reseat_1): Initialize bidi_it.disp_pos.
 src/keyboard.c (adjust_point_for_property): Adjust the call to
 display_prop_intangible_p to its new signature.
 src/dispextern.h (struct bidi_it): New member frame_window_p.
 (bidi_init_it): Update prototypes.
 (display_prop_intangible_p): Update prototype.
 (compute_display_string_pos, compute_display_string_end): Declare
 prototypes.
 (struct bidi_it): New members nchars and disp_pos.  ch_len is now
 EMACS_INT.

1  2 
src/ChangeLog
src/bidi.c
src/dispextern.h
src/keyboard.c
src/xdisp.c

diff --cc src/ChangeLog
index 45d8e38738ad9bda21b7be305e61ce6ec3af7d4b,066a1564431284a6df747db8a1f49c0d44831ce8..4c33bcc4e67b045601892d2059fd7e619067ce6c
 -      * bidi.c (bidi_fetch_char_advance): Remove unused and
 -      unimplemented function.
+ 2011-06-03  Eli Zaretskii  <eliz@gnu.org>
 -2011-05-28  Eli Zaretskii  <eliz@gnu.org>
++      Support bidi reordering of text covered by display properties.
 -
 -      * keyboard.c (adjust_point_for_property): Adjust the call to
 -      display_prop_intangible_p to its new signature.
 -
 -      * dispextern.h (display_prop_intangible_p): Adjust prototype.
 -
 -2011-05-21  Eli Zaretskii  <eliz@gnu.org>
 -
 -      * xdisp.c (handle_display_spec): New function, refactored from the
++      * bidi.c (bidi_copy_it): Use offsetof instead of emulating it.
++      (bidi_fetch_char, bidi_fetch_char_advance): New functions.
++      (bidi_cache_search, bidi_cache_iterator_state)
++      (bidi_paragraph_init, bidi_resolve_explicit, bidi_resolve_weak)
++      (bidi_level_of_next_char, bidi_move_to_visually_next): Support
++      character positions inside a run of characters covered by a
++      display string.
++      (bidi_paragraph_init, bidi_resolve_explicit_1)
++      (bidi_level_of_next_char): Call bidi_fetch_char and
++      bidi_fetch_char_advance instead of FETCH_CHAR and
++      FETCH_CHAR_ADVANCE.
++      (bidi_init_it): Initialize new members.
++      (LRE_CHAR, RLE_CHAR, PDF_CHAR, LRO_CHAR, RLO_CHAR): Remove macro
++      definitions.
++      (bidi_explicit_dir_char): Lookup character type in bidi_type_table,
++      instead of using explicit *_CHAR codes.
++      (bidi_resolve_explicit, bidi_resolve_weak): Use
++      FETCH_MULTIBYTE_CHAR instead of FETCH_CHAR, as reordering of
++      bidirectional text is supported only in multibyte buffers.
++      (bidi_init_it): Accept additional argument FRAME_WINDOW_P and use
++      it to initialize the frame_window_p member of struct bidi_it.
++      (bidi_cache_iterator_state, bidi_resolve_explicit_1)
++      (bidi_resolve_explicit, bidi_resolve_weak)
++      (bidi_level_of_next_char, bidi_move_to_visually_next): Abort if
++      bidi_it->nchars is non-positive.
++      (bidi_level_of_next_char): Don't try to lookup the cache for the
++      next/previous character if nothing is cached there yet, or if we
++      were just reseat()'ed to a new position.
+       * xdisp.c (set_cursor_from_row): Set start and stop points
+       according to the row's direction when priming the loop that looks
+       for the glyph on which to display cursor.
+       (single_display_spec_intangible_p): Function deleted.
+       (display_prop_intangible_p): Reimplement to call
+       handle_display_spec instead of single_display_spec_intangible_p.
+       Accept 3 additional arguments needed by handle_display_spec.  This
+       fixes incorrect cursor motion across display property with complex
+       values: lists, `(when COND...)' forms, etc.
+       (single_display_spec_string_p): Support property values that are
+       lists with the argument STRING its top-level element.
+       (display_prop_string_p): Fix the condition for processing a
+       property that is a list to be consistent with handle_display_spec.
 -      * bidi.c (bidi_fetch_char): Accept additional argument
 -      FRAME_WINDOW_P and pass it to compute_display_string_pos.  All
 -      callers changed.
 -      (bidi_init_it): Accept additional argument FRAME_WINDOW_P and use
 -      it to initialize the frame_window_p member of struct bidi_it.
++      (handle_display_spec): New function, refactored from the
+       last portion of handle_display_prop.
+       (compute_display_string_pos): Accept additional argument
+       FRAME_WINDOW_P.  Call handle_display_spec to determine whether the
+       value of a `display' property is a "replacing spec".
+       (handle_single_display_spec): Accept 2 additional arguments BUFPOS
+       and FRAME_WINDOW_P.  If IT is NULL, don't set up the iterator from
+       the display property, but just return a value indicating whether
+       the display property will replace the characters it covers.
+       (Fcurrent_bidi_paragraph_direction): Initialize the nchars and
+       frame_window_p members of struct bidi_it.
++      (compute_display_string_pos, compute_display_string_end): New
++      functions.
++      (push_it): Accept second argument POSITION, where pop_it should
++      jump to continue iteration.
++      (reseat_1): Initialize bidi_it.disp_pos.
 -      (bidi_init_it, compute_display_string_pos): Update prototypes.
++      * keyboard.c (adjust_point_for_property): Adjust the call to
++      display_prop_intangible_p to its new signature.
+       * dispextern.h (struct bidi_it): New member frame_window_p.
 -2011-05-14  Eli Zaretskii  <eliz@gnu.org>
++      (bidi_init_it): Update prototypes.
++      (display_prop_intangible_p): Update prototype.
++      (compute_display_string_pos, compute_display_string_end): Declare
++      prototypes.
++      (struct bidi_it): New members nchars and disp_pos.  ch_len is now
++      EMACS_INT.
 +2011-06-02  Paul Eggert  <eggert@cs.ucla.edu>
 +
 +      Malloc failure behavior now depends on size of allocation.
 +      * alloc.c (buffer_memory_full, memory_full): New arg NBYTES.
 +      * lisp.h: Change signatures accordingly.
 +      * alloc.c, buffer.c, editfns.c, menu.c, minibuf.c, xterm.c:
 +      All callers changed.  (Bug#8762)
 +
 +      * gnutls.c: Use Emacs's memory allocators.
 +      Without this change, the gnutls library would invoke malloc etc.
 +      directly, which causes problems on non-SYNC_INPUT hosts, and which
 +      runs afoul of improving memory_full behavior.  (Bug#8761)
 +      (fn_gnutls_global_set_mem_functions): New macro or function pointer.
 +      (emacs_gnutls_global_init): Use it to specify xmalloc, xrealloc,
 +      xfree instead of the default malloc, realloc, free.
 +      (Fgnutls_boot): No need to check for memory allocation failure,
 +      since xmalloc does that for us.
 +
 +      Remove arbitrary limit of 2**31 entries in hash tables.  (Bug#8771)
 +      * category.c (hash_get_category_set):
 +      * ccl.c (ccl_driver):
 +      * charset.c (Fdefine_charset_internal):
 +      * charset.h (struct charset.hash_index):
 +      * composite.c (get_composition_id, gstring_lookup_cache)
 +      (composition_gstring_put_cache):
 +      * composite.h (struct composition.hash_index):
 +      * dispextern.h (struct image.hash):
 +      * fns.c (next_almost_prime, larger_vector, cmpfn_eql)
 +      (cmpfn_equal, cmpfn_user_defined, hashfn_eq, hashfn_eql)
 +      (hashfn_equal, hashfn_user_defined, make_hash_table)
 +      (maybe_resize_hash_table, hash_lookup, hash_put)
 +      (hash_remove_from_table, hash_clear, sweep_weak_table, SXHASH_COMBINE)
 +      (sxhash_string, sxhash_list, sxhash_vector, sxhash_bool_vector)
 +      (Fsxhash, Fgethash, Fputhash, Fmaphash):
 +      * image.c (make_image, search_image_cache, lookup_image)
 +      (xpm_put_color_table_h):
 +      * lisp.h (struct Lisp_Hash_Table):
 +      * minibuf.c (Ftry_completion, Fall_completions, Ftest_completion):
 +      * print.c (print):  Use 'EMACS_UINT' and 'EMACS_INT'
 +      for hashes and hash indexes, instead of 'unsigned' and 'int'.
 +      * alloc.c (allocate_vectorlike):
 +      Check for overflow in vector size calculations.
 +      * ccl.c (ccl_driver):
 +      Check for overflow when converting EMACS_INT to int.
 +      * fns.c, image.c: Remove unnecessary static decls that would otherwise
 +      need to be updated by these changes.
 +      * fns.c (make_hash_table, maybe_resize_hash_table):
 +      Check for integer overflow with large hash tables.
 +      (make_hash_table, maybe_resize_hash_table, Fmake_hash_table):
 +      Prefer the faster XFLOAT_DATA to XFLOATINT where either will do.
 +      (SXHASH_REDUCE): New macro.
 +      (sxhash_string, sxhash_list, sxhash_vector, sxhash_bool_vector):
 +      Use it instead of discarding useful hash info with large hash values.
 +      (sxhash_float): New function.
 +      (sxhash): Use it.  No more need for "& INTMASK" due to above changes.
 +      * lisp.h (FIXNUM_BITS): New macro, useful for SXHASH_REDUCE etc.
 +      (MOST_NEGATIVE_FIXNUM, MOST_POSITIVE_FIXNUM, INTMASK):
 +      Rewrite to use FIXNUM_BITS, as this simplifies things.
 +      (next_almost_prime, larger_vector, sxhash, hash_lookup, hash_put):
 +      Adjust signatures to match updated version of code.
 +      (consing_since_gc): Now EMACS_INT, since a single hash table can
 +      use more than INT_MAX bytes.
 +
 +2011-06-01  Dan Nicolaescu  <dann@ics.uci.edu>
 +
 +      Make it possible to build with GCC-4.6+ -O2 -flto.
 +
 +      * emacs.c (__malloc_initialize_hook): Mark as EXTERNALLY_VISIBLE.
 +
 +2011-06-01  Stefan Monnier  <monnier@iro.umontreal.ca>
 +
 +      * minibuf.c (get_minibuffer, read_minibuf_unwind):
 +      Call minibuffer-inactive-mode.
 +
 +2011-05-31  Juanma Barranquero  <lekktu@gmail.com>
 +
 +      * makefile.w32-in ($(BLD)/data.$(O), $(BLD)/editfns.$(O)):
 +      Update dependencies.
  
 -      * xdisp.c (compute_display_string_pos): Non-trivial implementation.
 -      (compute_display_string_end): New function.
 -      (push_it): Accept second argument POSITION, where pop_it should
 -      jump to continue iteration.
 +2011-05-31  Dan Nicolaescu  <dann@ics.uci.edu>
  
 -      * dispextern.h (compute_display_string_end): Declare prototype.
 +      * data.c (init_data): Remove code for UTS, this system is not
 +      supported anymore.
  
 -      * bidi.c (bidi_resolve_explicit_1): Use ZV for disp_pos.
 -      (bidi_fetch_char): Implement support for runs of characters
 -      covered by display strings.
 +2011-05-31  Dan Nicolaescu  <dann@ics.uci.edu>
  
 -      * bidi.c (bidi_fetch_char): Accept also character position
 -      corresponding to BYTEPOS.  DISP_POS is now a character position,
 -      not a byte position.  All callers changed.
 -      (bidi_cache_iterator_state, bidi_resolve_explicit_1)
 -      (bidi_resolve_explicit, bidi_resolve_weak)
 -      (bidi_level_of_next_char, bidi_move_to_visually_next): Abort if
 -      bidi_it->nchars is non-positive.
 -      (bidi_level_of_next_char): Don't try to lookup the cache for the
 -      next/previous character if nothing is cached there yet, or if we
 -      were just reseat()'ed to a new position.
 -      (bidi_paragraph_init, bidi_resolve_explicit_1)
 -      (bidi_level_of_next_char): Fix arguments in the calls to
 -      bidi_fetch_char.
 +      Don't force ./temacs to start in terminal mode.
  
 -2011-05-10  Eli Zaretskii  <eliz@gnu.org>
 +      * frame.c (make_initial_frame): Initialize faces in all cases, not
 +      only when CANNOT_DUMP is defined.
 +      * dispnew.c (init_display): Remove CANNOT_DUMP condition.
  
 -      * xdisp.c (compute_display_string_pos): New function.
 -      (reseat_1): Initialize bidi_it.disp_pos.
 +2011-05-31  Dan Nicolaescu  <dann@ics.uci.edu>
  
 -      * bidi.c (bidi_copy_it): Use offsetof.
 -      (bidi_fetch_char, bidi_fetch_char_advance): New functions.
 -      (bidi_cache_search, bidi_cache_iterator_state)
 -      (bidi_paragraph_init, bidi_resolve_explicit, bidi_resolve_weak)
 -      (bidi_level_of_next_char, bidi_move_to_visually_next): Support
 -      character positions inside a run of characters covered by a
 -      display string.
 -      (bidi_paragraph_init, bidi_resolve_explicit_1)
 -      (bidi_level_of_next_char): Call bidi_fetch_char and
 -      bidi_fetch_char_advance instead of FETCH_CHAR and
 -      FETCH_CHAR_ADVANCE.
 -      (bidi_init_it): Initialize new members.
 -      (LRE_CHAR, RLE_CHAR, PDF_CHAR, LRO_CHAR, RLO_CHAR): Remove macro
 -      definitions.
 -      (bidi_explicit_dir_char): Lookup character type in bidi_type_table,
 -      instead of using explicit *_CHAR codes.
 -      (bidi_resolve_explicit, bidi_resolve_weak): Use
 -      FETCH_MULTIBYTE_CHAR instead of FETCH_CHAR, as reordering of
 -      bidirectional text is supported only in multibyte buffers.
 +      * dispnew.c (add_window_display_history): Use const for the string
 +      pointer.  Remove declaration, not needed.
  
 -      * dispextern.h (struct bidi_it): New members nchars and disp_pos.
 -      ch_len is now EMACS_INT.
 -      (compute_display_string_pos): Declare prototype.
 +2011-05-31  Paul Eggert  <eggert@cs.ucla.edu>
 +
 +      Use 'inline', not 'INLINE'.
 +      <http://lists.gnu.org/archive/html/emacs-devel/2011-05/msg00914.html>
 +      * alloc.c, fontset.c (INLINE): Remove.
 +      * alloc.c, bidi.c, charset.c, coding.c, dispnew.c, fns.c, image.c:
 +      * intervals.c, keyboard.c, process.c, syntax.c, textprop.c, w32term.c:
 +      * xdisp.c, xfaces.c, xterm.c: Replace all uses of INLINE with inline.
 +      * gmalloc.c (register_heapinfo): Use inline unconditionally.
 +      * lisp.h (LISP_MAKE_RVALUE): Use inline, not __inline__.
 +
 +2011-05-31  Dan Nicolaescu  <dann@ics.uci.edu>
 +
 +      Make it possible to run ./temacs.
 +
 +      * callproc.c (set_initial_environment): Remove CANNOT_DUMP code,
 +      syms_of_callproc does the same thing.  Remove test for
 +      "initialized", do it in the caller.
 +      * emacs.c (main): Avoid calling set_initial_environment when dumping.
 +
 +2011-05-31  Stefan Monnier  <monnier@iro.umontreal.ca>
 +
 +      * minibuf.c (Finternal_complete_buffer): Return `category' metadata.
 +      (read_minibuf): Use get_minibuffer.
 +      (syms_of_minibuf): Use DEFSYM.
 +      (Qmetadata): New var.
 +      * data.c (Qbuffer): Don't make it static.
 +      (syms_of_data): Use DEFSYM.
 +
 +2011-05-31  Paul Eggert  <eggert@cs.ucla.edu>
 +
 +      * ccl.c (CCL_CODE_RANGE): Allow negative numbers.  (Bug#8751)
 +      (CCL_CODE_MIN): New macro.
 +
 +2011-05-30  Paul Eggert  <eggert@cs.ucla.edu>
 +
 +      * alloc.c (lisp_align_malloc): Omit unnecessary val==NULL tests.
 +
 +      * eval.c (Qdebug): Now static.
 +      * lisp.h (Qdebug): Remove decl.  This reverts a part of the
 +      2011-04-26T11:26:05Z!dan.colascione@gmail.com that inadvertently undid part of
 +      2011-04-14T06:48:41Z!eggert@cs.ucla.edu.
 +
 +2011-05-29  Chong Yidong  <cyd@stupidchicken.com>
 +
 +      * image.c: Various fixes to ImageMagick code comments.
 +      (Fimagemagick_types): Doc fix.
 +
 +2011-05-29  Paul Eggert  <eggert@cs.ucla.edu>
 +
 +      Minor fixes prompted by GCC 4.6.0 warnings.
 +
 +      * xselect.c (converted_selections, conversion_fail_tag): Now static.
 +
 +      * emacs.c [HAVE_X_WINDOWS]: Include "xterm.h".
 +      (x_clipboard_manager_save_all): Move extern decl to ...
 +      * xterm.h: ... here, so that it can be checked for consistency.
 +
 +2011-05-29  Chong Yidong  <cyd@stupidchicken.com>
 +
 +      * xselect.c (x_clipboard_manager_save_frame)
 +      (x_clipboard_manager_save_all): New functions.
 +      (Fx_clipboard_manager_save): Lisp function deleted.
 +
 +      * emacs.c (Fkill_emacs): Call x_clipboard_manager_save_all.
 +      * frame.c (delete_frame): Call x_clipboard_manager_save_frame.
 +
 +      * xterm.h: Update prototype.
 +
 +2011-05-28  William Xu  <william.xwl@gmail.com>
 +
 +      * nsterm.m (ns_term_shutdown): Synchronize user defaults before
 +      exiting (Bug#8239).
 +
 +2011-05-28  Jim Meyering  <meyering@redhat.com>
 +
 +      Avoid a sign-extension bug in crypto_hash_function.
 +      * fns.c (to_uchar): Define.
 +      (crypto_hash_function): Use it to convert some newly-signed
 +      variables to unsigned, to avoid sign-extension bugs.  For example,
 +      without this change, (md5 "truc") would evaluate to
 +      45723a2aff78ff4fff7fff1114760e62 rather than the expected
 +      45723a2af3788c4ff17f8d1114760e62.  Reported by Antoine Levitt in
 +      https://lists.gnu.org/archive/html/emacs-devel/2011-05/msg00883.html.
 +
 +2011-05-27  Paul Eggert  <eggert@cs.ucla.edu>
 +
 +      Integer overflow fixes.
 +
 +      * dbusbind.c: Serial number integer overflow fixes.
 +      (CHECK_DBUS_SERIAL_GET_SERIAL): New macro.
 +      (Fdbus_call_method_asynchronously, xd_read_message_1): Use a float
 +      to hold a serial number that is too large for a fixnum.
 +      (Fdbus_method_return_internal, Fdbus_method_error_internal):
 +      Check for serial numbers out of range.  Decode any serial number
 +      that was so large that it became a float.  (Bug#8722)
 +
 +      * dbusbind.c: Use XFASTINT rather than XUINT, and check for nonneg.
 +      (Fdbus_call_method, Fdbus_call_method_asynchronously):
 +      Use XFASTINT rather than XUINT when numbers are nonnegative.
 +      (xd_append_arg, Fdbus_method_return_internal):
 +      (Fdbus_method_error_internal): Likewise.  Also, for unsigned
 +      arguments, check that Lisp number is nonnegative, rather than
 +      silently wrapping negative numbers around.  (Bug#8722)
 +      (xd_read_message_1): Don't assume dbus_uint32_t can fit in int.
 +      (Bug#8722)
 +
 +      * data.c (arith_driver, Flsh): Avoid unnecessary casts to EMACS_UINT.
 +
 +      * ccl.c (ccl_driver): Redo slightly to avoid the need for 'unsigned'.
 +
 +      ccl: add integer overflow checks
 +      * ccl.c (CCL_CODE_MAX, GET_CCL_RANGE, GET_CCL_CODE, GET_CCL_INT):
 +      (IN_INT_RANGE): New macros.
 +      (ccl_driver): Use them to check for integer overflow when
 +      decoding a CCL program.  Many of the new checks are whether XINT (x)
 +      fits in int; it doesn't always, on 64-bit hosts.  The new version
 +      doesn't catch all possible integer overflows, but it's an
 +      improvement.  (Bug#8719)
 +
 +      * alloc.c (make_event_array): Use XINT, not XUINT.
 +      There's no need for unsigned here.
 +
 +      * mem-limits.h (EXCEEDS_LISP_PTR) [!USE_LSB_TAG]: EMACS_UINT -> uintptr_t
 +      This follows up to the 2011-05-06 change that substituted uintptr_t
 +      for EMACS_INT.  This case wasn't caught back then.
 +
 +      Rework Fformat to avoid integer overflow issues.
 +      * editfns.c: Include <float.h> unconditionally, as it's everywhere
 +      now (part of C89).  Include <verify.h>.
 +      (MAX_10_EXP, CONVERTED_BYTE_SIZE): Remove; no longer needed.
 +      (pWIDE, pWIDElen, signed_wide, unsigned_wide): New defns.
 +      (Fformat): Avoid the prepass trying to compute sizes; it was only
 +      approximate and thus did not catch overflow reliably.  Instead, walk
 +      through the format just once, formatting and computing sizes as we go,
 +      checking for integer overflow at every step, and allocating a larger
 +      buffer as needed.  Keep track separately whether the format is
 +      multibyte.  Keep only the most-recently calculated precision, rather
 +      than them all.  Record whether each argument has been converted to
 +      string.  Use EMACS_INT, not int, for byte and char and arg counts.
 +      Support field widths and precisions larger than INT_MAX.  Avoid
 +      sprintf's undefined behavior with conversion specifications such as %#d
 +      and %.0c.  Fix bug with strchr succeeding on '\0' when looking for
 +      flags.  Fix bug with (format "%c" 256.0).  Avoid integer overflow when
 +      formatting out-of-range floating point numbers with int
 +      formats. (Bug#8668)
 +
 +      * lisp.h (FIXNUM_OVERFLOW_P): Work even if arg is a NaN.
 +
 +      * data.c: Avoid integer truncation in expressions involving floats.
 +      * data.c: Include <intprops.h>.
 +      (arith_driver): When there's an integer overflow in an expression
 +      involving floating point, convert the integers to floating point
 +      so that the resulting value does not suffer from catastrophic
 +      integer truncation.  For example, on a 64-bit host (* 4
 +      most-negative-fixnum 0.5) should yield about -4.6e+18, not zero.
 +      Do not rely on undefined behavior after integer overflow.
 +
 +      merge count_size_as_multibyte, parse_str_to_multibyte
 +      * character.c, character.h (count_size_as_multibyte):
 +      Rename from parse_str_to_multibyte; all uses changed.
 +      Check for integer overflow.
 +      * insdel.c, lisp.h (count_size_as_multibyte): Remove,
 +      since it's now a duplicate of the other.  This is more of
 +      a character than a buffer op, so better that it's in character.c.
 +      * fns.c, print.c: Adjust to above changes.
 +
 +2011-05-27  Stefan Monnier  <monnier@iro.umontreal.ca>
 +
 +      * xselect.c (x_convert_selection): Yet another int/Lisp_Object mixup.
 +
 +2011-05-27  Paul Eggert  <eggert@cs.ucla.edu>
 +
 +      * xselect.c: Fix minor problems prompted by GCC 4.6.0 warnings.
 +      (x_handle_selection_request, frame_for_x_selection): Remove unused vars.
 +      (x_clipboard_manager_save): Now static.
 +      (Fx_clipboard_manager_save): Rename local to avoid shadowing.
 +
 +      * fns.c: Fix minor problems prompted by GCC 4.6.0 warnings.
 +      (crypto_hash_function): Now static.
 +      Fix pointer signedness problems.  Avoid unnecessary initializations.
 +
 +2011-05-27  Chong Yidong  <cyd@stupidchicken.com>
 +
 +      * termhooks.h (Vselection_alist): Make it terminal-local.
 +
 +      * terminal.c (create_terminal): Initialize it.
 +
 +      * xselect.c: Support for clipboard managers.
 +      (Vselection_alist): Move to termhooks.h as terminal-local var.
 +      (LOCAL_SELECTION): New macro.
 +      (x_atom_to_symbol): Handle x_display_info_for_display fail case.
 +      (symbol_to_x_atom): Remove gratuitous arg.
 +      (x_handle_selection_request, lisp_data_to_selection_data)
 +      (x_get_foreign_selection, Fx_register_dnd_atom): Callers changed.
 +      (x_own_selection, x_get_local_selection, x_convert_selection):
 +      New arg, specifying work frame.  Use terminal-local Vselection_alist.
 +      (some_frame_on_display): Delete unused function.
 +      (Fx_own_selection_internal, Fx_get_selection_internal)
 +      (Fx_disown_selection_internal, Fx_selection_owner_p)
 +      (Fx_selection_exists_p): New optional frame arg.
 +      (frame_for_x_selection, Fx_clipboard_manager_save): New functions.
 +      (x_handle_selection_clear): Don't treat other terminals with the
 +      same keyboard specially.  Use the terminal-local Vselection_alist.
 +      (x_clear_frame_selections): Use Frun_hook_with_args.
 +
 +      * xterm.c (x_term_init): Intern ATOM and CLIPBOARD_MANAGER atoms.
 +
 +      * xterm.h: Add support for those atoms.
 +
 +2011-05-26  Chong Yidong  <cyd@stupidchicken.com>
 +
 +      * xselect.c: ICCCM-compliant handling of MULTIPLE targets.
 +      (converted_selections, conversion_fail_tag): New global variables.
 +      (x_selection_request_lisp_error): Free the above.
 +      (x_get_local_selection): Remove unnecessary code.
 +      (x_reply_selection_request): Args changed; handle arbitrary array
 +      of converted selections stored in converted_selections.
 +      Separate the XChangeProperty and SelectionNotify steps.
 +      (x_handle_selection_request): Rewrite to handle MULTIPLE target.
 +      (x_convert_selection): New function.
 +      (x_handle_selection_event): Simplify.
 +      (x_get_foreign_selection): Don't ignore incoming requests while
 +      waiting for an answer; this will fail when we implement
 +      SAVE_TARGETS, and seems unnecessary anyway.
 +      (selection_data_to_lisp_data): Recognize ATOM_PAIR type.
 +      (Vx_sent_selection_functions): Doc fix.
 +
 +2011-05-26  Leo Liu  <sdl.web@gmail.com>
 +
 +      * editfns.c (Ftranspose_regions): Allow empty regions.  (Bug#8699)
 +
 +2011-05-25  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
 +
 +      * dispextern.h (struct glyph_row): New member fringe_bitmap_periodic_p.
 +
 +      * dispnew.c (shift_glyph_matrix, scrolling_window): Mark scrolled row
 +      for fringe update if it has periodic bitmap.
 +      (row_equal_p): Also compare left_fringe_offset, right_fringe_offset,
 +      and fringe_bitmap_periodic_p.
 +
 +      * fringe.c (get_fringe_bitmap_data): New function.
 +      (draw_fringe_bitmap_1, update_window_fringes): Use it.
 +      (update_window_fringes): Record periodicity of fringe bitmap in glyph
 +      row.  Mark glyph row for fringe update if periodicity changed.
 +
 +      * xdisp.c (try_window_reusing_current_matrix): Don't mark scrolled row
 +      for fringe update unless it has periodic bitmap.
 +
 +2011-05-25  Kenichi Handa  <handa@m17n.org>
 +
 +      * xdisp.c (get_next_display_element): Set correct it->face_id for
 +      a static composition.
 +
 +2011-05-24  Leo Liu  <sdl.web@gmail.com>
 +
 +      * deps.mk (fns.o):
 +      * makefile.w32-in ($(BLD)/fns.$(O)): Include sha1.h.
 +
 +      * fns.c (crypto_hash_function, Fsha1): New function.
 +      (Fmd5): Use crypto_hash_function.
 +      (syms_of_fns): Add Ssha1.
 +
 +2011-05-22  Paul Eggert  <eggert@cs.ucla.edu>
 +
 +      * gnutls.c: Remove unused macros.
 +      (fn_gnutls_transport_set_lowat, fn_gnutls_transport_set_pull_function):
 +      (fn_gnutls_transport_set_push_function) [!WINDOWSNT]:
 +      Remove macros that are defined and never used.
 +      Caught by gcc -Wunused-macros (GCC 4.6.0, Fedora 14).
 +
 +2011-05-22  Chong Yidong  <cyd@stupidchicken.com>
 +
 +      * xselect.c (syms_of_xselect): Remove unused symbol SAVE_TARGETS.
 +      (Fx_get_selection_internal): Minor cleanup.
 +      (Fx_own_selection_internal): Rename arguments for consistency with
 +      select.el.
 +
 +2011-05-22  Paul Eggert  <eggert@cs.ucla.edu>
 +
 +      * xselect.c (QSAVE_TARGETS): New static var, to fix build failure.
 +
 +2011-05-22  Chong Yidong  <cyd@stupidchicken.com>
 +
 +      * xselect.c (syms_of_xselect): Include character.h; use DEFSYM.
 +
 +2011-05-21  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
 +
 +      * dispnew.c (scrolling_window): Don't exclude the case that the
 +      last enabled row in the desired matrix touches the bottom boundary.
 +
 +2011-05-21  Glenn Morris  <rgm@gnu.org>
 +
 +      * Makefile.in ($(etc)/DOC): Make second command line even shorter.
 +      (SOME_MACHINE_OBJECTS): Replace FONT_OBJ by its maximal expansion,
 +      and add some more files.
 +
 +2011-05-20  Eli Zaretskii  <eliz@gnu.org>
 +
 +      * callproc.c (Fcall_process) [MSDOS]: Fix arguments to
 +      report_file_error introduced by the change from 2011-05-07.
 +
 +2011-05-20  Paul Eggert  <eggert@cs.ucla.edu>
 +
 +      * systime.h (Time): Define only if emacs is defined.
 +      This is to allow ../lib-src/profile.c to be compiled on FreeBSD,
 +      where the include path doesn't have X11/X.h by default.  See
 +      <http://lists.gnu.org/archive/html/emacs-devel/2011-05/msg00561.html>.
 +
 +2011-05-20 Kenichi Handa  <handa@m17n.org>
 +
 +      * composite.c (find_automatic_composition): Fix previous change.
 +
 +2011-05-20  Glenn Morris  <rgm@gnu.org>
 +
 +      * lisp.mk: New file, split from Makefile.in.
 +      * Makefile.in (lisp): Move to separate file, inserted by @lisp_frag@.
 +      (shortlisp): Remove.
 +      ($(etc)/DOC): Edit lisp.mk rather than using $shortlisp.
 +
 +2011-05-19  Glenn Morris  <rgm@gnu.org>
 +
 +      * Makefile.in (MSDOS_SUPPORT_REAL, MSDOS_SUPPORT, NS_SUPPORT)
 +      (REAL_MOUSE_SUPPORT, GPM_MOUSE_SUPPORT, MOUSE_SUPPORT, TOOLTIP_SUPPORT)
 +      (BASE_WINDOW_SUPPORT, X_WINDOW_SUPPORT, WINDOW_SUPPORT): Remove.
 +      (lisp): Set the order to that of loadup.el.
 +      (shortlisp): Make it a copy of $lisp.
 +      (SOME_MACHINE_LISP): Remove.
 +      ($(etc)/DOC): Depend just on $lisp, not $SOME_MACHINE_LISP too.
 +      Use just $shortlisp, not $SOME_MACHINE_LISP too.
 +
 +2011-05-18  Kenichi Handa  <handa@m17n.org>
 +
 +      * composite.c (CHAR_COMPOSABLE_P): Add more check for efficiency.
 +      (BACKWARD_CHAR): Wrap the arg STOP by parenthesis.
 +      (find_automatic_composition): Mostly rewrite for efficiency.
 +
 +2011-05-18  Juanma Barranquero  <lekktu@gmail.com>
 +
 +      * makefile.w32-in: Update dependencies.
 +
 +2011-05-18  Christoph Scholtes  <cschol2112@googlemail.com>
 +
 +      * menu.c: Include limits.h (fixes the MS-Windows build broken by
 +      revision 104625).
 +
 +2011-05-18  Paul Eggert  <eggert@cs.ucla.edu>
 +
 +      Fix some integer overflow issues, such as string length overflow.
 +
 +      * insdel.c (count_size_as_multibyte): Check for string overflow.
 +
 +      * character.c (lisp_string_width): Check for string overflow.
 +      Use EMACS_INT, not int, for string indexes and lengths; in
 +      particular, 2nd arg is now EMACS_INT, not int.  Do not crash if
 +      the resulting string length overflows an EMACS_INT; instead,
 +      report a string overflow if no precision given.  When checking for
 +      precision exhaustion, use a check that cannot possibly have
 +      integer overflow.  (Bug#8675)
 +      * character.h (lisp_string_width): Adjust to new signature.
 +
 +      * alloc.c (string_overflow): New function.
 +      (Fmake_string): Use it.  This doesn't change behavior, but saves
 +      a few bytes and will simplify future changes.
 +      * character.c (string_escape_byte8): Likewise.
 +      * lisp.h (string_overflow): New decl.
 +
 +      Fixups, following up to the user-interface timestamp change.
 +      * nsterm.m (last_mouse_movement_time, ns_mouse_position): Use Time
 +      for UI timestamps, instead of unsigned long.
 +      * msdos.c (mouse_get_pos): Likewise.
 +      * w32inevt.c (movement_time, w32_console_mouse_position): Likewise.
 +      * w32gui.h (Time): Define by including "systime.h" rather than by
 +      declaring it ourselves.  (Bug#8664)
 +
 +      * dispextern.h (struct image): Don't assume time_t <= unsigned long.
 +      * image.c (clear_image_cache): Likewise.
 +
 +      * term.c (term_mouse_position): Don't assume time_t wraparound.
 +
 +      Be more systematic about user-interface timestamps.
 +      Before, the code sometimes used 'Time', sometimes 'unsigned long',
 +      and sometimes 'EMACS_UINT', to represent these timestamps.
 +      This change causes it to use 'Time' uniformly, as that's what X uses.
 +      This makes the code easier to follow, and makes it easier to catch
 +      integer overflow bugs such as Bug#8664.
 +      * frame.c (Fmouse_position, Fmouse_pixel_position):
 +      Use Time, not unsigned long, for user-interface timestamps.
 +      * keyboard.c (last_event_timestamp, kbd_buffer_get_event): Likewise.
 +      (button_down_time, make_lispy_position, make_lispy_movement): Likewise.
 +      * keyboard.h (last_event_timestamp): Likewise.
 +      * menu.c (Fx_popup_menu) [!HAVE_X_WINDOWS]: Likewise.
 +      * menu.h (xmenu_show): Likewise.
 +      * term.c (term_mouse_position): Likewise.
 +      * termhooks.h (struct input_event.timestamp): Likewise.
 +      (struct terminal.mouse_position_hook): Likewise.
 +      * xmenu.c (create_and_show_popup_menu, xmenu_show): Likewise.
 +      * xterm.c (XTmouse_position, x_scroll_bar_report_motion): Likewise.
 +      * systime.h (Time): New decl.  Pull it in from <X11/X.h> if
 +      HAVE_X_WINDOWS, otherwise define it as unsigned long, which is
 +      what it was before.
 +      * menu.h, termhooks.h: Include "systime.h", for Time.
 +
 +      * keyboard.c (make_lispy_event): Fix problem in integer overflow.
 +      Don't assume that the difference between two unsigned long values
 +      can fit into an integer.  At this point, we know button_down_time
 +      <= event->timestamp, so the difference must be nonnegative, so
 +      there's no need to cast the result if double-click-time is
 +      nonnegative, as it should be; check that it's nonnegative, just in
 +      case.  This bug is triggered when events are more than 2**31 ms
 +      apart (about 25 days).  (Bug#8664)
 +
 +      * xselect.c (last_event_timestamp): Remove duplicate decl.
 +      (x_own_selection): Remove needless cast to unsigned long.
 +
 +      * xmenu.c (set_frame_menubar): Use int, not EMACS_UINT, for indexes
 +      that always fit in int.  Use a sentinel instead of a counter, to
 +      avoid a temp and to allay GCC's concerns about possible int overflow.
 +      * frame.h (struct frame): Use int for menu_bar_items_used
 +      instead of EMACS_INT, since it always fits in int.
 +
 +      * menu.c (grow_menu_items): Check for int overflow.
 +
 +      * xmenu.c (set_frame_menubar): Don't mishandle vectors with no nils.
 +
 +      * xterm.c: Use EMACS_INT for Emacs modifiers, and int for X modifiers.
 +      Before, the code was not consistent.  These values cannot exceed
 +      2**31 - 1 so there's no need to make them unsigned.
 +      (x_x_to_emacs_modifiers): Accept int and return EMACS_INT.
 +      (x_emacs_to_x_modifiers): Accept EMACS_INT and return int.
 +      (x_x_to_emacs_modifiers, x_emacs_to_x_modifiers): Reject non-integers
 +      as modifiers.
 +      * xterm.h (x_x_to_emacs_modifiers): Adjust to signature change.
 +
 +      * lisp.h (XINT) [USE_LISP_UNION_TYPE]: Cast to EMACS_INT.
 +      (XUINT) [USE_LISP_UNION_TYPE]: Cast to EMACS_UINT.
 +      Otherwise, GCC 4.6.0 warns about printf (pI, XINT (...)),
 +      presumably because the widths might not match.
 +
 +      * window.c (size_window): Avoid needless test at loop start.
 +
 +2011-05-18  Courtney Bane  <emacs-bugs-7626@cbane.org>  (tiny change)
 +
 +      * term.c (Fresume_tty): Restore hooks before reinitializing (bug#8687).
 +
 +2011-05-12  Drew Adams  <drew.adams@oracle.com>
 +
 +      * textprop.c (Fprevious_single_char_property_change): Doc fix (bug#8655).
 +
 +2011-05-12  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
 +
 +      * w32term.c (w32_draw_fringe_bitmap): Rename local vars `left' and
 +      `width' to `bar_area_x' and `bar_area_width', respectively.
 +      (x_scroll_run): Take account of fringe background extension.
 +
 +      * xterm.c (x_draw_fringe_bitmap) [USE_TOOLKIT_SCROLL_BARS]:
 +      Rename local vars `left' and `width' to `bar_area_x' and
 +      `bar_area_width', respectively.
 +      (x_scroll_run) [USE_TOOLKIT_SCROLL_BARS]: Take account of fringe
 +      background extension.
 +
 +2011-05-10  Jim Meyering  <meyering@redhat.com>
 +
 +      * xdisp.c (x_intersect_rectangles): Fix typo "the the -> the".
 +
 +2011-05-10  Juanma Barranquero  <lekktu@gmail.com>
 +
 +      * image.c (Finit_image_library): Return t for built-in image types,
 +      like pbm and xbm.  (Bug#8640)
  
  2011-05-09  Andreas Schwab  <schwab@linux-m68k.org>
  
diff --cc src/bidi.c
index b05fd21e5b69ae44366f687df481f4adfe83851e,de189f0cb1374235dbb9c18e55ede0e12415799f..a41f50d9ca51a9644cd580eb718e9426c0456ba5
@@@ -565,6 -571,65 +571,65 @@@ bidi_line_init (struct bidi_it *bidi_it
    bidi_cache_reset ();
  }
  
 -static INLINE int
+ /* Fetch and return the character at BYTEPOS/CHARPOS.  If that
+    character is covered by a display string, treat the entire run of
+    covered characters as a single character u+FFFC, and return their
+    combined length in CH_LEN and NCHARS.  DISP_POS specifies the
+    character position of the next display string, or -1 if not yet
+    computed.  When the next character is at or beyond that position,
+    the function updates DISP_POS with the position of the next display
+    string.  */
++static inline int
+ bidi_fetch_char (EMACS_INT bytepos, EMACS_INT charpos, EMACS_INT *disp_pos,
+                int frame_window_p, EMACS_INT *ch_len, EMACS_INT *nchars)
+ {
+   int ch;
+   /* FIXME: Support strings in addition to buffers.  */
+   /* If we got past the last known position of display string, compute
+      the position of the next one.  That position could be at BYTEPOS.  */
+   if (charpos < ZV && charpos > *disp_pos)
+     *disp_pos = compute_display_string_pos (charpos, frame_window_p);
+   /* Fetch the character at BYTEPOS.  */
+   if (bytepos >= ZV_BYTE)
+     {
+       ch = BIDI_EOB;
+       *ch_len = 1;
+       *nchars = 1;
+       *disp_pos = ZV;
+     }
+   else if (charpos >= *disp_pos)
+     {
+       EMACS_INT disp_end_pos;
+       /* We don't expect to find ourselves in the middle of a display
+        property.  Hopefully, it will never be needed.  */
+       if (charpos > *disp_pos)
+       abort ();
+       /* Return the Unicode Object Replacement Character to represent
+        the entire run of characters covered by the display
+        string.  */
+       ch = 0xFFFC;
+       disp_end_pos = compute_display_string_end (*disp_pos);
+       *nchars = disp_end_pos - *disp_pos;
+       *ch_len = CHAR_TO_BYTE (disp_end_pos) - bytepos;
+     }
+   else
+     {
+       ch = FETCH_MULTIBYTE_CHAR (bytepos);
+       *nchars = 1;
+       *ch_len = CHAR_BYTES (ch);
+     }
+   /* If we just entered a run of characters covered by a display
+      string, compute the position of the next display string.  */
+   if (charpos + *nchars <= ZV && charpos + *nchars > *disp_pos)
+     *disp_pos = compute_display_string_pos (charpos + *nchars, frame_window_p);
+   return ch;
+ }
  /* Find the beginning of this paragraph by looking back in the buffer.
     Value is the byte position of the paragraph's beginning.  */
  static EMACS_INT
@@@ -828,13 -909,17 +909,17 @@@ bidi_resolve_neutral_1 (bidi_type_t pre
      return STRONG_R;
  }
  
 -static INLINE int
 +static inline int
- bidi_explicit_dir_char (int c)
+ bidi_explicit_dir_char (int ch)
  {
-   /* FIXME: this should be replaced with a lookup table with suitable
-      bits set, like standard C ctype macros do.  */
-   return (c == LRE_CHAR || c == LRO_CHAR
-         || c == RLE_CHAR || c == RLO_CHAR || c == PDF_CHAR);
+   bidi_type_t ch_type;
+   if (!bidi_initialized)
+     abort ();
+   ch_type = (bidi_type_t) XINT (CHAR_TABLE_REF (bidi_type_table, ch));
+   return (ch_type == LRE || ch_type == LRO
+         || ch_type == RLE || ch_type == RLO
+         || ch_type == PDF);
  }
  
  /* A helper function for bidi_resolve_explicit.  It advances to the
Simple merge
diff --cc src/keyboard.c
Simple merge
diff --cc src/xdisp.c
Simple merge