| 1 |
706 |
jeremybenn |
------------------------------------------------------------------------------
|
| 2 |
|
|
-- --
|
| 3 |
|
|
-- GNAT COMPILER COMPONENTS --
|
| 4 |
|
|
-- --
|
| 5 |
|
|
-- P R J . E X T --
|
| 6 |
|
|
-- --
|
| 7 |
|
|
-- S p e c --
|
| 8 |
|
|
-- --
|
| 9 |
|
|
-- Copyright (C) 2000-2011, Free Software Foundation, Inc. --
|
| 10 |
|
|
-- --
|
| 11 |
|
|
-- GNAT is free software; you can redistribute it and/or modify it under --
|
| 12 |
|
|
-- terms of the GNU General Public License as published by the Free Soft- --
|
| 13 |
|
|
-- ware Foundation; either version 3, or (at your option) any later ver- --
|
| 14 |
|
|
-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
|
| 15 |
|
|
-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
|
| 16 |
|
|
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
|
| 17 |
|
|
-- for more details. You should have received a copy of the GNU General --
|
| 18 |
|
|
-- Public License distributed with GNAT; see file COPYING3. If not, go to --
|
| 19 |
|
|
-- http://www.gnu.org/licenses for a complete copy of the license. --
|
| 20 |
|
|
-- --
|
| 21 |
|
|
-- GNAT was originally developed by the GNAT team at New York University. --
|
| 22 |
|
|
-- Extensive contributions were provided by Ada Core Technologies Inc. --
|
| 23 |
|
|
-- --
|
| 24 |
|
|
------------------------------------------------------------------------------
|
| 25 |
|
|
|
| 26 |
|
|
-- Subprograms to set, get and cache external references, to be used as
|
| 27 |
|
|
-- External functions in project files.
|
| 28 |
|
|
|
| 29 |
|
|
with GNAT.Dynamic_HTables;
|
| 30 |
|
|
|
| 31 |
|
|
package Prj.Ext is
|
| 32 |
|
|
|
| 33 |
|
|
-------------------------
|
| 34 |
|
|
-- External References --
|
| 35 |
|
|
-------------------------
|
| 36 |
|
|
|
| 37 |
|
|
-- External references influence the way a project tree is processed (in
|
| 38 |
|
|
-- particular they provide the values for the typed string variables that
|
| 39 |
|
|
-- are then used in case constructions).
|
| 40 |
|
|
|
| 41 |
|
|
-- External references are project-tree specific, so that when multiple
|
| 42 |
|
|
-- trees are loaded in parallel we can have different scenarios (or even
|
| 43 |
|
|
-- load the same tree twice and see different views of it).
|
| 44 |
|
|
|
| 45 |
|
|
type External_References is private;
|
| 46 |
|
|
No_External_Refs : constant External_References;
|
| 47 |
|
|
|
| 48 |
|
|
procedure Initialize
|
| 49 |
|
|
(Self : out External_References;
|
| 50 |
|
|
Copy_From : External_References := No_External_Refs);
|
| 51 |
|
|
-- Initialize Self, and copy all values from Copy_From if needed.
|
| 52 |
|
|
-- This has no effect if Self was already initialized.
|
| 53 |
|
|
|
| 54 |
|
|
procedure Free (Self : in out External_References);
|
| 55 |
|
|
-- Free memory used by Self
|
| 56 |
|
|
|
| 57 |
|
|
type External_Source is
|
| 58 |
|
|
(From_Command_Line,
|
| 59 |
|
|
From_Environment,
|
| 60 |
|
|
From_External_Attribute);
|
| 61 |
|
|
-- Indicates where was the value of an external reference defined. They are
|
| 62 |
|
|
-- prioritized in that order, so that a user can always use the command
|
| 63 |
|
|
-- line to override a value coming from his environment, or an environment
|
| 64 |
|
|
-- variable to override a value defined in an aggregate project through the
|
| 65 |
|
|
-- "for External()..." attribute.
|
| 66 |
|
|
|
| 67 |
|
|
procedure Add
|
| 68 |
|
|
(Self : External_References;
|
| 69 |
|
|
External_Name : String;
|
| 70 |
|
|
Value : String;
|
| 71 |
|
|
Source : External_Source := External_Source'First);
|
| 72 |
|
|
-- Add an external reference (or modify an existing one). No overriding is
|
| 73 |
|
|
-- done if the Source's priority is less than the one used to previously
|
| 74 |
|
|
-- set the value of the variable. The default for Source is such that
|
| 75 |
|
|
-- overriding always occurs.
|
| 76 |
|
|
|
| 77 |
|
|
function Value_Of
|
| 78 |
|
|
(Self : External_References;
|
| 79 |
|
|
External_Name : Name_Id;
|
| 80 |
|
|
With_Default : Name_Id := No_Name)
|
| 81 |
|
|
return Name_Id;
|
| 82 |
|
|
-- Get the value of an external reference, and cache it for future uses
|
| 83 |
|
|
|
| 84 |
|
|
function Check
|
| 85 |
|
|
(Self : External_References;
|
| 86 |
|
|
Declaration : String) return Boolean;
|
| 87 |
|
|
-- Check that an external declaration <external>=<value> is correct.
|
| 88 |
|
|
-- If it is correct, the external reference is Added.
|
| 89 |
|
|
|
| 90 |
|
|
procedure Reset (Self : External_References);
|
| 91 |
|
|
-- Clear the internal data structure that stores the external references
|
| 92 |
|
|
-- and free any allocated memory.
|
| 93 |
|
|
|
| 94 |
|
|
private
|
| 95 |
|
|
-- Use a Static_HTable, rather than a Simple_HTable
|
| 96 |
|
|
|
| 97 |
|
|
-- The issue is that we need to be able to copy the contents of the table
|
| 98 |
|
|
-- (in Initialize), but this isn't doable for Simple_HTable for which
|
| 99 |
|
|
-- iterators do not return the key.
|
| 100 |
|
|
|
| 101 |
|
|
type Name_To_Name;
|
| 102 |
|
|
type Name_To_Name_Ptr is access all Name_To_Name;
|
| 103 |
|
|
type Name_To_Name is record
|
| 104 |
|
|
Key : Name_Id;
|
| 105 |
|
|
Value : Name_Id;
|
| 106 |
|
|
Source : External_Source;
|
| 107 |
|
|
Next : Name_To_Name_Ptr;
|
| 108 |
|
|
end record;
|
| 109 |
|
|
|
| 110 |
|
|
procedure Set_Next (E : Name_To_Name_Ptr; Next : Name_To_Name_Ptr);
|
| 111 |
|
|
function Next (E : Name_To_Name_Ptr) return Name_To_Name_Ptr;
|
| 112 |
|
|
function Get_Key (E : Name_To_Name_Ptr) return Name_Id;
|
| 113 |
|
|
|
| 114 |
|
|
package Name_To_Name_HTable is new GNAT.Dynamic_HTables.Static_HTable
|
| 115 |
|
|
(Header_Num => Header_Num,
|
| 116 |
|
|
Element => Name_To_Name,
|
| 117 |
|
|
Elmt_Ptr => Name_To_Name_Ptr,
|
| 118 |
|
|
Null_Ptr => null,
|
| 119 |
|
|
Set_Next => Set_Next,
|
| 120 |
|
|
Next => Next,
|
| 121 |
|
|
Key => Name_Id,
|
| 122 |
|
|
Get_Key => Get_Key,
|
| 123 |
|
|
Hash => Hash,
|
| 124 |
|
|
Equal => "=");
|
| 125 |
|
|
-- General type for htables associating name_id to name_id. This is in
|
| 126 |
|
|
-- particular used to store the values of external references.
|
| 127 |
|
|
|
| 128 |
|
|
type Instance_Access is access all Name_To_Name_HTable.Instance;
|
| 129 |
|
|
|
| 130 |
|
|
type External_References is record
|
| 131 |
|
|
Refs : Instance_Access;
|
| 132 |
|
|
-- External references are stored in this hash table (and manipulated
|
| 133 |
|
|
-- through subprogrames in prj-ext.ads). External references are
|
| 134 |
|
|
-- project-tree specific so that one can load the same tree twice but
|
| 135 |
|
|
-- have two views of it, for instance.
|
| 136 |
|
|
end record;
|
| 137 |
|
|
|
| 138 |
|
|
No_External_Refs : constant External_References := (Refs => null);
|
| 139 |
|
|
|
| 140 |
|
|
end Prj.Ext;
|