diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/archplat.sh | 135 |
1 files changed, 68 insertions, 67 deletions
diff --git a/src/archplat.sh b/src/archplat.sh index b8324a0..6621ee7 100644 --- a/src/archplat.sh +++ b/src/archplat.sh @@ -1,6 +1,6 @@ # Functions for matching architectures and platforms # -# Copyright (C) 2012 Patrick "P. J." McDermott +# Copyright (C) 2012, 2019 Patrick McDermott # # This file is part of the ProteanOS Development Kit. # @@ -18,92 +18,70 @@ # along with the ProteanOS Development Kit. If not, see # <http://www.gnu.org/licenses/>. -match_arch() +_match_arch() { - local arch="${1}" - local arch_field="${2}" - local a= - local a_ere= + local match_arch="${1}" + local field_arch="${2}" + shift 2 + local match_arch_rest= + local field_arch_rest= + local match_arch_part= + local field_arch_part= - for a in ${arch_field}; do - - # "all" == "all" - if [ "${arch}" = 'all' ]; then - if [ "${a}" = 'all' ]; then - return 0 - else - continue - fi - fi - - # "foo-bar-baz" == "any" - if [ "${a}" = 'any' ]; then - return 0 - fi - - # Generate an ERE to match hyphenated architectures. - a_ere="$(printf '%s\n' "${a}" | sed \ - 's/^any-/[^-]+-/;s/-any-/-[^-]+-/g;s/-any$/-[^-]+/g')" - - # "foo-bar-baz" == "foo-any-any" - if echo "${arch}" | grep -E "${a_ere}" >/dev/null 2>&1; then - return 0 - fi - - done - - # Nothing matched. - return 1 -} - -match_plat() -{ - local plat="${1}" - local plat_field="${2}" - local p= + # "foo-bar-baz" == "any" + if [ x"${field_arch}" = x'any' ]; then + return 0 + fi - for p in ${plat_field}; do - if [ "x${plat}" = 'xall' ]; then - if [ "x${p}" = 'xall' ]; then - return 0 - else - continue - fi - fi - if [ "x${p}" = 'xany' ]; then - return 0 - fi - if [ "x${p}" = "x${plat}" ]; then - return 0 - fi + # "foo-bar-baz" == "foo-any-any" + match_arch_rest="${match_arch}" + field_arch_rest="${field_arch}" + while [ -n "${match_arch_rest}" ] && [ -n "${field_arch_rest}" ]; do + IFS='-' read match_arch_part match_arch_rest <<-EOF + ${match_arch_rest} + EOF + IFS='-' read field_arch_part field_arch_rest <<-EOF + ${field_arch_rest} + EOF + case "${field_arch_part}" in + "${match_arch_part}" | 'any') ;; + *) return 1;; # Failed match + esac done - return 1 + return 0 } arch_is_concerned() { local host_arch="${1}" local arches="${2}" + shift 2 local arch= local not_arch= local seen_arch= - if [ "x${arches}" = 'x' ]; then + if [ x"${arches}" = x'' ]; then return 0 + elif [ x"${host_arch}" = x'all' ]; then + if [ x"${arches}" = x'all' ]; then + return 0 + else + return 1 + fi else seen_arch=1 for arch in ${arches}; do not_arch="${arch#!}" - if [ "x${not_arch}" != "x${arch}" ]; then - if match_arch "${host_arch}" "${not_arch}" + if [ x"${not_arch}" != x"${arch}" ]; then + if _match_arch "${host_arch}" "${not_arch}" then seen_arch=1 break - elif [ "x${host_arch}" != 'xall' ]; then + else seen_arch=0 fi - elif match_arch "${host_arch}" "${arch}"; then + elif _match_arch "${host_arch}" "${arch}"; then seen_arch=0 break fi @@ -112,29 +90,52 @@ arch_is_concerned() fi } +_match_plat() +{ + local match_plat="${1}" + local field_plat="${2}" + shift 2 + + if [ x"${field_plat}" = x'any' ]; then + return 0 + fi + if [ x"${field_plat}" = x"${match_plat}" ]; then + return 0 + fi + + return 1 +} + plat_is_concerned() { local host_plat="${1}" local plats="${2}" + shift 2 local plat= local not_plat= local seen_plat= - if [ "x${plats}" = 'x' ]; then + if [ x"${plats}" = x'' ]; then return 0 + elif [ x"${host_plat}" = x'all' ]; then + if [ x"${plats}" = x'all' ]; then + return 0 + else + return 1 + fi else seen_plat=1 for plat in ${plats}; do not_plat="${plat#!}" - if [ "x${not_plat}" != "x${plat}" ]; then - if match_plat "${host_plat}" "${not_plat}" + if [ x"${not_plat}" != x"${plat}" ]; then + if _match_plat "${host_plat}" "${not_plat}" then seen_plat=1 break - elif [ "x${host_plat}" != 'xall' ]; then + else seen_plat=0 fi - elif match_plat "${host_plat}" "${plat}"; then + elif _match_plat "${host_plat}" "${plat}"; then seen_plat=0 break fi |