unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#31837: 26.1; replace-buffer-contents doesn't work if buffer has multibyte characters
@ 2018-06-14 21:34 Milan Stanojević
  2018-06-15  8:34 ` Eli Zaretskii
  0 siblings, 1 reply; 7+ messages in thread
From: Milan Stanojević @ 2018-06-14 21:34 UTC (permalink / raw)
  To: 31837

Here is a small recipe that illustrates the bug.

recipe.el
---------
(setq use-multibyte (< 0 (length argv)))

(switch-to-buffer "file1")
(when use-multibyte (insert-char (char-from-name "SMILE")))
(insert "1234")

(switch-to-buffer "file2")
(when use-multibyte (insert-char (char-from-name "SMILE")))
(insert "5678")

(replace-buffer-contents "file1")

(princ (buffer-substring-no-properties (point-min) (point-max)))
(princ "\n")
-------------

Running the recipe as script

$ emacs -Q --script /tmp/recipe.el
1234

$ emacs -Q --script /tmp/recipe.el multibyte
⌣5234

In the first run, with just ascii characters, everything works as
 expected. 
In the second run, with multibyte characters, the function didn't
 replace '5' with '1' as expected.
 
I looked at the code and it looks to me like there is a very obvious bug
 in function buffer_chars_equal in editfns.c. It calls
 BUF_FETCH_CHAR_AS_MULTIBYTE passing *character* positions, but the
 macro expects *byte* positions. (it would be nice if these char vs byte
 positions could be distinguished with types, but I'm not sure it is
 possible in C).

The simple fix is to replace BUF_FETCH_CHAR_AS_MULTIBYTE with
 STRING_CHAR (BUF_CHAR_ADDRESS (buf, pos)) and this seems to work.
 
I'm not sure about performance of the above fix, though, because
 accessing random character position in a buffer is not constant. If
 diffing algorithm is accessing buffer positions in more or less
 localized manner, maybe it makes sense to move the point inside
 buffer_chars_equal so the char position to byte position conversion is
 fast. It probably doesn't matter for small files.

Emacs info:
In GNU Emacs 26.1 (build 4, x86_64-pc-linux-gnu, X toolkit, Xaw scroll bars)
Windowing system distributor 'The X.Org Foundation', version 11.0.11905000
System Description: Linux 

Configured using:
 'configure --with-x-toolkit=lucid --without-gpm --without-gconf --without-selinux --without-imagemagick --with-modules --with-gif=no'






^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2018-07-01 17:32 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-06-14 21:34 bug#31837: 26.1; replace-buffer-contents doesn't work if buffer has multibyte characters Milan Stanojević
2018-06-15  8:34 ` Eli Zaretskii
2018-06-18 17:44   ` Milan Stanojević
2018-06-18 18:16     ` Eli Zaretskii
2018-06-18 20:29       ` Milan Stanojević
2018-06-19  2:30         ` Eli Zaretskii
2018-07-01 17:32   ` Philipp Stephani

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).