2003-12-26 Guilhem Lavaux <guilhem@kaffe.org>
[official-gcc.git] / gcc / testsuite / ada / acats / tests / cxb / cxb30132.am
blob4cff400b804ff5d5b6357617a2ba58cd3299118e
1 -- 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.
16 --                                    DISCLAIMER
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 --*
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".
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:
66 --         CXB30130.C
67 --         CXB30131.C
68 --         CXB30132.AM
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.
76 --!
78 with Report;
79 with Impdef;
80 with Interfaces.C;                                            -- N/A => ERROR
81 with Interfaces.C.Strings;                                    -- N/A => ERROR
83 procedure CXB30132 is
84 begin
86    Report.Test ("CXB3013", "Check that user-defined C functions can " &
87                            "be imported into an Ada program");
89    Test_Block:
90    declare
92       package IC  renames Interfaces.C;
93       package ICS renames Interfaces.C.Strings;
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;
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);
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; 
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;
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;
120       Char_Array_1        : Char_Array_Type;
121       Char_Array_2        : Char_Array_Type;
122       Char_Pointer        : ICS.chars_ptr;
124       TC_Char_Array       : constant Char_Array_Type := 
125                               "Look before you leap" & IC.nul;
126       TC_Return_int       : IC.int := 0;
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).
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;
138       -- The Combine_Strings function returns the result of the catenation
139       -- of the two string parameters through the function name.
141       function Combine_Strings (First_Part  : in IC.char_array;
142                                 Second_Part : in IC.char_array) 
143         return ICS.chars_ptr;
146       -- Use the user-defined C function square_it as a completion to the
147       -- function specification above.
149      pragma Import (Convention    => C, 
150                     Entity        => Square_It, 
151                     External_Name => Impdef.CXB30130_External_Name);
153       -- Use the user-defined C function combine_two_strings as a completion
154       -- to the function specification above.
156      pragma Import (C, Combine_Strings, Impdef.CXB30131_External_Name);
159    begin
161       -- Check that the imported version of C function CXB30130 produces 
162       -- the correct results.
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);
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.
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;
185       -- Check that two char_array values are combined by the imported 
186       -- C function CXB30131.
188       Char_Array_1(0..12) := "Look before " & IC.nul;
189       Char_Array_2(0..8)  := "you leap"     & IC.nul;
191       Char_Pointer := Combine_Strings (Char_Array_1, Char_Array_2);
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;
199    exception
200       when others => Report.Failed ("Exception raised in Test_Block");
201    end Test_Block;
203    Report.Result;
205 end CXB30132;