]> granicus.if.org Git - vim/commitdiff
patch 8.1.0802: negative index doesn't work for Blob v8.1.0802
authorBram Moolenaar <Bram@vim.org>
Thu, 24 Jan 2019 11:31:44 +0000 (12:31 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 24 Jan 2019 11:31:44 +0000 (12:31 +0100)
Problem:    Negative index doesn't work for Blob.
Solution:   Make it work, add a test. (closes #3856)

src/blob.c
src/eval.c
src/proto/blob.pro
src/testdir/test_blob.vim
src/version.c

index a95403033006de7a967c1b5996f710bf7142041f..9dc7926f4426cac7861373cb4796cc7200975792 100644 (file)
@@ -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];
index dac086f8567a1fd915fc9faa4c3faf498aba2aeb..f111dc431205cfb5ec666322e7b0c2135f885a73 100644 (file)
@@ -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;
index b8e48deeec411af365219d1d4cf6cc689a565690..019692dc3b86d827d4a06a951c8a498f56bd8afa 100644 (file)
@@ -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);
index 9eb2057740c325484c211d4312fcc02e6cca900f..b01e11be229526bc9b0200c928110d2daae898b3 100644 (file)
@@ -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()
index d66296529e20df1dc4c211c4b61a27c344f6a993..5b404ed8043f5b8f44b89313736344dffdf809fe 100644 (file)
@@ -791,6 +791,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    802,
 /**/
     801,
 /**/