summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-08-19 11:35:03 +0200
committerChristian Brabandt <cb@256bit.org>2023-08-19 11:35:03 +0200
commit4dd266cb66d901cf5324f09405cfea3f004bd29f (patch)
tree107f870fe1c042d11466e459c3aaa1988b2d3bcf
parentb102728c204430b16a5d9e6720c882e12a687570 (diff)
patch 9.0.1738: Duplicate code to reverse a stringv9.0.1738
Problem: Duplicate code to reverse a string Solution: Move reverse_text() to strings.c and remove string_reverse(). closes: #12847 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: zeertzjq <zeertzjq@outlook.com>
-rw-r--r--src/list.c8
-rw-r--r--src/proto/search.pro1
-rw-r--r--src/proto/strings.pro2
-rw-r--r--src/search.c41
-rw-r--r--src/strings.c71
-rw-r--r--src/version.c2
6 files changed, 40 insertions, 85 deletions
diff --git a/src/list.c b/src/list.c
index 28799d5fd4..6210fd6380 100644
--- a/src/list.c
+++ b/src/list.c
@@ -3001,7 +3001,13 @@ f_reverse(typval_T *argvars, typval_T *rettv)
if (argvars[0].v_type == VAR_BLOB)
blob_reverse(argvars[0].vval.v_blob, rettv);
else if (argvars[0].v_type == VAR_STRING)
- string_reverse(argvars[0].vval.v_string, rettv);
+ {
+ 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)
list_reverse(argvars[0].vval.v_list, rettv);
}
diff --git a/src/proto/search.pro b/src/proto/search.pro
index 7a29ff3a03..99e279dadf 100644
--- a/src/proto/search.pro
+++ b/src/proto/search.pro
@@ -1,7 +1,6 @@
/* search.c */
int search_regcomp(char_u *pat, char_u **used_pat, int pat_save, int pat_use, int options, regmmatch_T *regmatch);
char_u *get_search_pat(void);
-char_u *reverse_text(char_u *s);
void save_re_pat(int idx, char_u *pat, int magic);
void save_search_patterns(void);
void restore_search_patterns(void);
diff --git a/src/proto/strings.pro b/src/proto/strings.pro
index 8924a25715..aa8b374c34 100644
--- a/src/proto/strings.pro
+++ b/src/proto/strings.pro
@@ -21,9 +21,9 @@ char_u *vim_strrchr(char_u *string, int c);
void sort_strings(char_u **files, int count);
int has_non_ascii(char_u *s);
char_u *concat_str(char_u *str1, char_u *str2);
+char_u *reverse_text(char_u *s);
char_u *string_quote(char_u *str, int function);
long string_count(char_u *haystack, char_u *needle, int ic);
-void string_reverse(char_u *str, typval_T *rettv);
void string_filter_map(char_u *str, filtermap_T filtermap, typval_T *expr, typval_T *rettv);
void string_reduce(typval_T *argvars, typval_T *expr, typval_T *rettv);
void f_byteidx(typval_T *argvars, typval_T *rettv);
diff --git a/src/search.c b/src/search.c
index de17595257..d4baa9192c 100644
--- a/src/search.c
+++ b/src/search.c
@@ -203,47 +203,6 @@ get_search_pat(void)
return mr_pattern;
}
-#if defined(FEAT_RIGHTLEFT) || defined(PROTO)
-/*
- * Reverse text into allocated memory.
- * Returns the allocated string, NULL when out of memory.
- */
- char_u *
-reverse_text(char_u *s)
-{
- unsigned len;
- unsigned s_i, rev_i;
- char_u *rev;
-
- /*
- * Reverse the pattern.
- */
- len = (unsigned)STRLEN(s);
- rev = alloc(len + 1);
- if (rev == NULL)
- return NULL;
-
- rev_i = len;
- for (s_i = 0; s_i < len; ++s_i)
- {
- if (has_mbyte)
- {
- int mb_len;
-
- mb_len = (*mb_ptr2len)(s + s_i);
- rev_i -= mb_len;
- mch_memmove(rev + rev_i, s + s_i, mb_len);
- s_i += mb_len - 1;
- }
- else
- rev[--rev_i] = s[s_i];
-
- }
- rev[len] = NUL;
- return rev;
-}
-#endif
-
void
save_re_pat(int idx, char_u *pat, int magic)
{
diff --git a/src/strings.c b/src/strings.c
index 25c32ecaf1..993674406c 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -770,6 +770,36 @@ concat_str(char_u *str1, char_u *str2)
return dest;
}
+#if defined(FEAT_EVAL) || defined(FEAT_RIGHTLEFT) || defined(PROTO)
+/*
+ * Reverse text into allocated memory.
+ * Returns the allocated string, NULL when out of memory.
+ */
+ char_u *
+reverse_text(char_u *s)
+{
+ size_t len = STRLEN(s);
+ char_u *rev = alloc(len + 1);
+ if (rev == NULL)
+ return NULL;
+
+ for (size_t s_i = 0, rev_i = len; s_i < len; ++s_i)
+ {
+ if (has_mbyte)
+ {
+ int mb_len = (*mb_ptr2len)(s + s_i);
+ rev_i -= mb_len;
+ mch_memmove(rev + rev_i, s + s_i, mb_len);
+ s_i += mb_len - 1;
+ }
+ else
+ rev[--rev_i] = s[s_i];
+ }
+ rev[len] = NUL;
+ return rev;
+}
+#endif
+
#if defined(FEAT_EVAL) || defined(PROTO)
/*
* Return string "str" in ' quotes, doubling ' characters.
@@ -855,47 +885,6 @@ string_count(char_u *haystack, char_u *needle, int ic)
}
/*
- * 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.
*/
diff --git a/src/version.c b/src/version.c
index 325a46efe6..f6022d2cf8 100644
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1738,
+/**/
1737,
/**/
1736,