diff options
Diffstat (limited to 'subr.rtl/rtl_list.subr')
-rw-r--r-- | subr.rtl/rtl_list.subr | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/subr.rtl/rtl_list.subr b/subr.rtl/rtl_list.subr new file mode 100644 index 00000000..369d3b46 --- /dev/null +++ b/subr.rtl/rtl_list.subr @@ -0,0 +1,120 @@ +# +# set +o errexit -o noglob -o nounset is assumed. +# + +rtl_lassign() { + local _vnames="${1}" _sep="${2}" _vname="" _vval=""\ + IFS RTL_LFIRST_HEAD="" RTL_LFIRST_TAIL=""; + IFS="${_sep}"; shift 2; + for _vval in ${@}; do + if ! rtl_lfirst "${_vnames}" " "; then + return 1; + else + _vname="${RTL_LFIRST_HEAD}"; _vnames="${RTL_LFIRST_TAIL}"; + rtl_set_var_unsafe "${_vname}" "${_vval}"; + fi; + done; +}; + +rtl_lconcat() { + local _list="${1}" _litem_new="${2}" _sep="${3:- }" IFS="${3:-${IFS:- }}"; + if [ -n "${_list}" ]; then + printf "%s%s%s" "${_list}" "${_sep}" "${_litem_new}"; + else + printf "%s" "${_litem_new}"; + fi; +}; + +rtl_lfilter() { + local _list="${1}" _filter="${2}" _sep="${3:- }" IFS="${3:-${IFS:- }}"\ + _filterfl="" _litem="" _litem_filter="" _lnew=""; + if [ -z "${_filter}" ]; then + printf "%s" "${_list}"; return 0; + else for _litem in ${_list}; do + _filterfl=0; + for _litem_filter in ${_filter}; do + if [ "${_litem_filter}" = "${_litem}" ]; then + _filterfl=1; break; + fi; + done; + if [ "${_filterfl:-0}" -eq 0 ]; then + _lnew="${_lnew:+${_lnew}${_sep}}${_litem}"; + fi; + done; fi; + printf "%s" "${_lnew}"; +}; + +rtl_lfirst() { + local _list="${1}" _sep="${2}" IFS; IFS="${_sep}"; + set -- ${_list}; RTL_LFIRST_HEAD="${1}"; + if [ "${#}" -ge 0 ]; then + shift; RTL_LFIRST_TAIL="${*}"; + else + RTL_LFIRST_TAIL=""; + fi; +}; + +rtl_llength() { + local _list="${1}" _sep="${2:- }" IFS="${2:-${IFS:- }}" _litem="" _llength=0; + for _litem in ${_list}; do + : $((_llength+=1)); + done; + printf "%s" "${_llength}"; +}; + +rtl_llift() { + local _list="${1}" _sep="${2}" _sep_new="${3}" IFS; IFS="${_sep}"; + set -- ${_list}; IFS="${_sep_new}"; + printf "%s" "${*}"; +}; + +rtl_lmatch() { + local _list="${1}" _item="${2}" _sep="${3:- }"; + [ -n "$(rtl_lsearch "${_list}" "${_item}" "${_sep}")" ]; +}; + +rtl_lmax() { + local _len=0 _len_max=0; + while [ "${#}" -gt 0 ]; do + _len="${#1}"; + if [ "${_len}" -gt "${_len_max}" ]; then + _len_max="${_len}"; + fi; shift; + done; printf "%s" "${_len_max}"; +}; + +rtl_lsearch() { + local _list="${1}" _filter="${2}" _sep="${3:- }" IFS="${3:-${IFS:- }}"\ + _litem="" _litem_filter="" _lnew=""; + if [ -z "${_filter}" ]; then + printf "%s" "${_list}"; return 0; + else for _litem in ${_list}; do + for _litem_filter in ${_filter}; do + if [ "${_litem_filter}" = "${_litem}" ]; then + _lnew="${_lnew:+${_lnew}${_sep}}${_litem}"; + break; + fi; + done; + done; fi; + printf "%s" "${_lnew}"; +}; + +rtl_lsort() { + local _list="${1}" _sep="${2:- }"; + printf "%s" "${_list}" | tr "${_sep}" "\n" | sort | paste -s -d "${_sep}"; +}; + +rtl_lunfold_depends() { + local _vname_template="${1}" _depends="" _name="" _names=""; shift; + for _name in "${@}"; do + if _depends="$(rtl_get_var_unsafe -u "$(eval printf \"%s\" \""${_vname_template}"\")")"\ + && [ -n "${_depends}" ]; then + _depends="$(rtl_lunfold_depends "${_vname_template}" ${_depends})"; + _names="$(rtl_lconcat "${_names}" "${_depends}")"; + fi; + _names="$(rtl_lconcat "${_names}" "${_name}")"; + done; + printf "%s" "${_names}"; +}; + +# vim:filetype=sh |