diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/eval.lua | 12 | ||||
-rw-r--r-- | src/nvim/eval/funcs.c | 7 | ||||
-rw-r--r-- | src/nvim/strings.c | 7 |
3 files changed, 16 insertions, 10 deletions
diff --git a/src/nvim/eval.lua b/src/nvim/eval.lua index 2b89d34a6d..154023b25f 100644 --- a/src/nvim/eval.lua +++ b/src/nvim/eval.lua @@ -8151,11 +8151,13 @@ M.funcs = { args = 1, base = 1, desc = [=[ - Reverse the order of items in {object} in-place. - {object} can be a |List| or a |Blob|. - Returns {object}. - Returns zero if {object} is not a List or a Blob. - If you want an object to remain unmodified make a copy first: >vim + Reverse the order of items in {object}. {object} can be a + |List|, a |Blob| or a |String|. For a List and a Blob the + items are reversed in-place and {object} is returned. + For a String a new String is returned. + Returns zero if {object} is not a List, Blob or a String. + If you want a List or Blob to remain unmodified make a copy + first: >vim let revlist = reverse(copy(mylist)) < ]=], diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c index 9926530d58..b97e19131e 100644 --- a/src/nvim/eval/funcs.c +++ b/src/nvim/eval/funcs.c @@ -6209,6 +6209,13 @@ static void f_reverse(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) tv_blob_set(b, len - i - 1, tmp); } tv_blob_set_ret(rettv, b); + } else if (argvars[0].v_type == VAR_STRING) { + rettv->v_type = VAR_STRING; + if (argvars[0].vval.v_string != NULL) { + rettv->vval.v_string = reverse_text(argvars[0].vval.v_string); + } else { + rettv->vval.v_string = NULL; + } } else if (argvars[0].v_type != VAR_LIST) { semsg(_(e_listblobarg), "reverse()"); } else { diff --git a/src/nvim/strings.c b/src/nvim/strings.c index cfc7738ad7..ec770de4a0 100644 --- a/src/nvim/strings.c +++ b/src/nvim/strings.c @@ -2168,20 +2168,17 @@ int kv_do_printf(StringBuilder *str, const char *fmt, ...) /// /// @return the allocated string. char *reverse_text(char *s) - FUNC_ATTR_NONNULL_RET + FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_RET { - // Reverse the pattern. size_t len = strlen(s); char *rev = xmalloc(len + 1); - size_t rev_i = len; - for (size_t s_i = 0; s_i < len; s_i++) { + for (size_t s_i = 0, rev_i = len; s_i < len; s_i++) { const int mb_len = utfc_ptr2len(s + s_i); rev_i -= (size_t)mb_len; memmove(rev + rev_i, s + s_i, (size_t)mb_len); s_i += (size_t)mb_len - 1; } rev[len] = NUL; - return rev; } |