summaryrefslogtreecommitdiff
path: root/src/fileio.c
diff options
context:
space:
mode:
authorK.Takata <kentkt@csc.jp>2022-11-01 20:36:19 +0000
committerBram Moolenaar <Bram@vim.org>2022-11-01 20:36:19 +0000
commit3af982196b1b973e953c35351961f2a96fe34172 (patch)
tree8b2bc31d033187b17b4c5fb6e51350f833cd984b /src/fileio.c
parent8e0ccb6bc21a446e5c6375b7fdf200fb53a129da (diff)
downloadvim-git-3af982196b1b973e953c35351961f2a96fe34172.tar.gz
patch 9.0.0826: if 'endofline' is set CTRL-Z may be written in a wrong placev9.0.0826
Problem: If 'endofline' is set the CTRL-Z may be written in the wrong place. Solution: Write CTRL-Z at the end of the file. Update the help to explain the possibilities better. (Ken Takata, closes #11486)
Diffstat (limited to 'src/fileio.c')
-rw-r--r--src/fileio.c35
1 files changed, 20 insertions, 15 deletions
diff --git a/src/fileio.c b/src/fileio.c
index bca827152..9916de8a6 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -2271,27 +2271,32 @@ failed:
if (error && read_count == 0)
error = FALSE;
- /*
- * If we get EOF in the middle of a line, note the fact and
- * complete the line ourselves.
- * In Dos format ignore a trailing CTRL-Z, unless 'binary' set.
- */
+ // In Dos format ignore a trailing CTRL-Z, unless 'binary' is set.
+ // In old days the file length was in sector count and the CTRL-Z the
+ // marker where the file really ended. Assuming we write it to a file
+ // system that keeps file length properly the CTRL-Z should be dropped.
+ // Set the 'endoffile' option so the user can decide what to write later.
+ // In Unix format the CTRL-Z is just another character.
+ if (linerest != 0
+ && !curbuf->b_p_bin
+ && fileformat == EOL_DOS
+ && ptr[-1] == Ctrl_Z)
+ {
+ ptr--;
+ linerest--;
+ if (set_options)
+ curbuf->b_p_eof = TRUE;
+ }
+
+ // If we get EOF in the middle of a line, note the fact by resetting
+ // 'endofline' and add the line normally.
if (!error
&& !got_int
- && linerest != 0
- // TODO: should we handle CTRL-Z differently here for 'endoffile'?
- && !(!curbuf->b_p_bin
- && fileformat == EOL_DOS
- && *line_start == Ctrl_Z
- && ptr == line_start + 1))
+ && linerest != 0)
{
// remember for when writing
if (set_options)
- {
curbuf->b_p_eol = FALSE;
- if (*line_start == Ctrl_Z && ptr == line_start + 1)
- curbuf->b_p_eof = TRUE;
- }
*ptr = NUL;
len = (colnr_T)(ptr - line_start + 1);
if (ml_append(lnum, line_start, len, newfile) == FAIL)