Re: C strings in O'Caml

From: Xavier Leroy (Xavier.Leroy@inria.fr)
Date: Wed May 14 1997 - 18:14:52 MET DST


From: Xavier Leroy <Xavier.Leroy@inria.fr>
Message-Id: <199705141614.SAA19082@pauillac.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"
To: Jean-Christophe.Filliatre@ens-lyon.fr
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