diff options
author | bfredl <bjorn.linse@gmail.com> | 2024-02-18 18:04:28 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-18 18:04:28 +0100 |
commit | 93c911e52feadff72003f7e78257c00c3bbf1570 (patch) | |
tree | ff0e65d868b9e30ec4759f13e3c3809f8fd41697 /src/nvim/strings.c | |
parent | d94adff48b1882f9078b0ae94b677be5d29e5fd2 (diff) | |
parent | 97531be1f766e6cad79e6360ae9cb827434cff3c (diff) | |
download | rneovim-93c911e52feadff72003f7e78257c00c3bbf1570.tar.gz rneovim-93c911e52feadff72003f7e78257c00c3bbf1570.tar.bz2 rneovim-93c911e52feadff72003f7e78257c00c3bbf1570.zip |
Merge pull request #27511 from bfredl/maparena
refactor(api): use arena for mappings, autocmd, channel info
Diffstat (limited to 'src/nvim/strings.c')
-rw-r--r-- | src/nvim/strings.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/nvim/strings.c b/src/nvim/strings.c index c16b1f4ad0..06622a86b7 100644 --- a/src/nvim/strings.c +++ b/src/nvim/strings.c @@ -2166,6 +2166,47 @@ int kv_do_printf(StringBuilder *str, const char *fmt, ...) return printed; } +String arena_printf(Arena *arena, const char *fmt, ...) + FUNC_ATTR_PRINTF(2, 3) +{ + size_t remaining = 0; + char *buf = NULL; + if (arena) { + if (!arena->cur_blk) { + alloc_block(arena); + } + + // happy case, we can fit the printed string in the rest of the current + // block (one pass): + remaining = arena->size - arena->pos; + buf = arena->cur_blk + arena->pos; + } + + va_list ap; + va_start(ap, fmt); + int printed = vsnprintf(buf, remaining, fmt, ap); + va_end(ap); + + if (printed < 0) { + return (String)STRING_INIT; + } + + // printed string didn't fit, allocate and try again + if ((size_t)printed >= remaining) { + buf = arena_alloc(arena, (size_t)printed + 1, false); + va_start(ap, fmt); + printed = vsnprintf(buf, (size_t)printed + 1, fmt, ap); + va_end(ap); + if (printed < 0) { + return (String)STRING_INIT; + } + } else { + arena->pos += (size_t)printed + 1; + } + + return cbuf_as_string(buf, (size_t)printed); +} + /// Reverse text into allocated memory. /// /// @return the allocated string. |