]> granicus.if.org Git - vim/commitdiff
patch 8.1.0765: string format of a Blob can't be parsed back v8.1.0765
authorBram Moolenaar <Bram@vim.org>
Thu, 17 Jan 2019 15:32:53 +0000 (16:32 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 17 Jan 2019 15:32:53 +0000 (16:32 +0100)
Problem:    String format of a Blob can't be parsed back.
Solution:   Use 0z format.

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

index 6b771fed1f4eba2eed29b0602ffef2ce5777304f..bba9989136b0a79725f8375c32947e74b2699b8c 100644 (file)
@@ -168,7 +168,7 @@ write_blob(FILE *fd, blob_T *blob)
 }
 
 /*
- * Convert a blob to a readable form: "[0x11,0x34]"
+ * Convert a blob to a readable form: "0z00112233.44556677.8899"
  */
     char_u *
 blob2string(blob_T *blob, char_u **tofree, char_u *numbuf)
@@ -179,20 +179,19 @@ blob2string(blob_T *blob, char_u **tofree, char_u *numbuf)
     if (blob == NULL)
     {
        *tofree = NULL;
-       return (char_u *)"[]";
+       return (char_u *)"0z";
     }
 
     // Store bytes in the growarray.
     ga_init2(&ga, 1, 4000);
-    ga_append(&ga, '[');
+    ga_concat(&ga, (char_u *)"0z");
     for (i = 0; i < blob_len(blob); i++)
     {
-       if (i > 0)
-           ga_concat(&ga, (char_u *)",");
-       vim_snprintf((char *)numbuf, NUMBUFLEN, "0x%02X", (int)blob_get(blob, i));
+       if (i > 0 && (i & 3) == 0)
+           ga_concat(&ga, (char_u *)".");
+       vim_snprintf((char *)numbuf, NUMBUFLEN, "%02X", (int)blob_get(blob, i));
        ga_concat(&ga, numbuf);
     }
-    ga_append(&ga, ']');
     *tofree = ga.ga_data;
     return *tofree;
 }
@@ -207,24 +206,20 @@ string2blob(char_u *str)
     blob_T  *blob = blob_alloc();
     char_u  *s = str;
 
-    if (*s != '[')
+    if (s[0] != '0' || (s[1] != 'z' && s[1] != 'Z'))
        goto failed;
-    s = skipwhite(s + 1);
-    while (*s != ']')
+    s += 2;
+    while (vim_isxdigit(*s))
     {
-       if (s[0] != '0' || s[1] != 'x'
-                                || !vim_isxdigit(s[2]) || !vim_isxdigit(s[3]))
-           goto failed;
-       ga_append(&blob->bv_ga, (hex2nr(s[2]) << 4) + hex2nr(s[3]));
-       s += 4;
-       if (*s == ',')
-           s = skipwhite(s + 1);
-       else if (*s != ']')
+       if (!vim_isxdigit(s[1]))
            goto failed;
+       ga_append(&blob->bv_ga, (hex2nr(s[0]) << 4) + hex2nr(s[1]));
+       s += 2;
+       if (*s == '.' && vim_isxdigit(s[1]))
+           ++s;
     }
-    s = skipwhite(s + 1);
-    if (*s != NUL)
-       goto failed;  // text after final ']'
+    if (*skipwhite(s) != NUL)
+       goto failed;  // text after final digit
 
     ++blob->bv_refcount;
     return blob;
index af1021bdc94e5370b8cf9012dbc867ca8fe72dc3..b31ed351da6488187119341607685c8b14e1a7e6 100644 (file)
@@ -4258,6 +4258,8 @@ eval7(
                        if (blob != NULL)
                            ga_append(&blob->bv_ga,
                                         (hex2nr(*bp) << 4) + hex2nr(*(bp+1)));
+                       if (bp[2] == '.' && vim_isxdigit(bp[3]))
+                           ++bp;
                    }
                    if (blob != NULL)
                        rettv_blob_set(rettv, blob);
index d5f682f5444c6229b539798f47593493fafa8aea..1feab34150d034c1140d9541447bda1268828a71 100644 (file)
@@ -26,6 +26,12 @@ func Test_blob_create()
   call assert_fails('let b = 0z12345', 'E973:')
 
   call assert_equal(0z, test_null_blob())
+
+  let b = 0z001122.33445566.778899.aabbcc.dd
+  call assert_equal(0z00112233445566778899aabbccdd, b)
+  call assert_fails('let b = 0z1.1')
+  call assert_fails('let b = 0z.')
+  call assert_fails('let b = 0z001122.')
 endfunc
 
 " assignment to a blob
@@ -91,10 +97,13 @@ func Test_blob_get()
 endfunc
 
 func Test_blob_to_string()
-  let b = 0zDEADBEEF
-  call assert_equal('[0xDE,0xAD,0xBE,0xEF]', string(b))
+  let b = 0z00112233445566778899aabbccdd
+  call assert_equal('0z00112233.44556677.8899AABB.CCDD', string(b))
+  call assert_equal(b, eval(string(b)))
+  call remove(b, 4, -1)
+  call assert_equal('0z00112233', string(b))
   call remove(b, 0, 3)
-  call assert_equal('[]', string(b))
+  call assert_equal('0z', string(b))
 endfunc
 
 func Test_blob_compare()
index 152c34e19d08019ae72c5c5cd25ff77702736067..3f0e23b999ff034269cb0cbd18baa94473c5bff9 100644 (file)
@@ -791,6 +791,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    765,
 /**/
     764,
 /**/