patch 9.0.1515: reverse() does not work for a String
Problem: reverse() does not work for a String.
Solution: Implement reverse() for a String. (Yegappan Lakshmanan,
closes #12179)
diff --git a/src/strings.c b/src/strings.c
index 7d4281d..90429d3 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -855,6 +855,47 @@
}
/*
+ * Reverse the string in 'str' and set the result in 'rettv'.
+ */
+ void
+string_reverse(char_u *str, typval_T *rettv)
+{
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = NULL;
+ if (str == NULL)
+ return;
+
+ char_u *rstr = vim_strsave(str);
+ rettv->vval.v_string = rstr;
+ if (rstr == NULL || *str == NUL)
+ return;
+
+ size_t len = STRLEN(rstr);
+ if (has_mbyte)
+ {
+ char_u *src = str;
+ char_u *dest = rstr + len;
+
+ while (src < str + len)
+ {
+ int clen = mb_ptr2len(src);
+ dest -= clen;
+ mch_memmove(dest, src, (size_t)clen);
+ src += clen;
+ }
+ }
+ else
+ {
+ for (size_t i = 0; i < len / 2; i++)
+ {
+ char tmp = rstr[len - i - 1];
+ rstr[len - i - 1] = rstr[i];
+ rstr[i] = tmp;
+ }
+ }
+}
+
+/*
* Make a typval_T of the first character of "input" and store it in "output".
* Return OK or FAIL.
*/