Patch 8.1.0802
Problem: Negative index doesn't work for Blob.
Solution: Make it work, add a test. (closes #3856)
Files: src/blob.c, src/proto/blob.pro, src/eval.c,
src/testdir/test_blob.vim
*** ../vim-8.1.0801/src/blob.c 2019-01-23 21:56:17.623300022 +0100
--- src/blob.c 2019-01-24 12:29:14.225795888 +0100
***************
*** 72,79 ****
--- 72,83 ----
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,118 ****
* Get byte "idx" in blob "b".
* Caller must check that "idx" is valid.
*/
! char_u
blob_get(blob_T *b, int idx)
{
return ((char_u*)b->bv_ga.ga_data)[idx];
--- 116,122 ----
* Get byte "idx" in blob "b".
* Caller must check that "idx" is valid.
*/
! int
blob_get(blob_T *b, int idx)
{
return ((char_u*)b->bv_ga.ga_data)[idx];
*** ../vim-8.1.0801/src/proto/blob.pro 2019-01-23 21:56:17.623300022 +0100
--- src/proto/blob.pro 2019-01-24 12:29:39.945646015 +0100
***************
*** 6,12 ****
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);
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);
--- 6,12 ----
void blob_free(blob_T *b);
void blob_unref(blob_T *b);
long blob_len(blob_T *b);
! 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);
*** ../vim-8.1.0801/src/eval.c 2019-01-23 21:56:17.627299992 +0100
--- src/eval.c 2019-01-24 12:30:23.197391236 +0100
***************
*** 4723,4734 ****
}
else
{
! // The resulting variable is a string of a single
! // character. If the index is too big or negative the
! // result is empty.
if (n1 < len && n1 >= 0)
{
! int v = (int)blob_get(rettv->vval.v_blob, n1);
clear_tv(rettv);
rettv->v_type = VAR_NUMBER;
--- 4723,4735 ----
}
else
{
! // 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 = blob_get(rettv->vval.v_blob, n1);
clear_tv(rettv);
rettv->v_type = VAR_NUMBER;
*** ../vim-8.1.0801/src/testdir/test_blob.vim 2019-01-23 21:56:17.627299992
+0100
--- src/testdir/test_blob.vim 2019-01-24 12:24:45.847268594 +0100
***************
*** 95,100 ****
--- 95,107 ----
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()
*** ../vim-8.1.0801/src/version.c 2019-01-24 12:18:43.448842486 +0100
--- src/version.c 2019-01-24 12:25:38.178996684 +0100
***************
*** 793,794 ****
--- 793,796 ----
{ /* Add new patch number below this line */
+ /**/
+ 802,
/**/
--
"Intelligence has much less practical application than you'd think."
-- Scott Adams, Dilbert.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.