📄 cxb3014.a
字号:
-- CXB3014.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 the Function Value with Pointer and Element -- parameters will return an Element_Array result of correct size -- and content (up to and including the first "terminator" Element). ---- Check that the Function Value with Pointer and Length parameters -- will return an Element_Array result of appropriate size and content-- (the first Length elements pointed to by the parameter Ref).---- Check that both versions of Function Value will propagate -- Interfaces.C.Strings.Dereference_Error when the value of-- the Ref pointer parameter is null.---- TEST DESCRIPTION:-- This test tests that both versions of Function Value from the -- generic package Interfaces.C.Pointers are available and produce-- correct results. The generic package is instantiated with size_t,-- char, char_array, and nul as actual parameters, and subtests are-- performed on each of the Value functions resulting from this-- instantiation.-- For both function versions, a test is performed where a portion of-- a char_array is to be returned as the function result. Likewise,-- a test is performed where each version of the function returns the-- entire char_array referenced by the in parameter Ref.-- Finally, both versions of Function Value are called with a null-- pointer reference, to ensure that Dereference_Error is raised in-- this case.-- -- This test assumes that the following characters are all included-- in the implementation defined type Interfaces.C.char:-- ' ', 'a'..'z', and 'A'..'Z'.-- -- APPLICABILITY CRITERIA: -- This test is applicable to all implementations that provide -- packages Interfaces.C.Strings and Interfaces.C.Pointers. If an -- implementation provides packages Interfaces.C.Strings and -- Interfaces.C.Pointers, this test must compile, execute, and -- report "PASSED".---- -- CHANGE HISTORY:-- 19 Oct 95 SAIC Initial prerelease version.-- 13 May 96 SAIC Incorporated reviewer comments for ACVC 2.1.-- 23 Oct 96 SAIC Incorporated reviewer comments.----!with Report;with Interfaces.C.Strings; -- N/A => ERRORwith Interfaces.C.Pointers; -- N/A => ERRORprocedure CXB3014 isbegin Report.Test ("CXB3014", "Check that versions of the Value function " & "from package Interfaces.C.Pointers produce " & "correct results"); Test_Block: declare use type Interfaces.C.char, Interfaces.C.size_t; Char_a : constant Interfaces.C.char := 'a'; Char_j : constant Interfaces.C.char := 'j'; Char_z : constant Interfaces.C.char := 'z'; subtype Lower_Case_chars is Interfaces.C.char range Char_a..Char_z; subtype Char_Range is Interfaces.C.size_t range 0..26; Local_nul : aliased Interfaces.C.char := Interfaces.C.nul; TC_Array_Size : Interfaces.C.size_t := 20; TC_String_1 : constant String := "abcdefghij"; TC_String_2 : constant String := "abcdefghijklmnopqrstuvwxyz"; TC_String_3 : constant String := "abcdefghijklmnopqrst"; TC_String_4 : constant String := "abcdefghijklmnopqrstuvwxyz"; TC_Blank_String : constant String := " "; TC_Char_Array : Interfaces.C.char_array(Char_Range) := Interfaces.C.To_C(TC_String_2, True); TC_Char_Array_1 : Interfaces.C.char_array(0..9); TC_Char_Array_2 : Interfaces.C.char_array(Char_Range); TC_Char_Array_3 : Interfaces.C.char_array(0..TC_Array_Size-1); TC_Char_Array_4 : Interfaces.C.char_array(Char_Range); package Char_Pointers is new Interfaces.C.Pointers (Index => Interfaces.C.size_t, Element => Interfaces.C.char, Element_Array => Interfaces.C.char_array, Default_Terminator => Interfaces.C.nul); Char_Ptr : Char_Pointers.Pointer; use type Char_Pointers.Pointer; begin -- Check that the Function Value with Pointer and Terminator Element -- parameters will return an Element_Array result of appropriate size -- and content (up to and including the first "terminator" Element.) Char_Ptr := TC_Char_Array(0)'Access; -- Provide a new Terminator char in the call of Function Value. -- This call should return only a portion (the first 10 chars) of -- the referenced char_array, up to and including the char 'j'. TC_Char_Array_1 := Char_Pointers.Value(Ref => Char_Ptr, Terminator => Char_j); if Interfaces.C.To_Ada(TC_Char_Array_1, False) /= TC_String_1 or Interfaces.C.Is_Nul_Terminated(TC_Char_Array_1) then Report.Failed("Incorrect result from Function Value with Ref " & "and Terminator parameters, when supplied with " & "a non-default Terminator char"); end if; -- Use the default Terminator char in the call of Function Value. -- This call should return the entire char_array, including the -- terminating nul char. TC_Char_Array_2 := Char_Pointers.Value(Char_Ptr); if Interfaces.C.To_Ada(TC_Char_Array_2, True) /= TC_String_2 or not Interfaces.C.Is_Nul_Terminated(TC_Char_Array_2) then Report.Failed("Incorrect result from Function Value with Ref " & "and Terminator parameters, when using the " & "default Terminator char"); end if; -- Check that the Function Value with Pointer and Length parameters -- will return an Element_Array result of appropriate size and content -- (the first Length elements pointed to by the parameter Ref). -- This call should return only a portion (the first 20 chars) of -- the referenced char_array. TC_Char_Array_3 := Char_Pointers.Value(Ref => Char_Ptr, Length => Interfaces.C.ptrdiff_t(TC_Array_Size)); -- Verify the individual chars of the result. for i in 0..TC_Array_Size-1 loop if Interfaces.C.To_Ada(TC_Char_Array_3(i)) /= TC_String_3(Integer(i)+1) then Report.Failed("Incorrect result from Function Value with " & "Ref and Length parameters, when specifying " & "a length less than the full array size"); exit; end if; end loop; -- This call should return the entire char_array, including the -- terminating nul char. TC_Char_Array_4 := Char_Pointers.Value(Char_Ptr, 27); if Interfaces.C.To_Ada(TC_Char_Array_4, True) /= TC_String_4 or not Interfaces.C.Is_Nul_Terminated(TC_Char_Array_4) then Report.Failed("Incorrect result from Function Value with Ref " & "and Length parameters, when specifying the " & "entire array size"); end if; -- Check that both of the above versions of Function Value will -- propagate Interfaces.C.Strings.Dereference_Error when the value of -- the Ref Pointer parameter is null. Char_Ptr := null; begin TC_Char_Array_1 := Char_Pointers.Value(Ref => Char_Ptr, Terminator => Char_j); Report.Failed("Dereference_Error not raised by Function " & "Value with Terminator parameter, when " & "provided a null reference"); -- Call Report.Comment to ensure that the assignment to -- TC_Char_Array_1 is not "dead", and therefore can not be -- optimized away. Report.Comment(Interfaces.C.To_Ada(TC_Char_Array_1, False)); exception when Interfaces.C.Strings.Dereference_Error => null; -- OK, expected exception. when others => Report.Failed("Incorrect exception raised by Function " & "Value with Terminator parameter, when " & "provided a null reference"); end; begin TC_Char_Array_3 := Char_Pointers.Value(Char_Ptr, Interfaces.C.ptrdiff_t(TC_Array_Size)); Report.Failed("Dereference_Error not raised by Function " & "Value with Length parameter, when provided " & "a null reference"); -- Call Report.Comment to ensure that the assignment to -- TC_Char_Array_3 is not "dead", and therefore can not be -- optimized away. Report.Comment(Interfaces.C.To_Ada(TC_Char_Array_3, False)); exception when Interfaces.C.Strings.Dereference_Error => null; -- OK, expected exception. when others => Report.Failed("Incorrect exception raised by Function " & "Value with Length parameter, when " & "provided a null reference"); end; exception when others => Report.Failed ("Exception raised in Test_Block"); end Test_Block; Report.Result;end CXB3014;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -