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=-0.1 required=5.0 tests=AXB_XMAILER_MIMEOLE_OL_024C2, BAYES_00,MAILING_LIST_MULTI,REPLYTO_WITHOUT_TO_CC autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,255a2533fba89f5 X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2002-09-18 11:48:04 PST Path: archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!newsfeed.icl.net!newsfeed.fjserv.net!news.mailgate.org!fr.usenet-edu.net!usenet-edu.net!enst.fr!not-for-mail From: "David C. Hoos" Newsgroups: comp.lang.ada Subject: Re: Parity using 'Write, was Re: Calculate and set Parity Date: Wed, 18 Sep 2002 13:47:52 -0500 Organization: ENST, France Sender: comp.lang.ada-admin@ada.eu.org Message-ID: References: <0C3i9.459302$me6.55005@sccrnsc01> Reply-To: comp.lang.ada@ada.eu.org NNTP-Posting-Host: marvin.enst.fr Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Trace: avanie.enst.fr 1032374883 32125 137.194.161.2 (18 Sep 2002 18:48:02 GMT) X-Complaints-To: usenet@enst.fr NNTP-Posting-Date: Wed, 18 Sep 2002 18:48:02 +0000 (UTC) Return-Path: X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2600.0000 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 Errors-To: comp.lang.ada-admin@ada.eu.org X-BeenThere: comp.lang.ada@ada.eu.org X-Mailman-Version: 2.0.13 Precedence: bulk List-Unsubscribe: , List-Id: comp.lang.ada mail<->news gateway List-Post: List-Help: List-Subscribe: , Errors-To: comp.lang.ada-admin@ada.eu.org X-BeenThere: comp.lang.ada@ada.eu.org Xref: archiver1.google.com comp.lang.ada:29124 Date: 2002-09-18T13:47:52-05:00 I think it would be better to return a type Parity_Kind is (Even, Odd), rather than a Boolean, or else name the function Odd_Parity (or Even_Parity), so that True and False have obvious meanings. ----- Original Message ----- From: Newsgroups: comp.lang.ada To: Sent: Wednesday, September 18, 2002 1:29 PM Subject: Parity using 'Write, was Re: Calculate and set Parity > Assuming a reasonable compiler implementation of streams, where extra > bits from base type expansion are zeros, here's a way to calculate > the parity (or byte checksum) of an arbitrary record using 'write. > It accumulates a checksum in a stream object, and uses functions to > fetch a byte or a parity boolean from that accumulated checksum element. > S : aliased Xors.Stream_Type; > type something is record ... > ... > S.Check_Element := 0; > Some_Record_Type'Write(S'access, R); > Parity := Xors.Parity(S); > Checksum_Byte := Xors.Check_Byte(S); > ... > > with Ada.Streams; > package Xors is > > type Stream_Type is new Ada.Streams.Root_Stream_Type with record > Check_Element: Ada.Streams.Stream_Element := 0; > end record; > > procedure Read(Stream : in out Stream_Type; -- nop > Item : out Ada.Streams.Stream_Element_Array; > Last : out Ada.Streams.Stream_Element_Offset); > > procedure Write(Stream : in out Stream_Type; > Item : in Ada.Streams.Stream_Element_Array); > > function Check_Byte(Stream : Stream_Type) return Ada.Streams.Stream_Element; > > function Parity(Stream : Stream_Type) return Boolean; > > end Xors; > > package body Xors is > use Ada.Streams; > > procedure Read(Stream : in out Stream_Type; -- nop > Item : out Stream_Element_Array; > Last : out Stream_Element_Offset) is > begin > Last := Item'First - 1; > end Read; > > procedure Write(Stream : in out Stream_Type; > Item : in Stream_Element_Array) is > begin > for I in Item'range loop > Stream.Check_Element := Stream.Check_Element xor Item(I); > end loop; > end Write; > > function Check_Byte(Stream : Stream_Type) return Stream_Element is > Source : Stream_Element := Stream.Check_Element; > Target : Stream_Element := 0; > begin > while Source /= 0 loop > Target := Target xor (Source mod 255); > -- assume integer'size >= stream_element'size > Source := Stream_Element(Integer(Source) / 256); > end loop; > return Target; > end Check_Byte; > > function Parity(Stream : Stream_Type) return Boolean is > Source : Stream_Element := Check_Byte(Stream); > Target : Boolean := False; > begin > while Source /= 0 loop > Target := Target xor ((Source mod 2) = 1); > Source := Source / 2; > end loop; > return Target; > end Parity; > > end Xors; > _______________________________________________ > comp.lang.ada mailing list > comp.lang.ada@ada.eu.org > http://ada.eu.org/mailman/listinfo/comp.lang.ada >