packages feed

uhc-light-1.1.8.5: src-main/EHCRun.hs

module Main
where
import UHC.Light.Compiler.EHC.Main
import UHC.Light.Compiler.EHC.Main.Utils
import UHC.Light.Compiler.Base.API
import UHC.Light.Compiler.CoreRun.API
import UHC.Util.Pretty
import UHC.Util.FPath
import System.Exit
import System.FilePath
import System.Console.GetOpt
import System.IO
import Control.Monad
import System.Environment
import Data.List
import qualified Data.ByteString.Char8 as B

{-# LINE 31 "src/ehc/EHCRun.chs" #-}
-- | Top level main. TBD: hooks & customization
main :: IO ()
main = do
    args <- getArgs
    progName <- getProgName
    let opts0         = defaultEHCOpts
                          {ehcProgName = mkFPath progName}
        oo@(o,n,errs) = ehcrunCmdLineOptsApply args opts0
        opts          = maybe opts0 id o

    case ehcOptImmQuit opts of
      Just immq     -> handleImmQuitOption ehcrunCmdLineOpts ["rcr", "cr"] immq opts
      _             -> case (n,errs) of
        ([fname], []) -> do
          let (bname,ext) = splitExtension fname
          case ext of
            ".rcr" -> runRCR opts fname
            ".cr"  -> mainEHC $ opts
                        { ehcOptMbTarget = JustOk Target_None_Core_AsIs
                        , ehcOptCoreOpts = CoreOpt_Run : ehcOptCoreOpts opts
                        , ehcOptOptimizationScope = OptimizationScope_WholeCore
                        , ehcOptVerbosity = VerboseQuiet
                        }
            _      -> return ()
        (_      , es) -> do
          putStr (head errs)
          exitFailure

  where runRCR opts fname = do
            inp <- B.readFile fname
            case parseModFromString $ B.unpack inp of
              Left  es  -> forM_ es putStrLn
              Right mod -> do
                res <- runCoreRunIO opts mod
                case res of
                  Left  e   -> putStrLn $ show $ pp e
                  Right val -> putStrLn $ show $ pp val