DocAda(tm) is a productivity tool of KSCE
|
|
|
|
About DocAda Light:
Preface / Preliminary
/ Help
/ TOC
/ Copyright
DocAda Online at the Ada Home:
Complete RM95
/ Updates
/ News
The facilities relevant to interfacing with the C language are the package Interfaces.C and its children; and support for the Import, Export, and Convention pragmas with convention_identifier C.
The package Interfaces.C contains the basic types, constants and subprograms that allow an Ada program to pass scalars and strings to C functions.
Static Semantics
The library package Interfaces.C has the following declaration:
package Interfaces.C is pragma Pure(C); -- Declarations based on C's <limits.h> CHAR_BIT : constant := implementation-defined; -- typically 8 SCHAR_MIN : constant := implementation-defined; -- typically -128 SCHAR_MAX : constant := implementation-defined; -- typically 127 UCHAR_MAX : constant := implementation-defined; -- typically 255 -- Signed and Unsigned Integers type int is range implementation-defined; type short is range implementation-defined; type long is range implementation-defined; type signed_char is range SCHAR_MIN .. SCHAR_MAX; for signed_char'Size use CHAR_BIT; type unsigned is mod implementation-defined; type unsigned_short is mod implementation-defined; type unsigned_long is mod implementation-defined; type unsigned_char is mod (UCHAR_MAX+1); for unsigned_char'Size use CHAR_BIT; subtype plain_char is implementation-defined; type ptrdiff_t is range implementation-defined; type size_t is mod implementation-defined; -- Floating Point type C_float is digits implementation-defined; type double is digits implementation-defined; type long_double is digits implementation-defined; -- Characters and Strings type char is <implementation-defined character type>; nul : constant char := char'First; function To_C (Item : in Character) return char; function To_Ada (Item : in char) return Character; type char_array is array (size_t range <>) of aliased char; pragma Pack(char_array); for char_array'Component_Size use CHAR_BIT; function Is_Nul_Terminated (Item : in char_array) return Boolean; function To_C (Item : in String; Append_Nul : in Boolean := True) return char_array; function To_Ada (Item : in char_array; Trim_Nul : in Boolean := True) return String; procedure To_C (Item : in String; Target : out char_array; Count : out size_t; Append_Nul : in Boolean := True); procedure To_Ada (Item : in char_array; Target : out String; Count : out Natural; Trim_Nul : in Boolean := True); -- Wide Character and Wide String type wchar_t is implementation-defined; wide_nul : constant wchar_t := wchar_t'First; function To_C (Item : in Wide_Character) return wchar_t; function To_Ada (Item : in wchar_t ) return Wide_Character; type wchar_array is array (size_t range <>) of aliased wchar_t; pragma Pack(wchar_array); function Is_Nul_Terminated (Item : in wchar_array) return Boolean; function To_C (Item : in Wide_String; Append_Nul : in Boolean := True) return wchar_array; function To_Ada (Item : in wchar_array; Trim_Nul : in Boolean := True) return Wide_String; procedure To_C (Item : in Wide_String; Target : out wchar_array; Count : out size_t; Append_Nul : in Boolean := True); procedure To_Ada (Item : in wchar_array; Target : out Wide_String; Count : out Natural; Trim_Nul : in Boolean := True); Terminator_Error : exception; end Interfaces.C;
Each of the types declared in Interfaces.C is C-compatible.
The types int, short, long, unsigned, ptrdiff_t, size_t, double, char, and wchar_t correspond respectively to the C types having the same names. The types signed_char, unsigned_short, unsigned_long, unsigned_char, C_float, and long_double correspond respectively to the C types signed char, unsigned short, unsigned long, unsigned char, float, and long double.
The type of the subtype plain_char is either signed_char or unsigned_char, depending on the C implementation.
function To_C (Item : in Character) return char; function To_Ada (Item : in char ) return Character;
function Is_Nul_Terminated (Item : in char_array) return Boolean;
function To_C (Item : in String; Append_Nul : in Boolean := True) return char_array; function To_Ada (Item : in char_array; Trim_Nul : in Boolean := True) return String;
procedure To_C (Item : in String; Target : out char_array; Count : out size_t; Append_Nul : in Boolean := True); procedure To_Ada (Item : in char_array; Target : out String; Count : out Natural; Trim_Nul : in Boolean := True);
function Is_Nul_Terminated (Item : in wchar_array) return Boolean;
function To_C (Item : in Wide_Character) return wchar_t; function To_Ada (Item : in wchar_t ) return Wide_Character;
function To_C (Item : in Wide_String; Append_Nul : in Boolean := True) return wchar_array; function To_Ada (Item : in wchar_array; Trim_Nul : in Boolean := True) return Wide_String; procedure To_C (Item : in Wide_String; Target : out wchar_array; Count : out size_t; Append_Nul : in Boolean := True); procedure To_Ada (Item : in wchar_array; Target : out Wide_String; Count : out Natural; Trim_Nul : in Boolean := True);
Implementation Requirements
An implementation shall support pragma Convention with a C convention_identifier for a C-eligible type (see B.1)
Implementation Permissions
An implementation may provide additional declarations in the C interface packages.
Implementation Advice
An implementation should support the following interface correspondences between Ada and C.
NOTES
Examples
Example of using the Interfaces.C package:
--Calling the C Library Function strcpy with Interfaces.C; procedure Test is package C renames Interfaces.C; use type C.char_array; -- Call <string.h>strcpy: -- C definition of strcpy: char *strcpy(char *s1, const char *s2); -- This function copies the string pointed to by s2 (including the terminating null character) -- into the array pointed to by s1. If copying takes place between objects that overlap, -- the behavior is undefined. The strcpy function returns the value of s1. -- Note: since the C function's return value is of no interest, the Ada interface is a procedure procedure Strcpy (Target : out C.char_array; Source : in C.char_array); pragma Import(C, Strcpy, "strcpy"); Chars1 : C.char_array(1..20); Chars2 : C.char_array(1..20); begin Chars2(1..6) := "qwert" & C.nul; Strcpy(Chars1, Chars2); -- Now Chars1(1..6) = "qwert" & C.Nul end Test;
About DocAda Light:
Preface / Preliminary
/ Help
/ TOC
/ Copyright
DocAda Online at the Ada Home:
Complete RM95
/ Updates
/ News
|
|
|
|