import Char(ord, chr)
import CString(packString, unpackCStringIO)
import IO(Handle)
-import IOExts(IORef, newIORef, readIORef, writeIORef, unsafePerformIO)
+import IOExts(IORef, newIORef, readIORef, writeIORef, unsafePerformIO, freeHaskellFunctionPtr)
import Maybe(fromMaybe)
import Monad(when)
import Posix(intToFd, fdToHandle)
rlInitialize :: IO ()
rlInitialize = rlSetReadlineName =<< getProgName
-foreign import ccall "free" free :: Addr -> IO ()
-foreign import ccall "readline" readlineAux :: ByteArray Int -> IO Addr
+foreign import "free" unsafe free :: Addr -> IO ()
+foreign import "readline" unsafe readlineAux :: ByteArray Int -> IO Addr
readline :: String -- Prompt String
-> IO (Maybe String) -- Just returned line or Nothing if EOF
free cstr
return (Just str)
-foreign import ccall "add_history" add_history :: ByteArray Int -> IO ()
+foreign import "add_history" unsafe add_history :: ByteArray Int -> IO ()
addHistory :: String -- String to enter in history
-> IO ()
addHistory = add_history . packString
-foreign export ccall dynamic mkRlCallback :: (Int -> Int -> IO Int) -> IO Addr
-foreign import ccall "rl_bind_key" rl_bind_key :: Int -> Addr -> IO Int
+foreign export dynamic mkRlCallback :: (Int -> Int -> IO Int) -> IO Addr
+foreign import "rl_bind_key" rl_bind_key :: Int -> Addr -> IO Int
rlBindKey :: KeyCode -- Key to Bind to
-> RlCallbackFunction -- Function to exec on execution
ok <- rl_bind_key (ord key) cbAddr
if ok /= 0 then wrongKeyCode else addCbackEntry key cbAddr
-foreign import ccall "rl_add_defun" rl_add_defun :: ByteArray Int -> Addr -> Int -> IO Int
+foreign import "rl_add_defun" unsafe rl_add_defun :: ByteArray Int -> Addr -> Int -> IO Int
rlAddDefun :: String -> -- Function Name
RlCallbackFunction -> -- Function to call
theCbackTable :: IORef [(KeyCode,Addr)]
theCbackTable = unsafePerformIO (newIORef [])
-foreign import ccall "freeHaskellFunctionPtr" freeHaskellFunctionPtr :: Addr -> IO ()
-
addCbackEntry :: KeyCode -> Addr -> IO ()
addCbackEntry key cbAddr = do
cbackTable <- readIORef theCbackTable
import Maybe
import PrelIOBase
import PosixUtil (fdToInt)
-
\end{code}
This stuff should really be done using HDirect.
f <- handleToFd h
return (f,h)
-foreign import "selectFrom__"
+foreign import "selectFrom__" unsafe
selectFrom__ :: ByteArray Int
-> ByteArray Int
-> ByteArray Int
ba <- stToIO (unsafeFreezeByteArray ba)
return (x, ba)
-foreign import "is_fd_set__"
+foreign import "is_fd_set__" unsafe
is_fd_set :: ByteArray Int -> Int -> IO Int
-foreign import "fd_zero__"
+foreign import "fd_zero__" unsafe
fd_zero :: MutableByteArray RealWorld Int -> IO ()
-foreign import "fd_set__"
+foreign import "fd_set__" unsafe
fd_set :: MutableByteArray RealWorld Int -> Int -> IO ()
-foreign import "sizeof_fd_set__"
+foreign import "sizeof_fd_set__" unsafe
sizeof_fd_set :: Int
\end{code}