caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Issac Trotts <ijtrotts@ucdavis.edu>
To: caml-list@inria.fr
Cc: Chris Hecker <checker@d6.com>
Subject: Re: [Caml-list] string buffer as (in|out)_channel
Date: Fri, 18 Jul 2003 02:40:48 -0700	[thread overview]
Message-ID: <3F17C0A0.3010603@ucdavis.edu> (raw)
In-Reply-To: <4.3.2.7.2.20030717000026.026bcaa0@localhost>

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


      parent reply	other threads:[~2003-07-18  9:40 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-07-17  7:05 Chris Hecker
2003-07-17  7:39 ` Yaron M. Minsky
2003-07-18  9:13 ` Issac Trotts
2003-07-18  9:40 ` Issac Trotts [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3F17C0A0.3010603@ucdavis.edu \
    --to=ijtrotts@ucdavis.edu \
    --cc=caml-list@inria.fr \
    --cc=checker@d6.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).