module WASHGenerator (preprocess, preprocessPIPE) where { import List; import IO; import WASHData ; import Text.ParserCombinators.Parsec hiding (try) ; import qualified WASHParser ; import qualified WASHExpression ; import qualified WASHClean ; import WASHFlags ; -- import Trace; preprocess :: FLAGS -> String -> String -> String -> IO (); preprocess flags srcName dstName globalDefs = bracket (openFile srcName ReadMode) (\ srcHandle -> hClose srcHandle) (\ srcHandle -> bracket (openFile dstName WriteMode) (\ dstHandle -> hClose dstHandle) (\ dstHandle -> preprocessPIPE flags srcName srcHandle dstHandle globalDefs)); preprocessPIPE :: FLAGS -> String -> Handle -> Handle -> String -> IO (); preprocessPIPE flags srcName srcHandle dstHandle globalDefs = do { input <- hGetContents srcHandle; let { parsing = parse WASHParser.washfile srcName input }; case parsing of { Left error -> ioError $ userError $ show error; Right washfile -> hPutStrLn dstHandle (postprocess $ file flags globalDefs washfile ""); }; }; file :: FLAGS -> String -> [CodeFrag] -> ShowS ; file flags globalDefs fcode = WASHExpression.code flags (WASHClean.cleanCodeFragList fcode) . showString globalDefs . showString "\n" ; imports :: [String] -> String ; imports is = concat $ map (\m -> "import " ++ m ++ ";\n") is ; postprocess :: String -> String ; postprocess = unlines . postprocess' . lines ; postprocess' :: [String] -> [String] ; postprocess' [] = [] ; postprocess' xs'@(x:xs) = if "import" `isPrefixOf` x then "import qualified WASH.CGI.CGI as CGI" : xs' else x : postprocess' xs ; }