David Sankel wrote:

> Hello FFI experts,
> 
>   Say I have a function somewhere in c land with the following declaration:
> 
> void doStuff( int &a, int &b);

That isn't C. Are you referring to C++ references, or did you mean:

        void doStuff(int *a, int *b);

?

>   What would the appropriate Haskell wrapper for this function look like? 
> I'm looking to construct a haskell function of the type: 
> 
> doStuff :: Int -> Int -> IO( (Int,Int) )

The direct translation would be:

        Ptr CInt -> Ptr CInt -> IO ()

Higher level interfaces, such as the one which you suggest, could be
built upon that, e.g.:

        import Foreign.C(CInt)
        import Foreign.Ptr(Ptr)
        import Foreign.Marshal.Utils(with)
        import Foreign.Storable(peek)
        
        foreign import ccall doStuff :: Ptr CInt -> Ptr CInt -> IO ()
        
        doStuff' :: Int -> Int -> IO (Int,Int)
        doStuff' x y = do
         with (fromIntegral x) $ \px ->
          with (fromIntegral y) $ \py -> do
           doStuff px py
           x' <- peek px
           y' <- peek py
           return (fromIntegral x', fromIntegral y')

-- 
Glynn Clements <[EMAIL PROTECTED]>
_______________________________________________
FFI mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/ffi

Reply via email to