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;