Mercurial > vim
comparison src/evalfunc.c @ 18080:a6d218f99ff7 v8.1.2035
patch 8.1.2035: recognizing octal numbers is confusing
Commit: https://github.com/vim/vim/commit/60a8de28d11595f4df0419ece8afa7d6accc9fbd
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Sep 15 14:33:22 2019 +0200
patch 8.1.2035: recognizing octal numbers is confusing
Problem: Recognizing octal numbers is confusing.
Solution: Introduce scriptversion 4: do not use octal and allow for single
quote inside numbers.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 15 Sep 2019 14:45:04 +0200 |
parents | a9f1656f13c9 |
children | 9d6832a5426f |
comparison
equal
deleted
inserted
replaced
18079:c4ca2f98e7b4 | 18080:a6d218f99ff7 |
---|---|
726 #ifdef FEAT_FLOAT | 726 #ifdef FEAT_FLOAT |
727 {"sqrt", 1, 1, FEARG_1, f_sqrt}, | 727 {"sqrt", 1, 1, FEARG_1, f_sqrt}, |
728 {"str2float", 1, 1, FEARG_1, f_str2float}, | 728 {"str2float", 1, 1, FEARG_1, f_str2float}, |
729 #endif | 729 #endif |
730 {"str2list", 1, 2, FEARG_1, f_str2list}, | 730 {"str2list", 1, 2, FEARG_1, f_str2list}, |
731 {"str2nr", 1, 2, FEARG_1, f_str2nr}, | 731 {"str2nr", 1, 3, FEARG_1, f_str2nr}, |
732 {"strcharpart", 2, 3, FEARG_1, f_strcharpart}, | 732 {"strcharpart", 2, 3, FEARG_1, f_strcharpart}, |
733 {"strchars", 1, 2, FEARG_1, f_strchars}, | 733 {"strchars", 1, 2, FEARG_1, f_strchars}, |
734 {"strdisplaywidth", 1, 2, FEARG_1, f_strdisplaywidth}, | 734 {"strdisplaywidth", 1, 2, FEARG_1, f_strdisplaywidth}, |
735 #ifdef HAVE_STRFTIME | 735 #ifdef HAVE_STRFTIME |
736 {"strftime", 1, 2, FEARG_1, f_strftime}, | 736 {"strftime", 1, 2, FEARG_1, f_strftime}, |
7321 f_str2nr(typval_T *argvars, typval_T *rettv) | 7321 f_str2nr(typval_T *argvars, typval_T *rettv) |
7322 { | 7322 { |
7323 int base = 10; | 7323 int base = 10; |
7324 char_u *p; | 7324 char_u *p; |
7325 varnumber_T n; | 7325 varnumber_T n; |
7326 int what; | 7326 int what = 0; |
7327 int isneg; | 7327 int isneg; |
7328 | 7328 |
7329 if (argvars[1].v_type != VAR_UNKNOWN) | 7329 if (argvars[1].v_type != VAR_UNKNOWN) |
7330 { | 7330 { |
7331 base = (int)tv_get_number(&argvars[1]); | 7331 base = (int)tv_get_number(&argvars[1]); |
7332 if (base != 2 && base != 8 && base != 10 && base != 16) | 7332 if (base != 2 && base != 8 && base != 10 && base != 16) |
7333 { | 7333 { |
7334 emsg(_(e_invarg)); | 7334 emsg(_(e_invarg)); |
7335 return; | 7335 return; |
7336 } | 7336 } |
7337 if (argvars[2].v_type != VAR_UNKNOWN && tv_get_number(&argvars[2])) | |
7338 what |= STR2NR_QUOTE; | |
7337 } | 7339 } |
7338 | 7340 |
7339 p = skipwhite(tv_get_string(&argvars[0])); | 7341 p = skipwhite(tv_get_string(&argvars[0])); |
7340 isneg = (*p == '-'); | 7342 isneg = (*p == '-'); |
7341 if (*p == '+' || *p == '-') | 7343 if (*p == '+' || *p == '-') |
7342 p = skipwhite(p + 1); | 7344 p = skipwhite(p + 1); |
7343 switch (base) | 7345 switch (base) |
7344 { | 7346 { |
7345 case 2: what = STR2NR_BIN + STR2NR_FORCE; break; | 7347 case 2: what |= STR2NR_BIN + STR2NR_FORCE; break; |
7346 case 8: what = STR2NR_OCT + STR2NR_FORCE; break; | 7348 case 8: what |= STR2NR_OCT + STR2NR_FORCE; break; |
7347 case 16: what = STR2NR_HEX + STR2NR_FORCE; break; | 7349 case 16: what |= STR2NR_HEX + STR2NR_FORCE; break; |
7348 default: what = 0; | |
7349 } | 7350 } |
7350 vim_str2nr(p, NULL, NULL, what, &n, NULL, 0, FALSE); | 7351 vim_str2nr(p, NULL, NULL, what, &n, NULL, 0, FALSE); |
7351 // Text after the number is silently ignored. | 7352 // Text after the number is silently ignored. |
7352 if (isneg) | 7353 if (isneg) |
7353 rettv->vval.v_number = -n; | 7354 rettv->vval.v_number = -n; |