1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
9 -- Copyright (C) 2001-2002 Free Software Foundation, Inc. --
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 2, 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 COPYING. If not, write --
19 -- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
20 -- MA 02111-1307, USA. --
22 -- GNAT was originally developed by the GNAT team at New York University. --
23 -- Extensive contributions were provided by Ada Core Technologies Inc. --
25 ------------------------------------------------------------------------------
27 with Ada.Characters.Handling; use Ada.Characters.Handling;
28 with Namet; use Namet;
29 with Output; use Output;
31 package body Prj.Attr is
35 -- Package names are preceded by 'P'
37 -- Attribute names are preceded by two letters
39 -- The first letter is one of
43 -- The second letter is one of
44 -- 'V' for single variable
45 -- 'A' for associative array
46 -- 'a' for case insensitive associative array
48 -- End is indicated by two consecutive '#'.
50 Initialization_Data : constant String :=
58 "SVsource_list_file#" &
62 "SVlibrary_elaboration#" &
63 "SVlibrary_version#" &
70 "Saspecification_suffix#" &
71 "Saimplementation_suffix#" &
72 "SVseparate_suffix#" &
74 "SVdot_replacement#" &
77 "LAspecification_exceptions#" &
78 "LAimplementation_exceptions#" &
83 "Ladefault_switches#" &
85 "SVlocal_configuration_pragmas#" &
90 "Ladefault_switches#" &
92 "SVglobal_configuration_pragmas#" &
102 "Ladefault_switches#" &
108 "Ladefault_switches#" &
111 -- package Cross_Reference
113 "Pcross_reference#" &
114 "Ladefault_switches#" &
120 "Ladefault_switches#" &
132 "Sacompiler_command#" &
133 "SVdebugger_command#" &
136 "SVvcs_file_check#" &
145 procedure Initialize is
146 Start : Positive := Initialization_Data'First;
147 Finish : Positive := Start;
148 Current_Package : Package_Node_Id := Empty_Package;
149 Current_Attribute : Attribute_Node_Id := Empty_Attribute;
150 Is_An_Attribute : Boolean := False;
151 Kind_1 : Variable_Kind := Undefined;
152 Kind_2 : Attribute_Kind := Single;
153 Package_Name : Name_Id := No_Name;
154 Attribute_Name : Name_Id := No_Name;
155 First_Attribute : Attribute_Node_Id := Attribute_First;
158 -- Make sure the two tables are empty
160 Attributes.Set_Last (Attributes.First);
161 Package_Attributes.Set_Last (Package_Attributes.First);
163 while Initialization_Data (Start) /= '#' loop
164 Is_An_Attribute := True;
165 case Initialization_Data (Start) is
168 -- New allowed package
173 while Initialization_Data (Finish) /= '#' loop
174 Finish := Finish + 1;
177 Name_Len := Finish - Start;
178 Name_Buffer (1 .. Name_Len) :=
179 To_Lower (Initialization_Data (Start .. Finish - 1));
180 Package_Name := Name_Find;
182 for Index in Package_First .. Package_Attributes.Last loop
183 if Package_Name = Package_Attributes.Table (Index).Name then
184 Write_Line ("Duplicate package name """ &
185 Initialization_Data (Start .. Finish - 1) &
186 """ in Prj.Attr body.");
191 Is_An_Attribute := False;
192 Current_Attribute := Empty_Attribute;
193 Package_Attributes.Increment_Last;
194 Current_Package := Package_Attributes.Last;
195 Package_Attributes.Table (Current_Package).Name :=
209 if Is_An_Attribute then
214 case Initialization_Data (Start) is
218 Kind_2 := Associative_Array;
220 Kind_2 := Case_Insensitive_Associative_Array;
228 while Initialization_Data (Finish) /= '#' loop
229 Finish := Finish + 1;
232 Name_Len := Finish - Start;
233 Name_Buffer (1 .. Name_Len) :=
234 To_Lower (Initialization_Data (Start .. Finish - 1));
235 Attribute_Name := Name_Find;
236 Attributes.Increment_Last;
237 if Current_Attribute = Empty_Attribute then
238 First_Attribute := Attributes.Last;
240 if Current_Package /= Empty_Package then
241 Package_Attributes.Table (Current_Package).First_Attribute
246 -- Check that there are no duplicate attributes
248 for Index in First_Attribute .. Attributes.Last - 1 loop
250 Attributes.Table (Index).Name then
251 Write_Line ("Duplicate attribute name """ &
252 Initialization_Data (Start .. Finish - 1) &
253 """ in Prj.Attr body.");
258 Attributes.Table (Current_Attribute).Next :=
262 Current_Attribute := Attributes.Last;
263 Attributes.Table (Current_Attribute) :=
264 (Name => Attribute_Name,
267 Next => Empty_Attribute);