mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
patch 8.1.0802: negative index doesn't work for Blob
Problem: Negative index doesn't work for Blob. Solution: Make it work, add a test. (closes #3856)
This commit is contained in:
parent
fb1199d934
commit
a5be9b6248
@ -72,8 +72,12 @@ blob_copy(typval_T *from, typval_T *to)
|
||||
int len = from->vval.v_blob->bv_ga.ga_len;
|
||||
|
||||
if (len > 0)
|
||||
{
|
||||
to->vval.v_blob->bv_ga.ga_data =
|
||||
vim_memsave(from->vval.v_blob->bv_ga.ga_data, len);
|
||||
if (to->vval.v_blob->bv_ga.ga_data == NULL)
|
||||
len = 0;
|
||||
}
|
||||
to->vval.v_blob->bv_ga.ga_len = len;
|
||||
}
|
||||
return ret;
|
||||
@ -112,7 +116,7 @@ blob_len(blob_T *b)
|
||||
* Get byte "idx" in blob "b".
|
||||
* Caller must check that "idx" is valid.
|
||||
*/
|
||||
char_u
|
||||
int
|
||||
blob_get(blob_T *b, int idx)
|
||||
{
|
||||
return ((char_u*)b->bv_ga.ga_data)[idx];
|
||||
|
@ -4723,12 +4723,13 @@ eval_index(
|
||||
}
|
||||
else
|
||||
{
|
||||
// The resulting variable is a string of a single
|
||||
// character. If the index is too big or negative the
|
||||
// result is empty.
|
||||
// The resulting variable is a byte value.
|
||||
// If the index is too big or negative that is an error.
|
||||
if (n1 < 0)
|
||||
n1 = len + n1;
|
||||
if (n1 < len && n1 >= 0)
|
||||
{
|
||||
int v = (int)blob_get(rettv->vval.v_blob, n1);
|
||||
int v = blob_get(rettv->vval.v_blob, n1);
|
||||
|
||||
clear_tv(rettv);
|
||||
rettv->v_type = VAR_NUMBER;
|
||||
|
@ -6,7 +6,7 @@ int blob_copy(typval_T *from, typval_T *to);
|
||||
void blob_free(blob_T *b);
|
||||
void blob_unref(blob_T *b);
|
||||
long blob_len(blob_T *b);
|
||||
char_u blob_get(blob_T *b, int idx);
|
||||
int blob_get(blob_T *b, int idx);
|
||||
void blob_set(blob_T *b, int idx, char_u c);
|
||||
int blob_equal(blob_T *b1, blob_T *b2);
|
||||
int read_blob(FILE *fd, blob_T *blob);
|
||||
|
@ -95,6 +95,13 @@ func Test_blob_get()
|
||||
call assert_equal(999, get(b, 5, 999))
|
||||
call assert_equal(-1, get(b, -8))
|
||||
call assert_equal(999, get(b, -8, 999))
|
||||
|
||||
call assert_equal(0x00, b[0])
|
||||
call assert_equal(0x22, b[2])
|
||||
call assert_equal(0x44, b[4])
|
||||
call assert_equal(0x44, b[-1])
|
||||
call assert_fails('echo b[5]', 'E979:')
|
||||
call assert_fails('echo b[-8]', 'E979:')
|
||||
endfunc
|
||||
|
||||
func Test_blob_to_string()
|
||||
|
@ -791,6 +791,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
802,
|
||||
/**/
|
||||
801,
|
||||
/**/
|
||||
|
Loading…
x
Reference in New Issue
Block a user