1------------------------------------------------------------------------------ 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 29with GNAT.Dynamic_HTables; 30 31package 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 94private 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 140end Prj.Ext; 141