mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
fix(api): dynamically allocate line buffer for nvim_out_write (#20537)
This commit is contained in:
parent
0773a9ee3a
commit
2a12faaec1
@ -66,7 +66,7 @@
|
|||||||
#include "nvim/viml/parser/parser.h"
|
#include "nvim/viml/parser/parser.h"
|
||||||
#include "nvim/window.h"
|
#include "nvim/window.h"
|
||||||
|
|
||||||
#define LINE_BUFFER_SIZE 4096
|
#define LINE_BUFFER_MIN_SIZE 4096
|
||||||
|
|
||||||
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
||||||
# include "api/vim.c.generated.h"
|
# include "api/vim.c.generated.h"
|
||||||
@ -1718,17 +1718,21 @@ theend:
|
|||||||
/// @param to_err true: message is an error (uses `emsg` instead of `msg`)
|
/// @param to_err true: message is an error (uses `emsg` instead of `msg`)
|
||||||
static void write_msg(String message, bool to_err)
|
static void write_msg(String message, bool to_err)
|
||||||
{
|
{
|
||||||
static size_t out_pos = 0, err_pos = 0;
|
static StringBuilder out_line_buf = KV_INITIAL_VALUE;
|
||||||
static char out_line_buf[LINE_BUFFER_SIZE], err_line_buf[LINE_BUFFER_SIZE];
|
static StringBuilder err_line_buf = KV_INITIAL_VALUE;
|
||||||
|
|
||||||
#define PUSH_CHAR(i, pos, line_buf, msg) \
|
#define PUSH_CHAR(i, line_buf, msg) \
|
||||||
if (message.data[i] == NL || (pos) == LINE_BUFFER_SIZE - 1) { \
|
if (kv_max(line_buf) == 0) { \
|
||||||
(line_buf)[pos] = NUL; \
|
kv_resize(line_buf, LINE_BUFFER_MIN_SIZE); \
|
||||||
msg(line_buf); \
|
} \
|
||||||
(pos) = 0; \
|
if (message.data[i] == NL) { \
|
||||||
|
kv_push(line_buf, NUL); \
|
||||||
|
msg(line_buf.items); \
|
||||||
|
kv_drop(line_buf, kv_size(line_buf)); \
|
||||||
|
kv_resize(line_buf, LINE_BUFFER_MIN_SIZE); \
|
||||||
continue; \
|
continue; \
|
||||||
} \
|
} \
|
||||||
(line_buf)[(pos)++] = message.data[i];
|
kv_push(line_buf, message.data[i]);
|
||||||
|
|
||||||
no_wait_return++;
|
no_wait_return++;
|
||||||
for (uint32_t i = 0; i < message.size; i++) {
|
for (uint32_t i = 0; i < message.size; i++) {
|
||||||
@ -1736,9 +1740,9 @@ static void write_msg(String message, bool to_err)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (to_err) {
|
if (to_err) {
|
||||||
PUSH_CHAR(i, err_pos, err_line_buf, emsg);
|
PUSH_CHAR(i, err_line_buf, emsg);
|
||||||
} else {
|
} else {
|
||||||
PUSH_CHAR(i, out_pos, out_line_buf, msg);
|
PUSH_CHAR(i, out_line_buf, msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
no_wait_return--;
|
no_wait_return--;
|
||||||
|
@ -1905,11 +1905,32 @@ describe('API', function()
|
|||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
describe('nvim_out_write', function()
|
||||||
|
it('prints long messages correctly #20534', function()
|
||||||
|
exec([[
|
||||||
|
set more
|
||||||
|
redir => g:out
|
||||||
|
silent! call nvim_out_write('a')
|
||||||
|
silent! call nvim_out_write('a')
|
||||||
|
silent! call nvim_out_write('a')
|
||||||
|
silent! call nvim_out_write("\n")
|
||||||
|
silent! call nvim_out_write('a')
|
||||||
|
silent! call nvim_out_write('a')
|
||||||
|
silent! call nvim_out_write(repeat('a', 5000) .. "\n")
|
||||||
|
silent! call nvim_out_write('a')
|
||||||
|
silent! call nvim_out_write('a')
|
||||||
|
silent! call nvim_out_write('a')
|
||||||
|
silent! call nvim_out_write("\n")
|
||||||
|
redir END
|
||||||
|
]])
|
||||||
|
eq('\naaa\n' .. ('a'):rep(5002) .. '\naaa', meths.get_var('out'))
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
|
||||||
describe('nvim_err_write', function()
|
describe('nvim_err_write', function()
|
||||||
local screen
|
local screen
|
||||||
|
|
||||||
before_each(function()
|
before_each(function()
|
||||||
clear()
|
|
||||||
screen = Screen.new(40, 8)
|
screen = Screen.new(40, 8)
|
||||||
screen:attach()
|
screen:attach()
|
||||||
screen:set_default_attr_ids({
|
screen:set_default_attr_ids({
|
||||||
|
Loading…
Reference in New Issue
Block a user