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;
|
int len = from->vval.v_blob->bv_ga.ga_len;
|
||||||
|
|
||||||
if (len > 0)
|
if (len > 0)
|
||||||
|
{
|
||||||
to->vval.v_blob->bv_ga.ga_data =
|
to->vval.v_blob->bv_ga.ga_data =
|
||||||
vim_memsave(from->vval.v_blob->bv_ga.ga_data, len);
|
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;
|
to->vval.v_blob->bv_ga.ga_len = len;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
@ -112,7 +116,7 @@ blob_len(blob_T *b)
|
|||||||
* Get byte "idx" in blob "b".
|
* Get byte "idx" in blob "b".
|
||||||
* Caller must check that "idx" is valid.
|
* Caller must check that "idx" is valid.
|
||||||
*/
|
*/
|
||||||
char_u
|
int
|
||||||
blob_get(blob_T *b, int idx)
|
blob_get(blob_T *b, int idx)
|
||||||
{
|
{
|
||||||
return ((char_u*)b->bv_ga.ga_data)[idx];
|
return ((char_u*)b->bv_ga.ga_data)[idx];
|
||||||
|
@ -4723,12 +4723,13 @@ eval_index(
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// The resulting variable is a string of a single
|
// The resulting variable is a byte value.
|
||||||
// character. If the index is too big or negative the
|
// If the index is too big or negative that is an error.
|
||||||
// result is empty.
|
if (n1 < 0)
|
||||||
|
n1 = len + n1;
|
||||||
if (n1 < len && n1 >= 0)
|
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);
|
clear_tv(rettv);
|
||||||
rettv->v_type = VAR_NUMBER;
|
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_free(blob_T *b);
|
||||||
void blob_unref(blob_T *b);
|
void blob_unref(blob_T *b);
|
||||||
long blob_len(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);
|
void blob_set(blob_T *b, int idx, char_u c);
|
||||||
int blob_equal(blob_T *b1, blob_T *b2);
|
int blob_equal(blob_T *b1, blob_T *b2);
|
||||||
int read_blob(FILE *fd, blob_T *blob);
|
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(999, get(b, 5, 999))
|
||||||
call assert_equal(-1, get(b, -8))
|
call assert_equal(-1, get(b, -8))
|
||||||
call assert_equal(999, get(b, -8, 999))
|
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
|
endfunc
|
||||||
|
|
||||||
func Test_blob_to_string()
|
func Test_blob_to_string()
|
||||||
|
@ -791,6 +791,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 */
|
||||||
|
/**/
|
||||||
|
802,
|
||||||
/**/
|
/**/
|
||||||
801,
|
801,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user