updated for version 7.4.249
Problem: Using setreg() with a list of numbers does not work. Solution: Use a separate buffer for numbers. (ZyX)
This commit is contained in:
28
src/eval.c
28
src/eval.c
@ -16827,24 +16827,36 @@ f_setreg(argvars, rettv)
|
|||||||
if (argvars[1].v_type == VAR_LIST)
|
if (argvars[1].v_type == VAR_LIST)
|
||||||
{
|
{
|
||||||
char_u **lstval;
|
char_u **lstval;
|
||||||
|
char_u **allocval;
|
||||||
|
char_u buf[NUMBUFLEN];
|
||||||
char_u **curval;
|
char_u **curval;
|
||||||
|
char_u **curallocval;
|
||||||
int len = argvars[1].vval.v_list->lv_len;
|
int len = argvars[1].vval.v_list->lv_len;
|
||||||
listitem_T *li;
|
listitem_T *li;
|
||||||
|
|
||||||
lstval = (char_u **)alloc(sizeof(char_u *) * (len + 1));
|
/* First half: use for pointers to result lines; second half: use for
|
||||||
|
* pointers to allocated copies. */
|
||||||
|
lstval = (char_u **)alloc(sizeof(char_u *) * ((len + 1) * 2));
|
||||||
if (lstval == NULL)
|
if (lstval == NULL)
|
||||||
return;
|
return;
|
||||||
curval = lstval;
|
curval = lstval;
|
||||||
|
allocval = lstval + len + 2;
|
||||||
|
curallocval = allocval;
|
||||||
|
|
||||||
for (li = argvars[1].vval.v_list->lv_first; li != NULL;
|
for (li = argvars[1].vval.v_list->lv_first; li != NULL;
|
||||||
li = li->li_next)
|
li = li->li_next)
|
||||||
{
|
{
|
||||||
/* TODO: this may use a static buffer several times. */
|
strval = get_tv_string_buf_chk(&li->li_tv, buf);
|
||||||
strval = get_tv_string_chk(&li->li_tv);
|
|
||||||
if (strval == NULL)
|
if (strval == NULL)
|
||||||
|
goto free_lstval;
|
||||||
|
if (strval == buf)
|
||||||
{
|
{
|
||||||
vim_free(lstval);
|
/* Need to make a copy, next get_tv_string_buf_chk() will
|
||||||
return;
|
* overwrite the string. */
|
||||||
|
strval = vim_strsave(buf);
|
||||||
|
if (strval == NULL)
|
||||||
|
goto free_lstval;
|
||||||
|
*curallocval++ = strval;
|
||||||
}
|
}
|
||||||
*curval++ = strval;
|
*curval++ = strval;
|
||||||
}
|
}
|
||||||
@ -16852,6 +16864,9 @@ f_setreg(argvars, rettv)
|
|||||||
|
|
||||||
write_reg_contents_lst(regname, lstval, -1,
|
write_reg_contents_lst(regname, lstval, -1,
|
||||||
append, yank_type, block_len);
|
append, yank_type, block_len);
|
||||||
|
free_lstval:
|
||||||
|
while (curallocval > allocval)
|
||||||
|
vim_free(*--curallocval);
|
||||||
vim_free(lstval);
|
vim_free(lstval);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -20453,6 +20468,9 @@ get_tv_string_buf(varp, buf)
|
|||||||
return res != NULL ? res : (char_u *)"";
|
return res != NULL ? res : (char_u *)"";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Careful: This uses a single, static buffer. YOU CAN ONLY USE IT ONCE!
|
||||||
|
*/
|
||||||
char_u *
|
char_u *
|
||||||
get_tv_string_chk(varp)
|
get_tv_string_chk(varp)
|
||||||
typval_T *varp;
|
typval_T *varp;
|
||||||
|
|||||||
@ -90,6 +90,8 @@ call SetReg('a', ['abcA3'], 'c')
|
|||||||
call SetReg('b', ['abcB3'], 'l')
|
call SetReg('b', ['abcB3'], 'l')
|
||||||
call SetReg('c', ['abcC3'], 'b')
|
call SetReg('c', ['abcC3'], 'b')
|
||||||
call SetReg('d', ['abcD3'])
|
call SetReg('d', ['abcD3'])
|
||||||
|
call SetReg('e', [1, 2, 'abc', 3])
|
||||||
|
call SetReg('f', [1, 2, 3])
|
||||||
|
|
||||||
$put ='{{{1 Appending lists with setreg()'
|
$put ='{{{1 Appending lists with setreg()'
|
||||||
call SetReg('A', ['abcA3c'], 'c')
|
call SetReg('A', ['abcA3c'], 'c')
|
||||||
@ -128,8 +130,8 @@ call ErrExe('call setreg(1, 2, 3, 4)')
|
|||||||
call ErrExe('call setreg([], 2)')
|
call ErrExe('call setreg([], 2)')
|
||||||
call ErrExe('call setreg(1, {})')
|
call ErrExe('call setreg(1, {})')
|
||||||
call ErrExe('call setreg(1, 2, [])')
|
call ErrExe('call setreg(1, 2, [])')
|
||||||
call ErrExe('call setreg("/", [1, 2])')
|
call ErrExe('call setreg("/", ["1", "2"])')
|
||||||
call ErrExe('call setreg("=", [1, 2])')
|
call ErrExe('call setreg("=", ["1", "2"])')
|
||||||
call ErrExe('call setreg(1, ["", "", [], ""])')
|
call ErrExe('call setreg(1, ["", "", [], ""])')
|
||||||
endfun
|
endfun
|
||||||
:"
|
:"
|
||||||
|
|||||||
Binary file not shown.
@ -734,6 +734,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
249,
|
||||||
/**/
|
/**/
|
||||||
248,
|
248,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
Reference in New Issue
Block a user