X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;ds=sidebyside;f=perl.ml;h=23bc8331504f3abd80e2d94bba0134afbde351ed;hb=186f65548798769d55c2581b55b41ce1bbd6fe90;hp=da811c0a878f73da6f9b596fddceecc9b50595e7;hpb=721a6cf6a40bbb25c7f878e89d18a6c0cfdd9109;p=perl4caml.git diff --git a/perl.ml b/perl.ml index da811c0..23bc833 100644 --- a/perl.ml +++ b/perl.ml @@ -1,18 +1,14 @@ (* Interface to Perl from OCaml. * Copyright (C) 2003 Merjis Ltd. - * $Id: perl.ml,v 1.7 2003-10-16 08:54:56 rich Exp $ + * $Id: perl.ml,v 1.13 2005-01-28 23:09:31 rich Exp $ *) -type t - type sv type av +type hv exception Perl_failure of string -external create : ?args:string array -> unit -> t - = "perl4caml_create" - (* Initialization. This must happen first, otherwise other parts of the * program will segfault because of a missing interpreter. *) @@ -20,28 +16,17 @@ external c_init : unit -> unit = "perl4caml_init" let () = Callback.register_exception "perl4caml_perl_failure" (Perl_failure ""); c_init (); (* Initialise C code. *) - (* Create the default interpreter. *) - create ~args:[| ""; "-w"; "-e"; "0" |] (); () -external current_interpreter : unit -> t - = "perl4caml_current_interpreter" - -external destroy : t -> unit - = "perl4caml_destroy" - -external set_context : t -> unit - = "perl4caml_set_context" - external int_of_sv : sv -> int = "perl4caml_int_of_sv" external sv_of_int : int -> sv = "perl4caml_sv_of_int" -external float_of_sv : sv -> int = "perl4caml_float_of_sv" -external sv_of_float : int -> sv = "perl4caml_sv_of_float" +external float_of_sv : sv -> float = "perl4caml_float_of_sv" +external sv_of_float : float -> sv = "perl4caml_sv_of_float" external string_of_sv : sv -> string = "perl4caml_string_of_sv" external sv_of_string : string -> sv = "perl4caml_sv_of_string" external sv_is_true : sv -> bool = "perl4caml_sv_is_true" -external sv_is_undef : sv -> bool = "perl4caml_sv_is_undef" external sv_undef : unit -> sv = "perl4caml_sv_undef" +external sv_is_undef : sv -> bool = "perl4caml_sv_is_undef" external sv_yes : unit -> sv = "perl4caml_sv_yes" external sv_no : unit -> sv = "perl4caml_sv_no" @@ -76,8 +61,17 @@ let string_of_sv_t = function | SVt_PVGV -> "SVt_PVGV" | SVt_PVMG -> "SVt_PVMG" +external address_of_sv : sv -> Nativeint.t = "perl4caml_address_of_sv" +external address_of_av : av -> Nativeint.t = "perl4caml_address_of_av" +external address_of_hv : hv -> Nativeint.t = "perl4caml_address_of_hv" + +external scalarref : sv -> sv = "perl4caml_scalarref" +external arrayref : av -> sv = "perl4caml_arrayref" +external hashref : hv -> sv = "perl4caml_hashref" + external deref : sv -> sv = "perl4caml_deref" external deref_array : sv -> av = "perl4caml_deref_array" +external deref_hash : sv -> hv = "perl4caml_deref_hash" external av_empty : unit -> av = "perl4caml_av_empty" external av_of_sv_list : sv list -> av = "perl4caml_av_of_sv_list" @@ -99,8 +93,27 @@ let av_map f av = done; List.rev !list +let list_of_av av = + let list = ref [] in + for i = 0 to av_length av - 1 do + list := av_get av i :: !list + done; + List.rev !list + +let av_of_string_list strs = + av_of_sv_list (List.map sv_of_string strs) + +external hv_empty : unit -> hv = "perl4caml_hv_empty" +external hv_set : hv -> string -> sv -> unit = "perl4caml_hv_set" +external hv_get : hv -> string -> sv = "perl4caml_hv_get" +external hv_exists : hv -> string -> bool = "perl4caml_hv_exists" +external hv_delete : hv -> string -> unit = "perl4caml_hv_delete" +external hv_clear : hv -> unit = "perl4caml_hv_clear" +external hv_undef : hv -> unit = "perl4caml_hv_undef" + external get_sv : ?create:bool -> string -> sv = "perl4caml_get_sv" external get_av : ?create:bool -> string -> av = "perl4caml_get_av" +external get_hv : ?create:bool -> string -> hv = "perl4caml_get_hv" external call : ?sv:sv -> ?fn:string -> sv list -> sv = "perl4caml_call"