module Lang.Crucible.LLVM.Intrinsics.Match
( TemplateMatcher(..)
, matches
, stripDarwinAliases
) where
import Control.Applicative (asum)
import qualified Data.List as List
import qualified Data.List.Extra as List (stripInfix)
import Data.Maybe (fromMaybe)
data TemplateMatcher
= ExactMatch String
| PrefixMatch String
| SubstringsMatch [String]
| DarwinAliasMatch String
matches ::
String ->
TemplateMatcher ->
Bool
matches :: String -> TemplateMatcher -> Bool
matches String
nm (ExactMatch String
x) = String
x String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
nm
matches String
nm (PrefixMatch String
pfx) = String
pfx String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`List.isPrefixOf` String
nm
matches String
nm (DarwinAliasMatch String
x) = String
x String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String -> String
stripDarwinAliases String
nm
matches String
nm (SubstringsMatch [String]
subs) = [String] -> String -> Bool
filterSubstrings [String]
subs String
nm
where
filterSubstrings :: [String] -> String -> Bool
filterSubstrings [] String
_ = Bool
True
filterSubstrings (String
a:[String]
as) String
xs =
case String -> String -> Maybe String
restAfterSubstring String
a String
xs of
Maybe String
Nothing -> Bool
False
Just String
rest -> [String] -> String -> Bool
filterSubstrings [String]
as String
rest
restAfterSubstring :: String -> String -> Maybe String
restAfterSubstring :: String -> String -> Maybe String
restAfterSubstring String
sub String
xs = [Maybe String] -> Maybe String
forall (t :: Type -> Type) (f :: Type -> Type) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum [ String -> String -> Maybe String
forall a. Eq a => [a] -> [a] -> Maybe [a]
List.stripPrefix String
sub String
tl | String
tl <- String -> [String]
forall a. [a] -> [[a]]
List.tails String
xs ]
stripDarwinAliases :: String -> String
stripDarwinAliases :: String -> String
stripDarwinAliases String
str =
let strNoPrefix :: String
strNoPrefix = String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe String
str (String -> String -> Maybe String
forall a. Eq a => [a] -> [a] -> Maybe [a]
List.stripPrefix String
"\01_" String
str) in
(String -> String -> String) -> String -> [String] -> String
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: Type -> Type) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\String
suf String
s ->
case String -> String -> Maybe (String, String)
forall a. Eq a => [a] -> [a] -> Maybe ([a], [a])
List.stripInfix String
suf String
s of
Just (String
before, String
after) -> String
before String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
after
Maybe (String, String)
Nothing -> String
s)
String
strNoPrefix
[String]
suffixes
where
suffixes :: [String]
suffixes :: [String]
suffixes = [ String
"$UNIX2003"
, String
"$INODE64"
, String
"$1050"
, String
"$NOCANCEL"
, String
"$DARWIN_EXTSN"
]