aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/charset.c
diff options
context:
space:
mode:
authorBjörn Linse <bjorn.linse@gmail.com>2020-01-24 09:48:58 +0100
committerbfredl <bjorn.linse@gmail.com>2023-02-14 15:56:14 +0100
commit39f8aaeb815c2e31cffec12ef36ad4f25df91602 (patch)
treed8f729d4cbf87a80cf9a78270ba921baf1b6bb2c /src/nvim/charset.c
parent53968082675cd3b8d1809e53a47c0311b7347ef9 (diff)
downloadrneovim-39f8aaeb815c2e31cffec12ef36ad4f25df91602.tar.gz
rneovim-39f8aaeb815c2e31cffec12ef36ad4f25df91602.tar.bz2
rneovim-39f8aaeb815c2e31cffec12ef36ad4f25df91602.zip
fix(status): handle unprintable chars in the statusline
Diffstat (limited to 'src/nvim/charset.c')
-rw-r--r--src/nvim/charset.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/nvim/charset.c b/src/nvim/charset.c
index 5aec9ccf9d..c4c7c5f387 100644
--- a/src/nvim/charset.c
+++ b/src/nvim/charset.c
@@ -354,14 +354,15 @@ size_t transstr_len(const char *const s, bool untab)
/// @param[in] untab remove tab characters
///
/// @return length of the resulting string, without the NUL byte.
-size_t transstr_buf(const char *const s, char *const buf, const size_t len, bool untab)
+size_t transstr_buf(const char *const s, const ssize_t slen, char *const buf, const size_t buflen,
+ bool untab)
FUNC_ATTR_NONNULL_ALL
{
const char *p = s;
char *buf_p = buf;
- char *const buf_e = buf_p + len - 1;
+ char *const buf_e = buf_p + buflen - 1;
- while (*p != NUL && buf_p < buf_e) {
+ while ((slen < 0 || (p - s) < slen) && *p != NUL && buf_p < buf_e) {
const size_t l = (size_t)utfc_ptr2len(p);
if (l > 1) {
if (buf_p + l > buf_e) {
@@ -416,7 +417,7 @@ char *transstr(const char *const s, bool untab)
// multi-byte characters.
const size_t len = transstr_len(s, untab) + 1;
char *const buf = xmalloc(len);
- transstr_buf(s, buf, len, untab);
+ transstr_buf(s, -1, buf, len, untab);
return buf;
}
@@ -431,7 +432,7 @@ size_t kv_transstr(StringBuilder *str, const char *const s, bool untab)
// multi-byte characters.
const size_t len = transstr_len(s, untab);
kv_ensure_space(*str, len + 1);
- transstr_buf(s, str->items + str->size, len + 1, untab);
+ transstr_buf(s, -1, str->items + str->size, len + 1, untab);
str->size += len; // do not include NUL byte
return len;
}