caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Jonathan Roewen <jonathan.roewen@gmail.com>
To: caml-list@yquem.inria.fr
Subject: [Caml-list] A camlp4 task for reading in 'structs'
Date: Tue, 6 Dec 2005 22:08:09 +1300	[thread overview]
Message-ID: <ad8cfe7e0512060108od4040c9se85ac6d8eda9e807@mail.gmail.com> (raw)

Hi All,

The idea: a type-safe way to parse an IO.input stream as structured
data (think C structs).

I'm wondering if anyone is interested in trying to create a camlp4
extension for reading structured data from an IO.input stream. I'm not
sure if it's at all possible, but I'd like to return a tuple, and have
it type-checked properly.

Something like:

type field = Byte | Word | DWord | Bytes of int | Char | String of int | All;;
(* corresponding output types: int | int | int32 | int list | char |
string | string; *)

What I want is code that I can pattern match easily (lists are okay,
but I get non-exhaustive match warnings all the time, and it doesn't
guarantee that I'm getting the right values. I also need to use a
second type if I want to have values other than ints.

something like: let (a,b,c) = read_struct i [Byte; Char; Word];;
(using IO module, would return IO.No_more_input if it can't read
enough, which should be okay).

where i = IO.input, such as let i = IO.input_string "hello" in...

I figure something should be possible, as the size of the tuple would
match the size of the list. I'm just not sure if camlp4 is capable of
this; I myself would have zero idea where to begin if I have to write
it... so any help would be greatly appreciated, as I would use this a
heck of a lot in my operating system project.

The operations that would use I think would be:
Byte: IO.read_byte
Word: IO.read_ui16
DWord: IO.read_real_i32
Bytes of int: n * IO.read_byte : int list
Char: IO.read
String of int: IO.really_nread n
All: read until IO.No_more_input is raised, returning a string

Actually, I just had a thought: instead of a list, you could use a
tuple as well .. if that'd make it more possible. Ohh, I forgot about
endianness .. not sure how to handle that...

Kindest Regards,

Jonathan


             reply	other threads:[~2005-12-06  9:08 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-12-06  9:08 Jonathan Roewen [this message]
2005-12-06 11:08 ` Gerd Stolpmann

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=ad8cfe7e0512060108od4040c9se85ac6d8eda9e807@mail.gmail.com \
    --to=jonathan.roewen@gmail.com \
    --cc=caml-list@yquem.inria.fr \
    /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).