module Main (main) where
import FunctionMangulation (pattern, rewriteFunction)
import Text.Regex.Posix ((=~))
import qualified Data.Map as Map
import Data.Map (Map)
import Data.Maybe (mapMaybe)
import Control.Monad (forM_)
import System.Environment (getArgs)
import System.Exit (exitFailure)
import System.IO (hPutStrLn, stderr)
cFunctions :: String -> Map String String
cFunctions s =
let f (_:ret:name:params:_) =
Just ("LLVM" ++ name, rewriteFunction ret name params)
f _ = Nothing
in Map.fromList $ mapMaybe f (s =~ pattern)
hsFunctions :: String -> Map String String
hsFunctions s =
let pat = "\"([a-zA-Z0-9_]+)\"[ \t\n]+([a-zA-Z0-9_']+)"
f (_:cname:hsname:_) = Just (cname, hsname)
f _ = Nothing
in Map.fromList $ mapMaybe f (s =~ pat)
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_ (Map.toAscList $ Map.difference c hs) $ \(_, hsfunc) ->
putStrLn hsfunc
putStrLn "In Haskell, not C:"
forM_ (Map.keys $ Map.difference hs c) $ putStrLn . (" "++)
_ -> do
hPutStrLn stderr "Usage: DiffFFI cFile hsFile"
exitFailure