diff options
author | ZyX <kp-pav@yandex.ru> | 2017-04-16 20:16:32 +0300 |
---|---|---|
committer | ZyX <kp-pav@yandex.ru> | 2017-04-16 20:16:55 +0300 |
commit | fbdef2e6f2d65d3cc6f3c8a8dcd8b3cddf41c474 (patch) | |
tree | 32fc787417b833b4d7b4bdf2d95758e9888edd00 /src/nvim/eval.c | |
parent | 3c5f4b382f62d9f3cf5d54720592ff75d3a1f86d (diff) | |
download | rneovim-fbdef2e6f2d65d3cc6f3c8a8dcd8b3cddf41c474.tar.gz rneovim-fbdef2e6f2d65d3cc6f3c8a8dcd8b3cddf41c474.tar.bz2 rneovim-fbdef2e6f2d65d3cc6f3c8a8dcd8b3cddf41c474.zip |
eval: Refactor nr2char()
Adds error messages, checks type and ignores the second argument.
Currently utf_char2bytes is able to handle any 31-bit character, not
limited by a unicode range. So checking for INT_MAX and not for
something else: function yet uses `int`.
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r-- | src/nvim/eval.c | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index a259bbf0eb..71af801986 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -12763,25 +12763,32 @@ static void f_nextnonblank(typval_T *argvars, typval_T *rettv, FunPtr fptr) */ static void f_nr2char(typval_T *argvars, typval_T *rettv, FunPtr fptr) { - char_u buf[NUMBUFLEN]; - - if (has_mbyte) { - int utf8 = 0; - - if (argvars[1].v_type != VAR_UNKNOWN) { - utf8 = tv_get_number_chk(&argvars[1], NULL); - } - if (utf8) { - buf[(*utf_char2bytes)((int)tv_get_number(&argvars[0]), buf)] = NUL; - } else { - buf[(*mb_char2bytes)((int)tv_get_number(&argvars[0]), buf)] = NUL; + if (argvars[1].v_type != VAR_UNKNOWN) { + if (!tv_check_num(&argvars[1])) { + return; } - } else { - buf[0] = (char_u)tv_get_number(&argvars[0]); - buf[1] = NUL; } + + bool error = false; + const varnumber_T num = tv_get_number_chk(&argvars[0], &error); + if (error) { + return; + } + if (num < 0) { + emsgf(_("E5070: Character number could not be less then zero")); + return; + } + if (num > INT_MAX) { + emsgf(_("E5071: Character number could not be greater then INT_MAX (%i)"), + INT_MAX); + return; + } + + char buf[MB_MAXBYTES]; + const int len = utf_char2bytes((int)num, (char_u *)buf); + rettv->v_type = VAR_STRING; - rettv->vval.v_string = vim_strsave(buf); + rettv->vval.v_string = xmemdupz(buf, (size_t)len); } /* |