llvm-base-3.0.0.0: tools/DiffFFI.hs
module DiffFFI (main) where
import Control.Monad (forM_)
import Data.List (foldl')
import qualified Data.Map as M
import System.Environment (getArgs)
import System.Exit (exitFailure)
import System.IO (hPutStrLn, stderr)
import Text.Regex.Posix ((=~))
import FunctionMangulation (pattern, rewriteFunction)
cFunctions :: String -> M.Map String String
cFunctions s = foldl' go M.empty (s =~ pattern)
where go m (_:ret:name:params:_) =
M.insert ("LLVM" ++ name) (rewriteFunction ret name params) m
go m _ = m
hsFunctions :: String -> M.Map String String
hsFunctions s = foldl' go M.empty (s =~ pat)
where pat = "\"([a-zA-Z0-9_]+)\"[ \t\n]+([a-zA-Z0-9_']+)"
go m (_:cname:hsname:_) = M.insert cname hsname m
go m _ = m
main :: IO ()
main = do
args <- getArgs
case args of
[cFile, hsFile] -> do
c <- cFunctions `fmap` readFile cFile
hs <- hsFunctions `fmap` readFile hsFile
putStrLn "In C, not Haskell:"
forM_ (M.toAscList $ M.difference c hs) $ \(_, hsfunc) ->
putStrLn hsfunc
putStrLn "In Haskell, not C:"
forM_ (M.keys $ M.difference hs c) $ putStrLn . (" "++)
_ -> do
hPutStrLn stderr "Usage: DiffFFI cFile hsFile"
exitFailure