aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval.c
diff options
context:
space:
mode:
authorZyX <kp-pav@yandex.ru>2017-04-16 20:16:32 +0300
committerZyX <kp-pav@yandex.ru>2017-04-16 20:16:55 +0300
commitfbdef2e6f2d65d3cc6f3c8a8dcd8b3cddf41c474 (patch)
tree32fc787417b833b4d7b4bdf2d95758e9888edd00 /src/nvim/eval.c
parent3c5f4b382f62d9f3cf5d54720592ff75d3a1f86d (diff)
downloadrneovim-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.c39
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);
}
/*