summaryrefslogtreecommitdiff
path: root/src/blob.c
diff options
context:
space:
mode:
authorYegappan Lakshmanan <yegappan@yahoo.com>2021-09-14 17:54:30 +0200
committerBram Moolenaar <Bram@vim.org>2021-09-14 17:54:30 +0200
commit5dfe467432638fac2e0156a2f9cd0d9eb569fb39 (patch)
treef26436377c3b39cbbd4881d7c18450e61dc0d3ef /src/blob.c
parentf5785cf0592626ec17676e814d3ba58f5123bcda (diff)
downloadvim-git-5dfe467432638fac2e0156a2f9cd0d9eb569fb39.tar.gz
patch 8.2.3438: cannot manipulate blobsv8.2.3438
Problem: Cannot manipulate blobs. Solution: Add blob2list() and list2blob(). (Yegappan Lakshmanan, closes #8868)
Diffstat (limited to 'src/blob.c')
-rw-r--r--src/blob.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/blob.c b/src/blob.c
index 2138ac074..04319f8b1 100644
--- a/src/blob.c
+++ b/src/blob.c
@@ -483,4 +483,65 @@ blob_remove(typval_T *argvars, typval_T *rettv, char_u *arg_errmsg)
}
}
+/*
+ * blob2list() function
+ */
+ void
+f_blob2list(typval_T *argvars, typval_T *rettv)
+{
+ blob_T *blob;
+ list_T *l;
+ int i;
+
+ if (rettv_list_alloc(rettv) == FAIL)
+ return;
+
+ if (check_for_blob_arg(argvars, 0) == FAIL)
+ return;
+
+ blob = argvars->vval.v_blob;
+ l = rettv->vval.v_list;
+ for (i = 0; i < blob_len(blob); i++)
+ list_append_number(l, blob_get(blob, i));
+}
+
+/*
+ * list2blob() function
+ */
+ void
+f_list2blob(typval_T *argvars, typval_T *rettv)
+{
+ list_T *l;
+ listitem_T *li;
+ blob_T *blob;
+
+ if (rettv_blob_alloc(rettv) == FAIL)
+ return;
+ blob = rettv->vval.v_blob;
+
+ if (check_for_list_arg(argvars, 0) == FAIL)
+ return;
+
+ l = argvars->vval.v_list;
+ if (l == NULL)
+ return;
+
+ FOR_ALL_LIST_ITEMS(l, li)
+ {
+ int error;
+ varnumber_T n;
+
+ error = FALSE;
+ n = tv_get_number_chk(&li->li_tv, &error);
+ if (error == TRUE || n < 0 || n > 255)
+ {
+ if (!error)
+ semsg(_(e_invalid_value_for_blob_nr), n);
+ ga_clear(&blob->bv_ga);
+ return;
+ }
+ ga_append(&blob->bv_ga, n);
+ }
+}
+
#endif // defined(FEAT_EVAL)