diff options
author | Famiu Haque <famiuhaque@protonmail.com> | 2022-05-12 10:57:43 +0200 |
---|---|---|
committer | Famiu Haque <famiuhaque@protonmail.com> | 2022-05-14 10:25:52 +0600 |
commit | 566f8f80d6cb7ef2df8366e5f092b0841ee757ce (patch) | |
tree | f5f34de29ef1cde99309ad7faf988aca63844baa /src/nvim/strings.c | |
parent | 8fba428bc6f36ae038a9286517e15b33257a1359 (diff) | |
download | rneovim-566f8f80d6cb7ef2df8366e5f092b0841ee757ce.tar.gz rneovim-566f8f80d6cb7ef2df8366e5f092b0841ee757ce.tar.bz2 rneovim-566f8f80d6cb7ef2df8366e5f092b0841ee757ce.zip |
refactor(api/nvim_cmd): use `kvec_t` for constructing cmdline string
Co-authored-by: Björn Linse <bjorn.linse@gmail.com>
Diffstat (limited to 'src/nvim/strings.c')
-rw-r--r-- | src/nvim/strings.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/nvim/strings.c b/src/nvim/strings.c index 0307cf4696..de1c8b9c36 100644 --- a/src/nvim/strings.c +++ b/src/nvim/strings.c @@ -1480,3 +1480,32 @@ int vim_vsnprintf_typval(char *str, size_t str_m, const char *fmt, va_list ap, t // written to the buffer if it were large enough. return (int)str_l; } + +int kv_do_printf(StringBuilder *str, const char *fmt, ...) + FUNC_ATTR_PRINTF(2, 3) +{ + size_t remaining = str->capacity - str->size; + + va_list ap; + va_start(ap, fmt); + int printed = vsnprintf(str->items ? str->items + str->size : NULL, remaining, fmt, ap); + va_end(ap); + + if (printed < 0) { + return -1; + } + + // printed string didn't fit, resize and try again + if ((size_t)printed >= remaining) { + kv_ensure_space(*str, (size_t)printed + 1); // include space for NUL terminator at the end + va_start(ap, fmt); + printed = vsnprintf(str->items + str->size, str->capacity - str->size, fmt, ap); + va_end(ap); + if (printed < 0) { + return -1; + } + } + + str->size += (size_t)printed; + return printed; +} |