From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id LAA01071; Fri, 18 Jul 2003 11:40:34 +0200 (MET DST) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id LAA08248 for ; Fri, 18 Jul 2003 11:40:33 +0200 (MET DST) Received: from marble.he.net (marble.he.net [216.218.230.2]) by nez-perce.inria.fr (8.11.1/8.11.1) with ESMTP id h6I9eVT26779 for ; Fri, 18 Jul 2003 11:40:32 +0200 (MET DST) Received: from ucdavis.edu ([208.227.214.58] (may be forged)) by marble.he.net (8.8.6p2003-03-31/8.8.2) with ESMTP id CAA12580; Fri, 18 Jul 2003 02:40:31 -0700 Message-ID: <3F17C0A0.3010603@ucdavis.edu> Date: Fri, 18 Jul 2003 02:40:48 -0700 From: Issac Trotts User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.3) Gecko/20030319 Debian/1.3-3 X-Accept-Language: en MIME-Version: 1.0 To: caml-list@inria.fr CC: Chris Hecker Subject: Re: [Caml-list] string buffer as (in|out)_channel References: <4.3.2.7.2.20030717000026.026bcaa0@localhost> In-Reply-To: <4.3.2.7.2.20030717000026.026bcaa0@localhost> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Loop: caml-list@inria.fr X-Spam: no; 0.00; issac:01 trotts:01 ijtrotts:01 caml-list:01 buffer:01 hecker:01 formatter:01 pervasives:01 val:01 ostream:01 char:01 struct:01 incr:01 unsubscribed:99 bug:01 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk Chris Hecker wrote: > > Is there any way to do something similar to the C++ string stream > stuff, where you treat strings (or Buffer.t's) as in_ or > out_channels? The Format module has a formatter for strings, but > there doesn't seem to be a way to do it with Pervasives. Something like: > > val out_channel_of_buffer : Buffer.t -> out_channel > val in_channel_of_buffer : Buffer.t -> in_channel > > and maybe _of_string versions too (probably necessary because you > can't convert a string to a buffer for the in_channel), which fill up > and don't expand. > > It'd be very useful to be able to do this. Please disregard the previous buggy message I sent out. Here's a fixed-up version: (* read from a Buffer via a Stream *) let stream_of_buffer buf = Stream.from (fun i -> let s = Buffer.contents buf in if i >= String.length s then None else Some s.[i] ) (* write to buffers and other things without knowing what they are *) module Ostream : sig type t val of_function : (char -> unit) -> t val of_buffer : Buffer.t -> t val of_string : string -> t val of_out_channel : out_channel -> t val output_char : t -> char -> unit val output_string : t -> string -> unit val output_value : t -> 'a -> unit end = struct type t = char -> unit let of_function f = f let of_buffer (buf:Buffer.t) : t = fun (c:char) -> Buffer.add_char buf c let of_string (s:string) : t = let i = ref 0 in fun (c:char) -> s.[!i] <- c; incr i let of_out_channel (chan:out_channel) : t = fun (c:char) -> output_char chan c let output_char (ostream:t) (c:char) : unit = ostream c let output_string (ostream:t) (str:string) = String.iter ostream str let output_value (ostream:t) thing = let str = Marshal.to_string thing [] in output_string ostream str end Issac > > > Thanks, > Chris > > PS. Please cc me on replies, I temporarily unsubscribed from the > list, thanks! > > ------------------- > To unsubscribe, mail caml-list-request@inria.fr Archives: > http://caml.inria.fr > Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: > http://caml.inria.fr/FAQ/ > Beginner's list: http://groups.yahoo.com/group/ocaml_beginners > > ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners