Mercurial > vim
diff src/eval.c @ 6870:66ab6ec256d1 v7.4.755
patch 7.4.755
Problem: It is not easy to count the number of characters.
Solution: Add the skipcc argument to strchars(). (Hirohito Higashi, Ken
Takata)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Thu, 25 Jun 2015 16:09:26 +0200 |
parents | 566e193323ce |
children | 676906c33768 |
line wrap: on
line diff
--- a/src/eval.c +++ b/src/eval.c @@ -3810,7 +3810,7 @@ do_lock_var(lp, name_end, deep, lock) /* (un)lock a List item. */ item_lock(&lp->ll_li->li_tv, deep, lock); else - /* un(lock) a Dictionary item. */ + /* (un)lock a Dictionary item. */ item_lock(&lp->ll_di->di_tv, deep, lock); return ret; @@ -8309,7 +8309,7 @@ static struct fst {"str2float", 1, 1, f_str2float}, #endif {"str2nr", 1, 2, f_str2nr}, - {"strchars", 1, 1, f_strchars}, + {"strchars", 1, 2, f_strchars}, {"strdisplaywidth", 1, 2, f_strdisplaywidth}, #ifdef HAVE_STRFTIME {"strftime", 1, 2, f_strftime}, @@ -18372,18 +18372,30 @@ f_strchars(argvars, rettv) typval_T *rettv; { char_u *s = get_tv_string(&argvars[0]); + int skipcc = 0; #ifdef FEAT_MBYTE varnumber_T len = 0; - - while (*s != NUL) - { - mb_cptr2char_adv(&s); - ++len; - } - rettv->vval.v_number = len; + int (*func_mb_ptr2char_adv)(char_u **pp); +#endif + + if (argvars[1].v_type != VAR_UNKNOWN) + skipcc = get_tv_number_chk(&argvars[1], NULL); + if (skipcc < 0 || skipcc > 1) + EMSG(_(e_invarg)); + else + { +#ifdef FEAT_MBYTE + func_mb_ptr2char_adv = skipcc ? mb_ptr2char_adv : mb_cptr2char_adv; + while (*s != NUL) + { + func_mb_ptr2char_adv(&s); + ++len; + } + rettv->vval.v_number = len; #else - rettv->vval.v_number = (varnumber_T)(STRLEN(s)); -#endif + rettv->vval.v_number = (varnumber_T)(STRLEN(s)); +#endif + } } /*