[Haskell-cafe] c2hs, size_t, and CSize -- argh!

Duncan Coutts duncan.coutts at googlemail.com
Thu Oct 1 15:23:31 EDT 2009


On Thu, 2009-10-01 at 13:00 -0400, John Van Enk wrote:
> Hi Duncan,
> 
> Yes, I forgot to leave out that I'd like to see 'size_t' mapped to
> CSize.
> 
> As a (dirty) workaround, one can use 'castPtr' as the marshaler when
> dealing with pointers to 'size_t'. I'm a little more concerned about
> FunPtr's (though 'castPtr' still makes the issue go away).
> 
> Here's my specific case dealing with function pointers:

Ohhh, if you're dealing with pointers to CSize then it's easy, c2hs
supports that directly. See the c2hs user guide section on the pointer
hook.

{# pointer *size_t as CSizePtr -> CSize #}

This tells c2hs that when it sees a *size_t type in a function argument
or result that it should be imported as Ptr CSize.

It generates a type alias and uses that when it imports functions eg:

{# pointer *size_t as CSizePtr -> CSize #}

foo :: Ptr CSize -> IO ()
foo = {# call foo as raw_foo #}

generates:

type CSizePtr = Ptr (CSize)

foo :: Ptr CSize -> IO ()
foo = raw_foo

foreign import ccall safe "foo.chs.h foo"
  raw_foo :: CSizePtr -> IO ()


Duncan



More information about the Haskell-Cafe mailing list