OSDN Git Service

* builtins.c (std_expand_builtin_va_arg): Remove.
[pf3gnuchains/gcc-fork.git] / gcc / ada / prj.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                                  P R J                                   --
6 --                                                                          --
7 --                                 B o d y                                  --
8 --                                                                          --
9 --             Copyright (C) 2001-2004 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 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.                                                      --
21 --                                                                          --
22 -- GNAT was originally developed  by the GNAT team at  New York University. --
23 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
24 --                                                                          --
25 ------------------------------------------------------------------------------
26
27 with Ada.Characters.Handling; use Ada.Characters.Handling;
28
29 with Namet;    use Namet;
30 with Osint;    use Osint;
31 with Prj.Attr;
32 with Prj.Com;
33 with Prj.Env;
34 with Prj.Err;  use Prj.Err;
35 with Scans;    use Scans;
36 with Snames;   use Snames;
37 with Uintp;    use Uintp;
38
39 with GNAT.OS_Lib; use GNAT.OS_Lib;
40
41 package body Prj is
42
43    The_Empty_String : Name_Id;
44
45    subtype Known_Casing is Casing_Type range All_Upper_Case .. Mixed_Case;
46
47    The_Casing_Images : constant array (Known_Casing) of String_Access :=
48      (All_Lower_Case => new String'("lowercase"),
49       All_Upper_Case => new String'("UPPERCASE"),
50       Mixed_Case     => new String'("MixedCase"));
51
52    Initialized : Boolean := False;
53
54    Standard_Dot_Replacement      : constant Name_Id :=
55      First_Name_Id + Character'Pos ('-');
56
57    Std_Naming_Data : Naming_Data :=
58      (Current_Language          => No_Name,
59       Dot_Replacement           => Standard_Dot_Replacement,
60       Dot_Repl_Loc              => No_Location,
61       Casing                    => All_Lower_Case,
62       Spec_Suffix               => No_Array_Element,
63       Current_Spec_Suffix       => No_Name,
64       Spec_Suffix_Loc           => No_Location,
65       Body_Suffix               => No_Array_Element,
66       Current_Body_Suffix       => No_Name,
67       Body_Suffix_Loc           => No_Location,
68       Separate_Suffix           => No_Name,
69       Sep_Suffix_Loc            => No_Location,
70       Specs                     => No_Array_Element,
71       Bodies                    => No_Array_Element,
72       Specification_Exceptions  => No_Array_Element,
73       Implementation_Exceptions => No_Array_Element);
74
75    Project_Empty : constant Project_Data :=
76      (Languages                      => No_Languages,
77       Impl_Suffixes                  => No_Impl_Suffixes,
78       First_Referred_By              => No_Project,
79       Name                           => No_Name,
80       Path_Name                      => No_Name,
81       Display_Path_Name              => No_Name,
82       Virtual                        => False,
83       Location                       => No_Location,
84       Mains                          => Nil_String,
85       Directory                      => No_Name,
86       Display_Directory              => No_Name,
87       Dir_Path                       => null,
88       Library                        => False,
89       Library_Dir                    => No_Name,
90       Display_Library_Dir            => No_Name,
91       Library_Src_Dir                => No_Name,
92       Display_Library_Src_Dir        => No_Name,
93       Library_Name                   => No_Name,
94       Library_Kind                   => Static,
95       Lib_Internal_Name              => No_Name,
96       Standalone_Library             => False,
97       Lib_Interface_ALIs             => Nil_String,
98       Lib_Auto_Init                  => False,
99       Symbol_Data                    => No_Symbols,
100       Ada_Sources_Present            => True,
101       Other_Sources_Present          => True,
102       Sources                        => Nil_String,
103       First_Other_Source             => No_Other_Source,
104       Last_Other_Source              => No_Other_Source,
105       Imported_Directories_Switches  => null,
106       Include_Path                   => null,
107       Include_Data_Set               => False,
108       Source_Dirs                    => Nil_String,
109       Known_Order_Of_Source_Dirs     => True,
110       Object_Directory               => No_Name,
111       Display_Object_Dir             => No_Name,
112       Exec_Directory                 => No_Name,
113       Display_Exec_Dir               => No_Name,
114       Extends                        => No_Project,
115       Extended_By                    => No_Project,
116       Naming                         => Std_Naming_Data,
117       Decl                           => No_Declarations,
118       Imported_Projects              => Empty_Project_List,
119       Ada_Include_Path               => null,
120       Ada_Objects_Path               => null,
121       Include_Path_File              => No_Name,
122       Objects_Path_File_With_Libs    => No_Name,
123       Objects_Path_File_Without_Libs => No_Name,
124       Config_File_Name               => No_Name,
125       Config_File_Temp               => False,
126       Config_Checked                 => False,
127       Language_Independent_Checked   => False,
128       Checked                        => False,
129       Seen                           => False,
130       Need_To_Build_Lib              => False,
131       Depth                          => 0,
132       Unkept_Comments                => False);
133
134    -------------------
135    -- Add_To_Buffer --
136    -------------------
137
138    procedure Add_To_Buffer (S : String) is
139    begin
140       --  If Buffer is too small, double its size
141
142       if Buffer_Last + S'Length > Buffer'Last then
143          declare
144             New_Buffer : constant  String_Access :=
145                            new String (1 .. 2 * Buffer'Last);
146
147          begin
148             New_Buffer (1 .. Buffer_Last) := Buffer (1 .. Buffer_Last);
149             Free (Buffer);
150             Buffer := New_Buffer;
151          end;
152       end if;
153
154       Buffer (Buffer_Last + 1 .. Buffer_Last + S'Length) := S;
155       Buffer_Last := Buffer_Last + S'Length;
156    end Add_To_Buffer;
157
158    -------------------
159    -- Empty_Project --
160    -------------------
161
162    function Empty_Project return Project_Data is
163    begin
164       Prj.Initialize;
165       return Project_Empty;
166    end Empty_Project;
167
168    ------------------
169    -- Empty_String --
170    ------------------
171
172    function Empty_String return Name_Id is
173    begin
174       return The_Empty_String;
175    end Empty_String;
176
177    ------------
178    -- Expect --
179    ------------
180
181    procedure Expect (The_Token : Token_Type; Token_Image : String) is
182    begin
183       if Token /= The_Token then
184          Error_Msg (Token_Image & " expected", Token_Ptr);
185       end if;
186    end Expect;
187
188    --------------------------------
189    -- For_Every_Project_Imported --
190    --------------------------------
191
192    procedure For_Every_Project_Imported
193      (By         : Project_Id;
194       With_State : in out State)
195    is
196
197       procedure Check (Project : Project_Id);
198       --  Check if a project has already been seen.
199       --  If not seen, mark it as seen, call Action,
200       --  and check all its imported projects.
201
202       procedure Check (Project : Project_Id) is
203          List : Project_List;
204
205       begin
206          if not Projects.Table (Project).Seen then
207             Projects.Table (Project).Seen := True;
208             Action (Project, With_State);
209
210             List := Projects.Table (Project).Imported_Projects;
211             while List /= Empty_Project_List loop
212                Check (Project_Lists.Table (List).Project);
213                List := Project_Lists.Table (List).Next;
214             end loop;
215          end if;
216       end Check;
217
218    begin
219       for Project in Projects.First .. Projects.Last loop
220          Projects.Table (Project).Seen := False;
221       end loop;
222
223       Check (Project => By);
224    end For_Every_Project_Imported;
225
226    -----------
227    -- Image --
228    -----------
229
230    function Image (Casing : Casing_Type) return String is
231    begin
232       return The_Casing_Images (Casing).all;
233    end Image;
234
235    ----------------
236    -- Initialize --
237    ----------------
238
239    procedure Initialize is
240    begin
241       if not Initialized then
242          Initialized := True;
243          Uintp.Initialize;
244          Name_Len := 0;
245          The_Empty_String := Name_Find;
246          Empty_Name := The_Empty_String;
247          Name_Len := 4;
248          Name_Buffer (1 .. 4) := ".ads";
249          Default_Ada_Spec_Suffix := Name_Find;
250          Name_Len := 4;
251          Name_Buffer (1 .. 4) := ".adb";
252          Default_Ada_Body_Suffix := Name_Find;
253          Name_Len := 1;
254          Name_Buffer (1) := '/';
255          Slash := Name_Find;
256
257          for Lang in Programming_Language loop
258             Name_Len := Lang_Names (Lang)'Length;
259             Name_Buffer (1 .. Name_Len) := Lang_Names (Lang).all;
260             Lang_Name_Ids (Lang) := Name_Find;
261             Name_Len := Lang_Suffixes (Lang)'Length;
262             Name_Buffer (1 .. Name_Len) := Lang_Suffixes (Lang).all;
263             Lang_Suffix_Ids (Lang) := Name_Find;
264          end loop;
265
266          Std_Naming_Data.Current_Spec_Suffix := Default_Ada_Spec_Suffix;
267          Std_Naming_Data.Current_Body_Suffix := Default_Ada_Body_Suffix;
268          Std_Naming_Data.Separate_Suffix     := Default_Ada_Body_Suffix;
269          Register_Default_Naming_Scheme
270            (Language            => Name_Ada,
271             Default_Spec_Suffix => Default_Ada_Spec_Suffix,
272             Default_Body_Suffix => Default_Ada_Body_Suffix);
273          Prj.Env.Initialize;
274          Prj.Attr.Initialize;
275          Set_Name_Table_Byte (Name_Project,  Token_Type'Pos (Tok_Project));
276          Set_Name_Table_Byte (Name_Extends,  Token_Type'Pos (Tok_Extends));
277          Set_Name_Table_Byte (Name_External, Token_Type'Pos (Tok_External));
278       end if;
279    end Initialize;
280
281    ------------------------------------
282    -- Register_Default_Naming_Scheme --
283    ------------------------------------
284
285    procedure Register_Default_Naming_Scheme
286      (Language            : Name_Id;
287       Default_Spec_Suffix : Name_Id;
288       Default_Body_Suffix : Name_Id)
289    is
290       Lang : Name_Id;
291       Suffix : Array_Element_Id;
292       Found : Boolean := False;
293       Element : Array_Element;
294
295    begin
296       --  Get the language name in small letters
297
298       Get_Name_String (Language);
299       Name_Buffer (1 .. Name_Len) := To_Lower (Name_Buffer (1 .. Name_Len));
300       Lang := Name_Find;
301
302       Suffix := Std_Naming_Data.Spec_Suffix;
303       Found := False;
304
305       --  Look for an element of the spec sufix array indexed by the language
306       --  name. If one is found, put the default value.
307
308       while Suffix /= No_Array_Element and then not Found loop
309          Element := Array_Elements.Table (Suffix);
310
311          if Element.Index = Lang then
312             Found := True;
313             Element.Value.Value := Default_Spec_Suffix;
314             Array_Elements.Table (Suffix) := Element;
315
316          else
317             Suffix := Element.Next;
318          end if;
319       end loop;
320
321       --  If none can be found, create a new one.
322
323       if not Found then
324          Element :=
325            (Index     => Lang,
326             Src_Index => 0,
327             Index_Case_Sensitive => False,
328             Value => (Project  => No_Project,
329                       Kind     => Single,
330                       Location => No_Location,
331                       Default  => False,
332                       Value    => Default_Spec_Suffix,
333                       Index    => 0),
334             Next  => Std_Naming_Data.Spec_Suffix);
335          Array_Elements.Increment_Last;
336          Array_Elements.Table (Array_Elements.Last) := Element;
337          Std_Naming_Data.Spec_Suffix := Array_Elements.Last;
338       end if;
339
340       Suffix := Std_Naming_Data.Body_Suffix;
341       Found := False;
342
343       --  Look for an element of the body sufix array indexed by the language
344       --  name. If one is found, put the default value.
345
346       while Suffix /= No_Array_Element and then not Found loop
347          Element := Array_Elements.Table (Suffix);
348
349          if Element.Index = Lang then
350             Found := True;
351             Element.Value.Value := Default_Body_Suffix;
352             Array_Elements.Table (Suffix) := Element;
353
354          else
355             Suffix := Element.Next;
356          end if;
357       end loop;
358
359       --  If none can be found, create a new one.
360
361       if not Found then
362          Element :=
363            (Index     => Lang,
364             Src_Index => 0,
365             Index_Case_Sensitive => False,
366             Value => (Project  => No_Project,
367                       Kind     => Single,
368                       Location => No_Location,
369                       Default  => False,
370                       Value    => Default_Body_Suffix,
371                       Index    => 0),
372             Next  => Std_Naming_Data.Body_Suffix);
373          Array_Elements.Increment_Last;
374          Array_Elements.Table (Array_Elements.Last) := Element;
375          Std_Naming_Data.Body_Suffix := Array_Elements.Last;
376       end if;
377    end Register_Default_Naming_Scheme;
378
379    -----------
380    -- Reset --
381    -----------
382
383    procedure Reset is
384    begin
385       Projects.Init;
386       Project_Lists.Init;
387       Packages.Init;
388       Arrays.Init;
389       Variable_Elements.Init;
390       String_Elements.Init;
391       Prj.Com.Units.Init;
392       Prj.Com.Units_Htable.Reset;
393       Prj.Com.Files_Htable.Reset;
394    end Reset;
395
396    ------------------------
397    -- Same_Naming_Scheme --
398    ------------------------
399
400    function Same_Naming_Scheme
401      (Left, Right : Naming_Data)
402       return        Boolean
403    is
404    begin
405       return Left.Dot_Replacement = Right.Dot_Replacement
406         and then Left.Casing = Right.Casing
407         and then Left.Current_Spec_Suffix = Right.Current_Spec_Suffix
408         and then Left.Current_Body_Suffix = Right.Current_Body_Suffix
409         and then Left.Separate_Suffix = Right.Separate_Suffix;
410    end Same_Naming_Scheme;
411
412    --------------------------
413    -- Standard_Naming_Data --
414    --------------------------
415
416    function Standard_Naming_Data return Naming_Data is
417    begin
418       Prj.Initialize;
419       return Std_Naming_Data;
420    end Standard_Naming_Data;
421
422    -----------
423    -- Value --
424    -----------
425
426    function Value (Image : String) return Casing_Type is
427    begin
428       for Casing in The_Casing_Images'Range loop
429          if To_Lower (Image) = To_Lower (The_Casing_Images (Casing).all) then
430             return Casing;
431          end if;
432       end loop;
433
434       raise Constraint_Error;
435    end Value;
436
437 begin
438    --  Make sure that the standard project file extension is compatible
439    --  with canonical case file naming.
440
441    Canonical_Case_File_Name (Project_File_Extension);
442 end Prj;