module Main where
import Data.List
import Language.C
import Language.C.Analysis.AstAnalysis
import Language.C.Analysis.TravMonad
import Language.C.System.GCC
import System.Environment
import System.IO
import System.Exit
processFile :: CLanguage -> [String] -> FilePath -> IO ()
processFile lang cppOpts file =
do hPutStr stderr $ file ++ ": "
result <- parseCFile (newGCC "gcc") Nothing cppOpts file
case result of
Left err -> do
hPutStrLn stderr ('\n' : show err)
hPutStrLn stderr "Failed: Parse Error"
exitWith (ExitFailure 1)
Right tu -> case runTrav_ (body tu) of
Left errs -> mapM_ (hPutStrLn stderr) ("Error" : map show errs)
Right (_,errs) -> mapM_ (hPutStrLn stderr) ("Success" : map show errs)
where body tu = do modifyOptions (\opts -> opts { language = lang })
analyseAST tu
main :: IO ()
main =
do args <- getArgs
let (cppOpts, files) = partition (isPrefixOf "-") args
mapM_ (processFile GNU99 cppOpts) files