diff options
Diffstat (limited to 'src/list.c')
-rw-r--r-- | src/list.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/src/list.c b/src/list.c index 056210d243..a6805ed677 100644 --- a/src/list.c +++ b/src/list.c @@ -1065,9 +1065,8 @@ list2items(typval_T *argvars, typval_T *rettv) if (rettv_list_alloc(rettv) == FAIL) return; - if (l == NULL) - return; // empty list behaves like an empty list + return; // null list behaves like an empty list // TODO: would be more efficient to not materialize the argument CHECK_LIST_MATERIALIZE(l); @@ -1085,6 +1084,39 @@ list2items(typval_T *argvars, typval_T *rettv) } /* + * "items(string)" function + * Caller must have already checked that argvars[0] is a String. + */ + void +string2items(typval_T *argvars, typval_T *rettv) +{ + char_u *p = argvars[0].vval.v_string; + varnumber_T idx; + + if (rettv_list_alloc(rettv) == FAIL) + return; + if (p == NULL) + return; // null string behaves like an empty string + + for (idx = 0; *p != NUL; ++idx) + { + int len = mb_ptr2len(p); + list_T *l2; + + if (len == 0) + break; + 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_string(l2, p, len) == FAIL) + break; + p += len; + } +} + +/* * 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. |