> On 21 Jan. 2018, at 10:17, Jeremy Yallop <[email protected]> wrote: > > On 20 January 2018 at 22:08, john skaller <[email protected]> wrote: >> According to Real World Ocaml string_of_char_ptr can be used to convert a >> C char* to an Ocaml string. But I can’t find it anywhere in the API! >> >> Any clues? > > I don't think that function is exposed in the API, at least in recent > versions.
It’s not, its in the repository in an *.ml file which is not exposed, its used to define a view. One supplies read and write functions to views, but is there a way to get them back? The API is too abstract. I’d have used a concrete record :) > But if you have a 'char ptr' value 'p' then you can convert > it to a string using 'coerce': > > coerce (ptr char) string p > > For example: > > # let getenv = foreign "getenv" (string @-> returning (ptr char));; > val getenv : string -> char Ctypes_static.ptr = <fun> > # let p = getenv "USER";; > val p : char Ctypes_static.ptr = (char*) 0x7ffe712cd9f8 > # coerce (ptr char) string p;; > - : string = “jeremy" Ouch. That doesn’t make sense. I mean I’m happy that it will do the job, thanks for the info! But that’s not what a C programmer would think of as a coercion. Pointers and what they point at are distinct. Sigh .. of course now I am binding a function that returns a char* and of course the docs don’t say who owns the storage. Is it in a static buffer? Part of another data structure? Malloc()’d and therefore I have to free it? The usual problem with C: the fuctional API is weakly specified and the resource management isn’t specified at all ;) Off to troll the *.c files to see how its implemented… argghhh… — john skaller [email protected] http://felix-lang.org _______________________________________________ Ctypes mailing list [email protected] http://lists.ocaml.org/listinfo/ctypes
