Ada Programming/Libraries/Interfaces

From Wikibooks, open books for an open world
Jump to navigation Jump to search

float

The Interfaces package helps in interfacing with other programming languages. Ada is one of the few languages where interfacing with other languages is part of the language standard. The language standard defines the interfaces for C, Cobol and Fortran. Of course any implementation might define further interfaces — GNAT, for example, defines an interface to C++.

Interfacing with other languages is actually provided by pragma Export, pragma Import and pragma Convention.

In Ada 2012 these clauses have an alternate form using "with" in place of "pragma."

Example[edit]

As an example, here is a complete program that queries the terminfo (terminal information) database on Unix systems to get the dimensions of the current terminal window. It interfaces with C language functions in the ncurses package, so it must be linked with ncurses (e.g. with the -lncurses switch) when it is compiled.

 with Ada.Text_IO;
 with Interfaces.C;
 with Interfaces.C.Pointers;
 with Interfaces.C.Strings;
 
 procedure ctest is
   use Interfaces.C;
 
   type int_array is {{Ada/kw|array (size_t range <>) of aliased int with Pack;
 
   package Int_Pointers is new Pointers (
     Index              => size_t,
     Element            => int,
     Element_Array      => int_array,
     Default_Terminator => 0
   );
 
   -- int setupterm (char *term, int fildes, int *errret);
   function Get_Terminal_Data (
     terminal           : Interfaces.C.Strings.chars_ptr; 
     file_descriptor    : int; 
     error_code_pointer : Int_Pointers.Pointer
   ) return int
   with Import => True, Convention => C, External_Name => "setupterm";
 
   -- int tigetnum (char *name);
   function Get_Numeric_Value (name : Interfaces.C.Strings.chars_ptr) return int
   with Import => True, Convention => C, External_Name => "tigetnum";
 
   function Format (value : int) return String is
     result : String := int'Image (value);
   begin
     return (if result(1) = ' ' then result(2..result'Last) else result);
   end Format;
 
   error_code         : aliased int;
   error_code_pointer : Int_Pointers.Pointer := error_code'Access;
 
 begin
   if Get_Terminal_Data (Interfaces.C.Strings.Null_Ptr, 1, error_code_pointer) = 0 then
     Ada.Text_IO.Put_Line (
       "Window size: " &
       Format (Get_Numeric_Value (Interfaces.C.Strings.New_String ("cols"))) & "x" & 
       Format (Get_Numeric_Value (Interfaces.C.Strings.New_String ("lines")))
     );
   else
     Ada.Text_IO.Put_Line ("Can't access terminal data");
   end if;
 end ctest;

Child Packages[edit]

See also[edit]

Wikibook[edit]

Ada Reference Manual[edit]

Ada 95[edit]

Ada 2005[edit]