folds: decrease reliance on global 'curwin'

TODO in a future commit:
- remains 2 instances of changed_lines that dont take into account
buffer
This commit is contained in:
Matthieu Coudron
2020-04-24 18:38:48 +02:00
parent deb4566cab
commit d20142a31f
4 changed files with 116 additions and 97 deletions

View File

@@ -2389,6 +2389,11 @@ static int ml_append_int(
}
void ml_add_deleted_len(char_u *ptr, ssize_t len)
{
ml_add_deleted_len_buf(curbuf, ptr, len);
}
void ml_add_deleted_len_buf(buf_T *buf, char_u *ptr, ssize_t len)
{
if (inhibit_delete_count) {
return;
@@ -2396,15 +2401,21 @@ void ml_add_deleted_len(char_u *ptr, ssize_t len)
if (len == -1) {
len = STRLEN(ptr);
}
curbuf->deleted_bytes += len+1;
if (curbuf->update_need_codepoints) {
mb_utflen(ptr, len, &curbuf->deleted_codepoints,
&curbuf->deleted_codeunits);
curbuf->deleted_codepoints++; // NL char
curbuf->deleted_codeunits++;
buf->deleted_bytes += len+1;
if (buf->update_need_codepoints) {
mb_utflen(ptr, len, &buf->deleted_codepoints,
&buf->deleted_codeunits);
buf->deleted_codepoints++; // NL char
buf->deleted_codeunits++;
}
}
int ml_replace(linenr_T lnum, char_u *line, bool copy)
{
return ml_replace_buf(curbuf, lnum, line, copy);
}
/*
* Replace line lnum, with buffering, in current buffer.
*
@@ -2416,13 +2427,13 @@ void ml_add_deleted_len(char_u *ptr, ssize_t len)
*
* return FAIL for failure, OK otherwise
*/
int ml_replace(linenr_T lnum, char_u *line, bool copy)
int ml_replace_buf(buf_T *buf, linenr_T lnum, char_u *line, bool copy)
{
if (line == NULL) /* just checking... */
return FAIL;
/* When starting up, we might still need to create the memfile */
if (curbuf->b_ml.ml_mfp == NULL && open_buffer(FALSE, NULL, 0) == FAIL)
if (buf->b_ml.ml_mfp == NULL && open_buffer(FALSE, NULL, 0) == FAIL)
return FAIL;
bool readlen = true;
@@ -2430,22 +2441,22 @@ int ml_replace(linenr_T lnum, char_u *line, bool copy)
if (copy) {
line = vim_strsave(line);
}
if (curbuf->b_ml.ml_line_lnum != lnum) { // other line buffered
ml_flush_line(curbuf); // flush it
} else if (curbuf->b_ml.ml_flags & ML_LINE_DIRTY) { // same line allocated
ml_add_deleted_len(curbuf->b_ml.ml_line_ptr, -1);
if (buf->b_ml.ml_line_lnum != lnum) { // other line buffered
ml_flush_line(buf); // flush it
} else if (buf->b_ml.ml_flags & ML_LINE_DIRTY) { // same line allocated
ml_add_deleted_len(buf->b_ml.ml_line_ptr, -1);
readlen = false; // already added the length
xfree(curbuf->b_ml.ml_line_ptr); // free it
xfree(buf->b_ml.ml_line_ptr); // free it
}
if (readlen && kv_size(curbuf->update_callbacks)) {
ml_add_deleted_len(ml_get_buf(curbuf, lnum, false), -1);
if (readlen && kv_size(buf->update_callbacks)) {
ml_add_deleted_len(ml_get_buf(buf, lnum, false), -1);
}
curbuf->b_ml.ml_line_ptr = line;
curbuf->b_ml.ml_line_lnum = lnum;
curbuf->b_ml.ml_flags = (curbuf->b_ml.ml_flags | ML_LINE_DIRTY) & ~ML_EMPTY;
buf->b_ml.ml_line_ptr = line;
buf->b_ml.ml_line_lnum = lnum;
buf->b_ml.ml_flags = (buf->b_ml.ml_flags | ML_LINE_DIRTY) & ~ML_EMPTY;
return OK;
}
@@ -3990,7 +4001,7 @@ long ml_find_line_or_offset(buf_T *buf, linenr_T lnum, long *offp, bool no_ff)
int extra = 0;
/* take care of cached line first */
ml_flush_line(curbuf);
ml_flush_line(buf);
if (buf->b_ml.ml_usedchunks == -1
|| buf->b_ml.ml_chunksize == NULL