{-# OPTIONS -cpp #-}
--
-- Copyright (c) 2004-5 Don Stewart - http://www.cse.unsw.edu.au/~dons
-- GPL version 2 or later (see http://www.gnu.org/copyleft/gpl.html)
--

--
-- | Runplugs: use hs-plugins to run a Haskell expression under
-- controlled conditions.
--
import System.Eval.Haskell      (unsafeEval_)

import Data.Maybe               (isJust, fromJust)
import Control.Monad            (when) 
import Control.Exception        (evaluate) 


import System.Exit              (exitWith, ExitCode(ExitSuccess))
import System.IO                (hGetContents, hPutStrLn, putStrLn, hClose, stdin, stdout, stderr)
#if !defined(CYGWIN) && !defined(__MINGW32__)
import System.Posix.Resource    (setResourceLimit,
			         Resource(ResourceCPUTime), 
                                 ResourceLimits(ResourceLimits),
			         ResourceLimit(ResourceLimit))
import Control.Concurrent           ( forkIO )
import qualified Control.Exception  ( evaluate )

rlimit = ResourceLimit 3
#endif

context = prehier ++ datas ++ controls

prehier = ["Char", "List", "Maybe", "Numeric", "Random" ]

datas   = map ("Data." ++) [
                "Bits", "Bool", "Char", "Dynamic", "Either", 
                "Graph", "Int", "Ix", "List", "Maybe", 
#if __GLASGOW_HASKELL__ >= 604
                "Map",
#else
                "FiniteMap",
#endif
                "Ratio", "Set", "Tree", "Tuple", "Typeable", "Word" 
              ]

controls = map ("Control." ++) ["Monad", "Arrow"]

--
-- with ghc 6.4, ghc doesn't seem to be able to call gcc, setNoFDBlocking fails.
--
-- *** Assembler
-- gcc -I/tmp -c /tmp/ghc11596.s -o /tmp/MySzQ14137.o
-- 
-- Failed: gcc -I/tmp -c /tmp/ghc11596.s -o /tmp/MySzQ14137.o
-- gcc: setNonBlockingFD: invalid argument (Bad file descriptor)
--
main = do
#if !defined(CYGWIN) && defined(__MINGW32__)
        setResourceLimit ResourceCPUTime (ResourceLimits rlimit rlimit)
#endif
        s <- hGetContents stdin
        when (not . null $ s) $ do
                s <- unsafeEval_ ("(take 2048 (show ("++s++")))") context ["-v"] [] []
                case s of
                        Left errs -> mapM_ putStrLn errs
                        Right s   -> putStrLn s
        exitWith ExitSuccess