with Casing; use Casing;
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
All_Packages : constant String_List_Access;
type Project_Tree_Data;
type Project_Tree_Ref is access all Project_Tree_Data;
No_Project_Tree : constant Project_Tree_Ref;
function Default_Ada_Spec_Suffix return Name_Id;
pragma Inline (Default_Ada_Spec_Suffix);
function Default_Ada_Body_Suffix return Name_Id;
pragma Inline (Default_Ada_Body_Suffix);
function Slash return Name_Id;
pragma Inline (Slash);
Project_File_Extension : String := ".gpr";
type Error_Warning is (Silent, Warning, Error);
type Language_Index is new Nat;
No_Language_Index : constant Language_Index := 0;
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;
type Header_Num is range 0 .. 2047;
function Hash is new System.HTable.Hash (Header_Num => Header_Num);
function Hash (Name : Name_Id) return Header_Num;
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 => "=");
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");
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;
No_Languages : constant Languages_In_Project := (others => False);
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);
type Impl_Suffix_Array is array (First_Language_Indexes) of Name_Id;
No_Impl_Suffixes : constant Impl_Suffix_Array := (others => No_Name);
type Supp_Suffix is record
Index : Language_Index := No_Language_Index;
Suffix : Name_Id := No_Name;
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);
type Language_Kind is (GNU, other);
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);
type Language_Processing_Data is record
Compiler_Drivers : Name_List_Index := No_Name_List;
Compiler_Paths : Name_Id := No_Name;
Compiler_Kinds : Language_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);
type Other_Source_Id is new Nat;
No_Other_Source : constant Other_Source_Id := 0;
type Other_Source is record
Language : Language_Index; File_Name : Name_Id; Path_Name : Name_Id; Source_TS : Time_Stamp_Type; Object_Name : Name_Id; Object_Path : Name_Id; Object_TS : Time_Stamp_Type; Dep_Name : Name_Id; Dep_Path : Name_Id; Dep_TS : Time_Stamp_Type; Naming_Exception : Boolean := False; Next : Other_Source_Id := No_Other_Source;
end record;
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);
type Verbosity is (Default, Medium, High);
Current_Verbosity : Verbosity := Default;
type Lib_Kind is (Static, Dynamic, Relocatable);
type Policy is (Autonomous, Compliant, Controlled, Restricted);
type Symbol_Record is record
Symbol_File : Name_Id := No_Name;
Reference : Name_Id := No_Name;
Symbol_Policy : Policy := Autonomous;
end record;
No_Symbols : constant Symbol_Record :=
(Symbol_File => No_Name,
Reference => No_Name,
Symbol_Policy => Autonomous);
function Empty_String return Name_Id;
type Project_Id is new Nat;
No_Project : constant Project_Id := 0;
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;
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);
type Variable_Kind is (Undefined, List, Single);
subtype Defined_Variable_Kind is Variable_Kind range List .. Single;
Ignored : constant Variable_Kind;
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;
Nil_Variable_Value : constant Variable_Value;
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;
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);
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;
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);
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;
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);
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;
No_Declarations : constant Declarations :=
(Variables => No_Variable,
Attributes => No_Variable,
Arrays => No_Array,
Packages => No_Package);
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;
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);
function Image (Casing : Casing_Type) return String;
function Value (Image : String) return Casing_Type;
type Naming_Data is record
Dot_Replacement : Name_Id := No_Name;
Dot_Repl_Loc : Source_Ptr := No_Location;
Casing : Casing_Type := All_Lower_Case;
Spec_Suffix : Array_Element_Id := No_Array_Element;
Ada_Spec_Suffix : Name_Id := No_Name;
Spec_Suffix_Loc : Source_Ptr := No_Location;
Impl_Suffixes : Impl_Suffix_Array := No_Impl_Suffixes;
Supp_Suffixes : Supp_Language_Index := No_Supp_Language_Index;
Body_Suffix : Array_Element_Id := No_Array_Element;
Ada_Body_Suffix : Name_Id := No_Name;
Body_Suffix_Loc : Source_Ptr := No_Location;
Separate_Suffix : Name_Id := No_Name;
Sep_Suffix_Loc : Source_Ptr := No_Location;
Specs : Array_Element_Id := No_Array_Element;
Bodies : Array_Element_Id := No_Array_Element;
Specification_Exceptions : Array_Element_Id := No_Array_Element;
Implementation_Exceptions : Array_Element_Id := No_Array_Element;
end record;
function Standard_Naming_Data
(Tree : Project_Tree_Ref := No_Project_Tree) return Naming_Data;
pragma Inline (Standard_Naming_Data);
function Same_Naming_Scheme
(Left, Right : Naming_Data) return Boolean;
type Project_List is new Nat;
Empty_Project_List : constant Project_List := 0;
type Project_Element is record
Project : Project_Id := No_Project;
Next : Project_List := Empty_Project_List;
end record;
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);
type Project_Data is record
Externally_Built : Boolean := False;
Languages : Languages_In_Project := No_Languages;
Supp_Languages : Supp_Language_Index := No_Supp_Language_Index;
First_Referred_By : Project_Id := No_Project;
Name : Name_Id := No_Name;
Display_Name : Name_Id := No_Name;
Path_Name : Name_Id := No_Name;
Display_Path_Name : Name_Id := No_Name;
Virtual : Boolean := False;
Location : Source_Ptr := No_Location;
Mains : String_List_Id := Nil_String;
Directory : Name_Id := No_Name;
Display_Directory : Name_Id := No_Name;
Dir_Path : String_Access;
Library : Boolean := False;
Library_Dir : Name_Id := No_Name;
Display_Library_Dir : Name_Id := No_Name;
Library_TS : Time_Stamp_Type := Empty_Time_Stamp;
Library_Src_Dir : Name_Id := No_Name;
Display_Library_Src_Dir : Name_Id := No_Name;
Library_ALI_Dir : Name_Id := No_Name;
Display_Library_ALI_Dir : Name_Id := No_Name;
Library_Name : Name_Id := No_Name;
Library_Kind : Lib_Kind := Static;
Lib_Internal_Name : Name_Id := No_Name;
Standalone_Library : Boolean := False;
Lib_Interface_ALIs : String_List_Id := Nil_String;
Lib_Auto_Init : Boolean := False;
Symbol_Data : Symbol_Record := No_Symbols;
Ada_Sources_Present : Boolean := True;
Other_Sources_Present : Boolean := True;
Sources : String_List_Id := Nil_String;
First_Other_Source : Other_Source_Id := No_Other_Source;
Last_Other_Source : Other_Source_Id := No_Other_Source;
Imported_Directories_Switches : Argument_List_Access := null;
Include_Path : String_Access := null;
Include_Data_Set : Boolean := False;
Source_Dirs : String_List_Id := Nil_String;
Known_Order_Of_Source_Dirs : Boolean := True;
Object_Directory : Name_Id := No_Name;
Display_Object_Dir : Name_Id := No_Name;
Exec_Directory : Name_Id := No_Name;
Display_Exec_Dir : Name_Id := No_Name;
Extends : Project_Id := No_Project;
Extended_By : Project_Id := No_Project;
Naming : Naming_Data := Standard_Naming_Data;
First_Language_Processing : First_Language_Processing_Data :=
Default_First_Language_Processing_Data;
Supp_Language_Processing : Supp_Language_Index := No_Supp_Language_Index;
Default_Linker : Name_Id := No_Name;
Default_Linker_Path : Name_Id := No_Name;
Decl : Declarations := No_Declarations;
Imported_Projects : Project_List := Empty_Project_List;
All_Imported_Projects : Project_List := Empty_Project_List;
Ada_Include_Path : String_Access := null;
Ada_Objects_Path : String_Access := null;
Include_Path_File : Name_Id := No_Name;
Objects_Path_File_With_Libs : Name_Id := No_Name;
Objects_Path_File_Without_Libs : Name_Id := No_Name;
Config_File_Name : Name_Id := No_Name;
Config_File_Temp : Boolean := False;
Config_Checked : Boolean := False;
Language_Independent_Checked : Boolean := False;
Checked : Boolean := False;
Seen : Boolean := False;
Need_To_Build_Lib : Boolean := False;
Depth : Natural := 0;
Unkept_Comments : Boolean := False;
end record;
function Empty_Project (Tree : Project_Tree_Ref) return Project_Data;
Project_Error : exception;
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);
type Spec_Or_Body is
(Specification, Body_Part);
type File_Name_Data is record
Name : Name_Id := No_Name;
Index : Int := 0;
Display_Name : Name_Id := No_Name;
Path : Name_Id := No_Name;
Display_Path : Name_Id := No_Name;
Project : Project_Id := No_Project;
Needs_Pragma : Boolean := False;
end record;
type File_Names_Data is array (Spec_Or_Body) of File_Name_Data;
type Unit_Id is new Nat;
No_Unit : constant Unit_Id := 0;
type Unit_Data is record
Name : Name_Id := No_Name;
File_Names : File_Names_Data;
end record;
package Unit_Table is new GNAT.Dynamic_Tables
(Table_Component_Type => Unit_Data,
Table_Index_Type => Unit_Id,
Table_Low_Bound => 1,
Table_Initial => 100,
Table_Increment => 100);
package Units_Htable is new Simple_HTable
(Header_Num => Header_Num,
Element => Unit_Id,
No_Element => No_Unit,
Key => Name_Id,
Hash => Hash,
Equal => "=");
type Unit_Project is record
Unit : Unit_Id := No_Unit;
Project : Project_Id := No_Project;
end record;
No_Unit_Project : constant Unit_Project := (No_Unit, No_Project);
package Files_Htable is new Simple_HTable
(Header_Num => Header_Num,
Element => Unit_Project,
No_Element => No_Unit_Project,
Key => Name_Id,
Hash => Hash,
Equal => "=");
type Private_Project_Tree_Data is private;
type Project_Tree_Data is
record
Present_Languages : Present_Language_Table.Instance;
Supp_Suffixes : Supp_Suffix_Table.Instance;
Name_Lists : Name_List_Table.Instance;
Supp_Languages : Supp_Language_Table.Instance;
Other_Sources : Other_Source_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;
Units : Unit_Table.Instance;
Units_HT : Units_Htable.Instance;
Files_HT : Files_Htable.Instance;
Private_Part : Private_Project_Tree_Data;
end record;
type Put_Line_Access is access procedure
(Line : String;
Project : Project_Id;
In_Tree : Project_Tree_Ref);
procedure Expect (The_Token : Token_Type; Token_Image : String);
procedure Initialize (Tree : Project_Tree_Ref);
procedure Reset (Tree : Project_Tree_Ref);
procedure Register_Default_Naming_Scheme
(Language : Name_Id;
Default_Spec_Suffix : Name_Id;
Default_Body_Suffix : Name_Id;
In_Tree : Project_Tree_Ref);
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);
function Is_Present
(Language : Language_Index;
In_Project : Project_Data;
In_Tree : Project_Tree_Ref) return Boolean;
procedure Set
(Language : Language_Index;
Present : Boolean;
In_Project : in out Project_Data;
In_Tree : Project_Tree_Ref);
function Language_Processing_Data_Of
(Language : Language_Index;
In_Project : Project_Data;
In_Tree : Project_Tree_Ref) return Language_Processing_Data;
procedure Set
(Language_Processing : Language_Processing_Data;
For_Language : Language_Index;
In_Project : in out Project_Data;
In_Tree : Project_Tree_Ref);
function Suffix_Of
(Language : Language_Index;
In_Project : Project_Data;
In_Tree : Project_Tree_Ref) return Name_Id;
procedure Set
(Suffix : Name_Id;
For_Language : Language_Index;
In_Project : in out Project_Data;
In_Tree : Project_Tree_Ref);
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$";
Empty_Name : Name_Id;
procedure Add_To_Buffer
(S : String;
To : in out String_Access;
Last : in out Natural);
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);
package Path_File_Table is new GNAT.Dynamic_Tables
(Table_Component_Type => Name_Id,
Table_Index_Type => Natural,
Table_Low_Bound => 1,
Table_Initial => 50,
Table_Increment => 50);
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 => 50);
package Object_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 => 50);
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;
end Prj;