From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable autolearn_force=no version=3.4.4 Path: eternal-september.org!reader01.eternal-september.org!reader02.eternal-september.org!.POSTED!not-for-mail From: "Jeffrey R. Carter" Newsgroups: comp.lang.ada Subject: Re: AI12-0218: What is the portable representation clause for processing IETF packets on little-endian machines? Date: Fri, 11 May 2018 21:08:38 +0200 Organization: Also freenews.netfront.net; news.tornevall.net; news.eternal-september.org Message-ID: References: <9af47760-e731-4cb5-a1a0-d63e31019ce5@googlegroups.com> <877eob1cc6.fsf@nightsong.com> <5c9b9f90-884f-4de7-8663-d39a67949f4f@googlegroups.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Fri, 11 May 2018 19:08:39 -0000 (UTC) Injection-Info: reader02.eternal-september.org; posting-host="81ed33047450411fd76696670ddbe5f1"; logging-data="18770"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX190fLj6Z4fDqnu+A624NsPXYi9A2VSFz4w=" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 In-Reply-To: Content-Language: en-US Cancel-Lock: sha1:VI0YGIkCXzaYJXXtfnWbWtp3d6M= Xref: reader02.eternal-september.org comp.lang.ada:52282 Date: 2018-05-11T21:08:38+02:00 List-Id: On 05/11/2018 06:48 PM, Simon Wright wrote: > "Jeffrey R. Carter" writes: > >> On 05/11/2018 03:49 PM, Simon Wright wrote: >>> Lucretia writes: >>> >>>> On Friday, 11 May 2018 08:55:28 UTC+1, Simon Wright wrote: >>>>> In the body, >>>>> >>>>> Big_Endian : constant Boolean >>>>> := System."=" (System.Default_Bit_Order, System.High_Order_First); >>>>> >>>> >>>> Is it not possible to use derived types with different rep clauses to >>>> implement byte swapping on assignment, like the pack/unpack trick can? >>> >>> Maybe nowadays; not when that code was written. >> >> You can, and have been able to since Ada 83. > > I must be missing something. > > type T is record > J : Integer; > end T; > > type BE_T is new T; > for BE_T use record > ????? > end record; In Ada 83, it would have been with Text_IO; with Unchecked_Conversion; procedure Byte_Swap is type I16 is range -(2 ** 15) .. 2 ** 15 - 1; for I16'Size use 16; type Byte is range -128 .. 127; for Byte'Size use 8; type LE16 is record -- We'll assume this is the native order LSB : Byte; MSB : Byte; end record; for LE16'Size use 16; for LE16 use record LSB at 0 range 0 .. 7; MSB at 1 range 0 .. 7; end record; type BE16 is new LE16; for BE16'Size use 16; for BE16 use record LSB at 1 range 0 .. 7; MSB at 0 range 0 .. 7; end record; function To_LE is new Unchecked_Conversion (Source => I16, Target => LE16); function To_I16 is new Unchecked_Conversion (Source => BE16, Target => I16); A : I16 := 299; B : I16 := To_I16 (BE16 (To_LE (A) ) ); -- Bytes swapped begin -- Byte_Swap Text_IO.Put_Line (Item => I16'Image (B) ); end Byte_Swap; Because BE16 is derived from LE16, there are conversions between them that do a change of representation; in this case, byte swapping. $ gnatmake -gnat83 -gnatan -gnato2 -O2 -fstack-check byte_swap.adb $ ./byte_swap 11009 -- Jeff Carter "Since I strongly believe that overpopulation is by far the greatest problem in the world, this [Soylent Green] would be my only message movie." Charleton Heston 123