diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2014-12-15 00:00:50 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2014-12-15 00:01:42 -0800 |
commit | e2815bfe2a1e4d5a21d6b6378ebc2108d4d104ab (patch) | |
tree | d831506ddf8ed49830d9211db95a335039783a1a /src/fileio.c | |
parent | 872617ad730906f9437b90c3b90af2e2458f00f6 (diff) | |
download | emacs-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.c | 13 |
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)) { |