aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval/funcs.c
diff options
context:
space:
mode:
authorkuuote <36663503+kuuote@users.noreply.github.com>2021-02-23 10:13:14 +0900
committerGitHub <noreply@github.com>2021-02-22 20:13:14 -0500
commit0450e155d48cb2d8a73358e193931d8966a9d2e0 (patch)
treea1b0c4a2591447a25a3e735529d253206f05849a /src/nvim/eval/funcs.c
parent9d5f842807c56d6265a5557cbb4bf3e951210425 (diff)
downloadrneovim-0450e155d48cb2d8a73358e193931d8966a9d2e0.tar.gz
rneovim-0450e155d48cb2d8a73358e193931d8966a9d2e0.tar.bz2
rneovim-0450e155d48cb2d8a73358e193931d8966a9d2e0.zip
vim-patch:8.2.2233: cannot convert a byte index into a character index (#13978)
Problem: Cannot convert a byte index into a character index. Solution: Add charidx(). (Yegappan Lakshmanan, closes vim/vim#7561) https://github.com/vim/vim/commit/17793ef23aae0bc94539390ccfe5e63b0ad39ff2
Diffstat (limited to 'src/nvim/eval/funcs.c')
-rw-r--r--src/nvim/eval/funcs.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c
index d54e49bbd4..79cb1385ea 100644
--- a/src/nvim/eval/funcs.c
+++ b/src/nvim/eval/funcs.c
@@ -940,6 +940,52 @@ static void f_char2nr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
(const char_u *)tv_get_string(&argvars[0]));
}
+// "charidx()" function
+static void f_charidx(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ rettv->vval.v_number = -1;
+
+ if (argvars[0].v_type != VAR_STRING
+ || argvars[1].v_type != VAR_NUMBER
+ || (argvars[2].v_type != VAR_UNKNOWN
+ && argvars[2].v_type != VAR_NUMBER)) {
+ EMSG(_(e_invarg));
+ return;
+ }
+
+ const char *str = tv_get_string_chk(&argvars[0]);
+ varnumber_T idx = tv_get_number_chk(&argvars[1], NULL);
+ if (str == NULL || idx < 0) {
+ return;
+ }
+ int countcc = 0;
+ if (argvars[2].v_type != VAR_UNKNOWN) {
+ countcc = (int)tv_get_number(&argvars[2]);
+ }
+ if (countcc < 0 || countcc > 1) {
+ EMSG(_(e_invarg));
+ return;
+ }
+
+ int (*ptr2len)(const char_u *);
+ if (countcc) {
+ ptr2len = utf_ptr2len;
+ } else {
+ ptr2len = utfc_ptr2len;
+ }
+
+ const char *p;
+ int len;
+ for (p = str, len = 0; p <= str + idx; len++) {
+ if (*p == NUL) {
+ return;
+ }
+ p += ptr2len((const char_u *)p);
+ }
+
+ rettv->vval.v_number = len > 0 ? len - 1 : 0;
+}
+
/*
* "cindent(lnum)" function
*/