{
if (STRNCMP(arg, "END", 3) == 0)
{
- if (lhs->lhs_append)
+ if (cctx->ctx_skip != SKIP_YES)
{
- // First load the current variable value.
- if (compile_load_lhs_with_index(lhs, lhs->lhs_whole,
+ if (lhs->lhs_append)
+ {
+ // First load the current variable value.
+ if (compile_load_lhs_with_index(lhs, lhs->lhs_whole,
cctx) == FAIL)
- return NULL;
- }
+ return NULL;
+ }
- // Gets the redirected text and put it on the stack, then store it
- // in the variable.
- generate_instr_type(cctx, ISN_REDIREND, &t_string);
+ // Gets the redirected text and put it on the stack, then store
+ // it in the variable.
+ generate_instr_type(cctx, ISN_REDIREND, &t_string);
- if (lhs->lhs_append)
- generate_CONCAT(cctx, 2);
+ if (lhs->lhs_append)
+ generate_CONCAT(cctx, 2);
- if (lhs->lhs_has_index)
- {
- // Use the info in "lhs" to store the value at the index in the
- // list or dict.
- if (compile_assign_unlet(lhs->lhs_whole, lhs, TRUE,
+ if (lhs->lhs_has_index)
+ {
+ // Use the info in "lhs" to store the value at the index in
+ // the list or dict.
+ if (compile_assign_unlet(lhs->lhs_whole, lhs, TRUE,
&t_string, cctx) == FAIL)
+ return NULL;
+ }
+ else if (generate_store_lhs(cctx, lhs, -1, FALSE) == FAIL)
return NULL;
- }
- else if (generate_store_lhs(cctx, lhs, -1, FALSE) == FAIL)
- return NULL;
- VIM_CLEAR(lhs->lhs_name);
- VIM_CLEAR(lhs->lhs_whole);
+ VIM_CLEAR(lhs->lhs_name);
+ VIM_CLEAR(lhs->lhs_whole);
+ }
return arg + 3;
}
emsg(_(e_cannot_nest_redir));
if (need_type(&t_string, lhs->lhs_member_type,
-1, 0, cctx, FALSE, FALSE) == FAIL)
return NULL;
- generate_instr(cctx, ISN_REDIRSTART);
- lhs->lhs_append = append;
- if (lhs->lhs_has_index)
+ if (cctx->ctx_skip == SKIP_YES)
{
- lhs->lhs_whole = vim_strnsave(arg, lhs->lhs_varlen_total);
- if (lhs->lhs_whole == NULL)
- return NULL;
+ VIM_CLEAR(lhs->lhs_name);
+ }
+ else
+ {
+ generate_instr(cctx, ISN_REDIRSTART);
+ lhs->lhs_append = append;
+ if (lhs->lhs_has_index)
+ {
+ lhs->lhs_whole = vim_strnsave(arg, lhs->lhs_varlen_total);
+ if (lhs->lhs_whole == NULL)
+ return NULL;
+ }
}
return arg + lhs->lhs_varlen_total;
semsg(_(e_cannot_declare_a_scope_variable), scope, name);
}
+/*
+ * Return TRUE if "name" is a valid register to use.
+ * Return FALSE and give an error message if not.
+ */
+ static int
+valid_dest_reg(int name)
+{
+ if ((name == '@' || valid_yank_reg(name, FALSE)) && name != '.')
+ return TRUE;
+ emsg_invreg(name);
+ return FAIL;
+}
+
/*
* For one assignment figure out the type of destination. Return it in "dest".
* When not recognized "dest" is not set.
}
else if (*name == '@')
{
- if (name[1] != '@'
- && (!valid_yank_reg(name[1], FALSE) || name[1] == '.'))
- {
- emsg_invreg(name[1]);
+ if (!valid_dest_reg(name[1]))
return FAIL;
- }
*dest = dest_reg;
*type = name[1] == '#' ? &t_number_or_string : &t_string;
}
// "var_end" is the end of the variable/option/etc. name.
lhs->lhs_dest_end = skip_var_one(var_start, FALSE);
if (*var_start == '@')
+ {
+ if (!valid_dest_reg(var_start[1]))
+ return FAIL;
var_end = var_start + 2;
+ }
else
{
// skip over the leading "&", "&l:", "&g:" and "$"