From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Delivered-To: caml-list@yquem.inria.fr Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by yquem.inria.fr (Postfix) with ESMTP id 4884ABC48 for ; Mon, 11 Apr 2005 15:01:22 +0200 (CEST) Received: from pauillac.inria.fr (pauillac.inria.fr [128.93.11.35]) by concorde.inria.fr (8.13.0/8.13.0) with ESMTP id j3BD1LAj029985 for ; Mon, 11 Apr 2005 15:01:22 +0200 Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id PAA00197 for ; Mon, 11 Apr 2005 15:01:21 +0200 (MET DST) Received: from ux9.sp.cs.cmu.edu (UX9.SP.CS.CMU.EDU [128.2.220.166]) by concorde.inria.fr (8.13.0/8.13.0) with SMTP id j3BD1KVd029981 for ; Mon, 11 Apr 2005 15:01:21 +0200 Received: from [24.3.154.200] ([24.3.154.200]) by ux9.sp.cs.cmu.edu id aa13854; 11 Apr 2005 8:57 EDT Received: from ecc by stratocaster.home with local (Exim 4.50) id 1DKyTR-0003lE-GR for caml-list@inria.fr; Mon, 11 Apr 2005 08:57:05 -0400 Date: Mon, 11 Apr 2005 08:57:05 -0400 To: caml-list@inria.fr Subject: Re: [Caml-list] ocaml, int32/64, bigarray and unsigned values ... Message-ID: <20050411125705.GB14415@localhost> Mail-Followup-To: caml-list@inria.fr References: <20050411074619.GA26797@pegasos> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20050411074619.GA26797@pegasos> User-Agent: Mutt/1.5.6+20040907i From: Eric Cooper X-Miltered: at concorde with ID 425A7521.000 by Joe's j-chkmail (http://j-chkmail.ensmp.fr)! X-Miltered: at concorde with ID 425A7520.001 by Joe's j-chkmail (http://j-chkmail.ensmp.fr)! X-Spam: no; 0.00; caml-list:01 ocaml:01 bigarray:01 sven:01 luther:01 ocaml:01 byte:01 byte:01 plateform:01 bytecode:01 encapsulated:01 bigarray:01 descriptors:01 integers:01 altough:01 X-Spam-Checker-Version: SpamAssassin 3.0.2 (2004-11-16) on yquem.inria.fr X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=disabled version=3.0.2 X-Spam-Level: On Mon, Apr 11, 2005 at 09:46:19AM +0200, Sven Luther wrote: > I had plans to do a rewrite of GNU parted, a project which i am > involved with, in ocaml, and am being blocked by a few issues. > [...] > 1) most disk partition tables and filesystem have a mapping from a > given disk 512 byte sector to a descriptive structure. > [...] > or to have access functions which transform parts of > a byte array into values. The first one is ugly, as i was aiming > for a purely ocaml solution (so i can build and arch/plateform > independent bytecode tool), and the second would probably be a > disaster speed wise, and also somewhat ugly unless properly > encapsulated in an abstract module. I would use the second approach. I would define a logically equivalent OCaml record or class, and conversion functions between that object and a string + offset (or Bigarray of bytes, plus offset). Passing around an offset into a larger byte array can save a lot of copying. You can probably structure your code so that you only convert to/from bytes in a few places, not likely to be performance-critical. > Which brings me to the second problem. > > 2) Disk descriptors like partition table and filesystems, need to > have exact values, and the values are mostly unsigned 8, 16, 32 or > 64 bit integers, strings and bit fields. The int64 and int32 offer > these kind of values, but only the signed version. Is it save to > make calculation on a signed number and ignoring the sign bit ? > Does this not cause risk of overflow ? That's the beauty of 2's-complement representation of signed numbers. The sign bit is just a consequence of which half of the values encode negative numbers, from -1 (0xFF...FF) to min_int (0x80...00), so the leading bit is the sign bit. You can just do arithmetic and interpret the results as unsigned. > Also, i believe that bit fields are not easily available, altough > there is some support in the Int32 and int64 bit-wise operators, > but again we have the signed vs unsigned problem, altough it is > maybe ignored for bit operations ? You can do anything you need with shifting and masking. That should probably also be hidden in the bytearray-to-record conversion routines. It would be very cool to have such a "hard core" utility as a disk partition editor in OCaml! -- Eric Cooper e c c @ c m u . e d u