1%include polycode.fmt 2 3%if false 4 Error: DSL for error definition 5 6 Copyright (c) 2009 ETH Zurich. 7 All rights reserved. 8 9 This file is distributed under the terms in the attached LICENSE file. 10 If you do not find this file, copies can be found by writing to: 11 ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group. 12%endif 13 14> module Main where 15 16> import Text.PrettyPrint.HughesPJ as Pprinter 17 18> import System.Environment 19> import System.Exit 20> import System.Console.GetOpt 21> import System.IO 22> import System.Random 23> import System.FilePath.Posix 24 25> import Data.Char 26> import qualified Data.Map as Map 27 28> import Expressions 29> import Compile 30> import IL.Paka.Syntax 31> import IL.Paka.Compile 32 33> import FuguBackend 34> import Parser 35 36> parseError :: Show a => a -> IO () 37> parseError err = do 38> hPutStrLn stderr "parse error at: " 39> hPutStrLn stderr (show err) 40> exitWith (ExitFailure 1) 41 42> main :: IO () 43> main = do 44> argv <- System.Environment.getArgs 45> case argv of 46> [ inF, "-h", hdrF ] -> do 47> input <- Parser.parse inF 48> case input of 49> Left err -> parseError err 50> Right ast -> do 51> let macro = "__" ++ 52> map toUpper (takeBaseName inF) ++ 53> "_BARRELFISH__" 54> let gen = mkStdGen 1 55> let code = compile (backendCode gen ast) 56> let header_ = compile (backendHeader gen ast) 57> let header = header_ { prototypes = prototypes code 58> `Map.union` 59> prototypes header_ } 60> fileH <- openFile hdrF WriteMode 61> let pre = "#ifndef " ++ macro ++ "\n" ++ 62> "#define " ++ macro ++ "\n" 63> let post = "\n#endif // " ++ macro 64> hPutStr fileH pre 65> hPutStr fileH $ show $ header 66> hPutStrLn fileH post 67> hClose fileH 68> [ inF, "-c", codeF ] -> do 69> input <- Parser.parse inF 70> case input of 71> Left err -> parseError err 72> Right ast -> do 73> let gen = mkStdGen 1 74> let code = compile (backendCode gen ast) 75> fileC <- openFile codeF WriteMode 76> hPutStr fileC "#include <errors/errno.h>\n" 77> hPutStr fileC "#include <assert.h>\n" 78> hPutStrLn fileC $ show $ 79> code { prototypes = Map.empty, 80> functions = Map.filterWithKey 81> (\n _ -> n /= "err_no" && 82> n /= "err_is_fail") $ 83> functions code } 84> hClose fileC 85> otherwise -> do 86> hPutStrLn stderr 87> "Usage: fugu input.fugu (-h output.h | -c output.c)" 88> exitWith (ExitFailure 1) 89