comp.lang.ada
 help / color / mirror / Atom feed
From: nospam.andrew.logue@cdcgy.com (Shifty)
Subject: Re: First time Ada has let me down
Date: 2000/10/25
Date: 2000-10-25T00:00:00+00:00	[thread overview]
Message-ID: <8FD8A9ED5andrewloguecdcgycom@142.77.1.194> (raw)
In-Reply-To: sJAJ5.8835$NP.676523@news.flash.net

Ken.Garlington@computer.org (Ken Garlington) wrote in 
<sJAJ5.8835$NP.676523@news.flash.net>:

>I'm curious about the "typecasting a 4 bit value into an 8 bit integer"
>statement. Why would you need to do this?

Apparently I don't, per comments from Ted and others.  I just assumed
that it wouldn't be considered an integer type since it is smaller than
the system.storage_unit size.

>I would have thought the record representation clause approach would be much
>preferable than a bunch of
>#DEFINEs to describe the header layout. Granted, the fact that the headers
>are variable length complicates
>things a bit, but just looking at an IPv4 header, I would expect something
>like the source code below. In fact,
>if you use this approach (records with variant), you might be able to avoid
>some of the offset calculations altogether.
>You certainly don't need to do any low-level bit twiddling (which is why
>this wasn't as big of a deal in Ada83 as
>you might think...)
>
>package IPv4 is
>
>type Byte is range 0 .. 16#FF#;
>for Byte'Size use 8;
>
>type Version_Type is range 4 .. 4;

>subtype Header_Length_Type is Integer range 5 .. 15;
>subtype Total_Length_Type is Integer range 0 .. 65_535;
>
>-- more types for the rest of the header
>
>type Option_Type is array (1 .. 4) of Byte;
>pragma Pack (Option_Type);
>type Option_Type_Array is array (Integer range <>) of Option_Type;
>pragma Pack (Option_Type_Array);
>
>type Header_Type (IHL : Header_Length_Type) is record
>   Version : Version_Type := 4;
>   Type_of_Service : Byte := 0;
>   Total_Length : Total_Length_Type;
>
>   -- the rest of the mandatory fields
>
>   case IHL is
>      when 5 =>
>         null;
>      when 6 .. Header_Length_Type'Last =>
>         Option : Option_Type_Array(6 .. IHL);
>   end case;
>end record;
>
>-- record rep spec goes here
>
>end IPv4;

Yep, this looks like a good solution, but it just seemed like too much
code to simply calculate the IP header length.  In the end I came up with
something like this:

  function Calculate_Ip_Header_Length  
             (Byte_At : in System.Address) return Integer is

    Version_Length_Descriptor : Octet_Type;
    for Version_Length_Descriptor use at Byte_At;

    Temp : Integer := Integer (Version_Length_Descriptor);

    --  7 6 5 4 3 2 1 0 
    -- +-+-+-+-+-+-+-+-+
    -- | | | | | | | | |
    -- +-+-+-+-+-+-+-+-+
    -- | Ver   | Hlen  |

    -- Define a mask to mask out the high-order bits.
    --                                   ||||
    Version_Mask : constant Integer := 2#00001111#;

    -- Mask it.
    --
    Length : Integer := V_Bits.Bit_And (Temp, Version_Mask);

  begin -- Calculate_Ip_Header_Length

    -- The Hlen field gives the datagram hdr len measured in 32-bit words. 
    --
    return Length * (32 / System.Storage_Unit); 

  end Calculate_Ip_Header_Length;


I don't want to start a war over this, since there is _always_ a better
way of doing things, but this solution seems simple and elegant, especially
when I don't give hoot about the rest of the header structure.  You just
pass the start address of the IP datagram to this function and it quickly
returns the byte-length of the header.  (assuming, of course, that Hlen
contains the right value!)

Thankfully Ada95 has native language support for bitwise integer operators.


Thank you for your comments guys.


Andrew.




  reply	other threads:[~2000-10-25  0:00 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2000-10-25  3:50 First time Ada has let me down Shifty
2000-10-25  0:00 ` wv12
2000-10-25  0:00   ` Joel Seidman
2000-10-25  0:00   ` Gisle Sælensminde
2000-10-25  0:00   ` Gautier
2000-10-26  6:42   ` tmoran
2000-10-25  0:00 ` First time Ada has let me down (recipe) Guillaume
2000-10-26  2:45   ` Mats Weber
2000-10-25  0:00 ` First time Ada has let me down Ken Garlington
2000-10-25  0:00   ` Shifty [this message]
2000-10-26  4:00     ` Jeff Carter
2000-10-26 14:43       ` Ted Dennison
2000-10-26 17:55         ` tmoran
2000-10-26 17:12       ` Shifty
2000-10-27  1:00         ` Jeff Carter
2000-10-26 22:27       ` Guillaume
2000-10-26 21:49         ` Keith Thompson
2000-10-26 14:36     ` Ted Dennison
2000-10-26 17:55       ` tmoran
2000-10-26 23:08         ` Ted Dennison
2000-10-25  0:00 ` Larry Kilgallen
2000-10-25  0:00   ` Ted Dennison
2000-10-25  0:00     ` Larry Kilgallen
2000-10-25  0:00       ` Ted Dennison
2000-10-25  4:44 ` Julian Morrison
2000-10-25  4:50 ` Ted Dennison
2000-10-24  0:00   ` Keith Thompson
2000-10-26  0:00   ` Andreas Schulz
2000-10-26 18:05     ` Alejandro Villanueva
2000-10-26 21:46 ` Tucker Taft
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox