]> granicus.if.org Git - vim/commitdiff
updated for version 7.3.124 v7.3.124
authorBram Moolenaar <Bram@vim.org>
Tue, 15 Feb 2011 16:39:22 +0000 (17:39 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 15 Feb 2011 16:39:22 +0000 (17:39 +0100)
Problem:    When writing a file in binary mode it may be missing the final EOL
            if a file previously read was missing the EOL. (Kevin Goodsell)
Solution:   Move the write_no_eol_lnum into the buffer struct.

src/fileio.c
src/globals.h
src/os_unix.c
src/structs.h
src/version.c

index 0d4511ad5d7fa82f34ae9a9b7d4beb7d20f10802..a87b70b8bb687fd98bc9dda6552243eec56a6659 100644 (file)
@@ -317,7 +317,7 @@ readfile(fname, sfname, from, lines_to_skip, lines_to_read, eap, flags)
     int                using_b_fname;
 #endif
 
-    write_no_eol_lnum = 0;     /* in case it was set by the previous read */
+    curbuf->b_no_eol_lnum = 0; /* in case it was set by the previous read */
 
     /*
      * If there is no file name yet, use the one for the read file.
@@ -2599,10 +2599,11 @@ failed:
 
     /*
      * Trick: We remember if the last line of the read didn't have
-     * an eol for when writing it again.  This is required for
+     * an eol even when 'binary' is off, for when writing it again with
+     * 'binary' on.  This is required for
      * ":autocmd FileReadPost *.gz set bin|'[,']!gunzip" to work.
      */
-    write_no_eol_lnum = read_no_eol_lnum;
+    curbuf->b_no_eol_lnum = read_no_eol_lnum;
 
     /* When reloading a buffer put the cursor at the first line that is
      * different. */
@@ -2650,13 +2651,17 @@ failed:
                                                            FALSE, NULL, eap);
        if (msg_scrolled == n)
            msg_scroll = m;
-#ifdef FEAT_EVAL
+# ifdef FEAT_EVAL
        if (aborting())     /* autocmds may abort script processing */
            return FAIL;
-#endif
+# endif
     }
 #endif
 
+    /* Reset now, following writes should not omit the EOL.  Also, the line
+     * number will become invalid because of edits. */
+    curbuf->b_no_eol_lnum = 0;
+
     if (recoverymode && error)
        return FAIL;
     return OK;
@@ -4560,7 +4565,7 @@ restore_backup:
        if (end == 0
                || (lnum == end
                    && write_bin
-                   && (lnum == write_no_eol_lnum
+                   && (lnum == buf->b_no_eol_lnum
                        || (lnum == buf->b_ml.ml_line_count && !buf->b_p_eol))))
        {
            ++lnum;                     /* written the line, count it */
@@ -5086,8 +5091,6 @@ nofail:
     {
        aco_save_T      aco;
 
-       write_no_eol_lnum = 0;  /* in case it was set by the previous read */
-
        /*
         * Apply POST autocommands.
         * Careful: The autocommands may call buf_write() recursively!
@@ -7256,8 +7259,8 @@ buf_store_time(buf, st, fname)
 write_lnum_adjust(offset)
     linenr_T   offset;
 {
-    if (write_no_eol_lnum != 0)                /* only if there is a missing eol */
-       write_no_eol_lnum += offset;
+    if (curbuf->b_no_eol_lnum != 0)    /* only if there is a missing eol */
+       curbuf->b_no_eol_lnum += offset;
 }
 
 #if defined(TEMPDIRNAMES) || defined(PROTO)
index 84aaa06ada1b7bbb93b5582361871bcbed470907..3685fc7322d1c0cff673b1b113454d89a040a805 100644 (file)
@@ -1057,10 +1057,6 @@ EXTERN pos_T     last_cursormoved            /* for CursorMoved event */
                        ;
 #endif
 
-EXTERN linenr_T        write_no_eol_lnum INIT(= 0); /* non-zero lnum when last line
-                                               of next binary write should
-                                               not have an end-of-line */
-
 #ifdef FEAT_WINDOWS
 EXTERN int     postponed_split INIT(= 0);  /* for CTRL-W CTRL-] command */
 EXTERN int     postponed_split_flags INIT(= 0);  /* args for win_split() */
index 0234f90d115082ad418ba12eb9abde1872995a83..b227c8ea94620a5f882a03b8b86f11fb644e15c4 100644 (file)
@@ -4245,7 +4245,7 @@ mch_call_shell(cmd, options)
                                 * should not have one. */
                                if (lnum != curbuf->b_op_end.lnum
                                        || !curbuf->b_p_bin
-                                       || (lnum != write_no_eol_lnum
+                                       || (lnum != curbuf->b_no_eol_lnum
                                            && (lnum !=
                                                    curbuf->b_ml.ml_line_count
                                                    || curbuf->b_p_eol)))
@@ -4588,10 +4588,10 @@ finished:
                    {
                        append_ga_line(&ga);
                        /* remember that the NL was missing */
-                       write_no_eol_lnum = curwin->w_cursor.lnum;
+                       curbuf->b_no_eol_lnum = curwin->w_cursor.lnum;
                    }
                    else
-                       write_no_eol_lnum = 0;
+                       curbuf->b_no_eol_lnum = 0;
                    ga_clear(&ga);
                }
 
index aa93aaedcd835ec7fb0b1b82882ece2850e933f6..afc494e2cffea8f83c24c17a187af9bf72934a0a 100644 (file)
@@ -1564,6 +1564,9 @@ struct file_buffer
 
     /* end of buffer options */
 
+    linenr_T   b_no_eol_lnum;  /* non-zero lnum when last line of next binary
+                                * write should not have an end-of-line */
+
     int                b_start_eol;    /* last line had eol when it was read */
     int                b_start_ffc;    /* first char of 'ff' when edit started */
 #ifdef FEAT_MBYTE
index 34ef9201769eb1e225017775737dcd869721e9a0..ad439e13ebe17d3957f220a20a4340ac383f7cde 100644 (file)
@@ -714,6 +714,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    124,
 /**/
     123,
 /**/