From: Xavier Leroy <Xavier.Leroy@inria.fr>
Subject: Re: C strings in O'Caml
In-Reply-To: <199705130659.IAA22102@anjou.ens-lyon.fr> from Jean-Christophe Filliatre at "May 13, 97 08:59:06 am"
Date: Wed, 14 May 1997 18:14:52 +0200 (MET DST)
> 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
This archive was generated by hypermail 2b29 : Sun Jan 02 2000 - 11:58:10 MET