static int eval3 __ARGS((char_u **arg, typval_T *rettv, int evaluate));
static int eval4 __ARGS((char_u **arg, typval_T *rettv, int evaluate));
static int eval5 __ARGS((char_u **arg, typval_T *rettv, int evaluate));
-static int eval6 __ARGS((char_u **arg, typval_T *rettv, int evaluate));
-static int eval7 __ARGS((char_u **arg, typval_T *rettv, int evaluate));
+static int eval6 __ARGS((char_u **arg, typval_T *rettv, int evaluate, int want_string));
+static int eval7 __ARGS((char_u **arg, typval_T *rettv, int evaluate, int want_string));
static int eval_index __ARGS((char_u **arg, typval_T *rettv, int evaluate, int verbose));
static int get_option_tv __ARGS((char_u **arg, typval_T *rettv, int evaluate));
/*
* Get the first variable.
*/
- if (eval6(arg, rettv, evaluate) == FAIL)
+ if (eval6(arg, rettv, evaluate, FALSE) == FAIL)
return FAIL;
/*
* Get the second variable.
*/
*arg = skipwhite(*arg + 1);
- if (eval6(arg, &var2, evaluate) == FAIL)
+ if (eval6(arg, &var2, evaluate, op == '.') == FAIL)
{
clear_tv(rettv);
return FAIL;
* Return OK or FAIL.
*/
static int
-eval6(arg, rettv, evaluate)
+eval6(arg, rettv, evaluate, want_string)
char_u **arg;
typval_T *rettv;
int evaluate;
+ int want_string; /* after "." operator */
{
typval_T var2;
int op;
/*
* Get the first variable.
*/
- if (eval7(arg, rettv, evaluate) == FAIL)
+ if (eval7(arg, rettv, evaluate, want_string) == FAIL)
return FAIL;
/*
* Get the second variable.
*/
*arg = skipwhite(*arg + 1);
- if (eval7(arg, &var2, evaluate) == FAIL)
+ if (eval7(arg, &var2, evaluate, FALSE) == FAIL)
return FAIL;
if (evaluate)
* Return OK or FAIL.
*/
static int
-eval7(arg, rettv, evaluate)
+eval7(arg, rettv, evaluate, want_string)
char_u **arg;
typval_T *rettv;
int evaluate;
+ int want_string; /* after "." operator */
{
long n;
int len;
/* We accept a float when the format matches
* "[0-9]\+\.[0-9]\+\([eE][+-]\?[0-9]\+\)\?". This is very
- * strict to avoid backwards compatibility problems. */
- if (p[0] == '.' && vim_isdigit(p[1]))
+ * strict to avoid backwards compatibility problems.
+ * Don't look for a float after the "." operator, so that
+ * ":let vers = 1.2.3" doesn't fail. */
+ if (!want_string && p[0] == '.' && vim_isdigit(p[1]))
{
get_float = TRUE;
p = skipdigits(p + 2);