aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-09-17 11:40:31 +0800
committerGitHub <noreply@github.com>2023-09-17 11:40:31 +0800
commitd70667a1c1f887529d1b4952325aff368c200ef1 (patch)
tree14f4fe727caf2b265251af2377633b6bc491e1c3
parentaac85b8d6b803318d9cbf6e496aac1cd223b4550 (diff)
parenta1f0f0b2bc19f29948c3b9e6c71f3a5e80eaceea (diff)
downloadrneovim-d70667a1c1f887529d1b4952325aff368c200ef1.tar.gz
rneovim-d70667a1c1f887529d1b4952325aff368c200ef1.tar.bz2
rneovim-d70667a1c1f887529d1b4952325aff368c200ef1.zip
Merge pull request #25208 from zeertzjq/vim-8.2.2356
-rw-r--r--src/nvim/eval.c46
1 files changed, 25 insertions, 21 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 9be4cea059..ec90803884 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -947,38 +947,42 @@ 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.
+///
+/// @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;
+ }
+ 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
-/// a Float to a String.
+/// @param convert when true convert a List into a sequence of lines.
///
-/// @return pointer to allocated memory, or NULL for failure.
+/// @return pointer to allocated memory, or NULL for failure.
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);