% % Copyright (C) 1997 Thomas Nordin and Alastair Reid % \begin{code} module Main(main) where import Package import System( getArgs ) import GetOptSOF import Process( processFile ) import Target( Target(..) ) import ListUtils( split, dropSuffix ) \end{code} %************************************************************************ %* * \subsection{Main program} %* * %************************************************************************ Driver code. \begin{code} main = do argv <- getArgs greencard (snd (getOpts options [] argv)) main2 str = greencard (snd (getOpts options [] (words str))) tstg file = main2 (unwords [file, "--debug", "--include-dir .", "--target ghc"]) tstn file = main2 (unwords [file, "--debug", "--include-dir .", "--target nhc98"]) tsth file = main2 (unwords [file, "--debug", "--include-dir .", "--target Hugs"]) greencard :: [CLIOptions] -> IO () greencard opts = if optversion then putStrLn ver else if opthelp then putStrLn usage else case optfiles of [] -> putStrLn usage (fname:_) -> case targets of ["Hugs"] -> greencard' Hugs fname ["ghc"] -> greencard' GHC fname ["nhc98"]-> greencard' NHC fname ["nhc13"]-> greencard' NHC fname [] -> greencard' NHC fname _ -> putStrLn " must be `Hugs' or `ghc' or `nhc98' or `nhc13'" where greencard' target fname = processFile target optdebug optverbose ("./" : optincludedirs) (dropSuffix fname ".gc") optCsuffix ver = name ++ " " ++ version usage = "Usage: green-card [OPTION]... FILE..." optversion = any (DumpVersion==) opts opthelp = any (DumpHelp==) opts optdebug = any (DumpDebug==) opts optverbose = any (DumpVerbose==) opts optgcsafe = any (DumpGCSafe==) opts targets = [t | OptTarget t <- opts ] optfiles = [f | OptFile f <- opts] optCsuffix = head [x | OptCSuffix x <- opts] optincludedirs = map ensuredir $ [d | OptIncludeDirs d <- reverse opts] --map ensuredir $ concat [split ':' d | OptIncludeDirs d <- reverse opts] ensuredir d = case reverse d of ('/':_) -> d _ -> d++"/" \end{code} The command-line options recognised by Green Card. \begin{code} options = (prefixed "-" $ opts [prefixed "-" $ opts ["version" -= DumpVersion, "help" -= DumpHelp, "debug" -= DumpDebug, "verbose" -= DumpVerbose, "fgc-safe" -= DumpGCSafe, "target" -=== OptTarget, "include-dir" -=== OptIncludeDirs, "c-suffix" -=== OptCSuffix ], "h" -= DumpHelp, "d" -= DumpDebug, "v" -= DumpVerbose, "g" -= DumpGCSafe, "t" -== OptTarget, "i" -== OptIncludeDirs, "I" -== OptIncludeDirs, "P" -== OptIncludeDirs ]) `orOpt` ((const True) -? OptFile) data CLIOptions = DumpVersion | DumpHelp | DumpDebug | DumpVerbose | DumpGCSafe | OptTarget String | OptCSuffix String | OptIncludeDirs String | OptFile String deriving Eq \end{code}