content: 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
  