diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-01-13 17:48:04 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-01-13 17:48:04 +0100 |
commit | 8c8b8bb56c724cc1bfc3d8520eec33f2d399697c (patch) | |
tree | 62748a3e2cc6168a4d8eb8799ed8708c5575a278 /src/blob.c | |
parent | 8309b0559da6e9a581a7816572594c90c2d7f942 (diff) |
patch 8.1.0741: viminfo with Blob is not testedv8.1.0741
Problem: Viminfo with Blob is not tested.
Solution: Extend the viminfo test. Fix reading a blob. Fixed storing a
special variable value.
Diffstat (limited to 'src/blob.c')
-rw-r--r-- | src/blob.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/blob.c b/src/blob.c index c260a43572..58acfc816a 100644 --- a/src/blob.c +++ b/src/blob.c @@ -167,4 +167,71 @@ write_blob(FILE *fd, blob_T *blob) return OK; } +/* + * Convert a blob to a readable form: "[0x11,0x34]" + */ + char_u * +blob2string(blob_T *blob, char_u **tofree, char_u *numbuf) +{ + int i; + garray_T ga; + + if (blob == NULL) + { + *tofree = NULL; + return (char_u *)"[]"; + } + + // Store bytes in the growarray. + ga_init2(&ga, 1, 4000); + ga_append(&ga, '['); + 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)); + ga_concat(&ga, numbuf); + } + ga_append(&ga, ']'); + *tofree = ga.ga_data; + return *tofree; +} + +/* + * Convert a string variable, in the format of blob2string(), to a blob. + * Return NULL when conversion failed. + */ + blob_T * +string2blob(char_u *str) +{ + blob_T *blob = blob_alloc(); + char_u *s = str; + + if (*s != '[') + goto failed; + s = skipwhite(s + 1); + while (*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 != ']') + goto failed; + } + s = skipwhite(s + 1); + if (*s != NUL) + goto failed; // text after final ']' + + ++blob->bv_refcount; + return blob; + +failed: + blob_free(blob); + return NULL; +} + #endif /* defined(FEAT_EVAL) */ |