summaryrefslogtreecommitdiff
path: root/src/fileio.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2014-12-15 00:00:50 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2014-12-15 00:01:42 -0800
commite2815bfe2a1e4d5a21d6b6378ebc2108d4d104ab (patch)
treed831506ddf8ed49830d9211db95a335039783a1a /src/fileio.c
parent872617ad730906f9437b90c3b90af2e2458f00f6 (diff)
downloademacs-e2815bfe2a1e4d5a21d6b6378ebc2108d4d104ab.tar.gz
emacs-e2815bfe2a1e4d5a21d6b6378ebc2108d4d104ab.tar.bz2
emacs-e2815bfe2a1e4d5a21d6b6378ebc2108d4d104ab.zip
Correct same_at_end when restoring window points
* fileio.c (Finsert_file_contents): Compute same_at_end character position using the old buffer size, not the new one, since restore_window_points wants the old size. Fixes: debbugs:19161
Diffstat (limited to 'src/fileio.c')
-rw-r--r--src/fileio.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/fileio.c b/src/fileio.c
index 83b4954b745..39514ee18e6 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -3522,6 +3522,9 @@ by calling `format-decode', which see. */)
bytes and BEG and END count bytes. */
ptrdiff_t same_at_start = BEGV_BYTE;
ptrdiff_t same_at_end = ZV_BYTE;
+ /* SAME_AT_END_CHARPOS counts characters, because
+ restore_window_points needs the old character count. */
+ ptrdiff_t same_at_end_charpos = ZV;
if (current_buffer->base_buffer && ! NILP (visit))
error ("Cannot do file visiting in an indirect buffer");
@@ -3943,6 +3946,7 @@ by calling `format-decode', which see. */)
+ (! NILP (end) ? end_offset : st.st_size) - ZV_BYTE));
if (overlap > 0)
same_at_end += overlap;
+ same_at_end_charpos = BYTE_TO_CHAR (same_at_end);
/* Arrange to read only the nonmatching middle part of the file. */
beg_offset += same_at_start - BEGV_BYTE;
@@ -3950,7 +3954,7 @@ by calling `format-decode', which see. */)
invalidate_buffer_caches (current_buffer,
BYTE_TO_CHAR (same_at_start),
- BYTE_TO_CHAR (same_at_end));
+ same_at_end_charpos);
del_range_byte (same_at_start, same_at_end, 0);
/* Insert from the file at the proper position. */
temp = BYTE_TO_CHAR (same_at_start);
@@ -4099,6 +4103,7 @@ by calling `format-decode', which see. */)
overlap = same_at_start - BEGV_BYTE - (same_at_end + inserted - ZV_BYTE);
if (overlap > 0)
same_at_end += overlap;
+ same_at_end_charpos = BYTE_TO_CHAR (same_at_end);
/* If display currently starts at beginning of line,
keep it that way. */
@@ -4114,7 +4119,7 @@ by calling `format-decode', which see. */)
{
invalidate_buffer_caches (current_buffer,
BYTE_TO_CHAR (same_at_start),
- BYTE_TO_CHAR (same_at_end));
+ same_at_end_charpos);
del_range_byte (same_at_start, same_at_end, 0);
temp = GPT;
eassert (same_at_start == GPT_BYTE);
@@ -4122,7 +4127,7 @@ by calling `format-decode', which see. */)
}
else
{
- temp = BYTE_TO_CHAR (same_at_start);
+ temp = same_at_end_charpos;
}
/* Insert from the file at the proper position. */
SET_PT_BOTH (temp, same_at_start);
@@ -4405,7 +4410,7 @@ by calling `format-decode', which see. */)
if (inserted > 0)
restore_window_points (window_markers, inserted,
BYTE_TO_CHAR (same_at_start),
- BYTE_TO_CHAR (same_at_end));
+ same_at_end_charpos);
if (!NILP (visit))
{