summaryrefslogtreecommitdiffstats
path: root/src/blob.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-01-13 17:48:04 +0100
committerBram Moolenaar <Bram@vim.org>2019-01-13 17:48:04 +0100
commit8c8b8bb56c724cc1bfc3d8520eec33f2d399697c (patch)
tree62748a3e2cc6168a4d8eb8799ed8708c5575a278 /src/blob.c
parent8309b0559da6e9a581a7816572594c90c2d7f942 (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.c67
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) */