diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-09-17 10:59:36 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2023-09-17 11:07:32 +0800 |
commit | ac0fda2e46708f474a810e16407341c9f7b47dfe (patch) | |
tree | b74126634f044b2629f22d1ec766fd62dc23a401 /src/nvim/eval.c | |
parent | aac85b8d6b803318d9cbf6e496aac1cd223b4550 (diff) | |
download | rneovim-ac0fda2e46708f474a810e16407341c9f7b47dfe.tar.gz rneovim-ac0fda2e46708f474a810e16407341c9f7b47dfe.tar.bz2 rneovim-ac0fda2e46708f474a810e16407341c9f7b47dfe.zip |
vim-patch:8.2.2356: Vim9: ":put =expr" does not handle a list properly
Problem: Vim9: ":put =expr" does not handle a list properly.
Solution: Use the same logic as eval_to_string_eap(). (closes vim/vim#7684)
https://github.com/vim/vim/commit/883cf97f109d2ff281cf77f7b2e3bb44aced7cb3
Co-authored-by: Bram Moolenaar <Bram@vim.org>
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r-- | src/nvim/eval.c | 47 |
1 files changed, 29 insertions, 18 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 9be4cea059..fed5b01538 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -947,6 +947,34 @@ int skip_expr(char **pp, evalarg_T *const evalarg) return res; } +/// Convert "tv" to a string. +/// +/// @param convert when true convert a List into a sequence of lines and convert +/// a Float to a String. +/// +/// @return an allocated string. +static char *typval2string(typval_T *tv, bool convert) +{ + if (convert && tv->v_type == VAR_LIST) { + garray_T ga; + ga_init(&ga, (int)sizeof(char), 80); + if (tv->vval.v_list != NULL) { + tv_list_join(&ga, tv->vval.v_list, "\n"); + if (tv_list_len(tv->vval.v_list) > 0) { + ga_append(&ga, NL); + } + } + ga_append(&ga, NUL); + return (char *)ga.ga_data; + } + if (convert && tv->v_type == VAR_FLOAT) { + char numbuf[NUMBUFLEN]; + vim_snprintf(numbuf, NUMBUFLEN, "%g", tv->vval.v_float); + return xstrdup(numbuf); + } + return xstrdup(tv_get_string(tv)); +} + /// Top level evaluation function, returning a string. /// /// @param convert when true convert a List into a sequence of lines and convert @@ -957,28 +985,11 @@ char *eval_to_string(char *arg, bool convert) { typval_T tv; char *retval; - garray_T ga; if (eval0(arg, &tv, NULL, &EVALARG_EVALUATE) == FAIL) { retval = NULL; } else { - if (convert && tv.v_type == VAR_LIST) { - ga_init(&ga, (int)sizeof(char), 80); - if (tv.vval.v_list != NULL) { - tv_list_join(&ga, tv.vval.v_list, "\n"); - if (tv_list_len(tv.vval.v_list) > 0) { - ga_append(&ga, NL); - } - } - ga_append(&ga, NUL); - retval = (char *)ga.ga_data; - } else if (convert && tv.v_type == VAR_FLOAT) { - char numbuf[NUMBUFLEN]; - vim_snprintf(numbuf, NUMBUFLEN, "%g", tv.vval.v_float); - retval = xstrdup(numbuf); - } else { - retval = xstrdup(tv_get_string(&tv)); - } + retval = typval2string(&tv, convert); tv_clear(&tv); } clear_evalarg(&EVALARG_EVALUATE, NULL); |