clr-host-0.1.0.0: src/Clr/Host.hs
{-# LANGUAGE CPP, RankNTypes #-}
module Clr.Host where
import Clr.Host.Config
#ifdef HAVE_MONO
import Clr.Host.Mono
#endif
#ifdef HAVE_DOTNET
import Clr.Host.DotNet
#endif
import Foreign.Ptr
import Data.Word
type GetPtrToMethod a = Ptr Word16 -> IO (FunPtr a)
type GetPtrToMethodFunPtr a = FunPtr (GetPtrToMethod a)
foreign import ccall "clrHost.c getPointerToMethod_set" getPtrToMethod_set :: GetPtrToMethodFunPtr a -> IO ()
foreign import ccall "clrHost.c getPointerToMethod_get" getPtrToMethod_get :: IO (GetPtrToMethodFunPtr a)
startClr :: IO ()
startClr = do
ClrHostConfig hostType <- getClrHostConfig
getPtrToMethod <- case hostType of
#ifdef HAVE_MONO
ClrHostMono -> startHostMono
#else
ClrHostMono -> error "not built with Mono support enabled"
#endif
#ifdef HAVE_DOTNET
ClrHostDotNet -> startHostDotNet
#else
ClrHostDotNet -> error "not built with .Net support enabled"
#endif
if getPtrToMethod == nullFunPtr then
error "Failed to boot the driver"
else
getPtrToMethod_set getPtrToMethod
stopClr :: IO ()
stopClr = putStrLn "stopClr"