module Language.Preprocessor.Cpphs.RunCpphs ( runCpphs ) where
import Language.Preprocessor.Cpphs.CppIfdef (cppIfdef)
import Language.Preprocessor.Cpphs.MacroPass(macroPass)
import Language.Preprocessor.Cpphs.Options(CpphsOption(..), parseOption)
import Language.Preprocessor.Unlit as Unlit (unlit)
runCpphs :: [CpphsOption] -> FilePath -> String -> IO String
runCpphs opts filename input = do
let ds = [x | CpphsMacro x <- opts]
is = [x | CpphsPath x <- opts]
macro = not (CpphsNoMacro `elem` opts)
locat = not (CpphsNoLine `elem` opts)
lang = not (CpphsText `elem` opts)
strip = CpphsStrip `elem` opts
ansi = CpphsAnsi `elem` opts
layout= CpphsLayout `elem` opts
unlit = CpphsUnlit `elem` opts
let pass1 = cppIfdef filename ds is macro locat input
pass2 = macroPass ds strip ansi layout lang pass1
result = if not macro then unlines (map snd pass1) else pass2
pass3 = if unlit then Unlit.unlit filename result else result
return pass3