1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
with Interfaces.C; use Interfaces.C;
package body Foreigns is
function Sin (Arg : double) return double;
pragma Import (C, Sin);
function Log (Arg : double) return double;
pragma Import (C, Log);
function Exp (Arg : double) return double;
pragma Import (C, Exp);
function Sqrt (Arg : double) return double;
pragma Import (C, Sqrt);
function Asin (Arg : double) return double;
pragma Import (C, Asin);
function Acos (Arg : double) return double;
pragma Import (C, Acos);
function Asinh (Arg : double) return double;
pragma Import (C, Asinh);
function Acosh (Arg : double) return double;
pragma Import (C, Acosh);
function Atanh (X : double) return double;
pragma Import (C, Atanh);
function Atan2 (X, Y : double) return double;
pragma Import (C, Atan2);
type String_Cacc is access constant String;
type Foreign_Record is record
Name : String_Cacc;
Addr : Address;
end record;
Foreign_Arr : constant array (Natural range <>) of Foreign_Record :=
(
(new String'("sin"), Sin'Address),
(new String'("log"), Log'Address),
(new String'("exp"), Exp'Address),
(new String'("sqrt"), Sqrt'Address),
(new String'("asin"), Asin'Address),
(new String'("acos"), Acos'Address),
(new String'("asinh"), Asinh'Address),
(new String'("acosh"), Acosh'Address),
(new String'("atanh"), Atanh'Address),
(new String'("atan2"), Atan2'Address)
);
function Find_Foreign (Name : String) return Address is
begin
for I in Foreign_Arr'Range loop
if Foreign_Arr(I).Name.all = Name then
return Foreign_Arr(I).Addr;
end if;
end loop;
return Null_Address;
end Find_Foreign;
end Foreigns;
|