diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-01-17 16:32:53 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-01-17 16:32:53 +0100 |
commit | 4131fd5509b283e978e8c6161f09643b64719787 (patch) | |
tree | 7b01e6afbeaf439a5a7f18c71906d8d58f107838 /src | |
parent | 6e0b6a0bec093b2fbc2e630312ec412f3f2c2254 (diff) |
patch 8.1.0765: string format of a Blob can't be parsed backv8.1.0765
Problem: String format of a Blob can't be parsed back.
Solution: Use 0z format.
Diffstat (limited to 'src')
-rw-r--r-- | src/blob.c | 37 | ||||
-rw-r--r-- | src/eval.c | 2 | ||||
-rw-r--r-- | src/testdir/test_blob.vim | 15 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 32 insertions, 24 deletions
diff --git a/src/blob.c b/src/blob.c index 6b771fed1f..bba9989136 100644 --- 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 **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; diff --git a/src/eval.c b/src/eval.c index af1021bdc9..b31ed351da 100644 --- 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 index d5f682f544..1feab34150 100644 --- 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 index 152c34e19d..3f0e23b999 100644 --- 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, |