+(* Allow only safe functions from Filename. *)
+module Filename : sig
+ val current_dir_name : string
+ val parent_dir_name : string
+ val concat : string -> string -> string
+ val is_relative : string -> bool
+ val is_implicit : string -> bool
+ val check_suffix : string -> string -> bool
+ val chop_suffix : string -> string -> string
+ val chop_extension : string -> string
+ val basename : string -> string
+ val dirname : string -> string
+ val quote : string -> string
+end = struct include Filename end
+
+(* Allow only safe functions from Char. *)
+module Char : sig
+ external code : char -> int = "%identity"
+ val chr : int -> char
+ val escaped : char -> string
+ val lowercase : char -> char
+ val uppercase : char -> char
+ type t = char
+ val compare: t -> t -> int
+end = struct include Char end
+
+(* Allow only safe functions from Array. *)
+module Array : sig
+ external length : 'a array -> int = "%array_length"
+ external get : 'a array -> int -> 'a = "%array_safe_get"
+ external set : 'a array -> int -> 'a -> unit = "%array_safe_set"
+ external make : int -> 'a -> 'a array = "caml_make_vect"
+ external create : int -> 'a -> 'a array = "caml_make_vect"
+ val init : int -> (int -> 'a) -> 'a array
+ val make_matrix : int -> int -> 'a -> 'a array array
+ val create_matrix : int -> int -> 'a -> 'a array array
+ val append : 'a array -> 'a array -> 'a array
+ val concat : 'a array list -> 'a array
+ val sub : 'a array -> int -> int -> 'a array
+ val copy : 'a array -> 'a array
+ val fill : 'a array -> int -> int -> 'a -> unit
+ val blit : 'a array -> int -> 'a array -> int -> int -> unit
+ val to_list : 'a array -> 'a list
+ val of_list : 'a list -> 'a array
+ val iter : ('a -> unit) -> 'a array -> unit
+ val map : ('a -> 'b) -> 'a array -> 'b array
+ val iteri : (int -> 'a -> unit) -> 'a array -> unit
+ val mapi : (int -> 'a -> 'b) -> 'a array -> 'b array
+ val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b array -> 'a
+ val fold_right : ('b -> 'a -> 'a) -> 'b array -> 'a -> 'a
+ val sort : ('a -> 'a -> int) -> 'a array -> unit
+ val stable_sort : ('a -> 'a -> int) -> 'a array -> unit
+ val fast_sort : ('a -> 'a -> int) -> 'a array -> unit
+end = struct include Array end
+
+(* Allow only safe functions from Printf. *)
+module Printf : sig
+ val printf : ('a, out_channel, unit) format -> 'a
+ val sprintf : ('a, unit, string) format -> 'a
+end = struct include Printf end
+
+(* Allow only safe functions from Scanf. *)
+module Scanf : sig
+ module Scanning : sig
+ type scanbuf;;
+ val stdib : scanbuf;;
+ val from_string : string -> scanbuf;;
+ val from_function : (unit -> char) -> scanbuf;;
+ val end_of_input : scanbuf -> bool;;
+ val beginning_of_input : scanbuf -> bool;;
+ val name_of_input : scanbuf -> string;;
+ end;;
+ exception Scan_failure of string;;
+ type ('a, 'b, 'c, 'd) scanner =
+ ('a, Scanning.scanbuf, 'b, 'c, 'a -> 'd, 'd) format6 -> 'c;;
+ val bscanf : Scanning.scanbuf -> ('a, 'b, 'c, 'd) scanner;;
+ val sscanf : string -> ('a, 'b, 'c, 'd) scanner;;
+ val scanf : ('a, 'b, 'c, 'd) scanner;;
+ val kscanf :
+ Scanning.scanbuf -> (Scanning.scanbuf -> exn -> 'd) ->
+ ('a, 'b, 'c, 'd) scanner;;
+ val bscanf_format :
+ Scanning.scanbuf -> ('a, 'b, 'c, 'd, 'e, 'f) format6 ->
+ (('a, 'b, 'c, 'd, 'e, 'f) format6 -> 'g) -> 'g;;
+ val sscanf_format :
+ string -> ('a, 'b, 'c, 'd, 'e, 'f) format6 ->
+ (('a, 'b, 'c, 'd, 'e, 'f) format6 -> 'g) -> 'g;;
+ val format_from_string :
+ string ->
+ ('a, 'b, 'c, 'd, 'e, 'f) format6 -> ('a, 'b, 'c, 'd, 'e, 'f) format6;;
+end = struct include Scanf end
+
+(* Set and Map. *)
+module StringSet = Set.Make(String)
+module StringMap = Map.Make(String)
+
+(* Create an object, so we get the CamlinternalOO module ... *)
+let _ = object end
+
+(* ... but prevent public access to CamlinternalOO. *)
+module CamlinternalOO = struct end