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