diff src/list.c @ 29978:34151eb6ae25 v9.0.0327

patch 9.0.0327: items() does not work on a list Commit: https://github.com/vim/vim/commit/976f859763b215050a03248dbc2bb62fa5d0d059 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Aug 30 14:34:52 2022 +0100 patch 9.0.0327: items() does not work on a list Problem: items() does not work on a list. (Sergey Vlasov) Solution: Make items() work on a list. (closes https://github.com/vim/vim/issues/11013)
author Bram Moolenaar <Bram@vim.org>
date Tue, 30 Aug 2022 15:45:03 +0200
parents 755ab148288b
children 0ad8b72af148
line wrap: on
line diff
--- a/src/list.c
+++ b/src/list.c
@@ -1053,6 +1053,38 @@ f_flattennew(typval_T *argvars, typval_T
 }
 
 /*
+ * "items(list)" function
+ * Caller must have already checked that argvars[0] is a List.
+ */
+    void
+list2items(typval_T *argvars, typval_T *rettv)
+{
+    list_T	*l = argvars[0].vval.v_list;
+    listitem_T	*li;
+    varnumber_T	idx;
+
+    if (rettv_list_alloc(rettv) == FAIL)
+	return;
+
+    if (l == NULL)
+	return;  // empty list behaves like an empty list
+
+    // TODO: would be more efficient to not materialize the argument
+    CHECK_LIST_MATERIALIZE(l);
+    for (idx = 0, li = l->lv_first; li != NULL; li = li->li_next, ++idx)
+    {
+	list_T	    *l2 = list_alloc();
+
+	if (l2 == NULL)
+	    break;
+	if (list_append_list(rettv->vval.v_list, l2) == FAIL
+		|| list_append_number(l2, idx) == FAIL
+		|| list_append_tv(l2, &li->li_tv) == FAIL)
+	    break;
+    }
+}
+
+/*
  * Extend "l1" with "l2".  "l1" must not be NULL.
  * If "bef" is NULL append at the end, otherwise insert before this item.
  * Returns FAIL when out of memory.