Sat, 06 Jan 2001 21:58:26 +1100, Manuel M. T. Chakravarty <chak@cse.unsw.edu.au> pisze:
type CString = Ptr CChar type CStringLen = (CString, Int)
Hmmm, yes, although pointer/length pairs are not very common in C and this module is a language dependent module (and so should be called `MarshalCString').
I added the explicit-length variants when I needed them for the Python interface, after I realized that it's not possible to express them with variants which always stoped on input '\0' and didn't mark the output length besides writing a '\0'. The '\0' variants are now small wrappers around the explicit-length variants.
But SimonM said that he doesn't want to make errno Haskell thread local...
It would force wrapping every C function which may set errno in another C function which returns the error in a thred-safe way. The wrapper would have to check for errno and pass it in some way to Haskell together with the proper result - either through a pointer (which needs extra alloca per C function call) or special thread-local variables. It would be really bad to not have thread-local errno.
withObject :: Storable a => a -> (Ptr a -> IO b) -> IO b
BTW, can't we just use `with' now. IIRC, the only reason Marcin used `withObject' was because of a clash with the implicit parameter extension.
Indeed.
This has been changed now, hasn't it?
Everybody agreed that "let" should be used instead of "with", but the change has not been made yet.
There is one exception: MarshalCString shouldn't be re-exported by Foreign (like CTypes).
If language separation is realistic, we would also keep errno handling outside basic Foreign. But it yields several separate C-specific modules... module CForeign? It would reexport Foreign, CTypes, CTypesISO, MarshalCString and CErrors (or whatever they will be called). BTW, why are CTypes and CTypesISO separate? -- __("< Marcin Kowalczyk * qrczak@knm.org.pl http://qrczak.ids.net.pl/ \__/ ^^ SYGNATURA ZASTÊPCZA QRCZAK