functor (String : String->
  functor
    (Buffer : sig
                type string = String.t
                type t
                exception Full
                val create : int -> t
                val add_uchar : t -> int -> unit
                val clear : t -> unit
                val contents : t -> string
                val length : t -> int
              end->
    sig
      type string = String.t
      type encoding =
          [ `ISO_8859_1
          | `US_ASCII
          | `UTF_16
          | `UTF_16BE
          | `UTF_16LE
          | `UTF_8 ]
      type dtd = string option
      type name = string * string
      type attribute = name * string
      type tag = name * attribute list
      type signal =
          [ `Data of string | `Dtd of dtd | `El_end | `El_start of tag ]
      val ns_xml : string
      val ns_xmlns : string
      type pos = int * int
      type error =
          [ `Expected_char_seqs of string list * string
          | `Expected_root_element
          | `Illegal_char_ref of string
          | `Illegal_char_seq of string
          | `Malformed_char_stream
          | `Max_buffer_size
          | `Unexpected_eoi
          | `Unknown_encoding of string
          | `Unknown_entity_ref of string
          | `Unknown_ns_prefix of string ]
      exception Error of pos * error
      val error_message : error -> string
      type source =
          [ `Channel of in_channel
          | `Fun of unit -> int
          | `String of int * std_string ]
      type input
      val make_input :
        ?enc:encoding option ->
        ?strip:bool ->
        ?ns:(string -> string option) ->
        ?entity:(string -> string option) -> source -> input
      val input : input -> signal
      val input_tree :
        el:(tag -> 'a list -> 'a) -> data:(string -> 'a) -> input -> 'a
      val input_doc_tree :
        el:(tag -> 'a list -> 'a) -> data:(string -> 'a) -> input -> dtd * 'a
      val peek : input -> signal
      val eoi : input -> bool
      val pos : input -> pos
      type 'a frag = [ `Data of string | `El of tag * 'a list ]
      type dest =
          [ `Buffer of std_buffer
          | `Channel of out_channel
          | `Fun of int -> unit ]
      type output
      val make_output :
        ?decl:bool ->
        ?nl:bool ->
        ?indent:int option ->
        ?ns_prefix:(string -> string option) -> dest -> output
      val output_depth : output -> int
      val output : output -> signal -> unit
      val output_tree : ('-> 'a frag) -> output -> '-> unit
      val output_doc_tree : ('-> 'a frag) -> output -> dtd * '-> unit
    end