1 |
294 |
jeremybenn |
-- CXB30132.AM
|
2 |
|
|
--
|
3 |
|
|
-- Grant of Unlimited Rights
|
4 |
|
|
--
|
5 |
|
|
-- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
|
6 |
|
|
-- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained
|
7 |
|
|
-- unlimited rights in the software and documentation contained herein.
|
8 |
|
|
-- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making
|
9 |
|
|
-- this public release, the Government intends to confer upon all
|
10 |
|
|
-- recipients unlimited rights equal to those held by the Government.
|
11 |
|
|
-- These rights include rights to use, duplicate, release or disclose the
|
12 |
|
|
-- released technical data and computer software in whole or in part, in
|
13 |
|
|
-- any manner and for any purpose whatsoever, and to have or permit others
|
14 |
|
|
-- to do so.
|
15 |
|
|
--
|
16 |
|
|
-- DISCLAIMER
|
17 |
|
|
--
|
18 |
|
|
-- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
|
19 |
|
|
-- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
|
20 |
|
|
-- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
|
21 |
|
|
-- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
|
22 |
|
|
-- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
|
23 |
|
|
-- PARTICULAR PURPOSE OF SAID MATERIAL.
|
24 |
|
|
--*
|
25 |
|
|
--
|
26 |
|
|
-- OBJECTIVE:
|
27 |
|
|
-- Check that imported, user-defined C language functions can be
|
28 |
|
|
-- called from an Ada program.
|
29 |
|
|
--
|
30 |
|
|
-- TEST DESCRIPTION:
|
31 |
|
|
-- This test checks that user-defined C language functions can be
|
32 |
|
|
-- imported and referenced from an Ada program. Two C language
|
33 |
|
|
-- functions are specified in files CXB30130.C and CXB30131.C.
|
34 |
|
|
-- These two functions are imported to this test program, using two
|
35 |
|
|
-- calls to Pragma Import. Each function is then called in this test,
|
36 |
|
|
-- and the results of the call are verified.
|
37 |
|
|
--
|
38 |
|
|
-- This test assumes that the following characters are all included
|
39 |
|
|
-- in the implementation defined type Interfaces.C.char:
|
40 |
|
|
-- ' ', 'a'..'z', and 'A'..'Z'.
|
41 |
|
|
--
|
42 |
|
|
-- APPLICABILITY CRITERIA:
|
43 |
|
|
-- This test is applicable to all implementations that provide
|
44 |
|
|
-- packages Interfaces.C and Interfaces.C.Strings. If an
|
45 |
|
|
-- implementation provides packages Interfaces.C and
|
46 |
|
|
-- Interfaces.C.Strings, this test must compile, execute, and
|
47 |
|
|
-- report "PASSED".
|
48 |
|
|
--
|
49 |
|
|
-- SPECIAL REQUIREMENTS:
|
50 |
|
|
-- The files CXB30130.C and CXB30131.C must be compiled with a C
|
51 |
|
|
-- compiler. Implementation dialects of C may require alteration of
|
52 |
|
|
-- the C program syntax (see individual C files).
|
53 |
|
|
--
|
54 |
|
|
-- Note that the compiled C code must be bound with the compiled Ada
|
55 |
|
|
-- code to create an executable image. An implementation must provide
|
56 |
|
|
-- the necessary commands to accomplish this.
|
57 |
|
|
--
|
58 |
|
|
-- Note that the C code included in CXB30130.C and CXB30131.C conforms
|
59 |
|
|
-- to ANSI-C. Modifications to these files may be required for other
|
60 |
|
|
-- C compilers. An implementation must provide the necessary
|
61 |
|
|
-- modifications to satisfy the function requirements.
|
62 |
|
|
--
|
63 |
|
|
-- TEST FILES:
|
64 |
|
|
-- The following files comprise this test:
|
65 |
|
|
--
|
66 |
|
|
-- CXB30130.C
|
67 |
|
|
-- CXB30131.C
|
68 |
|
|
-- CXB30132.AM
|
69 |
|
|
--
|
70 |
|
|
--
|
71 |
|
|
-- CHANGE HISTORY:
|
72 |
|
|
-- 13 Oct 95 SAIC Initial prerelease version.
|
73 |
|
|
-- 13 May 96 SAIC Incorporated reviewer comments for ACVC 2.1.
|
74 |
|
|
-- 26 Oct 96 SAIC Incorporated reviewer comments.
|
75 |
|
|
--
|
76 |
|
|
--!
|
77 |
|
|
|
78 |
|
|
with Report;
|
79 |
|
|
with Impdef;
|
80 |
|
|
with Interfaces.C; -- N/A => ERROR
|
81 |
|
|
with Interfaces.C.Strings; -- N/A => ERROR
|
82 |
|
|
|
83 |
|
|
procedure CXB30132 is
|
84 |
|
|
begin
|
85 |
|
|
|
86 |
|
|
Report.Test ("CXB3013", "Check that user-defined C functions can " &
|
87 |
|
|
"be imported into an Ada program");
|
88 |
|
|
|
89 |
|
|
Test_Block:
|
90 |
|
|
declare
|
91 |
|
|
|
92 |
|
|
package IC renames Interfaces.C;
|
93 |
|
|
package ICS renames Interfaces.C.Strings;
|
94 |
|
|
|
95 |
|
|
use type IC.char_array;
|
96 |
|
|
use type IC.int;
|
97 |
|
|
use type IC.short;
|
98 |
|
|
use type IC.C_float;
|
99 |
|
|
use type IC.double;
|
100 |
|
|
|
101 |
|
|
type Short_Ptr is access all IC.short;
|
102 |
|
|
type Float_Ptr is access all IC.C_float;
|
103 |
|
|
type Double_Ptr is access all IC.double;
|
104 |
|
|
subtype Char_Array_Type is IC.char_array(0..20);
|
105 |
|
|
|
106 |
|
|
TC_Default_int : IC.int := 49;
|
107 |
|
|
TC_Default_short : IC.short := 3;
|
108 |
|
|
TC_Default_float : IC.C_float := 50.0;
|
109 |
|
|
TC_Default_double : IC.double := 1209.0;
|
110 |
|
|
|
111 |
|
|
An_Int_Value : IC.int := TC_Default_int;
|
112 |
|
|
A_Short_Value : aliased IC.short := TC_Default_short;
|
113 |
|
|
A_Float_Value : aliased IC.C_float := TC_Default_float;
|
114 |
|
|
A_Double_Value : aliased IC.double := TC_Default_double;
|
115 |
|
|
|
116 |
|
|
A_Short_Int_Pointer : Short_Ptr := A_Short_Value'access;
|
117 |
|
|
A_Float_Pointer : Float_Ptr := A_Float_Value'access;
|
118 |
|
|
A_Double_Pointer : Double_Ptr := A_Double_Value'access;
|
119 |
|
|
|
120 |
|
|
Char_Array_1 : Char_Array_Type;
|
121 |
|
|
Char_Array_2 : Char_Array_Type;
|
122 |
|
|
Char_Pointer : ICS.chars_ptr;
|
123 |
|
|
|
124 |
|
|
TC_Char_Array : constant Char_Array_Type :=
|
125 |
|
|
"Look before you leap" & IC.nul;
|
126 |
|
|
TC_Return_int : IC.int := 0;
|
127 |
|
|
|
128 |
|
|
-- The Square_It function returns the square of the value The_Int
|
129 |
|
|
-- through the function name, and returns the square of the other
|
130 |
|
|
-- parameters through the parameter list (the last three parameters
|
131 |
|
|
-- are access values).
|
132 |
|
|
|
133 |
|
|
function Square_It (The_Int : in IC.int;
|
134 |
|
|
The_Short : in Short_Ptr;
|
135 |
|
|
The_Float : in Float_Ptr;
|
136 |
|
|
The_Double : in Double_Ptr) return IC.int;
|
137 |
|
|
|
138 |
|
|
-- The Combine_Strings function returns the result of the catenation
|
139 |
|
|
-- of the two string parameters through the function name.
|
140 |
|
|
|
141 |
|
|
function Combine_Strings (First_Part : in IC.char_array;
|
142 |
|
|
Second_Part : in IC.char_array)
|
143 |
|
|
return ICS.chars_ptr;
|
144 |
|
|
|
145 |
|
|
|
146 |
|
|
-- Use the user-defined C function square_it as a completion to the
|
147 |
|
|
-- function specification above.
|
148 |
|
|
|
149 |
|
|
pragma Import (Convention => C,
|
150 |
|
|
Entity => Square_It,
|
151 |
|
|
External_Name => Impdef.CXB30130_External_Name);
|
152 |
|
|
|
153 |
|
|
-- Use the user-defined C function combine_two_strings as a completion
|
154 |
|
|
-- to the function specification above.
|
155 |
|
|
|
156 |
|
|
pragma Import (C, Combine_Strings, Impdef.CXB30131_External_Name);
|
157 |
|
|
|
158 |
|
|
|
159 |
|
|
begin
|
160 |
|
|
|
161 |
|
|
-- Check that the imported version of C function CXB30130 produces
|
162 |
|
|
-- the correct results.
|
163 |
|
|
|
164 |
|
|
TC_Return_int := Square_It (The_Int => An_Int_Value,
|
165 |
|
|
The_Short => A_Short_Int_Pointer,
|
166 |
|
|
The_Float => A_Float_Pointer,
|
167 |
|
|
The_Double => A_Double_Pointer);
|
168 |
|
|
|
169 |
|
|
-- Compare the results with the expected results. Note that in the
|
170 |
|
|
-- case of the three "pointer" parameters, the objects being pointed
|
171 |
|
|
-- to have been modified as a result of the function.
|
172 |
|
|
|
173 |
|
|
if TC_Return_int /= An_Int_Value * An_Int_Value or
|
174 |
|
|
A_Short_Int_Pointer.all /= TC_Default_short * TC_Default_Short or
|
175 |
|
|
A_Short_Value /= TC_Default_short * TC_Default_Short or
|
176 |
|
|
A_Float_Pointer.all /= TC_Default_float * TC_Default_float or
|
177 |
|
|
A_Float_Value /= TC_Default_float * TC_Default_float or
|
178 |
|
|
A_Double_Pointer.all /= TC_Default_double * TC_Default_double or
|
179 |
|
|
A_Double_Value /= TC_Default_double * TC_Default_double
|
180 |
|
|
then
|
181 |
|
|
Report.Failed("Incorrect results returned from function square_it");
|
182 |
|
|
end if;
|
183 |
|
|
|
184 |
|
|
|
185 |
|
|
-- Check that two char_array values are combined by the imported
|
186 |
|
|
-- C function CXB30131.
|
187 |
|
|
|
188 |
|
|
Char_Array_1(0..12) := "Look before " & IC.nul;
|
189 |
|
|
Char_Array_2(0..8) := "you leap" & IC.nul;
|
190 |
|
|
|
191 |
|
|
Char_Pointer := Combine_Strings (Char_Array_1, Char_Array_2);
|
192 |
|
|
|
193 |
|
|
if ICS.Value(Char_Pointer) /= TC_Char_Array then
|
194 |
|
|
Report.Failed("Incorrect value returned from imported function " &
|
195 |
|
|
"combine_two_strings");
|
196 |
|
|
end if;
|
197 |
|
|
|
198 |
|
|
|
199 |
|
|
exception
|
200 |
|
|
when others => Report.Failed ("Exception raised in Test_Block");
|
201 |
|
|
end Test_Block;
|
202 |
|
|
|
203 |
|
|
Report.Result;
|
204 |
|
|
|
205 |
|
|
end CXB30132;
|