From 3af982196b1b973e953c35351961f2a96fe34172 Mon Sep 17 00:00:00 2001 From: "K.Takata" Date: Tue, 1 Nov 2022 20:36:19 +0000 Subject: patch 9.0.0826: if 'endofline' is set CTRL-Z may be written in a wrong place 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) --- src/fileio.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) (limited to 'src/fileio.c') diff --git a/src/fileio.c b/src/fileio.c index bca827152a..9916de8a63 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) -- cgit v1.2.3