aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/strings.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/strings.c')
-rw-r--r--src/nvim/strings.c32
1 files changed, 9 insertions, 23 deletions
diff --git a/src/nvim/strings.c b/src/nvim/strings.c
index 3f31914c03..3b0a950ff2 100644
--- a/src/nvim/strings.c
+++ b/src/nvim/strings.c
@@ -344,14 +344,17 @@ char *strcase_save(const char *const orig, bool upper)
char *p = res;
while (*p != NUL) {
- int l;
-
int c = utf_ptr2char((const char_u *)p);
+ int l = utf_ptr2len((const char_u *)p);
+ if (c == 0) {
+ // overlong sequence, use only the first byte
+ c = *p;
+ l = 1;
+ }
int uc = upper ? mb_toupper(c) : mb_tolower(c);
// Reallocate string when byte count changes. This is rare,
// thus it's OK to do another malloc()/free().
- l = utf_ptr2len((const char_u *)p);
int newl = utf_char2len(uc);
if (newl != l) {
// TODO(philix): use xrealloc() in strup_save()
@@ -456,25 +459,6 @@ char_u *vim_strchr(const char_u *const string, const int c)
}
/*
- * Search for last occurrence of "c" in "string".
- * Return NULL if not found.
- * Does not handle multi-byte char for "c"!
- */
-char_u *vim_strrchr(const char_u *string, int c)
- FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE
-{
- const char_u *retval = NULL;
- const char_u *p = string;
-
- while (*p) {
- if (*p == c)
- retval = p;
- MB_PTR_ADV(p);
- }
- return (char_u *) retval;
-}
-
-/*
* Sort an array of strings.
*/
@@ -709,6 +693,7 @@ static float_T tv_float(typval_T *const tvs, int *const idxp)
///
/// @see vim_vsnprintf().
int vim_snprintf_add(char *str, size_t str_m, char *fmt, ...)
+ FUNC_ATTR_PRINTF(3, 4)
{
const size_t len = strlen(str);
size_t space;
@@ -734,6 +719,7 @@ int vim_snprintf_add(char *str, size_t str_m, char *fmt, ...)
/// @return Number of bytes excluding NUL byte that would be written to the
/// string if str_m was greater or equal to the return value.
int vim_snprintf(char *str, size_t str_m, const char *fmt, ...)
+ FUNC_ATTR_PRINTF(3, 4)
{
va_list ap;
va_start(ap, fmt);
@@ -1233,6 +1219,7 @@ int vim_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap,
str_arg_l = 3;
zero_padding = 0;
} else {
+ // Regular float number
format[0] = '%';
size_t l = 1;
if (force_sign) {
@@ -1257,7 +1244,6 @@ int vim_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap,
format[l] = (char)(fmt_spec == 'F' ? 'f' : fmt_spec);
format[l + 1] = NUL;
- // Regular float number
str_arg_l = (size_t)snprintf(tmp, sizeof(tmp), format, f);
assert(str_arg_l < sizeof(tmp));