diff options
Diffstat (limited to 'gcc/ada/prj-ext.ads')
-rw-r--r-- | gcc/ada/prj-ext.ads | 69 |
1 files changed, 63 insertions, 6 deletions
diff --git a/gcc/ada/prj-ext.ads b/gcc/ada/prj-ext.ads index 1fb389c..26ad219 100644 --- a/gcc/ada/prj-ext.ads +++ b/gcc/ada/prj-ext.ads @@ -6,7 +6,7 @@ -- -- -- S p e c -- -- -- --- Copyright (C) 2000-2010, Free Software Foundation, Inc. -- +-- Copyright (C) 2000-2011, 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- -- @@ -26,7 +26,7 @@ -- Subprograms to set, get and cache external references, to be used as -- External functions in project files. -with Prj.Tree; +with GNAT.Dynamic_HTables; package Prj.Ext is @@ -42,27 +42,84 @@ package Prj.Ext is -- trees are loaded in parallel we can have different scenarios (or even -- load the same tree twice and see different views of it). + type External_References is private; + No_External_Refs : constant External_References; + + procedure Initialize + (Self : out External_References; + Copy_From : External_References := No_External_Refs); + -- Initialize Self, and copy all values from Copy_From if needed. + -- This has no effect if Self was already initialized. + + procedure Free (Self : in out External_References); + -- Free memory used by Self + procedure Add - (Tree : Prj.Tree.Project_Node_Tree_Ref; + (Self : External_References; External_Name : String; Value : String); -- Add an external reference (or modify an existing one) function Value_Of - (Tree : Prj.Tree.Project_Node_Tree_Ref; + (Self : External_References; External_Name : Name_Id; With_Default : Name_Id := No_Name) return Name_Id; -- Get the value of an external reference, and cache it for future uses function Check - (Tree : Prj.Tree.Project_Node_Tree_Ref; + (Self : External_References; Declaration : String) return Boolean; -- Check that an external declaration <external>=<value> is correct. -- If it is correct, the external reference is Added. - procedure Reset (Tree : Prj.Tree.Project_Node_Tree_Ref); + procedure Reset (Self : External_References); -- Clear the internal data structure that stores the external references -- and free any allocated memory. +private + + -- Use a Static_HTable, not a Simple_HTable. + -- The issue is that we need to be able to copy the contents of the table + -- (in Initialize), but this isn't doable for Simple_HTable for which + -- iterators do not return the key. + + type Name_To_Name; + type Name_To_Name_Ptr is access all Name_To_Name; + type Name_To_Name is record + Key : Name_Id; + Value : Name_Id; + Next : Name_To_Name_Ptr; + end record; + + procedure Set_Next (E : Name_To_Name_Ptr; Next : Name_To_Name_Ptr); + function Next (E : Name_To_Name_Ptr) return Name_To_Name_Ptr; + function Get_Key (E : Name_To_Name_Ptr) return Name_Id; + + package Name_To_Name_HTable is new GNAT.Dynamic_HTables.Static_HTable + (Header_Num => Header_Num, + Element => Name_To_Name, + Elmt_Ptr => Name_To_Name_Ptr, + Null_Ptr => null, + Set_Next => Set_Next, + Next => Next, + Key => Name_Id, + Get_Key => Get_Key, + Hash => Hash, + Equal => "="); + -- General type for htables associating name_id to name_id. This is in + -- particular used to store the values of external references. + + type Instance_Access is access all Name_To_Name_HTable.Instance; + + type External_References is record + Refs : Instance_Access; + -- External references are stored in this hash table (and manipulated + -- through subprogrames in prj-ext.ads). External references are + -- project-tree specific so that one can load the same tree twice but + -- have two views of it, for instance. + end record; + + No_External_Refs : constant External_References := (Refs => null); + end Prj.Ext; |