Split Fugu .h and .c generation
[barrelfish] / tools / fugu / Main.lhs
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)