diff src/blob.c @ 15466:435fcefd2c8e v8.1.0741

patch 8.1.0741: viminfo with Blob is not tested commit https://github.com/vim/vim/commit/8c8b8bb56c724cc1bfc3d8520eec33f2d399697c Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jan 13 17:48:04 2019 +0100 patch 8.1.0741: viminfo with Blob is not tested Problem: Viminfo with Blob is not tested. Solution: Extend the viminfo test. Fix reading a blob. Fixed storing a special variable value.
author Bram Moolenaar <Bram@vim.org>
date Sun, 13 Jan 2019 18:00:05 +0100
parents f01eb1aed348
children 55ccc2d353bd
line wrap: on
line diff
--- 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) */