------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                   I N T E R F A C E S . F O R T R A N                    --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
-- This specification is adapted from the Ada Reference Manual for use with --
-- GNAT.  In accordance with the copyright of that document, you can freely --
-- copy and modify this specification,  provided that if you redistribute a --
-- modified version,  any changes that you have made are clearly indicated. --
--                                                                          --
------------------------------------------------------------------------------

with Ada.Numerics.Generic_Complex_Types;
pragma Elaborate_All (Ada.Numerics.Generic_Complex_Types);

package Interfaces.Fortran is
   pragma Pure;

   type Fortran_Integer  is new Integer;
   type Real             is new Float;
   type Double_Precision is new Long_Float;

   type Logical is new Boolean;
   for Logical'Size use Integer'Size;
   pragma Convention (Fortran, Logical);
   --  As required by Fortran standard, stand alone logical allocates same
   --  space as integer (but what about the array case???). The convention
   --  is important, since in Fortran, Booleans have zero/non-zero semantics
   --  for False/True, and the pragma Convention (Fortran) activates the
   --  special handling required in this case.

   package Single_Precision_Complex_Types is
      new Ada.Numerics.Generic_Complex_Types (Real);

   type Complex is new Single_Precision_Complex_Types.Complex;

   subtype Imaginary is Single_Precision_Complex_Types.Imaginary;
   i : Imaginary renames Single_Precision_Complex_Types.i;
   j : Imaginary renames Single_Precision_Complex_Types.j;

   type Character_Set is new Character;

   type Fortran_Character is array (Positive range <>) of Character_Set;

   function To_Fortran (Item : Character)     return Character_Set;
   function To_Ada     (Item : Character_Set) return Character;

   function To_Fortran (Item : String)            return Fortran_Character;
   function To_Ada     (Item : Fortran_Character) return String;

   procedure To_Fortran
     (Item   : String;
      Target : out Fortran_Character;
      Last   : out Natural);

   procedure To_Ada
     (Item   : Fortran_Character;
      Target : out String;
      Last   : out Natural);

end Interfaces.Fortran;
