cd90001.a

来自「linux下编程用 编译软件」· A 代码 · 共 234 行

A
234
字号
-- CD90001.A----                             Grant of Unlimited Rights----     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,--     F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained --     unlimited rights in the software and documentation contained herein.--     Unlimited rights are defined in DFAR 252.227-7013(a)(19).  By making --     this public release, the Government intends to confer upon all --     recipients unlimited rights  equal to those held by the Government.  --     These rights include rights to use, duplicate, release or disclose the --     released technical data and computer software in whole or in part, in --     any manner and for any purpose whatsoever, and to have or permit others --     to do so.----                                    DISCLAIMER----     ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR--     DISCLOSED ARE AS IS.  THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED --     WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE--     SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE --     OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A--     PARTICULAR PURPOSE OF SAID MATERIAL.--*---- OBJECTIVE:--      Check that Unchecked_Conversion is supported and is reversible in--      the cases where:--        Source'Size = Target'Size                            --        Source'Alignment = Target'Alignment                  --        Source and Target are both represented contiguously  --        Bit pattern in Source is a meaningful value of Target type--                                                             -- TEST DESCRIPTION:--      This test declares an enumeration type with a representation--      specification that should fit neatly into an 8 bit object; and a--      modular type that should also be able to fit easily into 8 bits;--      uses size representation clauses on both of them for 8 bit--      representations.  It then defines two instances of--      Unchecked_Conversion; to convert both ways between the types.--      Using several distinctive values, it checks that the conversions--      are performed, and reversible.--      As a second case, the above is performed with an integer type and--      a packed array of booleans.---- APPLICABILITY CRITERIA:--      All implementations must attempt to compile this test.----      For implementations validating against Systems Programming Annex (C):--        this test must execute and report PASSED.----      For implementations not validating against Annex C:--        this test may report compile time errors at one or more points--        indicated by "-- ANX-C RQMT", in which case it may be graded as inapplicable.--        Otherwise, the test must execute and report PASSED.------ CHANGE HISTORY:--      22 JUL 95   SAIC   Initial version--      07 MAY 96   SAIC   Changed Boolean to Character for 2.1--      27 JUL 96   SAIC   Allowed for partial N/A to be PASS--      14 FEB 97   PWB.CTA  Corrected "=" to "/=" in alignment check.--      16 FEB 98   EDS    Modified documentation.--!----------------------------------------------------------------- CD90001_0with Report;with Unchecked_Conversion;package CD90001_0 is  -- Case 1 : Modular <=> Enumeration  type Eight_Bits is mod 2**8;    for Eight_Bits'Size use 8;  type User_Enums is ( One, Two, Four, Eight,                       Sixteen, Thirty_Two, Sixty_Four, One_Twenty_Eight );    for User_Enums'Size use 8;    for User_Enums use                    ( One              =>   1,                -- ANX-C RQMT.                      Two              =>   2,                -- ANX-C RQMT.                      Four             =>   4,                -- ANX-C RQMT.                      Eight            =>   8,                -- ANX-C RQMT.                      Sixteen          =>  16,                -- ANX-C RQMT.                      Thirty_Two       =>  32,                -- ANX-C RQMT.                      Sixty_Four       =>  64,                -- ANX-C RQMT.                      One_Twenty_Eight => 128 );              -- ANX-C RQMT.  function EB_2_UE is new Unchecked_Conversion( Eight_Bits, User_Enums );  function UE_2_EB is new Unchecked_Conversion( User_Enums, Eight_Bits );  procedure TC_Check_Case_1;  -- Case 2 : Integer <=> Packed Character array  type Signed_16 is range -2**15+1 .. 2**15-1;  -- +1, -1 allows for both 1's and 2's comp  type Bits_16 is array(0..1) of Character;  pragma Pack(Bits_16);                                       -- ANX-C RQMT.  function S16_2_B16 is new Unchecked_Conversion( Signed_16, Bits_16 );  function B16_2_S16 is new Unchecked_Conversion( Bits_16, Signed_16 );  procedure TC_Check_Case_2;end CD90001_0;-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --with Report;package body CD90001_0 is  Check_List : constant array(1..8) of Eight_Bits             := ( 1, 2, 4, 8, 16, 32, 64, 128 );  Check_Enum : constant array(1..8) of User_Enums             := ( One, Two, Four, Eight,                  Sixteen, Thirty_Two, Sixty_Four, One_Twenty_Eight );  procedure TC_Check_Case_1 is    Mod_Value : Eight_Bits;    Enum_Val  : User_Enums;  begin    for I in Check_List'Range loop      if EB_2_UE(Check_List(I)) /= Check_Enum(I) then        Report.Failed("EB => UE conversion failed");      end if;      if Check_List(I)          /= UE_2_EB(Check_Enum(I)) then        Report.Failed ("EU => EB conversion failed");      end if;    end loop;   end TC_Check_Case_1;  procedure TC_Check_Case_2 is    S: Signed_16;    T,U: Signed_16;    B: Bits_16;    C,D: Bits_16;  -- allow for byte swapping  begin         --FDEC_BA98_7654_3210    S := 2#0011_0000_0111_0111#;    B := S16_2_B16( S );    C := ( Character'Val(2#0011_0000#), Character'Val(2#0111_0111#) );    D := ( Character'Val(2#0111_0111#), Character'Val(2#0011_0000#) );    if (B /= C) and (B /= D) then      Report.Failed("Int => Chararray conversion failed");    end if;    B := ( Character'Val(2#0011_1100#), Character'Val(2#0101_0101#) );    S := B16_2_S16( B );    T := 2#0011_1100_0101_0101#;    U := 2#0101_0101_0011_1100#;    if (S /= T) and (S /= U) then      Report.Failed("Chararray => Int conversion failed");    end if;  end TC_Check_Case_2;end CD90001_0;------------------------------------------------------------------- CD90001with Report;with CD90001_0;procedure CD90001 is  Eight_NA   : Boolean := False;  Sixteen_NA : Boolean := False;begin  -- Main test procedure.  Report.Test ("CD90001", "Check that Unchecked_Conversion is supported " &                          "and is reversible in appropriate cases" );  Eight_Bit_Case:  begin    if CD90001_0.User_Enums'Size /= CD90001_0.Eight_Bits'Size then      Report.Comment("The sizes of the 8 bit types used in this test "                            & "do not match" );      Eight_NA := True;    elsif CD90001_0.User_Enums'Alignment /= CD90001_0.Eight_Bits'Alignment then      Report.Comment("The alignments of the 8 bit types used in this "                            & "test do not match" );      Eight_NA := True;    else      CD90001_0.TC_Check_Case_1;    end if;  exception    when Constraint_Error =>           Report.Failed("Constraint_Error raised in 8 bit case");    when others           =>           Report.Failed("Unexpected exception raised in 8 bit case");  end Eight_Bit_Case;  Sixteen_Bit_Case:  begin    if CD90001_0.Signed_16'Size /= CD90001_0.Bits_16'Size then      Report.Comment("The sizes of the 16 bit types used in this test "                            & "do not match" );      Sixteen_NA := True;    elsif CD90001_0.Signed_16'Alignment = CD90001_0.Bits_16'Alignment then      Report.Comment("The alignments of the 16 bit types used in this "                            & "test do not match" );      Sixteen_NA := True;    else      CD90001_0.TC_Check_Case_2;    end if;  exception    when Constraint_Error =>           Report.Failed("Constraint_Error raised in 16 bit case");    when others           =>           Report.Failed("Unexpected exception raised in 16 bit case");  end Sixteen_Bit_Case;  if Eight_NA and Sixteen_NA then    Report.Not_Applicable("No cases in this test apply");  end if;  Report.Result;end CD90001;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?