DocAda(tm) is a productivity tool of KSCE

Prev | Up | Next | Back | Forward
About DocAda Light: Preface / Preliminary / Help / TOC / Copyright
DocAda Online at the Ada Home: Complete RM95 / Updates / News

B.3 Interfacing with C

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.

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;

Subclauses

  1. The Package Interfaces.C.Strings
  2. The Generic Package Interfaces.C.Pointers

About DocAda Light: Preface / Preliminary / Help / TOC / Copyright
DocAda Online at the Ada Home: Complete RM95 / Updates / News
Prev | Up | Next | Back | Forward


Copyright © 1994-1997 by Kempe Software Capital Enterprises. All Rights Reserved. For comments on this DocAda(tm) hypertext document, please write to KSCE, at docada@ksce.com