cxb30041.am

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

AM
378
字号
-- CXB30041.AM----                             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 the functions To_C and To_Ada map between the Ada type--      Character and the C type char.----      Check that the function Is_Nul_Terminated returns True if the--      char_array parameter contains nul, and otherwise False.----      Check that the function To_C produces a correct char_array result,--      with lower bound of 0, and length dependent upon the Item and--      Append_Nul parameters.----      Check that the function To_Ada produces a correct string result, with--      lower bound of 1, and length dependent upon the Item and Trim_Nul--      parameters.----      Check that the function To_Ada raises Terminator_Error if the--      parameter Trim_Nul is set to True, but the actual Item parameter--      does not contain the nul char.---- TEST DESCRIPTION:--      This test uses a variety of Character, char, String, and char_array--      objects to test versions of the To_C, To_Ada, and Is_Nul_Terminated--      functions.----      This test assumes that the following characters are all included--      in the implementation defined type Interfaces.C.char:--      ' ', ',', '.', '0'..'9', 'a'..'z' and 'A'..'Z'.---- APPLICABILITY CRITERIA:--      This test is applicable to all implementations that provide--      package Interfaces.C.  If an implementation provides--      package Interfaces.C, this test must compile, execute, and--      report "PASSED".---- SPECIAL REQUIREMENTS:--      The file CXB30040.C must be compiled with a C compiler.--      Implementation dialects of C may require alteration of--      the C program syntax (see individual C files).----      Note that the compiled C code must be bound with the compiled Ada--      code to create an executable image.  An implementation must provide--      the necessary commands to accomplish this.----      Note that the C code included in CXB30040.C conforms--      to ANSI-C.  Modifications to these files may be required for other--      C compilers.  An implementation must provide the necessary--      modifications to satisfy the function requirements.---- TEST FILES:--      The following files comprise this test:----         CXB30040.C--         CXB30041.AM---- CHANGE HISTORY:--      30 Aug 95   SAIC    Initial prerelease version.--      09 May 96   SAIC    Incorporated reviewer comments for ACVC 2.1.--      26 Oct 96   SAIC    Incorporated reviewer comments.--      13 Sep 99   RLB     Replaced (bogus) Unchecked_Conversions with a--                          C function character generator.----!with Report;with Interfaces.C;                                            -- N/A => ERRORwith Ada.Characters.Latin_1;with Ada.Exceptions;with Ada.Strings.Fixed;with Impdef;procedure CXB30041 isbegin   Report.Test ("CXB3004", "Check that the functions To_C and To_Ada " &                           "produce correct results");   Test_Block:   declare      use Interfaces, Interfaces.C;      use Ada.Characters, Ada.Characters.Latin_1;      use Ada.Exceptions;      use Ada.Strings.Fixed;      Start_Character,      Stop_Character,      TC_Character    : Character         := Character'First;      TC_char,      TC_Low_char,      TC_High_char    : char              := char'First;      TC_String       : String(1..8)      := (others => Latin_1.NUL);      TC_char_array   : char_array(0..7)  := (others => C.nul);      -- The function Char_Gen returns a character corresponding to its      -- argument.      --     Value   0 ..  9 ==> '0' .. '9'      --     Value  10 .. 19 ==> 'A' .. 'J'      --     Value  20 .. 29 ==> 'k' .. 't'      --     Value  30       ==> ' '      --     Value  31       ==> '.'      --     Value  32       ==> ','      function Char_Gen (Value   : in int) return char;      -- Use the user-defined C function char_gen as a completion to the      -- function specification above.      pragma Import (Convention    => C,                     Entity        => Char_Gen,                     External_Name => Impdef.CXB30040_External_Name);   begin      -- Check that the functions To_C and To_Ada map between the Ada type      -- Character and the C type char.      if To_C(Ada.Characters.Latin_1.NUL) /= Interfaces.C.nul then         Report.Failed("Incorrect result from To_C with NUL character input");      end if;      Start_Character := Report.Ident_Char('k');      Stop_Character  := Report.Ident_Char('t');      for TC_Character in Start_Character..Stop_Character loop         if To_C(Item => TC_Character) /=            Char_Gen(Character'Pos(TC_Character) - Character'Pos('k') + 20) then            Report.Failed("Incorrect result from To_C with lower case " &                          "alphabetic character input");         end if;      end loop;      Start_Character := Report.Ident_Char('A');      Stop_Character  := Report.Ident_Char('J');      for TC_Character in Start_Character..Stop_Character loop         if To_C(Item => TC_Character) /=            Char_Gen(Character'Pos(TC_Character) - Character'Pos('A') + 10) then            Report.Failed("Incorrect result from To_C with upper case " &                          "alphabetic character input");         end if;      end loop;      Start_Character := Report.Ident_Char('0');      Stop_Character  := Report.Ident_Char('9');      for TC_Character in Start_Character..Stop_Character loop         if To_C(Item => TC_Character) /=            Char_Gen(Character'Pos(TC_Character) - Character'Pos('0')) then            Report.Failed("Incorrect result from To_C with digit " &                          "character input");         end if;      end loop;      if To_C(Item => ' ') /= Char_Gen(30) then         Report.Failed("Incorrect result from To_C with space " &                       "character input");      end if;      if To_C(Item => '.') /= Char_Gen(31) then         Report.Failed("Incorrect result from To_C with dot " &                       "character input");      end if;      if To_C(Item => ',') /= Char_Gen(32) then         Report.Failed("Incorrect result from To_C with comma " &                       "character input");      end if;      if To_Ada(Interfaces.C.nul) /= Ada.Characters.Latin_1.NUL then         Report.Failed("Incorrect result from To_Ada with nul char input");      end if;      for Code in int range         int(Report.Ident_Int(20)) .. int(Report.Ident_Int(29)) loop            -- 'k' .. 't'         if To_Ada(Item => Char_Gen(Code)) /=	    Character'Val (Character'Pos('k') + (Code - 20)) then            Report.Failed("Incorrect result from To_Ada with lower case " &                          "alphabetic char input");         end if;      end loop;      for Code in int range         int(Report.Ident_Int(10)) .. int(Report.Ident_Int(19)) loop            -- 'A' .. 'J'         if To_Ada(Item => Char_Gen(Code)) /=	    Character'Val (Character'Pos('A') + (Code - 10)) then            Report.Failed("Incorrect result from To_Ada with upper case " &                          "alphabetic char input");         end if;      end loop;      for Code in int range         int(Report.Ident_Int(0)) .. int(Report.Ident_Int(9)) loop            -- '0' .. '9'         if To_Ada(Item => Char_Gen(Code)) /=	    Character'Val (Character'Pos('0') + (Code)) then            Report.Failed("Incorrect result from To_Ada with digit " &                          "char input");         end if;      end loop;      if To_Ada(Item => Char_Gen(30)) /= ' ' then         Report.Failed("Incorrect result from To_Ada with space " &                       "char input");      end if;      if To_Ada(Item => Char_Gen(31)) /= '.' then         Report.Failed("Incorrect result from To_Ada with dot " &                       "char input");      end if;      if To_Ada(Item => Char_Gen(32)) /= ',' then         Report.Failed("Incorrect result from To_Ada with comma " &                       "char input");      end if;      -- Check that the function Is_Nul_Terminated produces correct results      -- whether or not the char_array argument contains the      -- Ada.Interfaces.C.nul character.      TC_String := "abcdefgh";      if Is_Nul_Terminated(Item => To_C(TC_String, Append_Nul => False)) then         Report.Failed("Incorrect result from Is_Nul_Terminated when no " &                       "nul char is present");      end if;      if not Is_Nul_Terminated(To_C(TC_String, Append_Nul => True)) then         Report.Failed("Incorrect result from Is_Nul_Terminated when the " &                       "nul char is present");      end if;      -- Now that we've tested the character/char versions of To_Ada and To_C,      -- use them to test the string versions.      declare         i                    : size_t  := 0;         j                    : integer := 1;         Incorrect_Conversion : Boolean := False;         TC_No_nul       : constant char_array := To_C(TC_String, False);         TC_nul_Appended : constant char_array := To_C(TC_String, True);      begin         -- Check that the function To_C produces a char_array result with         -- lower bound of 0, and length dependent upon the Item and         -- Append_Nul parameters (if Append_Nul is True, length is         -- Item'Length + 1; if False, length is Item'Length).         if TC_No_nul'First /= 0 or TC_nul_Appended'First /= 0 then            Report.Failed("Incorrect lower bound from Function To_C");         end if;         if TC_No_nul'Length /= TC_String'Length then            Report.Failed("Incorrect length returned from Function To_C " &                          "when Append_Nul => False");         end if;         for TC_char in Report.Ident_Char('a')..Report.Ident_Char('h') loop            if TC_No_nul(i)       /= To_C(TC_char) or -- Single character To_C.               TC_nul_Appended(i) /= To_C(TC_char) then               Incorrect_Conversion := True;            end if;            i := i + 1;         end loop;         if Incorrect_Conversion then            Report.Failed("Incorrect result from To_C with string input " &                          "and char_array result");         end if;         if TC_nul_Appended'Length /= TC_String'Length + 1 then            Report.Failed("Incorrect length returned from Function To_C " &                          "when Append_Nul => True");         end if;         if not Is_Nul_Terminated(TC_nul_Appended) then            Report.Failed("No nul appended to the string parameter during " &                          "conversion to char_array by function To_C");         end if;         -- Check that the function To_Ada produces a string result with         -- lower bound of 1, and length dependent upon the Item and         -- Trim_Nul parameters (if Trim_Nul is False, length is Item'Length;         -- if True, length will be the length of the slice of Item prior to         -- the first nul).         declare            TC_No_NUL_String       : constant String :=                                       To_Ada(Item     => TC_nul_Appended,                                              Trim_Nul => True);            TC_NUL_Appended_String : constant String :=                                       To_Ada(TC_nul_Appended, False);         begin            if TC_No_NUL_String'First       /= 1 or               TC_NUL_Appended_String'First /= 1            then               Report.Failed("Incorrect lower bound from Function To_Ada");            end if;            if TC_No_NUL_String'Length /= TC_String'Length then               Report.Failed("Incorrect length returned from Function " &                             "To_Ada when Trim_Nul => True");            end if;            if TC_NUL_Appended_String'Length /= TC_String'Length + 1 then               Report.Failed("Incorrect length returned from Function " &                             "To_Ada when Trim_Nul => False");            end if;            Start_Character := Report.Ident_Char('a');            Stop_Character  := Report.Ident_Char('h');            for TC_Character in Start_Character..Stop_Character loop               if TC_No_NUL_String(j)       /= TC_Character or                  TC_NUL_Appended_String(j) /= TC_Character               then                  Report.Failed("Incorrect result from To_Ada with " &                                "char_array input, index = "         &                                Integer'Image(j));               end if;               j := j + 1;            end loop;         end;         -- Check that the function To_Ada raises Terminator_Error if the         -- parameter Trim_Nul is set to True, but the actual Item parameter         -- does not contain the nul char.         begin            TC_String := To_Ada(TC_No_nul, Trim_Nul => True);            Report.Failed("Terminator_Error not raised when Item "    &                          "parameter of To_Ada does not contain the " &                          "nul char, but parameter Trim_Nul => True");            Report.Comment(TC_String & " printed to defeat optimization");         exception            when Terminator_Error => null;  -- OK, expected exception.            when others           =>               Report.Failed("Incorrect exception raised by function "  &                             "To_Ada when the Item parameter does not " &                             "contain the nul char, but parameter "     &                             "Trim_Nul => True");         end;      end;   exception      when The_Error : others =>         Report.Failed ("The following exception was raised in the " &                        "Test_Block: " & Exception_Name(The_Error));   end Test_Block;   Report.Result;end CXB30041;

⌨️ 快捷键说明

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