{-# LINE 1 "src/System/Posix/IO/Select/FdSet/Internal.hsc" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LINE 2 "src/System/Posix/IO/Select/FdSet/Internal.hsc" #-}

-- Primed functions work on ForeignPtrs, unprimed work on FdSets.
module System.Posix.IO.Select.FdSet.Internal where

import Foreign.ForeignPtr.Safe
import Foreign.Ptr
import Foreign.Marshal.Utils
import Foreign.C.Types
import System.Posix.Types
import Misc

-- NOT an instance of storable. We treat fdset as opaque, maintaing only a pointer.
data FdSet = FdSet (ForeignPtr ()) Fd


{-# LINE 17 "src/System/Posix/IO/Select/FdSet/Internal.hsc" #-}

{-# LINE 18 "src/System/Posix/IO/Select/FdSet/Internal.hsc" #-}

{-# LINE 19 "src/System/Posix/IO/Select/FdSet/Internal.hsc" #-}

remove' :: Fd -> ForeignPtr () -> IO ()
remove' fd ptr = withForeignPtr ptr (c_fd_clr_wrapper (fromIntegral fd))
                            
insert' :: Fd -> ForeignPtr () -> IO ()
insert' fd ptr = withForeignPtr ptr (c_fd_set_wrapper (fromIntegral fd))

elem' :: Fd -> ForeignPtr () -> IO CInt
elem' fd ptr = withForeignPtr ptr (c_fd_isset_wrapper (fromIntegral fd))

pointer :: FdSet -> ForeignPtr ()
pointer (FdSet p _) = p

allocate' :: IO (ForeignPtr ())
allocate' = mallocForeignPtrBytes (128)
{-# LINE 34 "src/System/Posix/IO/Select/FdSet/Internal.hsc" #-}
-- debugging: putStrLn ("Allocating " ++ show #{size fd_set} ++ ".") >>  -- Remove when finished testing.

duplicate' :: ForeignPtr () -> IO (ForeignPtr ())
duplicate' ptr = allocate' >>= \newPtr ->
                 withForeignPtr ptr (\ptr' -> withForeignPtr newPtr (\newPtr' -> copyBytes newPtr' ptr' (128))) >>
{-# LINE 39 "src/System/Posix/IO/Select/FdSet/Internal.hsc" #-}
                 return newPtr

c_FD_SETSIZE :: Fd
c_FD_SETSIZE = 1024
{-# LINE 43 "src/System/Posix/IO/Select/FdSet/Internal.hsc" #-}

foreign import ccall "cbits.h fd_zero_wrapper"
        c_fd_zero_wrapper :: Ptr () -> IO ()

foreign import ccall "cbits.h fd_set_wrapper"
        c_fd_set_wrapper :: CInt -> Ptr () -> IO ()

foreign import ccall "cbits.h fd_clr_wrapper"
        c_fd_clr_wrapper :: CInt -> Ptr () -> IO ()

foreign import ccall "cbits.h fd_isset_wrapper"
        c_fd_isset_wrapper :: CInt -> Ptr () -> IO CInt