# HG changeset patch # User Bram Moolenaar # Date 1547739906 -3600 # Node ID 99a4cc4782ac8627fe3258b255ffa97abf4f4410 # Parent c72617e8f153f3416cce06ac244318e6dbce9436 patch 8.1.0765: string format of a Blob can't be parsed back commit https://github.com/vim/vim/commit/4131fd5509b283e978e8c6161f09643b64719787 Author: Bram Moolenaar Date: Thu Jan 17 16:32:53 2019 +0100 patch 8.1.0765: string format of a Blob can't be parsed back Problem: String format of a Blob can't be parsed back. Solution: Use 0z format. diff --git a/src/blob.c b/src/blob.c --- a/src/blob.c +++ b/src/blob.c @@ -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 **tofre 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])) + if (!vim_isxdigit(s[1])) 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 != ']') - 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; diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -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); diff --git a/src/testdir/test_blob.vim b/src/testdir/test_blob.vim --- a/src/testdir/test_blob.vim +++ b/src/testdir/test_blob.vim @@ -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() diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 765, +/**/ 764, /**/ 763,