aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/strings.c
diff options
context:
space:
mode:
authorbfredl <bjorn.linse@gmail.com>2022-05-14 11:20:13 +0200
committerGitHub <noreply@github.com>2022-05-14 11:20:13 +0200
commit99f3e74fc27acb0d9d9f32161e18b5a474697074 (patch)
treef6fe0df8bcacf42351caf5f57ed7c4e1e9ca9c4c /src/nvim/strings.c
parent9e4286294f9caa5a20851706331cc46a5342f326 (diff)
parent566f8f80d6cb7ef2df8366e5f092b0841ee757ce (diff)
downloadrneovim-99f3e74fc27acb0d9d9f32161e18b5a474697074.tar.gz
rneovim-99f3e74fc27acb0d9d9f32161e18b5a474697074.tar.bz2
rneovim-99f3e74fc27acb0d9d9f32161e18b5a474697074.zip
Merge pull request #18542 from famiu/feat/api/nvim_cmd/kvec_t
refactor(api/nvim_cmd): use `kvec_t` for constructing cmdline string
Diffstat (limited to 'src/nvim/strings.c')
-rw-r--r--src/nvim/strings.c29
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;
+}