aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/mbyte.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/mbyte.c')
-rw-r--r--src/nvim/mbyte.c41
1 files changed, 36 insertions, 5 deletions
diff --git a/src/nvim/mbyte.c b/src/nvim/mbyte.c
index bd680330ca..cc488d486f 100644
--- a/src/nvim/mbyte.c
+++ b/src/nvim/mbyte.c
@@ -346,7 +346,6 @@ static int enc_canon_search(const char_u *name)
}
-
/*
* Find canonical encoding "name" in the list and return its properties.
* Returns 0 if not found.
@@ -1587,7 +1586,7 @@ void show_utf8(void)
line = get_cursor_pos_ptr();
len = utfc_ptr2len(line);
if (len == 0) {
- MSG("NUL");
+ msg("NUL");
return;
}
@@ -1610,7 +1609,7 @@ void show_utf8(void)
}
}
- msg(IObuff);
+ msg((char *)IObuff);
}
/// Return offset from "p" to the first byte of the character it points into.
@@ -1883,6 +1882,40 @@ int mb_tail_off(char_u *base, char_u *p)
return i;
}
+
+/// Return the offset from "p" to the first byte of the character it points
+/// into. Can start anywhere in a stream of bytes.
+///
+/// @param[in] base Pointer to start of string
+/// @param[in] p Pointer to byte for which to return the offset to the previous codepoint
+//
+/// @return 0 if invalid sequence, else offset to previous codepoint
+int mb_head_off(char_u *base, char_u *p)
+{
+ int i;
+ int j;
+
+ if (*p == NUL) {
+ return 0;
+ }
+
+ // Find the first character that is not 10xx.xxxx
+ for (i = 0; p - i > base; i--) {
+ if ((p[i] & 0xc0) != 0x80) {
+ break;
+ }
+ }
+
+ // Find the last character that is 10xx.xxxx
+ for (j = 0; (p[j + 1] & 0xc0) == 0x80; j++) {}
+
+ // Check for illegal sequence.
+ if (utf8len_tab[p[i]] == 1) {
+ return 0;
+ }
+ return i;
+}
+
/*
* Find the next illegal byte sequence.
*/
@@ -2398,8 +2431,6 @@ static char_u *iconv_string(const vimconv_T *const vcp, char_u *str, size_t slen
#endif // HAVE_ICONV
-
-
/*
* Setup "vcp" for conversion from "from" to "to".
* The names must have been made canonical with enc_canonize().