updated for version 7.0087
diff --git a/src/eval.c b/src/eval.c
index 913f8ed..6f31346 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -107,7 +107,7 @@
static char *e_dictrange = N_("E719: Cannot use [:] with a Dictionary");
static char *e_letwrong = N_("E734: Wrong variable type for %s=");
static char *e_nofunc = N_("E130: Unknown function: %s");
-
+static char *e_illvar = N_("E461: Illegal variable name: %s");
/*
* All user-defined global variables are stored in dictionary "globvardict".
* "globvars_var" is the variable that is used for "g:".
@@ -1553,15 +1553,17 @@
}
/*
- * Skip one (assignable) variable name, includig $VAR, d.key, l[idx].
+ * Skip one (assignable) variable name, includig @r, $VAR, &option, d.key,
+ * l[idx].
*/
static char_u *
skip_var_one(arg)
char_u *arg;
{
- if (vim_strchr((char_u *)"$@&", *arg) != NULL)
- ++arg;
- return find_name_end(arg, NULL, NULL, FNE_INCL_BR | FNE_CHECK_START);
+ if (*arg == '@' && arg[1] != NUL)
+ return arg + 2;
+ return find_name_end(*arg == '$' || *arg == '&' ? arg + 1 : arg,
+ NULL, NULL, FNE_INCL_BR | FNE_CHECK_START);
}
/*
@@ -1886,7 +1888,7 @@
p = get_tv_string_chk(tv);
if (p != NULL && op != NULL && *op == '.')
{
- s = get_reg_contents(*arg == '@' ? '"' : *arg, FALSE, FALSE);
+ s = get_reg_contents(*arg == '@' ? '"' : *arg, TRUE, TRUE);
if (s != NULL)
{
p = tofree = concat_str(s, p);
@@ -4173,8 +4175,7 @@
if (evaluate)
{
rettv->v_type = VAR_STRING;
- rettv->vval.v_string = get_reg_contents(**arg,
- FALSE, FALSE);
+ rettv->vval.v_string = get_reg_contents(**arg, TRUE, TRUE);
}
if (**arg != NUL)
++*arg;
@@ -11415,7 +11416,7 @@
return; /* type error; errmsg already given */
if (stride == 0)
EMSG(_("E726: Stride is zero"));
- else if (stride > 0 ? end < start : end > start)
+ else if (stride > 0 ? end + 1 < start : end - 1 > start)
EMSG(_("E727: Start past end"));
else
{
@@ -12585,7 +12586,6 @@
return;
(void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
varname = get_tv_string_chk(&argvars[1]);
- ++emsg_off;
buf = get_buf_tv(&argvars[0]);
varp = &argvars[2];
@@ -12606,10 +12606,8 @@
int error = FALSE;
++varname;
- --emsg_off;
numval = get_tv_number_chk(varp, &error);
strval = get_tv_string_buf_chk(varp, nbuf);
- ++emsg_off;
if (!error && strval != NULL)
set_option_value(varname, numval, strval, OPT_LOCAL);
}
@@ -12632,7 +12630,6 @@
curbuf = save_curbuf;
#endif
}
- --emsg_off;
}
/*
@@ -12844,7 +12841,6 @@
return;
win = find_win_by_nr(&argvars[0]);
varname = get_tv_string_chk(&argvars[1]);
- ++emsg_off;
varp = &argvars[2];
if (win != NULL && varname != NULL && varp != NULL)
@@ -12863,10 +12859,8 @@
int error = FALSE;
++varname;
- --emsg_off;
numval = get_tv_number_chk(varp, &error);
strval = get_tv_string_buf_chk(varp, nbuf);
- ++emsg_off;
if (!error && strval != NULL)
set_option_value(varname, numval, strval, OPT_LOCAL);
}
@@ -12892,7 +12886,6 @@
}
#endif
}
- --emsg_off;
}
/*
@@ -13459,7 +13452,7 @@
long lnum;
long col;
int trans;
- int transerr;
+ int transerr = FALSE;
lnum = get_tv_lnum(argvars); /* -1 on type error */
col = get_tv_number(&argvars[1]) - 1; /* -1 on type error */
@@ -15443,6 +15436,7 @@
dictitem_T *v;
char_u *varname;
hashtab_T *ht;
+ char_u *p;
if (tv->v_type == VAR_FUNC)
{
@@ -15464,7 +15458,7 @@
ht = find_var_ht(name, &varname);
if (ht == NULL || *varname == NUL)
{
- EMSG2(_("E461: Illegal variable name: %s"), name);
+ EMSG2(_(e_illvar), name);
return;
}
@@ -15514,6 +15508,14 @@
}
else /* add a new variable */
{
+ /* Make sure the variable name is valid. */
+ for (p = varname; *p != NUL; ++p)
+ if (!eval_isnamec1(*p) && (p == varname || !VIM_ISDIGIT(*p)))
+ {
+ EMSG2(_(e_illvar), varname);
+ return;
+ }
+
v = (dictitem_T *)alloc((unsigned)(sizeof(dictitem_T)
+ STRLEN(varname)));
if (v == NULL)