aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval.c
diff options
context:
space:
mode:
authorJames McCoy <jamessan@jamessan.com>2017-06-05 22:39:09 -0400
committerJames McCoy <jamessan@jamessan.com>2017-06-06 05:07:14 -0400
commit17d616037d9312be6fb99ab559861175a1bc35e6 (patch)
tree717c27a0a25d29ea99bd05dbf4c1dcc8c4992cbc /src/nvim/eval.c
parentb1d4ef2b420b1fa9826a9e79344adaf71ad27e18 (diff)
downloadrneovim-17d616037d9312be6fb99ab559861175a1bc35e6.tar.gz
rneovim-17d616037d9312be6fb99ab559861175a1bc35e6.tar.bz2
rneovim-17d616037d9312be6fb99ab559861175a1bc35e6.zip
vim-patch:8.0.0167
Problem: str2nr() and str2float() do not always work with negative values. Solution: Be more flexible about handling signs. (LemonBoy, closes vim/vim#1332) Add more tests. https://github.com/vim/vim/commit/08243d26d22ad44a857d02c90071578577b8a55d
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r--src/nvim/eval.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 612c3be368..8cf505587d 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -15698,11 +15698,15 @@ static void f_split(typval_T *argvars, typval_T *rettv, FunPtr fptr)
static void f_str2float(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
char_u *p = skipwhite((const char_u *)tv_get_string(&argvars[0]));
+ bool isneg = (*p == '-');
- if (*p == '+') {
+ if (*p == '+' || *p == '-') {
p = skipwhite(p + 1);
}
(void)string2float((char *)p, &rettv->vval.v_float);
+ if (isneg) {
+ rettv->vval.v_float *= -1;
+ }
rettv->v_type = VAR_FLOAT;
}
@@ -15722,7 +15726,8 @@ static void f_str2nr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
}
char_u *p = skipwhite((const char_u *)tv_get_string(&argvars[0]));
- if (*p == '+') {
+ bool isneg = (*p == '-');
+ if (*p == '+' || *p == '-') {
p = skipwhite(p + 1);
}
switch (base) {
@@ -15743,7 +15748,11 @@ static void f_str2nr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
}
}
vim_str2nr(p, NULL, NULL, what, &n, NULL, 0);
- rettv->vval.v_number = n;
+ if (isneg) {
+ rettv->vval.v_number = -n;
+ } else {
+ rettv->vval.v_number = n;
+ }
}
/*