------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                                  P R J                                   --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
--          Copyright (C) 2001-2007, Free Software Foundation, Inc.         --
--                                                                          --
-- GNAT is free software;  you can  redistribute it  and/or modify it under --
-- terms of the  GNU General Public License as published  by the Free Soft- --
-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
-- for  more details.  You should have  received  a copy of the GNU General --
-- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
-- http://www.gnu.org/licenses for a complete copy of the license.          --
--                                                                          --
-- GNAT was originally developed  by the GNAT team at  New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
--                                                                          --
------------------------------------------------------------------------------

--  The following package declares the data types for GNAT project.
--  These data types may be used by GNAT Project-aware tools.

--  Children of these package implements various services on these data types.
--  See in particular Prj.Pars and Prj.Env.

with Casing; use Casing;
with Namet;  use Namet;
with Scans;  use Scans;
with Table;
with Types;  use Types;

with GNAT.Dynamic_HTables; use GNAT.Dynamic_HTables;
with GNAT.Dynamic_Tables;
with GNAT.OS_Lib;          use GNAT.OS_Lib;

with System.HTable;

package Prj is

   type Library_Support is (None, Static_Only, Full);
   --  Support for Library Project File.
   --  - None: Library Project Files are not supported at all
   --  - Static_Only: Library Project Files are only supported for static
   --    libraries.
   --  - Full: Library Project Files are supported for static and dynamic
   --    (shared) libraries.

   type Yes_No_Unknown is (Yes, No, Unknown);
   --  Tri-state to decide if -lgnarl is needed when linking

   type Mode is (Multi_Language, Ada_Only);

   function Get_Mode return Mode;
   pragma Inline (Get_Mode);

   procedure Set_Mode (New_Mode : Mode);
   pragma Inline (Set_Mode);

   Default_Language_Is_Ada : Boolean := True;
   --  If no language was defined in the project or the configuration file, it
   --  is an error, unless this variable is True, in which case it defaults to
   --  Ada. Calling Set_Mode will reset this variable, default is for Ada_Only.

   Must_Check_Configuration : Boolean := False;
   --  Whether the contents of the configuration file must be checked. This is
   --  in general only needed by gprbuild itself, since other applications can
   --  ignore such errors when they don't need to build directly. Calling
   --  Set_Mode will reset this variable, default is for Ada_Only.

   function In_Configuration return Boolean;
   pragma Inline (In_Configuration);

   procedure Set_In_Configuration (Value : Boolean);
   pragma Inline (Set_In_Configuration);

   All_Packages : constant String_List_Access;
   --  Default value of parameter Packages of procedures Parse, in Prj.Pars and
   --  Prj.Part, indicating that all packages should be checked.

   type Project_Tree_Data;
   type Project_Tree_Ref is access all Project_Tree_Data;
   --  Reference to a project tree. Several project trees may exist in memory
   --  at the same time.

   No_Project_Tree : constant Project_Tree_Ref;

   function Default_Ada_Spec_Suffix return File_Name_Type;
   pragma Inline (Default_Ada_Spec_Suffix);
   --  The name for the standard GNAT suffix for Ada spec source file name
   --  ".ads". Initialized by Prj.Initialize.

   function Default_Ada_Body_Suffix return File_Name_Type;
   pragma Inline (Default_Ada_Body_Suffix);
   --  The name for the standard GNAT suffix for Ada body source file name
   --  ".adb". Initialized by Prj.Initialize.

   function Slash return Path_Name_Type;
   pragma Inline (Slash);
   --  "/", used as the path of locally removed files

   Config_Project_File_Extension : String := ".cgpr";
   Project_File_Extension : String := ".gpr";
   --  The standard config and user project file name extensions. They are not
   --  constants, because Canonical_Case_File_Name is called on these variables
   --  in the body of Prj.

   type Error_Warning is (Silent, Warning, Error);
   --  Severity of some situations, such as: no Ada sources in a project where
   --  Ada is one of the language.
   --
   --  When the situation occurs, the behaviour depends on the setting:
   --
   --    - Silent:  no action
   --    - Warning: issue a warning, does not cause the tool to fail
   --    - Error:   issue an error, causes the tool to fail

   function Empty_File   return File_Name_Type;
   function Empty_String return Name_Id;
   --  Return the id for an empty string ""

   type Project_Id is new Nat;
   No_Project : constant Project_Id := 0;
   --  Id of a Project File

   type String_List_Id is new Nat;
   Nil_String : constant String_List_Id := 0;
   type String_Element is record
      Value         : Name_Id        := No_Name;
      Index         : Int            := 0;
      Display_Value : Name_Id        := No_Name;
      Location      : Source_Ptr     := No_Location;
      Flag          : Boolean        := False;
      Next          : String_List_Id := Nil_String;
   end record;
   --  To hold values for string list variables and array elements.
   --  Component Flag may be used for various purposes. For source
   --  directories, it indicates if the directory contains Ada source(s).

   package String_Element_Table is new GNAT.Dynamic_Tables
     (Table_Component_Type => String_Element,
      Table_Index_Type     => String_List_Id,
      Table_Low_Bound      => 1,
      Table_Initial        => 200,
      Table_Increment      => 100);
   --  The table for string elements in string lists

   type Variable_Kind is (Undefined, List, Single);
   --  Different kinds of variables

   subtype Defined_Variable_Kind is Variable_Kind range List .. Single;
   --  The defined kinds of variables

   Ignored : constant Variable_Kind;
   --  Used to indicate that a package declaration must be ignored
   --  while processing the project tree (unknown package name).

   type Variable_Value (Kind : Variable_Kind := Undefined) is record
      Project  : Project_Id := No_Project;
      Location : Source_Ptr := No_Location;
      Default  : Boolean    := False;
      case Kind is
         when Undefined =>
            null;
         when List =>
            Values : String_List_Id := Nil_String;
         when Single =>
            Value : Name_Id := No_Name;
            Index : Int     := 0;
      end case;
   end record;
   --  Values for variables and array elements. Default is True if the
   --  current value is the default one for the variable

   Nil_Variable_Value : constant Variable_Value;
   --  Value of a non existing variable or array element

   type Variable_Id is new Nat;
   No_Variable : constant Variable_Id := 0;
   type Variable is record
      Next  : Variable_Id := No_Variable;
      Name  : Name_Id;
      Value : Variable_Value;
   end record;
   --  To hold the list of variables in a project file and in packages

   package Variable_Element_Table is new GNAT.Dynamic_Tables
     (Table_Component_Type => Variable,
      Table_Index_Type     => Variable_Id,
      Table_Low_Bound      => 1,
      Table_Initial        => 200,
      Table_Increment      => 100);
   --  The table of variable in list of variables

   type Array_Element_Id is new Nat;
   No_Array_Element : constant Array_Element_Id := 0;
   type Array_Element is record
      Index                : Name_Id;
      Src_Index            : Int := 0;
      Index_Case_Sensitive : Boolean := True;
      Value                : Variable_Value;
      Next                 : Array_Element_Id := No_Array_Element;
   end record;
   --  Each Array_Element represents an array element and is linked (Next)
   --  to the next array element, if any, in the array.

   package Array_Element_Table is new GNAT.Dynamic_Tables
     (Table_Component_Type => Array_Element,
      Table_Index_Type     => Array_Element_Id,
      Table_Low_Bound      => 1,
      Table_Initial        => 200,
      Table_Increment      => 100);
   --  The table that contains all array elements

   type Array_Id is new Nat;
   No_Array : constant Array_Id := 0;
   type Array_Data is record
      Name  : Name_Id          := No_Name;
      Value : Array_Element_Id := No_Array_Element;
      Next  : Array_Id         := No_Array;
   end record;
   --  Each Array_Data value represents an array.
   --  Value is the id of the first element.
   --  Next is the id of the next array in the project file or package.

   package Array_Table is new GNAT.Dynamic_Tables
     (Table_Component_Type => Array_Data,
      Table_Index_Type     => Array_Id,
      Table_Low_Bound      => 1,
      Table_Initial        => 200,
      Table_Increment      => 100);
   --  The table that contains all arrays

   type Package_Id is new Nat;
   No_Package : constant Package_Id := 0;
   type Declarations is record
      Variables  : Variable_Id := No_Variable;
      Attributes : Variable_Id := No_Variable;
      Arrays     : Array_Id    := No_Array;
      Packages   : Package_Id  := No_Package;
   end record;
   --  Contains the declarations (variables, single and array attributes,
   --  packages) for a project or a package in a project.

   No_Declarations : constant Declarations :=
     (Variables  => No_Variable,
      Attributes => No_Variable,
      Arrays     => No_Array,
      Packages   => No_Package);
   --  Default value of Declarations: indicates that there is no declarations

   type Package_Element is record
      Name   : Name_Id      := No_Name;
      Decl   : Declarations := No_Declarations;
      Parent : Package_Id   := No_Package;
      Next   : Package_Id   := No_Package;
   end record;
   --  A package (includes declarations that may include other packages)

   package Package_Table is new GNAT.Dynamic_Tables
     (Table_Component_Type => Package_Element,
      Table_Index_Type     => Package_Id,
      Table_Low_Bound      => 1,
      Table_Initial        => 100,
      Table_Increment      => 100);
   --  The table that contains all packages

   type Language_Index is new Nat;
   --  Index of language data

   No_Language_Index : constant Language_Index := 0;
   --  Constant indicating that there is no language data

   procedure Display_Language_Name
     (In_Tree  : Project_Tree_Ref;
      Language : Language_Index);
   --  Output the name of a language

   type Header_Num is range 0 .. 6150;
   --  Size for hash table below. The upper bound is an arbitrary value, the
   --  value here was chosen after testing to determine a good compromise
   --  between speed of access and memory usage.

   function Hash (Name : Name_Id)        return Header_Num;
   function Hash (Name : File_Name_Type) return Header_Num;
   function Hash (Name : Path_Name_Type) return Header_Num;
   --  Used for computing hash values for names put into above hash table

   type Language_Kind is (File_Based, Unit_Based);
   --  Type for the kind of language. All languages are file based, except Ada
   --  which is unit based.

   type Dependency_File_Kind is (None, Makefile, ALI_File);
   --  Type of dependency to be checked: no dependency file, Makefile fragment
   --  or ALI file (for Ada).

   Makefile_Dependency_Suffix : constant String := ".d";
   ALI_Dependency_Suffix      : constant String := ".ali";

   Switches_Dependency_Suffix : constant String := ".cswi";

   Binder_Exchange_Suffix     : constant String := ".bexch";
   --  Suffix for binder exchange files

   Library_Exchange_Suffix     : constant String := ".lexch";
   --  Suffix for library exchange files

   type Name_List_Index is new Nat;
   No_Name_List            : constant Name_List_Index := 0;

   type Name_Node is record
      Name : Name_Id         := No_Name;
      Next : Name_List_Index := No_Name_List;
   end record;

   package Name_List_Table is new GNAT.Dynamic_Tables
     (Table_Component_Type => Name_Node,
      Table_Index_Type     => Name_List_Index,
      Table_Low_Bound      => 1,
      Table_Initial        => 10,
      Table_Increment      => 100);
   --  The table for lists of names used in package Language_Processing

   package Mapping_Files_Htable is new Simple_HTable
     (Header_Num => Header_Num,
      Element    => Path_Name_Type,
      No_Element => No_Path,
      Key        => Path_Name_Type,
      Hash       => Hash,
      Equal      => "=");
   --  A hash table to store the mapping files that are not used

   type Lang_Naming_Data is record
      Dot_Replacement : File_Name_Type := No_File;
      --  The string to replace '.' in the source file name (for Ada)

      Casing : Casing_Type := All_Lower_Case;
      --  The casing of the source file name (for Ada)

      Separate_Suffix : File_Name_Type := No_File;
      --  String to append to unit name for source file name of an Ada subunit

      Spec_Suffix : File_Name_Type := No_File;
      --  The string to append to the unit name for the
      --  source file name of a spec.

      Body_Suffix : File_Name_Type := No_File;
      --  The string to append to the unit name for the
      --  source file name of a body.
   end record;

   No_Lang_Naming_Data : constant Lang_Naming_Data :=
                           (Dot_Replacement => No_File,
                            Casing          => All_Lower_Case,
                            Separate_Suffix => No_File,
                            Spec_Suffix     => No_File,
                            Body_Suffix     => No_File);

   type Source_Id is new Nat;

   No_Source : constant Source_Id := 0;

   type Language_Config is record
      Kind : Language_Kind := File_Based;
      --  Kind of language. All languages are file based, except Ada which is
      --  unit based.

      Naming_Data : Lang_Naming_Data;
      --  The naming data for the languages (prefixs, etc)

      Compiler_Driver : File_Name_Type := No_File;
      --  The name of the executable for the compiler of the language

      Compiler_Driver_Path : String_Access := null;
      --  The path name of the executable for the compiler of the language

      Compiler_Required_Switches : Name_List_Index := No_Name_List;
      --  The list of switches that are required as a minimum to invoke the
      --  compiler driver.

      Compilation_PIC_Option : Name_List_Index := No_Name_List;
      --  The option(s) to compile a source in Position Independent Code for
      --  shared libraries. Specified in the configuration. When not specified,
      --  there is no need for such switch.

      Runtime_Library_Dir        : Name_Id := No_Name;
      --  Path name of the runtime library directory, if any

      Mapping_File_Switches  : Name_List_Index := No_Name_List;
      --  The option(s) to provide a mapping file to the compiler. Specified in
      --  the configuration. When value is No_Name_List, there is no mapping
      --  file.

      Mapping_Spec_Suffix        : File_Name_Type       := No_File;
      --  Placeholder representing the spec suffix in a mapping file

      Mapping_Body_Suffix        : File_Name_Type       := No_File;
      --  Placeholder representing the body suffix in a mapping file

      Config_File_Switches       : Name_List_Index      := No_Name_List;
      --  The option(s) to provide a config file to the compiler. Specified in
      --  the configuration. When value is No_Name_List, there is no config
      --  file.

      Dependency_Kind            : Dependency_File_Kind := None;
      --  The kind of dependency to be checked: none, Makefile fragment or
      --  ALI file (for Ada).

      Dependency_Option          : Name_List_Index      := No_Name_List;
      --  The option(s) to be used to create the dependency file. When value is
      --  No_Name_List, there is not such option(s).

      Compute_Dependency         : Name_List_Index      := No_Name_List;
      --  Hold the value of attribute Dependency_Driver, if declared for the
      --  language.

      Include_Option             : Name_List_Index      := No_Name_List;
      --  Hold the value of attribute Include_Switches, if declared for the
      --  language.

      Include_Path : Name_Id := No_Name;
      --  Name of environment variable declared by attribute Include_Path for
      --  the language.

      Include_Path_File : Name_Id := No_Name;
      --  Name of environment variable declared by attribute Include_Path_File
      --  for the language.

      Objects_Path : Name_Id := No_Name;
      --  Name of environment variable declared by attribute Objects_Path for
      --  the language.

      Objects_Path_File : Name_Id := No_Name;
      --  Name of environment variable declared by attribute Objects_Path_File
      --  for the language.

      Config_Body                : Name_Id         := No_Name;
      --  The template for a pragma Source_File_Name(_Project) for a specific
      --  file name of a body.

      Config_Spec           : Name_Id         := No_Name;
      --  The template for a pragma Source_File_Name(_Project) for a specific
      --  file name of a spec.

      Config_Body_Pattern   : Name_Id         := No_Name;
      --  The template for a pragma Source_File_Name(_Project) for a naming
      --  body pattern.

      Config_Spec_Pattern   : Name_Id         := No_Name;
      --  The template for a pragma Source_File_Name(_Project) for a naming
      --  spec pattern.

      Config_File_Unique         : Boolean         := False;
      --  Indicate if the config file specified to the compiler needs to be
      --  unique. If it is unique, then all config files are concatenated into
      --  a temp config file.

      Binder_Driver              : File_Name_Type  := No_File;
      --  The name of the binder driver for the language, if any

      Binder_Driver_Path         : Path_Name_Type  := No_Path;
      --  The path name of the binder driver

      Binder_Required_Switches   : Name_List_Index      := No_Name_List;
      --  Hold the value of attribute Binder'Required_Switches for the language

      Binder_Prefix              : Name_Id         := No_Name;
      --  Hold the value of attribute Binder'Prefixthe language

      Toolchain_Version          : Name_Id         := No_Name;
      --  Hold the value of attribute Toolchain_Version for the language

      Toolchain_Description      : Name_Id         := No_Name;
      --  Hold the value of attribute Toolchain_Description for the language

      PIC_Option                 : Name_Id         := No_Name;
      --  Hold the value of attribute Compiler'PIC_Option for the language

      Objects_Generated          : Boolean         := True;
      --  Indicates if objects are generated for the language

   end record;
   --  Record describing the configuration of a language

   No_Language_Config : constant Language_Config :=
                          (Kind                       => File_Based,
                           Naming_Data                => No_Lang_Naming_Data,
                           Compiler_Driver            => No_File,
                           Compiler_Driver_Path       => null,
                           Compiler_Required_Switches => No_Name_List,
                           Compilation_PIC_Option     => No_Name_List,
                           Runtime_Library_Dir        => No_Name,
                           Mapping_File_Switches      => No_Name_List,
                           Mapping_Spec_Suffix        => No_File,
                           Mapping_Body_Suffix        => No_File,
                           Config_File_Switches       => No_Name_List,
                           Dependency_Kind            => Makefile,
                           Dependency_Option          => No_Name_List,
                           Compute_Dependency         => No_Name_List,
                           Include_Option             => No_Name_List,
                           Include_Path               => No_Name,
                           Include_Path_File          => No_Name,
                           Objects_Path               => No_Name,
                           Objects_Path_File          => No_Name,
                           Config_Body                => No_Name,
                           Config_Spec                => No_Name,
                           Config_Body_Pattern        => No_Name,
                           Config_Spec_Pattern        => No_Name,
                           Config_File_Unique         => False,
                           Binder_Driver              => No_File,
                           Binder_Driver_Path         => No_Path,
                           Binder_Required_Switches   => No_Name_List,
                           Binder_Prefix              => No_Name,
                           Toolchain_Version          => No_Name,
                           Toolchain_Description      => No_Name,
                           PIC_Option                 => No_Name,
                           Objects_Generated          => True);

   type Language_Data is record
      Name          : Name_Id         := No_Name;
      Display_Name  : Name_Id         := No_Name;
      Config        : Language_Config := No_Language_Config;
      First_Source  : Source_Id       := No_Source;
      Mapping_Files : Mapping_Files_Htable.Instance :=
                        Mapping_Files_Htable.Nil;
      Next          : Language_Index  := No_Language_Index;
   end record;

   No_Language_Data : constant Language_Data :=
                        (Name          => No_Name,
                         Display_Name  => No_Name,
                         Config        => No_Language_Config,
                         First_Source  => No_Source,
                         Mapping_Files => Mapping_Files_Htable.Nil,
                         Next          => No_Language_Index);

   package Language_Data_Table is new GNAT.Dynamic_Tables
     (Table_Component_Type => Language_Data,
      Table_Index_Type     => Language_Index,
      Table_Low_Bound      => 1,
      Table_Initial        => 10,
      Table_Increment      => 100);
   --  The table for lists of names used in package Language_Processing

   type Alternate_Language_Id is new Nat;

   No_Alternate_Language : constant Alternate_Language_Id := 0;

   type Alternate_Language_Data is record
      Language : Language_Index := No_Language_Index;
      Next     : Alternate_Language_Id := No_Alternate_Language;
   end record;

   package Alternate_Language_Table is new GNAT.Dynamic_Tables
     (Table_Component_Type => Alternate_Language_Data,
      Table_Index_Type     => Alternate_Language_Id,
      Table_Low_Bound      => 1,
      Table_Initial        => 10,
      Table_Increment      => 100);
   --  The table for storing the alternate languages of a header file that
   --  is used for several languages.

   type Source_Kind is (Spec, Impl, Sep);

   type Source_Data is record
      Project             : Project_Id            := No_Project;
      --  Project of the source

      Language_Name       : Name_Id               := No_Name;
      --  Name of the language of the source

      Language            : Language_Index        := No_Language_Index;
      --  Index of the language

      Lang_Kind           : Language_Kind         := File_Based;
      --  Kind of the language

      Alternate_Languages : Alternate_Language_Id := No_Alternate_Language;
      --  List of languages a header file may also be, in addition of
      --  language Language_Name.

      Kind                : Source_Kind           := Spec;
      --  Kind of the source: spec, body or subunit

      Dependency          : Dependency_File_Kind  := None;
      --  Kind of dependency: none, Makefile fragment or ALI file

      Other_Part          : Source_Id             := No_Source;
      --  Source ID for the other part, if any: for a spec, indicates its body;
      --  for a body, indicates its spec.

      Unit                : Name_Id               := No_Name;
      --  Name of the unit, if language is unit based

      Index               : Int                   := 0;
      --  Index of the source in a multi unit source file

      Locally_Removed     : Boolean               := False;
      --  True if the source has been "excluded"

      Get_Object          : Boolean               := False;
      --  Indicates that the object of the source should be put in the global
      --  archive. This is for Ada, when only the closure of a main needs to
      --  be compiled/recompiled.

      Replaced_By         : Source_Id             := No_Source;

      File                : File_Name_Type        := No_File;
      --  Canonical file name of the source

      Display_File        : File_Name_Type        := No_File;
      --  File name of the source, for display purposes

      Path                : Path_Name_Type        := No_Path;
      --  Canonical path name of the source

      Display_Path        : Path_Name_Type        := No_Path;
      --  Path name of the source, for display purposes

      Source_TS           : Time_Stamp_Type       := Empty_Time_Stamp;
      --  Time stamp of the source file

      Object_Project      : Project_Id            := No_Project;
      --  Project where the object file is

      Object_Exists       : Boolean               := True;
      --  True if an object file exists

      Object              : File_Name_Type        := No_File;
      --  File name of the object file

      Current_Object_Path : Path_Name_Type        := No_Path;
      --  Object path of an existing object file

      Object_Path         : Path_Name_Type        := No_Path;
      --  Object path of the real object file

      Object_TS : Time_Stamp_Type := Empty_Time_Stamp;
      --  Object file time stamp

      Dep_Name : File_Name_Type := No_File;
      --  Dependency file simple name

      Current_Dep_Path : Path_Name_Type := No_Path;
      --  Path name of an existing dependency file

      Dep_Path : Path_Name_Type := No_Path;
      --  Path name of the real dependency file

      Dep_TS : Time_Stamp_Type := Empty_Time_Stamp;
      --  Dependency file time stamp

      Switches            : File_Name_Type  := No_File;
      --  File name of the switches file

      Switches_Path       : Path_Name_Type  := No_Path;
      --  Path name of the switches file

      Switches_TS         : Time_Stamp_Type := Empty_Time_Stamp;
      --  Switches file time stamp

      Naming_Exception    : Boolean         := False;
      --  True if the source has an exceptional name

      Next_In_Sources     : Source_Id       := No_Source;
      --  Link to another source in the project tree

      Next_In_Project     : Source_Id       := No_Source;
      --  Link to another source in the project

      Next_In_Lang        : Source_Id       := No_Source;
      --  Link to another source of the same language
   end record;

   No_Source_Data : constant Source_Data :=
                      (Project             => No_Project,
                       Language_Name       => No_Name,
                       Language            => No_Language_Index,
                       Lang_Kind           => File_Based,
                       Alternate_Languages => No_Alternate_Language,
                       Kind                => Spec,
                       Dependency          => None,
                       Other_Part          => No_Source,
                       Unit                => No_Name,
                       Index               => 0,
                       Locally_Removed     => False,
                       Get_Object          => False,
                       Replaced_By         => No_Source,
                       File                => No_File,
                       Display_File        => No_File,
                       Path                => No_Path,
                       Display_Path        => No_Path,
                       Source_TS           => Empty_Time_Stamp,
                       Object_Project      => No_Project,
                       Object_Exists       => True,
                       Object              => No_File,
                       Current_Object_Path => No_Path,
                       Object_Path         => No_Path,
                       Object_TS           => Empty_Time_Stamp,
                       Dep_Name            => No_File,
                       Current_Dep_Path    => No_Path,
                       Dep_Path            => No_Path,
                       Dep_TS              => Empty_Time_Stamp,
                       Switches            => No_File,
                       Switches_Path       => No_Path,
                       Switches_TS         => Empty_Time_Stamp,
                       Naming_Exception    => False,
                       Next_In_Sources     => No_Source,
                       Next_In_Project     => No_Source,
                       Next_In_Lang        => No_Source);

   package Source_Data_Table is new GNAT.Dynamic_Tables
     (Table_Component_Type => Source_Data,
      Table_Index_Type     => Source_Id,
      Table_Low_Bound      => 1,
      Table_Initial        => 1000,
      Table_Increment      => 100);
   --  The table for the sources

   package Source_Paths_Htable is new Simple_HTable
     (Header_Num => Header_Num,
      Element    => Source_Id,
      No_Element => No_Source,
      Key        => Path_Name_Type,
      Hash       => Hash,
      Equal      => "=");
   --  Mapping of source paths to source ids

   type Verbosity is (Default, Medium, High);
   --  Verbosity when parsing GNAT Project Files
   --    Default is default (very quiet, if no errors).
   --    Medium is more verbose.
   --    High is extremely verbose.

   Current_Verbosity : Verbosity := Default;
   --  The current value of the verbosity the project files are parsed with

   type Lib_Kind is (Static, Dynamic, Relocatable);

   type Policy is (Autonomous, Compliant, Controlled, Restricted, Direct);
   --  Type to specify the symbol policy, when symbol control is supported.
   --  See full explanation about this type in package Symbols.
   --    Autonomous: Create a symbol file without considering any reference
   --    Compliant:  Try to be as compatible as possible with an existing ref
   --    Controlled: Fail if symbols are not the same as those in the reference
   --    Restricted: Restrict the symbols to those in the symbol file
   --    Direct:     The symbol file is used as is

   type Symbol_Record is record
      Symbol_File   : Path_Name_Type := No_Path;
      Reference     : Path_Name_Type := No_Path;
      Symbol_Policy : Policy  := Autonomous;
   end record;
   --  Type to keep the symbol data to be used when building a shared library

   No_Symbols : constant Symbol_Record :=
     (Symbol_File   => No_Path,
      Reference     => No_Path,
      Symbol_Policy => Autonomous);
   --  The default value of the symbol data

   function Image (Casing : Casing_Type) return String;
   --  Similar to 'Image (but avoid use of this attribute in compiler)

   function Value (Image : String) return Casing_Type;
   --  Similar to 'Value (but avoid use of this attribute in compiler)
   --  Raises Constraint_Error if not a Casing_Type image.

   --  Declarations for gprmake:

   First_Language_Index        : constant Language_Index := 1;
   First_Language_Indexes_Last : constant Language_Index := 5;

   Ada_Language_Index         : constant Language_Index :=
                                  First_Language_Index;
   C_Language_Index           : constant Language_Index :=
                                  Ada_Language_Index + 1;
   C_Plus_Plus_Language_Index : constant Language_Index :=
                                  C_Language_Index + 1;

   Last_Language_Index : Language_Index := No_Language_Index;

   subtype First_Language_Indexes is Language_Index
      range First_Language_Index .. First_Language_Indexes_Last;

   package Language_Indexes is new System.HTable.Simple_HTable
     (Header_Num => Header_Num,
      Element    => Language_Index,
      No_Element => No_Language_Index,
      Key        => Name_Id,
      Hash       => Hash,
      Equal      => "=");
   --  Mapping of language names to language indexes

   package Language_Names is new Table.Table
     (Table_Component_Type => Name_Id,
      Table_Index_Type     => Language_Index,
      Table_Low_Bound      => 1,
      Table_Initial        => 4,
      Table_Increment      => 100,
      Table_Name           => "Prj.Language_Names");
   --  The table for the name of programming languages

   procedure Add_Language_Name (Name : Name_Id);

   procedure Display_Language_Name (Language : Language_Index);

   type Languages_In_Project is array (First_Language_Indexes) of Boolean;
   --  Set of supported languages used in a project

   No_Languages : constant Languages_In_Project := (others => False);
   --  No supported languages are used

   type Supp_Language_Index is new Nat;
   No_Supp_Language_Index  : constant Supp_Language_Index := 0;

   type Supp_Language is record
      Index   : Language_Index := No_Language_Index;
      Present : Boolean := False;
      Next    : Supp_Language_Index := No_Supp_Language_Index;
   end record;

   package Present_Language_Table is new GNAT.Dynamic_Tables
     (Table_Component_Type => Supp_Language,
      Table_Index_Type     => Supp_Language_Index,
      Table_Low_Bound      => 1,
      Table_Initial        => 4,
      Table_Increment      => 100);
   --  The table for the presence of languages with an index that is outside
   --  of First_Language_Indexes.

   type Impl_Suffix_Array is array (First_Language_Indexes) of File_Name_Type;
   --  Suffixes for the non spec sources of the different supported languages
   --  in a project.

   No_Impl_Suffixes : constant Impl_Suffix_Array := (others => No_File);
   --  A default value for the non spec source suffixes

   type Supp_Suffix is record
      Index   : Language_Index      := No_Language_Index;
      Suffix  : File_Name_Type      := No_File;
      Next    : Supp_Language_Index := No_Supp_Language_Index;
   end record;

   package Supp_Suffix_Table is new GNAT.Dynamic_Tables
     (Table_Component_Type => Supp_Suffix,
      Table_Index_Type     => Supp_Language_Index,
      Table_Low_Bound      => 1,
      Table_Initial        => 4,
      Table_Increment      => 100);
   --  The table for the presence of languages with an index that is outside
   --  of First_Language_Indexes.

   type Lang_Kind is (GNU, Other);

   type Language_Processing_Data is record
      Compiler_Drivers     : Name_List_Index := No_Name_List;
      Compiler_Paths       : Name_Id         := No_Name;
      Compiler_Kinds       : Lang_Kind       := GNU;
      Dependency_Options   : Name_List_Index := No_Name_List;
      Compute_Dependencies : Name_List_Index := No_Name_List;
      Include_Options      : Name_List_Index := No_Name_List;
      Binder_Drivers       : Name_Id         := No_Name;
      Binder_Driver_Paths  : Name_Id         := No_Name;
   end record;

   Default_Language_Processing_Data :
     constant Language_Processing_Data :=
       (Compiler_Drivers     => No_Name_List,
        Compiler_Paths       => No_Name,
        Compiler_Kinds       => GNU,
        Dependency_Options   => No_Name_List,
        Compute_Dependencies => No_Name_List,
        Include_Options      => No_Name_List,
        Binder_Drivers       => No_Name,
        Binder_Driver_Paths  => No_Name);

   type First_Language_Processing_Data is
     array (First_Language_Indexes) of Language_Processing_Data;

   Default_First_Language_Processing_Data :
      constant First_Language_Processing_Data :=
                 (others => Default_Language_Processing_Data);

   type Supp_Language_Data is record
      Index : Language_Index := No_Language_Index;
      Data  : Language_Processing_Data := Default_Language_Processing_Data;
      Next  : Supp_Language_Index := No_Supp_Language_Index;
   end record;

   package Supp_Language_Table is new GNAT.Dynamic_Tables
     (Table_Component_Type => Supp_Language_Data,
      Table_Index_Type     => Supp_Language_Index,
      Table_Low_Bound      => 1,
      Table_Initial        => 4,
      Table_Increment      => 100);
   --  The table for language data when there are more languages than
   --  in First_Language_Indexes.

   type Other_Source_Id is new Nat;
   No_Other_Source : constant Other_Source_Id := 0;

   type Other_Source is record
      Language         : Language_Index;       --  language of the source
      File_Name        : File_Name_Type;       --  source file simple name
      Path_Name        : Path_Name_Type;       --  source full path name
      Source_TS        : Time_Stamp_Type;      --  source file time stamp
      Object_Name      : File_Name_Type;       --  object file simple name
      Object_Path      : Path_Name_Type;       --  object full path name
      Object_TS        : Time_Stamp_Type;      --  object file time stamp
      Dep_Name         : File_Name_Type;       --  dependency file simple name
      Dep_Path         : Path_Name_Type;       --  dependency full path name
      Dep_TS           : Time_Stamp_Type;      --  dependency file time stamp
      Naming_Exception : Boolean := False;     --  True if a naming exception
      Next             : Other_Source_Id := No_Other_Source;
   end record;
   --  Data for a source in a language other than Ada

   package Other_Source_Table is new GNAT.Dynamic_Tables
     (Table_Component_Type => Other_Source,
      Table_Index_Type     => Other_Source_Id,
      Table_Low_Bound      => 1,
      Table_Initial        => 200,
      Table_Increment      => 100);
   --  The table for sources of languages other than Ada

   --  The following record contains data for a naming scheme

   type Naming_Data is record

      Dot_Replacement : File_Name_Type := No_File;
      --  The string to replace '.' in the source file name (for Ada)

      Dot_Repl_Loc : Source_Ptr := No_Location;

      Casing : Casing_Type := All_Lower_Case;
      --  The casing of the source file name (for Ada)

      Spec_Suffix : Array_Element_Id := No_Array_Element;
      --  The string to append to the unit name for the
      --  source file name of a spec.
      --  Indexed by the programming language.

      Ada_Spec_Suffix_Loc : Source_Ptr := No_Location;

      Body_Suffix : Array_Element_Id := No_Array_Element;
      --  The string to append to the unit name for the
      --  source file name of a body.
      --  Indexed by the programming language.

      Ada_Body_Suffix_Loc : Source_Ptr := No_Location;

      Separate_Suffix : File_Name_Type := No_File;
      --  String to append to unit name for source file name of an Ada subunit

      Sep_Suffix_Loc : Source_Ptr := No_Location;
      --  Position in the project file source where Separate_Suffix is defined

      Specs : Array_Element_Id := No_Array_Element;
      --  An associative array mapping individual specs to source file names
      --  This is specific to Ada.

      Bodies : Array_Element_Id := No_Array_Element;
      --  An associative array mapping individual bodies to source file names
      --  This is specific to Ada.

      Specification_Exceptions : Array_Element_Id := No_Array_Element;
      --  An associative array listing spec file names that do not have the
      --  spec suffix. Not used by Ada. Indexed by programming language name.

      Implementation_Exceptions : Array_Element_Id := No_Array_Element;
      --  An associative array listing body file names that do not have the
      --  body suffix. Not used by Ada. Indexed by programming language name.

      --  For gprmake:

      Impl_Suffixes : Impl_Suffix_Array   := No_Impl_Suffixes;
      Supp_Suffixes : Supp_Language_Index := No_Supp_Language_Index;
   end record;

   function Spec_Suffix_Of
     (In_Tree  : Project_Tree_Ref;
      Language : String;
      Naming   : Naming_Data) return String;

   function Spec_Suffix_Id_Of
     (In_Tree  : Project_Tree_Ref;
      Language : String;
      Naming   : Naming_Data) return File_Name_Type;

   function Spec_Suffix_Id_Of
     (In_Tree     : Project_Tree_Ref;
      Language_Id : Name_Id;
      Naming      : Naming_Data) return File_Name_Type;

   procedure Set_Spec_Suffix
     (In_Tree  : Project_Tree_Ref;
      Language : String;
      Naming   : in out Naming_Data;
      Suffix   : File_Name_Type);

   function Body_Suffix_Id_Of
     (In_Tree  : Project_Tree_Ref;
      Language : String;
      Naming   : Naming_Data) return File_Name_Type;

   function Body_Suffix_Id_Of
     (In_Tree     : Project_Tree_Ref;
      Language_Id : Name_Id;
      Naming      : Naming_Data) return File_Name_Type;

   function Body_Suffix_Of
     (In_Tree  : Project_Tree_Ref;
      Language : String;
      Naming   : Naming_Data) return String;

   procedure Set_Body_Suffix
     (In_Tree  : Project_Tree_Ref;
      Language : String;
      Naming   : in out Naming_Data;
      Suffix   : File_Name_Type);

   function Objects_Exist_For
     (Language : String;
      In_Tree  : Project_Tree_Ref) return Boolean;

   function Standard_Naming_Data
     (Tree : Project_Tree_Ref := No_Project_Tree) return Naming_Data;
   pragma Inline (Standard_Naming_Data);
   --  The standard GNAT naming scheme when Tree is No_Project_Tree.
   --  Otherwise, return the default naming scheme for the project tree Tree,
   --  which must have been Initialized.

   function Same_Naming_Scheme
     (Left, Right : Naming_Data) return Boolean;
   --  Returns True if Left and Right are the same naming scheme
   --  not considering Specs and Bodies.

   type Project_List is new Nat;
   Empty_Project_List : constant Project_List := 0;
   --  A list of project files

   type Project_Element is record
      Project : Project_Id   := No_Project;
      Next    : Project_List := Empty_Project_List;
   end record;
   --  Element in a list of project files. Next is the id of the next
   --  project file in the list.

   package Project_List_Table is new GNAT.Dynamic_Tables
     (Table_Component_Type => Project_Element,
      Table_Index_Type     => Project_List,
      Table_Low_Bound      => 1,
      Table_Initial        => 100,
      Table_Increment      => 100);
   --  The table that contains the lists of project files

   type Project_Configuration is record
         Run_Path_Option          : Name_List_Index := No_Name_List;
         --  The option to use when linking to specify the path where to look
         --  for libraries.

         Executable_Suffix        : Name_Id         := No_Name;
         --  The suffix of executables, when specified in the configuration or
         --  in package Builder of the main project. When this is not
         --  specified, the executable suffix is the default for the platform.

         --  Linking

         Linker                   : Path_Name_Type  := No_Path;
         --  Path name of the linker driver; specified in the configuration
         --  or in the package Builder of the main project.

         Minimum_Linker_Options   : Name_List_Index := No_Name_List;
         --  The minimum options for the linker driver; specified in the
         --  configuration.

         Linker_Executable_Option : Name_List_Index := No_Name_List;
         --  The option(s) to indicate the name of the executable in the
         --  linker command. Specified in the configuration. When not
         --  specified, default to -o <executable name>.

         Linker_Lib_Dir_Option    : Name_Id         := No_Name;
         --  The option to specify where to find a library for linking.
         --  Specified in the configuration. When not specified, defaults to
         --  "-L".

         Linker_Lib_Name_Option   : Name_Id         := No_Name;
         --  The option to specify the name of a library for linking.
         --  Specified in the configuration. When not specified, defaults to
         --  "-l".

         --  Libraries

         Library_Builder          : Path_Name_Type  := No_Path;
         --  The executable to build library. Specified in the configuration.

         Lib_Support              : Library_Support := None;
         --  The level of library support. Specified in the configuration.
         --  Support is none, static libraries only or both static and shared
         --  libraries.

         --  Archives

         Archive_Builder          : Name_List_Index := No_Name_List;
         --  The name of the executable to build archives, with the minimum
         --  switches. Specified in the configuration.

         Archive_Indexer          : Name_List_Index := No_Name_List;
         --  The name of the executable to index archives, with the minimum
         --  switches. Specified in the configuration.

         Archive_Suffix           : File_Name_Type  := No_File;
         --  The suffix of archives. Specified in the configuration. When not
         --  specified, defaults to ".a".

         Lib_Partial_Linker       : Name_List_Index := No_Name_List;

         --  Shared libraries

         Shared_Lib_Prefix        : File_Name_Type  := No_File;
         --  Part of a shared library file name that precedes the name of the
         --  library. Specified in the configuration. When not specified,
         --  defaults to "lib".

         Shared_Lib_Suffix        : File_Name_Type  := No_File;
         --  Suffix of shared libraries, after the library name in the shared
         --  library name. Specified in the configuration. When not specified,
         --  default to ".so".

         Shared_Lib_Min_Options   : Name_List_Index := No_Name_List;
         --

         Lib_Version_Options      : Name_List_Index := No_Name_List;
         --

         Symbolic_Link_Supported  : Boolean         := False;
         --

         Lib_Maj_Min_Id_Supported : Boolean         := False;
         --

         Auto_Init_Supported      : Boolean         := False;
         --
   end record;

   Default_Project_Config : constant Project_Configuration :=
       (Run_Path_Option          => No_Name_List,
        Executable_Suffix        => No_Name,
        Linker                   => No_Path,
        Minimum_Linker_Options   => No_Name_List,
        Linker_Executable_Option => No_Name_List,
        Linker_Lib_Dir_Option    => No_Name,
        Linker_Lib_Name_Option   => No_Name,
        Library_Builder          => No_Path,
        Lib_Support              => None,
        Archive_Builder          => No_Name_List,
        Archive_Indexer          => No_Name_List,
        Archive_Suffix           => No_File,
        Lib_Partial_Linker       => No_Name_List,
        Shared_Lib_Prefix        => No_File,
        Shared_Lib_Suffix        => No_File,
        Shared_Lib_Min_Options   => No_Name_List,
        Lib_Version_Options      => No_Name_List,
        Symbolic_Link_Supported  => False,
        Lib_Maj_Min_Id_Supported => False,
        Auto_Init_Supported      => False);

   --  The following record describes a project file representation

   --  Note that it is not specified if the path names of directories (source,
   --  object, library or exec directories) end with or without a directory
   --  separator.

   type Project_Data is record
      Externally_Built : Boolean := False;
      --  True if the project is externally built. In such case, the Project
      --  Manager will not modify anything in this project.

      Languages : Name_List_Index := No_Name_List;
      --  The list of languages of the sources of this project

      Config : Project_Configuration;

      First_Referred_By : Project_Id := No_Project;
      --  The project, if any, that was the first to be known as importing or
      --  extending this project

      Name : Name_Id := No_Name;
      --  The name of the project

      Display_Name : Name_Id := No_Name;
      --  The name of the project with the spelling of its declaration

      Path_Name : Path_Name_Type := No_Path;
      --  The path name of the project file

      Display_Path_Name : Path_Name_Type := No_Path;
      --  The path name used for display purposes. May be different from
      --  Path_Name for platforms where the file names are case-insensitive.

      Virtual : Boolean := False;
      --  True for virtual extending projects

      Location : Source_Ptr := No_Location;
      --  The location in the project file source of the reserved word project

      Mains : String_List_Id := Nil_String;
      --  List of mains specified by attribute Main

      Directory : Path_Name_Type := No_Path;
      --  Path name of the directory where the project file resides

      Display_Directory : Path_Name_Type := No_Path;
      --  The path name of the project directory, for display purposes. May be
      --  different from Directory for platforms where the file names are
      --  case-insensitive.

      Dir_Path : String_Access;
      --  Same as Directory, but as an access to String

      Library : Boolean := False;
      --  True if this is a library project

      Library_Dir : Path_Name_Type := No_Path;
      --  If a library project, path name of the directory where the library
      --  resides.

      Display_Library_Dir : Path_Name_Type := No_Path;
      --  The path name of the library directory, for display purposes. May be
      --  different from Library_Dir for platforms where the file names are
      --  case-insensitive.

      Library_TS : Time_Stamp_Type := Empty_Time_Stamp;
      --  The timestamp of a library file in a library project

      Library_Src_Dir : Path_Name_Type := No_Path;
      --  If a Stand-Alone Library project, path name of the directory where
      --  the sources of the interfaces of the library are copied. By default,
      --  if attribute Library_Src_Dir is not specified, sources of the
      --  interfaces are not copied anywhere.

      Display_Library_Src_Dir : Path_Name_Type := No_Path;
      --  The path name of the library source directory, for display purposes.
      --  May be different from Library_Src_Dir for platforms where the file
      --  names are case-insensitive.

      Library_ALI_Dir : Path_Name_Type := No_Path;
      --  In a library project, path name of the directory where the ALI files
      --  are copied. If attribute Library_ALI_Dir is not specified, ALI files
      --  are copied in the Library_Dir.

      Display_Library_ALI_Dir : Path_Name_Type := No_Path;
      --  The path name of the library ALI directory, for display purposes. May
      --  be different from Library_ALI_Dir for platforms where the file names
      --  are case-insensitive.

      Library_Name : Name_Id := No_Name;
      --  If a library project, name of the library

      Library_Kind : Lib_Kind := Static;
      --  If a library project, kind of library

      Lib_Internal_Name : Name_Id := No_Name;
      --  If a library project, internal name store inside the library

      Standalone_Library : Boolean := False;
      --  Indicate that this is a Standalone Library Project File

      Lib_Interface_ALIs : String_List_Id := Nil_String;
      --  For Standalone Library Project Files, indicate the list of Interface
      --  ALI files.

      Lib_Auto_Init : Boolean := False;
      --  For non static Stand-Alone Library Project Files, indicate if
      --  the library initialisation should be automatic.

      Libgnarl_Needed : Yes_No_Unknown := Unknown;
      --  Set to True when libgnarl is needed to link

      Symbol_Data : Symbol_Record := No_Symbols;
      --  Symbol file name, reference symbol file name, symbol policy

      Ada_Sources : String_List_Id := Nil_String;
      --  The list of all the Ada source file names (gnatmake only).

      Sources : String_List_Id := Nil_String;
      --  Identical to Ada_Sources. For upward compatibility of GPS.

      First_Source : Source_Id := No_Source;
      Last_Source  : Source_Id := No_Source;
      --  Head and tail of the list of sources

      Unit_Based_Language_Name  : Name_Id := No_Name;
      Unit_Based_Language_Index : Language_Index := No_Language_Index;
      --  The name and index, if any, of the unit-based language of some
      --  sources of the project. There may be only one unit-based language
      --  in one project.

      Imported_Directories_Switches : Argument_List_Access := null;
      --  List of the source search switches (-I<source dir>) to be used when
      --  compiling.

      Include_Path : String_Access := null;
      --  Value of the environment variable to indicate the source search path,
      --  instead of a list of switches (Imported_Directories_Switches).

      Include_Path_File : Path_Name_Type := No_Path;
      --  The path name of the of the source search directory file

      Include_Data_Set : Boolean := False;
      --  Set True when Imported_Directories_Switches or Include_Path are set

      Include_Language : Language_Index := No_Language_Index;

      Source_Dirs : String_List_Id := Nil_String;
      --  The list of all the source directories

      Known_Order_Of_Source_Dirs : Boolean := True;
      --  False, if there is any /** in the Source_Dirs, because in this case
      --  the ordering of the source subdirs depend on the OS. If True,
      --  duplicate file names in the same project file are allowed.

      Object_Directory : Path_Name_Type := No_Path;
      --  The path name of the object directory of this project file

      Display_Object_Dir : Path_Name_Type := No_Path;
      --  The path name of the object directory, for display purposes. May be
      --  different from Object_Directory for platforms where the file names
      --  are case-insensitive.

      Exec_Directory : Path_Name_Type := No_Path;
      --  The path name of the exec directory of this project file. Default is
      --  equal to Object_Directory.

      Display_Exec_Dir : Path_Name_Type := No_Path;
      --  The path name of the exec directory, for display purposes. May be
      --  different from Exec_Directory for platforms where the file names are
      --  case-insensitive.

      Extends : Project_Id := No_Project;
      --  The reference of the project file, if any, that this project file
      --  extends.

      Extended_By : Project_Id := No_Project;
      --  The reference of the project file, if any, that extends this project
      --  file.

      Naming : Naming_Data := Standard_Naming_Data;
      --  The naming scheme of this project file

      First_Language_Processing : Language_Index := No_Language_Index;
      --  First index of the language data in the project

      Decl : Declarations := No_Declarations;
      --  The declarations (variables, attributes and packages) of this project
      --  file.

      Imported_Projects : Project_List := Empty_Project_List;
      --  The list of all directly imported projects, if any

      All_Imported_Projects : Project_List := Empty_Project_List;
      --  The list of all projects imported directly or indirectly, if any

      Ada_Include_Path : String_Access := null;
      --  The cached value of ADA_INCLUDE_PATH for this project file. Do not
      --  use this field directly outside of the compiler, use
      --  Prj.Env.Ada_Include_Path instead.

      Ada_Objects_Path : String_Access := null;
      --  The cached value of ADA_OBJECTS_PATH for this project file. Do not
      --  use this field directly outside of the compiler, use
      --  Prj.Env.Ada_Objects_Path instead.

      Objects_Path : String_Access := null;
      --  The cached value of the object dir path, used during the binding
      --  phase of gprbuild.

      Objects_Path_File_With_Libs : Path_Name_Type := No_Path;
      --  The cached value of the object path temp file (including library
      --  dirs) for this project file.

      Objects_Path_File_Without_Libs : Path_Name_Type := No_Path;
      --  The cached value of the object path temp file (excluding library
      --  dirs) for this project file.

      Config_File_Name : Path_Name_Type := No_Path;
      --  The path name of the configuration pragmas file, if any

      Config_File_Temp : Boolean := False;
      --  An indication that the configuration pragmas file is a temporary file
      --  that must be deleted at the end.

      Linker_Name : File_Name_Type  := No_File;
      --  Value of attribute Language_Processing'Linker in the project file

      Linker_Path : Path_Name_Type  := No_Path;
      --  Path of linker when attribute Language_Processing'Linker is specified

      Minimum_Linker_Options : Name_List_Index := No_Name_List;
      --  List of options specified in attribute
      --  Language_Processing'Minimum_Linker_Options.

      Config_Checked : Boolean := False;
      --  A flag to avoid checking repetitively the configuration pragmas file

      Checked : Boolean := False;
      --  A flag to avoid checking repetitively the naming scheme of this
      --  project file.

      Seen : Boolean := False;
      --  A flag to mark a project as "visited" to avoid processing the same
      --  project several time.

      Need_To_Build_Lib : Boolean := False;
      --  Indicates that the library of a Library Project needs to be built or
      --  rebuilt.

      Depth : Natural := 0;
      --  The maximum depth of a project in the project graph. Depth of main
      --  project is 0.

      Unkept_Comments : Boolean := False;
      --  True if there are comments in the project sources that cannot be kept
      --  in the project tree.

      ------------------
      --  For gprmake --
      ------------------

      Langs          : Languages_In_Project := No_Languages;
      Supp_Languages : Supp_Language_Index  := No_Supp_Language_Index;
      --  Indicate the different languages of the source of this project

      Ada_Sources_Present            : Boolean := True;
      --  True if there are Ada sources in the project

      Other_Sources_Present          : Boolean := True;
      --  True if there are sources from languages other than Ada in the
      --  project.

      First_Other_Source             : Other_Source_Id := No_Other_Source;
      --  First source of a language other than Ada

      Last_Other_Source              : Other_Source_Id := No_Other_Source;
      --  Last source of a language other than Ada

      First_Lang_Processing : First_Language_Processing_Data :=
                                Default_First_Language_Processing_Data;
      Supp_Language_Processing : Supp_Language_Index :=
                                   No_Supp_Language_Index;
      --  Language configurations
   end record;

   function Empty_Project (Tree : Project_Tree_Ref) return Project_Data;
   --  Return the representation of an empty project in project Tree tree.
   --  The project tree Tree must have been Initialized and/or Reset.

   function Is_Extending
     (Extending : Project_Id;
      Extended  : Project_Id;
      In_Tree   : Project_Tree_Ref) return Boolean;

   function Is_A_Language
     (Tree          : Project_Tree_Ref;
      Data          : Project_Data;
      Language_Name : Name_Id) return Boolean;
   --  Whether Language_Name is one of the languages used for the project.
   --  Language_Name must be lower cased.

   function There_Are_Ada_Sources
     (In_Tree : Project_Tree_Ref;
      Project : Project_Id) return Boolean;

   Project_Error : exception;
   --  Raised by some subprograms in Prj.Attr

   package Project_Table is new GNAT.Dynamic_Tables (
     Table_Component_Type => Project_Data,
     Table_Index_Type     => Project_Id,
     Table_Low_Bound      => 1,
     Table_Initial        => 100,
     Table_Increment      => 100);
   --  The set of all project files

   type Spec_Or_Body is
     (Specification, Body_Part);

   type File_Name_Data is record
      Name         : File_Name_Type := No_File;
      Index        : Int            := 0;
      Display_Name : File_Name_Type := No_File;
      Path         : Path_Name_Type := No_Path;
      Display_Path : Path_Name_Type := No_Path;
      Project      : Project_Id     := No_Project;
      Needs_Pragma : Boolean        := False;
   end record;
   --  File and Path name of a spec or body

   type File_Names_Data is array (Spec_Or_Body) of File_Name_Data;

   type Unit_Index is new Nat;
   No_Unit_Index : constant Unit_Index := 0;
   type Unit_Data is record
      Name       : Name_Id    := No_Name;
      File_Names : File_Names_Data;
   end record;
   --  Name and File and Path names of a unit, with a reference to its
   --  GNAT Project File(s).

   package Unit_Table is new GNAT.Dynamic_Tables
     (Table_Component_Type => Unit_Data,
      Table_Index_Type     => Unit_Index,
      Table_Low_Bound      => 1,
      Table_Initial        => 100,
      Table_Increment      => 100);
   --  Table of all units in a project tree

   package Units_Htable is new Simple_HTable
     (Header_Num => Header_Num,
      Element    => Unit_Index,
      No_Element => No_Unit_Index,
      Key        => Name_Id,
      Hash       => Hash,
      Equal      => "=");
   --  Mapping of unit names to indexes in the Units table

   type Unit_Project is record
      Unit    : Unit_Index := No_Unit_Index;
      Project : Project_Id := No_Project;
   end record;

   No_Unit_Project : constant Unit_Project := (No_Unit_Index, No_Project);

   package Files_Htable is new Simple_HTable
     (Header_Num => Header_Num,
      Element    => Unit_Project,
      No_Element => No_Unit_Project,
      Key        => File_Name_Type,
      Hash       => Hash,
      Equal      => "=");
   --  Mapping of file names to indexes in the Units table

   type Private_Project_Tree_Data is private;
   --  Data for a project tree that is used only by the Project Manager

   type Project_Tree_Data is
      record
         --  Languages and sources of the project

         First_Language : Language_Index  := No_Language_Index;
         --

         First_Source : Source_Id := No_Source;
         --

         --  Tables

         Languages_Data    : Language_Data_Table.Instance;
         Name_Lists        : Name_List_Table.Instance;
         String_Elements   : String_Element_Table.Instance;
         Variable_Elements : Variable_Element_Table.Instance;
         Array_Elements    : Array_Element_Table.Instance;
         Arrays            : Array_Table.Instance;
         Packages          : Package_Table.Instance;
         Project_Lists     : Project_List_Table.Instance;
         Projects          : Project_Table.Instance;
         Sources           : Source_Data_Table.Instance;
         Alt_Langs         : Alternate_Language_Table.Instance;
         Units             : Unit_Table.Instance;
         Units_HT          : Units_Htable.Instance;
         Files_HT          : Files_Htable.Instance;
         Source_Paths_HT   : Source_Paths_Htable.Instance;

         --  For gprmake:

         Present_Languages : Present_Language_Table.Instance;
         Supp_Suffixes     : Supp_Suffix_Table.Instance;
         Supp_Languages    : Supp_Language_Table.Instance;
         Other_Sources     : Other_Source_Table.Instance;

         --  Private part

         Private_Part : Private_Project_Tree_Data;
      end record;
   --  Data for a project tree

   type Put_Line_Access is access procedure
     (Line    : String;
      Project : Project_Id;
      In_Tree : Project_Tree_Ref);
   --  Use to customize error reporting in Prj.Proc and Prj.Nmsc

   procedure Expect (The_Token : Token_Type; Token_Image : String);
   --  Check that the current token is The_Token. If it is not, then
   --  output an error message.

   procedure Initialize (Tree : Project_Tree_Ref);
   --  This procedure must be called before using any services from the Prj
   --  hierarchy. Namet.Initialize must be called before Prj.Initialize.

   procedure Reset (Tree : Project_Tree_Ref);
   --  This procedure resets all the tables that are used when processing a
   --  project file tree. Initialize must be called before the call to Reset.

   procedure Register_Default_Naming_Scheme
     (Language            : Name_Id;
      Default_Spec_Suffix : File_Name_Type;
      Default_Body_Suffix : File_Name_Type;
      In_Tree             : Project_Tree_Ref);
   --  Register the default suffixes for a given language. These extensions
   --  will be ignored if the user has specified a new naming scheme in a
   --  project file.
   --
   --  Otherwise, this information will be automatically added to Naming_Data
   --  when a project is processed, in the lists Spec_Suffix and Body_Suffix.

   generic
      type State is limited private;
      with procedure Action
        (Project    : Project_Id;
         With_State : in out State);
   procedure For_Every_Project_Imported
     (By         : Project_Id;
      In_Tree    : Project_Tree_Ref;
      With_State : in out State);
   --  Call Action for each project imported directly or indirectly by project
   --  By. Action is called according to the order of importation: if A
   --  imports B, directly or indirectly, Action will be called for A before
   --  it is called for B. If two projects import each other directly or
   --  indirectly (using at least one "limited with"), it is not specified
   --  for which of these two projects Action will be called first. Projects
   --  that are extended by other projects are not considered. With_State may
   --  be used by Action to choose a behavior or to report some global result.

   function Extend_Name
     (File        : File_Name_Type;
      With_Suffix : String) return File_Name_Type;
   --  Replace the extension of File with With_Suffix

   function Object_Name
     (Source_File_Name : File_Name_Type) return File_Name_Type;
   --  Returns the object file name corresponding to a source file name

   function Dependency_Name
     (Source_File_Name : File_Name_Type;
      Dependency       : Dependency_File_Kind) return File_Name_Type;
   --  Returns the dependency file name corresponding to a source file name

   function Switches_Name
     (Source_File_Name : File_Name_Type) return File_Name_Type;
   --  Returns the switches file name corresponding to a source file name

   --  For gprmake

   function Body_Suffix_Of
     (Language   : Language_Index;
      In_Project : Project_Data;
      In_Tree    : Project_Tree_Ref) return String;
   --  Returns the suffix of sources of language Language in project In_Project
   --  in project tree In_Tree.

   function Is_Present
     (Language   : Language_Index;
      In_Project : Project_Data;
      In_Tree    : Project_Tree_Ref) return Boolean;
   --  Return True when Language is one of the languages used in
   --  project In_Project.

   procedure Set
     (Language   : Language_Index;
      Present    : Boolean;
      In_Project : in out Project_Data;
      In_Tree    : Project_Tree_Ref);
   --  Indicate if Language is or not a language used in project In_Project

   function Language_Processing_Data_Of
     (Language   : Language_Index;
      In_Project : Project_Data;
      In_Tree    : Project_Tree_Ref) return Language_Processing_Data;
   --  Return the Language_Processing_Data for language Language in project
   --  In_Project. Return the default when no Language_Processing_Data are
   --  defined for the language.

   procedure Set
     (Language_Processing : Language_Processing_Data;
      For_Language        : Language_Index;
      In_Project          : in out Project_Data;
      In_Tree             : Project_Tree_Ref);
   --  Set the Language_Processing_Data for language Language in project
   --  In_Project.

   function Suffix_Of
     (Language   : Language_Index;
      In_Project : Project_Data;
      In_Tree    : Project_Tree_Ref) return File_Name_Type;
   --  Return the suffix for language Language in project In_Project. Return
   --  No_Name when no suffix is defined for the language.

   procedure Set
     (Suffix       : File_Name_Type;
      For_Language : Language_Index;
      In_Project   : in out Project_Data;
      In_Tree      : Project_Tree_Ref);
   --  Set the suffix for language Language in project In_Project

   ----------------
   -- Temp Files --
   ----------------

   procedure Record_Temp_File (Path : Path_Name_Type);
   --  Record the path of a newly created temporary file, so that it can be
   --  deleted later.

   procedure Delete_All_Temp_Files;
   --  Delete all recorded temporary files

private

   All_Packages : constant String_List_Access := null;

   No_Project_Tree : constant Project_Tree_Ref := null;

   Ignored : constant Variable_Kind := Single;

   Nil_Variable_Value : constant Variable_Value :=
                          (Project  => No_Project,
                           Kind     => Undefined,
                           Location => No_Location,
                           Default  => False);

   Virtual_Prefix : constant String := "v$";
   --  The prefix for virtual extending projects. Because of the '$', which is
   --  normally forbidden for project names, there cannot be any name clash.

   Empty_Name : Name_Id;
   --  Name_Id for an empty name (no characters). Initialized by the call
   --  to procedure Initialize.

   procedure Add_To_Buffer
     (S    : String;
      To   : in out String_Access;
      Last : in out Natural);
   --  Append a String to the Buffer

   type Naming_Id is new Nat;

   package Naming_Table is new GNAT.Dynamic_Tables
     (Table_Component_Type => Naming_Data,
      Table_Index_Type     => Naming_Id,
      Table_Low_Bound      => 1,
      Table_Initial        => 5,
      Table_Increment      => 100);
   --  Table storing the naming data for gnatmake/gprmake

   package Path_File_Table is new GNAT.Dynamic_Tables
     (Table_Component_Type => Path_Name_Type,
      Table_Index_Type     => Natural,
      Table_Low_Bound      => 1,
      Table_Initial        => 50,
      Table_Increment      => 100);
   --  Table storing all the temp path file names.
   --  Used by Delete_All_Path_Files.

   package Source_Path_Table is new GNAT.Dynamic_Tables
     (Table_Component_Type => Name_Id,
      Table_Index_Type     => Natural,
      Table_Low_Bound      => 1,
      Table_Initial        => 50,
      Table_Increment      => 100);
   --  A table to store the source dirs before creating the source path file

   package Object_Path_Table is new GNAT.Dynamic_Tables
     (Table_Component_Type => Path_Name_Type,
      Table_Index_Type     => Natural,
      Table_Low_Bound      => 1,
      Table_Initial        => 50,
      Table_Increment      => 100);
   --  A table to store the object dirs, before creating the object path file

   type Private_Project_Tree_Data is record
      Namings        : Naming_Table.Instance;
      Path_Files     : Path_File_Table.Instance;
      Source_Paths   : Source_Path_Table.Instance;
      Object_Paths   : Object_Path_Table.Instance;
      Default_Naming : Naming_Data;
   end record;
   --  Type to represent the part of a project tree which is private to the
   --  Project Manager.

end Prj;
