summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/archplat.sh135
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