module Graphics.UI.GLUT.Raw.APIEntry (
Invoker, getAPIEntry, getAPIEntryInternal,
FunPtr, unsafePerformIO
) where
import Foreign.C.String
import Foreign.Marshal.Error
import Foreign.Ptr
import System.IO.Unsafe
#ifdef __HUGS__
#endif
type Invoker a = FunPtr a -> a
getAPIEntry :: String -> IO (FunPtr a)
getAPIEntry extensionEntry =
throwIfNullFunPtr ("unknown GLUT entry " ++ extensionEntry) $
getAPIEntryInternal extensionEntry
throwIfNullFunPtr :: String -> IO (FunPtr a) -> IO (FunPtr a)
throwIfNullFunPtr = throwIf (== nullFunPtr) . const
getAPIEntryInternal :: String -> IO (FunPtr a)
getAPIEntryInternal extensionEntry =
withCString extensionEntry hs_GLUT_getProcAddress
foreign import ccall unsafe "hs_GLUT_getProcAddress"
hs_GLUT_getProcAddress :: CString -> IO (FunPtr a)