0
0
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:
Bram Moolenaar 2019-01-24 12:31:44 +01:00
parent fb1199d934
commit a5be9b6248
5 changed files with 20 additions and 6 deletions

View File

@ -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];

View File

@ -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;

View File

@ -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);

View File

@ -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()

View File

@ -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,
/**/ /**/