diff options
author | Matthieu Coudron <mattator@gmail.com> | 2020-08-02 20:19:48 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-02 20:19:48 +0200 |
commit | 4ed5204bc9d5811cd45209476ac1b9e2c2b74146 (patch) | |
tree | b3d811af95576072856a07f0dffcb86c76de6604 /src/nvim/fileio.c | |
parent | 480515e4426865c37a42a452432b3463f0ab40a7 (diff) | |
parent | ea515f8ca1fa63cfad516a956cd78ef371f91955 (diff) | |
download | rneovim-4ed5204bc9d5811cd45209476ac1b9e2c2b74146.tar.gz rneovim-4ed5204bc9d5811cd45209476ac1b9e2c2b74146.tar.bz2 rneovim-4ed5204bc9d5811cd45209476ac1b9e2c2b74146.zip |
Merge pull request #12665 from janlazo/vim-8.2.1254
vim-patch:8.0.1774,8.1.{192,194,255,264,1202,2172,2340},8.2.{62,71,72,1004,1254,1259,1265,1267,1292,1295}
Diffstat (limited to 'src/nvim/fileio.c')
-rw-r--r-- | src/nvim/fileio.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index 20f0cdccc3..f922591d0b 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -300,6 +300,7 @@ readfile( int skip_read = false; context_sha256_T sha_ctx; int read_undo_file = false; + int split = 0; // number of split lines linenr_T linecnt; int error = FALSE; /* errors encountered */ int ff_error = EOL_UNKNOWN; /* file format with errors */ @@ -1013,8 +1014,21 @@ retry: */ { if (!skip_read) { - size = 0x10000L; /* use buffer >= 64K */ + // Use buffer >= 64K. Add linerest to double the size if the + // line gets very long, to avoid a lot of copying. But don't + // read more than 1 Mbyte at a time, so we can be interrupted. + size = 0x10000L + linerest; + if (size > 0x100000L) { + size = 0x100000L; + } + } + // Protect against the argument of lalloc() going negative. + if (size < 0 || size + linerest + 1 < 0 || linerest >= MAXCOL) { + split++; + *ptr = NL; // split line by inserting a NL + size = 1; + } else if (!skip_read) { for (; size >= 10; size /= 2) { new_buffer = verbose_try_malloc((size_t)size + (size_t)linerest + 1); if (new_buffer) { @@ -1862,6 +1876,10 @@ failed: STRCAT(IObuff, _("[CR missing]")); c = TRUE; } + if (split) { + STRCAT(IObuff, _("[long lines split]")); + c = true; + } if (notconverted) { STRCAT(IObuff, _("[NOT converted]")); c = TRUE; |