From 976f859763b215050a03248dbc2bb62fa5d0d059 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Tue, 30 Aug 2022 14:34:52 +0100 Subject: 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 #11013) --- src/list.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'src/list.c') diff --git a/src/list.c b/src/list.c index 10a7aacd3..056210d24 100644 --- a/src/list.c +++ b/src/list.c @@ -1052,6 +1052,38 @@ f_flattennew(typval_T *argvars, typval_T *rettv) flatten_common(argvars, rettv, TRUE); } +/* + * "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. -- cgit v1.2.1