[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | Xavier Leroy <Xavier.Leroy@i...> |
| Subject: | Re: C strings in O'Caml |
> I'm interfacing a C library in O'Caml and I faced the following > problem. I have a C string declared in the library, and I want to see > it as a Caml string. Is it possible to do it without copying it ? If you have control over the allocation of the string, then you can put a Caml string header in the word preceding the beginning of the string, and twiddle the last byte of the last word of the string as described in byterun/alloc.c. Then, you can just pass the char * as a Caml value and any Caml code should work on it quite happily. (The char * pointer must be word-aligned, by the way.) If the C string is allocated outside of your code (e.g. in a library), then you can't fully disguise it as a Caml string. You can still return the char * as a Caml value (provided it's word-aligned), but you can't use String.length neither any of the "safe" string functions (those that checks the bounds) on this string. You can still use the undocumented (and highly unsafe) String.unsafe_get, String.unsafe_set, String.unsafe_blit and String.unsafe_fill on that pseudo Caml string. Just be very, very careful with out-of-bounds accesses. - Xavier Leroy