FPS: useAsCString variants

Donald Bruce Stewart dons at cse.unsw.edu.au
Fri Jul 14 03:23:23 EDT 2006


bulat.ziganshin:
> Hello Donald,
> 
> Friday, July 14, 2006, 8:11:22 AM, you wrote:
> 
> >> afaik, CStringLen don't require zero byte at the end of string. So the
> >> following implementation will be much faster and still correct (not
> >> tested, it's just sketch):
> 
> > Well spotted! I've applied this patch, with a tiny tweak (you missed a
> > withForeignPtr in useAsCStringLen).
> 
> thanks. after writing this letter i spotted unsafeUseAsCStringLen and
> used it. now i'm curious about having these 4 functions:
> 
> useAsCString
> useAsCStringLen
> unsafeUseAsCString
> unsafeUseAsCStringLen
> 
> and differences between their behavior. may be, it will be better to
> keep only first two functions, with semantics already implemented
> (with my patch) - `useAsCString` add zero byte while useAsCStringLen doesn't ?

Ok, the story is:

We'd like to be able to efficiently pass ByteStrings to C. However,
    * CString has to be null terminated
    * ByteStrings aren't null terminated.

So, we have:
    useAsCString,           which copies a ByteString, and adds a \0 byte, O(n)
    unafeUseAsCString,      zero-copy version, assumes there's already a null byte, O(1)

Now, on the other hand, we have the CStringLen type, which doesn't need
a null byte. The CString type is isomorphic to a ByteString, so:

    useAsCStringLen,        which is just a cast. O(1)
    unsafeUseAsCStringLen   is a synonym for useAsCStringLen. 

I've clarified the documentation for the CString functions to make this
clear.

Cheers,
  Don


More information about the Libraries mailing list