Mercurial > vim
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.