blob: 4cff400b804ff5d5b6357617a2ba58cd3299118e [file] [log] [blame]
-- CXB30132.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 imported, user-defined C language functions can be
-- called from an Ada program.
--
-- TEST DESCRIPTION:
-- This test checks that user-defined C language functions can be
-- imported and referenced from an Ada program. Two C language
-- functions are specified in files CXB30130.C and CXB30131.C.
-- These two functions are imported to this test program, using two
-- calls to Pragma Import. Each function is then called in this test,
-- and the results of the call are verified.
--
-- 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 and Interfaces.C.Strings. If an
-- implementation provides packages Interfaces.C and
-- Interfaces.C.Strings, this test must compile, execute, and
-- report "PASSED".
--
-- SPECIAL REQUIREMENTS:
-- The files CXB30130.C and CXB30131.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 CXB30130.C and CXB30131.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:
--
-- CXB30130.C
-- CXB30131.C
-- CXB30132.AM
--
--
-- CHANGE HISTORY:
-- 13 Oct 95 SAIC Initial prerelease version.
-- 13 May 96 SAIC Incorporated reviewer comments for ACVC 2.1.
-- 26 Oct 96 SAIC Incorporated reviewer comments.
--
--!
with Report;
with Impdef;
with Interfaces.C; -- N/A => ERROR
with Interfaces.C.Strings; -- N/A => ERROR
procedure CXB30132 is
begin
Report.Test ("CXB3013", "Check that user-defined C functions can " &
"be imported into an Ada program");
Test_Block:
declare
package IC renames Interfaces.C;
package ICS renames Interfaces.C.Strings;
use type IC.char_array;
use type IC.int;
use type IC.short;
use type IC.C_float;
use type IC.double;
type Short_Ptr is access all IC.short;
type Float_Ptr is access all IC.C_float;
type Double_Ptr is access all IC.double;
subtype Char_Array_Type is IC.char_array(0..20);
TC_Default_int : IC.int := 49;
TC_Default_short : IC.short := 3;
TC_Default_float : IC.C_float := 50.0;
TC_Default_double : IC.double := 1209.0;
An_Int_Value : IC.int := TC_Default_int;
A_Short_Value : aliased IC.short := TC_Default_short;
A_Float_Value : aliased IC.C_float := TC_Default_float;
A_Double_Value : aliased IC.double := TC_Default_double;
A_Short_Int_Pointer : Short_Ptr := A_Short_Value'access;
A_Float_Pointer : Float_Ptr := A_Float_Value'access;
A_Double_Pointer : Double_Ptr := A_Double_Value'access;
Char_Array_1 : Char_Array_Type;
Char_Array_2 : Char_Array_Type;
Char_Pointer : ICS.chars_ptr;
TC_Char_Array : constant Char_Array_Type :=
"Look before you leap" & IC.nul;
TC_Return_int : IC.int := 0;
-- The Square_It function returns the square of the value The_Int
-- through the function name, and returns the square of the other
-- parameters through the parameter list (the last three parameters
-- are access values).
function Square_It (The_Int : in IC.int;
The_Short : in Short_Ptr;
The_Float : in Float_Ptr;
The_Double : in Double_Ptr) return IC.int;
-- The Combine_Strings function returns the result of the catenation
-- of the two string parameters through the function name.
function Combine_Strings (First_Part : in IC.char_array;
Second_Part : in IC.char_array)
return ICS.chars_ptr;
-- Use the user-defined C function square_it as a completion to the
-- function specification above.
pragma Import (Convention => C,
Entity => Square_It,
External_Name => Impdef.CXB30130_External_Name);
-- Use the user-defined C function combine_two_strings as a completion
-- to the function specification above.
pragma Import (C, Combine_Strings, Impdef.CXB30131_External_Name);
begin
-- Check that the imported version of C function CXB30130 produces
-- the correct results.
TC_Return_int := Square_It (The_Int => An_Int_Value,
The_Short => A_Short_Int_Pointer,
The_Float => A_Float_Pointer,
The_Double => A_Double_Pointer);
-- Compare the results with the expected results. Note that in the
-- case of the three "pointer" parameters, the objects being pointed
-- to have been modified as a result of the function.
if TC_Return_int /= An_Int_Value * An_Int_Value or
A_Short_Int_Pointer.all /= TC_Default_short * TC_Default_Short or
A_Short_Value /= TC_Default_short * TC_Default_Short or
A_Float_Pointer.all /= TC_Default_float * TC_Default_float or
A_Float_Value /= TC_Default_float * TC_Default_float or
A_Double_Pointer.all /= TC_Default_double * TC_Default_double or
A_Double_Value /= TC_Default_double * TC_Default_double
then
Report.Failed("Incorrect results returned from function square_it");
end if;
-- Check that two char_array values are combined by the imported
-- C function CXB30131.
Char_Array_1(0..12) := "Look before " & IC.nul;
Char_Array_2(0..8) := "you leap" & IC.nul;
Char_Pointer := Combine_Strings (Char_Array_1, Char_Array_2);
if ICS.Value(Char_Pointer) /= TC_Char_Array then
Report.Failed("Incorrect value returned from imported function " &
"combine_two_strings");
end if;
exception
when others => Report.Failed ("Exception raised in Test_Block");
end Test_Block;
Report.Result;
end CXB30132;