Add mkpatsubst
Bug: 181797530 Test: rbcrun build/make/tests/run.rbc Change-Id: Id15daaf6e3ed68982e50cdc710563095ffcf57ba
This commit is contained in:
@@ -433,6 +433,38 @@ def _mkinfo(file, message = ""):
|
|||||||
"""Prints info."""
|
"""Prints info."""
|
||||||
print(message)
|
print(message)
|
||||||
|
|
||||||
|
|
||||||
|
def __mkpatsubst_word(parsed_pattern,parsed_subst, word):
|
||||||
|
(before, after) = parsed_pattern
|
||||||
|
if not word.startswith(before):
|
||||||
|
return word
|
||||||
|
if not word.endswith(after):
|
||||||
|
return word
|
||||||
|
if len(parsed_subst) < 2:
|
||||||
|
return parsed_subst[0]
|
||||||
|
return parsed_subst[0] + word[len(before):len(word) - len(after)] + parsed_subst[1]
|
||||||
|
|
||||||
|
|
||||||
|
def _mkpatsubst(pattern, replacement, s):
|
||||||
|
"""Emulates Make's patsubst.
|
||||||
|
|
||||||
|
Tokenizes `s` (unless it is already a list), and then performs a simple
|
||||||
|
wildcard substitution (in other words, `foo%bar` pattern is equivalent to
|
||||||
|
the regular expression `^foo(.*)bar$, and the first `%` in replacement is
|
||||||
|
$1 in regex terms). Escaping % is not supported
|
||||||
|
"""
|
||||||
|
if pattern.find("\\") >= 0:
|
||||||
|
fail("'\\' in pattern is not allowed")
|
||||||
|
parsed_pattern = pattern.split("%", 1)
|
||||||
|
words = s if type(s) == "list" else _mkstrip(s).split(" ")
|
||||||
|
if len(parsed_pattern) == 1:
|
||||||
|
out_words = [ replacement if x == pattern else x for x in words]
|
||||||
|
else:
|
||||||
|
parsed_replacement = replacement.split("%", 1)
|
||||||
|
out_words = [__mkpatsubst_word(parsed_pattern, parsed_replacement, x) for x in words]
|
||||||
|
return out_words if type(s) == "list" else " ".join(out_words)
|
||||||
|
|
||||||
|
|
||||||
def _mkstrip(s):
|
def _mkstrip(s):
|
||||||
"""Emulates Make's strip.
|
"""Emulates Make's strip.
|
||||||
|
|
||||||
@@ -507,6 +539,7 @@ rblf = struct(
|
|||||||
indirect = _indirect,
|
indirect = _indirect,
|
||||||
mkinfo = _mkinfo,
|
mkinfo = _mkinfo,
|
||||||
mkerror = _mkerror,
|
mkerror = _mkerror,
|
||||||
|
mkpatsubst = _mkpatsubst,
|
||||||
mkwarning = _mkwarning,
|
mkwarning = _mkwarning,
|
||||||
mkstrip = _mkstrip,
|
mkstrip = _mkstrip,
|
||||||
mksubst = _mksubst,
|
mksubst = _mksubst,
|
||||||
|
@@ -34,6 +34,16 @@ assert_eq("a b c", rblf.mkstrip(" a b \n c \t"))
|
|||||||
assert_eq("b1 b2", rblf.mksubst("a", "b", "a1 a2"))
|
assert_eq("b1 b2", rblf.mksubst("a", "b", "a1 a2"))
|
||||||
assert_eq(["b1", "x2"], rblf.mksubst("a", "b", ["a1", "x2"]))
|
assert_eq(["b1", "x2"], rblf.mksubst("a", "b", ["a1", "x2"]))
|
||||||
|
|
||||||
|
assert_eq("ABcdYZ", rblf.mkpatsubst("ab%yz", "AB%YZ", "abcdyz"))
|
||||||
|
assert_eq("bcz", rblf.mkpatsubst("a%z", "A%Z", "bcz"))
|
||||||
|
assert_eq(["Ay", "Az"], rblf.mkpatsubst("a%", "A%", ["ay", "az"]))
|
||||||
|
assert_eq("AcZ bcz", rblf.mkpatsubst("a%z", "A%Z", "acz bcz"))
|
||||||
|
assert_eq("Abcd", rblf.mkpatsubst("a%", "A%", "abcd"))
|
||||||
|
assert_eq("abcZ", rblf.mkpatsubst("%z", "%Z", "abcz"))
|
||||||
|
assert_eq("azx b", rblf.mkpatsubst("az", "AZ", "azx b"))
|
||||||
|
assert_eq(["azx", "b"], rblf.mkpatsubst("az", "AZ", ["azx", "b"]))
|
||||||
|
assert_eq("ABC", rblf.mkpatsubst("abc", "ABC", "abc"))
|
||||||
|
|
||||||
globals, config = rblf.product_configuration("test/device", init)
|
globals, config = rblf.product_configuration("test/device", init)
|
||||||
assert_eq(
|
assert_eq(
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user