1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
9 -- Copyright (C) 2001-2007, 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, 51 Franklin Street, Fifth Floor, --
20 -- Boston, MA 02110-1301, 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;
30 with Output; use Output;
31 with Osint; use Osint;
34 with Prj.Err; use Prj.Err;
35 with Snames; use Snames;
36 with Uintp; use Uintp;
38 with System.Case_Util; use System.Case_Util;
42 Object_Suffix : constant String := Get_Target_Object_Suffix.all;
43 -- File suffix for object files
45 Initial_Buffer_Size : constant := 100;
46 -- Initial size for extensible buffer used in Add_To_Buffer
48 Current_Mode : Mode := Ada_Only;
50 Configuration_Mode : Boolean := False;
52 The_Empty_String : Name_Id;
54 Name_C_Plus_Plus : Name_Id;
56 Default_Ada_Spec_Suffix_Id : File_Name_Type;
57 Default_Ada_Body_Suffix_Id : File_Name_Type;
58 Slash_Id : Path_Name_Type;
59 -- Initialized in Prj.Initialize, then never modified
61 subtype Known_Casing is Casing_Type range All_Upper_Case .. Mixed_Case;
63 The_Casing_Images : constant array (Known_Casing) of String_Access :=
64 (All_Lower_Case => new String'("lowercase"),
65 All_Upper_Case => new String'("UPPERCASE"),
66 Mixed_Case => new String'("MixedCase"));
68 Initialized : Boolean := False;
70 Standard_Dot_Replacement : constant File_Name_Type :=
72 (First_Name_Id + Character'Pos ('-'));
74 Std_Naming_Data : constant Naming_Data :=
75 (Dot_Replacement => Standard_Dot_Replacement,
76 Dot_Repl_Loc => No_Location,
77 Casing => All_Lower_Case,
78 Spec_Suffix => No_Array_Element,
79 Ada_Spec_Suffix_Loc => No_Location,
80 Body_Suffix => No_Array_Element,
81 Ada_Body_Suffix_Loc => No_Location,
82 Separate_Suffix => No_File,
83 Sep_Suffix_Loc => No_Location,
84 Specs => No_Array_Element,
85 Bodies => No_Array_Element,
86 Specification_Exceptions => No_Array_Element,
87 Implementation_Exceptions => No_Array_Element,
88 Impl_Suffixes => No_Impl_Suffixes,
89 Supp_Suffixes => No_Supp_Language_Index);
91 Project_Empty : constant Project_Data :=
92 (Externally_Built => False,
93 Config => Default_Project_Config,
94 Languages => No_Name_List,
95 First_Referred_By => No_Project,
97 Display_Name => No_Name,
99 Display_Path_Name => No_Path,
101 Location => No_Location,
103 Directory => No_Path,
104 Display_Directory => No_Path,
107 Library_Dir => No_Path,
108 Display_Library_Dir => No_Path,
109 Library_Src_Dir => No_Path,
110 Display_Library_Src_Dir => No_Path,
111 Library_ALI_Dir => No_Path,
112 Display_Library_ALI_Dir => No_Path,
113 Library_Name => No_Name,
114 Library_Kind => Static,
115 Lib_Internal_Name => No_Name,
116 Standalone_Library => False,
117 Lib_Interface_ALIs => Nil_String,
118 Lib_Auto_Init => False,
119 Libgnarl_Needed => Unknown,
120 Symbol_Data => No_Symbols,
121 Ada_Sources => Nil_String,
122 Sources => Nil_String,
123 First_Source => No_Source,
124 Last_Source => No_Source,
125 Unit_Based_Language_Name => No_Name,
126 Unit_Based_Language_Index => No_Language_Index,
127 Imported_Directories_Switches => null,
128 Include_Path => null,
129 Include_Data_Set => False,
130 Include_Language => No_Language_Index,
131 Source_Dirs => Nil_String,
132 Known_Order_Of_Source_Dirs => True,
133 Object_Directory => No_Path,
134 Display_Object_Dir => No_Path,
135 Library_TS => Empty_Time_Stamp,
136 Exec_Directory => No_Path,
137 Display_Exec_Dir => No_Path,
138 Extends => No_Project,
139 Extended_By => No_Project,
140 Naming => Std_Naming_Data,
141 First_Language_Processing => No_Language_Index,
142 Decl => No_Declarations,
143 Imported_Projects => Empty_Project_List,
144 All_Imported_Projects => Empty_Project_List,
145 Ada_Include_Path => null,
146 Ada_Objects_Path => null,
147 Objects_Path => null,
148 Include_Path_File => No_Path,
149 Objects_Path_File_With_Libs => No_Path,
150 Objects_Path_File_Without_Libs => No_Path,
151 Config_File_Name => No_Path,
152 Config_File_Temp => False,
153 Linker_Name => No_File,
154 Linker_Path => No_Path,
155 Minimum_Linker_Options => No_Name_List,
156 Config_Checked => False,
159 Need_To_Build_Lib => False,
161 Unkept_Comments => False,
162 Langs => No_Languages,
163 Supp_Languages => No_Supp_Language_Index,
164 Ada_Sources_Present => True,
165 Other_Sources_Present => True,
166 First_Other_Source => No_Other_Source,
167 Last_Other_Source => No_Other_Source,
168 First_Lang_Processing => Default_First_Language_Processing_Data,
169 Supp_Language_Processing => No_Supp_Language_Index);
171 package Temp_Files is new Table.Table
172 (Table_Component_Type => Path_Name_Type,
173 Table_Index_Type => Integer,
174 Table_Low_Bound => 1,
176 Table_Increment => 100,
177 Table_Name => "Makegpr.Temp_Files");
178 -- Table to store the path name of all the created temporary files, so that
179 -- they can be deleted at the end, or when the program is interrupted.
181 -----------------------
182 -- Add_Language_Name --
183 -----------------------
185 procedure Add_Language_Name (Name : Name_Id) is
187 Last_Language_Index := Last_Language_Index + 1;
188 Language_Indexes.Set (Name, Last_Language_Index);
189 Language_Names.Increment_Last;
190 Language_Names.Table (Last_Language_Index) := Name;
191 end Add_Language_Name;
197 procedure Add_To_Buffer
199 To : in out String_Access;
200 Last : in out Natural)
204 To := new String (1 .. Initial_Buffer_Size);
208 -- If Buffer is too small, double its size
210 while Last + S'Length > To'Last loop
212 New_Buffer : constant String_Access :=
213 new String (1 .. 2 * Last);
216 New_Buffer (1 .. Last) := To (1 .. Last);
222 To (Last + 1 .. Last + S'Length) := S;
223 Last := Last + S'Length;
226 -----------------------
227 -- Body_Suffix_Id_Of --
228 -----------------------
230 function Body_Suffix_Id_Of
231 (In_Tree : Project_Tree_Ref;
233 Naming : Naming_Data) return File_Name_Type
235 Language_Id : Name_Id;
236 Element_Id : Array_Element_Id;
237 Element : Array_Element;
238 Suffix : File_Name_Type := No_File;
239 Lang : Language_Index;
243 Add_Str_To_Name_Buffer (Language);
244 To_Lower (Name_Buffer (1 .. Name_Len));
245 Language_Id := Name_Find;
247 Element_Id := Naming.Body_Suffix;
248 while Element_Id /= No_Array_Element loop
249 Element := In_Tree.Array_Elements.Table (Element_Id);
251 if Element.Index = Language_Id then
252 return File_Name_Type (Element.Value.Value);
255 Element_Id := Element.Next;
258 if Current_Mode = Multi_Language then
259 Lang := In_Tree.First_Language;
260 while Lang /= No_Language_Index loop
261 if In_Tree.Languages_Data.Table (Lang).Name = Language_Id then
263 In_Tree.Languages_Data.Table
264 (Lang).Config.Naming_Data.Body_Suffix;
268 Lang := In_Tree.Languages_Data.Table (Lang).Next;
273 end Body_Suffix_Id_Of;
279 function Body_Suffix_Of
280 (In_Tree : Project_Tree_Ref;
282 Naming : Naming_Data) return String
284 Language_Id : Name_Id;
285 Element_Id : Array_Element_Id;
286 Element : Array_Element;
287 Suffix : File_Name_Type := No_File;
288 Lang : Language_Index;
292 Add_Str_To_Name_Buffer (Language);
293 To_Lower (Name_Buffer (1 .. Name_Len));
294 Language_Id := Name_Find;
296 Element_Id := Naming.Body_Suffix;
297 while Element_Id /= No_Array_Element loop
298 Element := In_Tree.Array_Elements.Table (Element_Id);
300 if Element.Index = Language_Id then
301 return Get_Name_String (Element.Value.Value);
304 Element_Id := Element.Next;
307 if Current_Mode = Multi_Language then
308 Lang := In_Tree.First_Language;
309 while Lang /= No_Language_Index loop
310 if In_Tree.Languages_Data.Table (Lang).Name = Language_Id then
313 (In_Tree.Languages_Data.Table
314 (Lang).Config.Naming_Data.Body_Suffix);
318 Lang := In_Tree.Languages_Data.Table (Lang).Next;
321 if Suffix /= No_File then
322 return Get_Name_String (Suffix);
329 function Body_Suffix_Of
330 (Language : Language_Index;
331 In_Project : Project_Data;
332 In_Tree : Project_Tree_Ref) return String
334 Suffix_Id : constant File_Name_Type :=
335 Suffix_Of (Language, In_Project, In_Tree);
337 if Suffix_Id /= No_File then
338 return Get_Name_String (Suffix_Id);
340 return "." & Get_Name_String (Language_Names.Table (Language));
344 -----------------------------
345 -- Default_Ada_Body_Suffix --
346 -----------------------------
348 function Default_Ada_Body_Suffix return File_Name_Type is
350 return Default_Ada_Body_Suffix_Id;
351 end Default_Ada_Body_Suffix;
353 -----------------------------
354 -- Default_Ada_Spec_Suffix --
355 -----------------------------
357 function Default_Ada_Spec_Suffix return File_Name_Type is
359 return Default_Ada_Spec_Suffix_Id;
360 end Default_Ada_Spec_Suffix;
362 ----------------------
363 -- Default_Language --
364 ----------------------
366 function Default_Language (In_Tree : Project_Tree_Ref) return Name_Id is
368 return In_Tree.Default_Language;
369 end Default_Language;
371 ---------------------------
372 -- Delete_All_Temp_Files --
373 ---------------------------
375 procedure Delete_All_Temp_Files is
378 if not Debug.Debug_Flag_N then
379 for Index in 1 .. Temp_Files.Last loop
381 (Get_Name_String (Temp_Files.Table (Index)), Dont_Care);
384 end Delete_All_Temp_Files;
386 ---------------------
387 -- Dependency_Name --
388 ---------------------
390 function Dependency_Name
391 (Source_File_Name : File_Name_Type;
392 Dependency : Dependency_File_Kind) return File_Name_Type
403 (Source_File_Name, Makefile_Dependency_Suffix));
409 (Source_File_Name, ALI_Dependency_Suffix));
413 ---------------------------
414 -- Display_Language_Name --
415 ---------------------------
417 procedure Display_Language_Name
418 (In_Tree : Project_Tree_Ref;
419 Language : Language_Index)
422 Get_Name_String (In_Tree.Languages_Data.Table (Language).Display_Name);
423 Write_Str (Name_Buffer (1 .. Name_Len));
424 end Display_Language_Name;
426 ---------------------------
427 -- Display_Language_Name --
428 ---------------------------
430 procedure Display_Language_Name (Language : Language_Index) is
432 Get_Name_String (Language_Names.Table (Language));
433 To_Upper (Name_Buffer (1 .. 1));
434 Write_Str (Name_Buffer (1 .. Name_Len));
435 end Display_Language_Name;
441 function Empty_File return File_Name_Type is
443 return File_Name_Type (The_Empty_String);
450 function Empty_Project (Tree : Project_Tree_Ref) return Project_Data is
451 Value : Project_Data;
454 Prj.Initialize (Tree => No_Project_Tree);
455 Value := Project_Empty;
456 Value.Naming := Tree.Private_Part.Default_Naming;
458 if Current_Mode = Multi_Language then
459 Value.Config := Tree.Config;
469 function Empty_String return Name_Id is
471 return The_Empty_String;
478 procedure Expect (The_Token : Token_Type; Token_Image : String) is
480 if Token /= The_Token then
481 Error_Msg (Token_Image & " expected", Token_Ptr);
490 (File : File_Name_Type;
491 With_Suffix : String) return File_Name_Type
496 Get_Name_String (File);
497 Last := Name_Len + 1;
499 while Name_Len /= 0 and then Name_Buffer (Name_Len) /= '.' loop
500 Name_Len := Name_Len - 1;
503 if Name_Len <= 1 then
507 for J in With_Suffix'Range loop
508 Name_Buffer (Name_Len) := With_Suffix (J);
509 Name_Len := Name_Len + 1;
512 Name_Len := Name_Len - 1;
517 --------------------------------
518 -- For_Every_Project_Imported --
519 --------------------------------
521 procedure For_Every_Project_Imported
523 In_Tree : Project_Tree_Ref;
524 With_State : in out State)
527 procedure Recursive_Check (Project : Project_Id);
528 -- Check if a project has already been seen. If not seen, mark it as
529 -- Seen, Call Action, and check all its imported projects.
531 ---------------------
532 -- Recursive_Check --
533 ---------------------
535 procedure Recursive_Check (Project : Project_Id) is
538 if not In_Tree.Projects.Table (Project).Seen then
539 In_Tree.Projects.Table (Project).Seen := True;
540 Action (Project, With_State);
543 In_Tree.Projects.Table (Project).Imported_Projects;
544 while List /= Empty_Project_List loop
545 Recursive_Check (In_Tree.Project_Lists.Table (List).Project);
546 List := In_Tree.Project_Lists.Table (List).Next;
551 -- Start of processing for For_Every_Project_Imported
554 for Project in Project_Table.First ..
555 Project_Table.Last (In_Tree.Projects)
557 In_Tree.Projects.Table (Project).Seen := False;
560 Recursive_Check (Project => By);
561 end For_Every_Project_Imported;
567 function Get_Mode return Mode is
576 function Hash (Name : File_Name_Type) return Header_Num is
578 return Hash (Get_Name_String (Name));
581 function Hash (Name : Name_Id) return Header_Num is
583 return Hash (Get_Name_String (Name));
586 function Hash (Name : Path_Name_Type) return Header_Num is
588 return Hash (Get_Name_String (Name));
595 function Image (Casing : Casing_Type) return String is
597 return The_Casing_Images (Casing).all;
600 ----------------------
601 -- In_Configuration --
602 ----------------------
604 function In_Configuration return Boolean is
606 return Configuration_Mode;
607 end In_Configuration;
613 procedure Initialize (Tree : Project_Tree_Ref) is
615 if not Initialized then
619 The_Empty_String := Name_Find;
620 Empty_Name := The_Empty_String;
622 Name_Buffer (1 .. 4) := ".ads";
623 Default_Ada_Spec_Suffix_Id := Name_Find;
625 Name_Buffer (1 .. 4) := ".adb";
626 Default_Ada_Body_Suffix_Id := Name_Find;
628 Name_Buffer (1) := '/';
629 Slash_Id := Name_Find;
631 Name_Buffer (1 .. 3) := "c++";
632 Name_C_Plus_Plus := Name_Find;
636 Set_Name_Table_Byte (Name_Project, Token_Type'Pos (Tok_Project));
637 Set_Name_Table_Byte (Name_Extends, Token_Type'Pos (Tok_Extends));
638 Set_Name_Table_Byte (Name_External, Token_Type'Pos (Tok_External));
640 Language_Indexes.Reset;
641 Last_Language_Index := No_Language_Index;
643 Add_Language_Name (Name_Ada);
644 Add_Language_Name (Name_C);
645 Add_Language_Name (Name_C_Plus_Plus);
648 if Tree /= No_Project_Tree then
657 function Is_A_Language
658 (Tree : Project_Tree_Ref;
660 Language_Name : String) return Boolean
666 Add_Str_To_Name_Buffer (Language_Name);
667 To_Lower (Name_Buffer (1 .. Name_Len));
668 Lang_Id := Name_Find;
670 if Get_Mode = Ada_Only then
672 List : Name_List_Index := Data.Languages;
675 while List /= No_Name_List loop
676 if Tree.Name_Lists.Table (List).Name = Lang_Id then
680 List := Tree.Name_Lists.Table (List).Next;
687 Lang_Ind : Language_Index;
688 Lang_Data : Language_Data;
691 Lang_Ind := Data.First_Language_Processing;
692 while Lang_Ind /= No_Language_Index loop
693 Lang_Data := Tree.Languages_Data.Table (Lang_Ind);
695 if Lang_Data.Name = Lang_Id then
699 Lang_Ind := Lang_Data.Next;
711 function Is_Extending
712 (Extending : Project_Id;
713 Extended : Project_Id;
714 In_Tree : Project_Tree_Ref) return Boolean
720 while Proj /= No_Project loop
721 if Proj = Extended then
725 Proj := In_Tree.Projects.Table (Proj).Extends;
736 (Language : Language_Index;
737 In_Project : Project_Data;
738 In_Tree : Project_Tree_Ref) return Boolean
742 when No_Language_Index =>
745 when First_Language_Indexes =>
746 return In_Project.Langs (Language);
750 Supp : Supp_Language;
751 Supp_Index : Supp_Language_Index := In_Project.Supp_Languages;
754 while Supp_Index /= No_Supp_Language_Index loop
755 Supp := In_Tree.Present_Languages.Table (Supp_Index);
757 if Supp.Index = Language then
761 Supp_Index := Supp.Next;
769 ---------------------------------
770 -- Language_Processing_Data_Of --
771 ---------------------------------
773 function Language_Processing_Data_Of
774 (Language : Language_Index;
775 In_Project : Project_Data;
776 In_Tree : Project_Tree_Ref) return Language_Processing_Data
780 when No_Language_Index =>
781 return Default_Language_Processing_Data;
783 when First_Language_Indexes =>
784 return In_Project.First_Lang_Processing (Language);
788 Supp : Supp_Language_Data;
789 Supp_Index : Supp_Language_Index :=
790 In_Project.Supp_Language_Processing;
793 while Supp_Index /= No_Supp_Language_Index loop
794 Supp := In_Tree.Supp_Languages.Table (Supp_Index);
796 if Supp.Index = Language then
800 Supp_Index := Supp.Next;
803 return Default_Language_Processing_Data;
806 end Language_Processing_Data_Of;
808 -----------------------
809 -- Objects_Exist_For --
810 -----------------------
812 function Objects_Exist_For
814 In_Tree : Project_Tree_Ref) return Boolean
816 Language_Id : Name_Id;
817 Lang : Language_Index;
820 if Current_Mode = Multi_Language then
822 Add_Str_To_Name_Buffer (Language);
823 To_Lower (Name_Buffer (1 .. Name_Len));
824 Language_Id := Name_Find;
826 Lang := In_Tree.First_Language;
828 while Lang /= No_Language_Index loop
829 if In_Tree.Languages_Data.Table (Lang).Name = Language_Id then
831 In_Tree.Languages_Data.Table
832 (Lang).Config.Objects_Generated;
835 Lang := In_Tree.Languages_Data.Table (Lang).Next;
840 end Objects_Exist_For;
847 (Source_File_Name : File_Name_Type)
848 return File_Name_Type
851 return Extend_Name (Source_File_Name, Object_Suffix);
854 ----------------------
855 -- Record_Temp_File --
856 ----------------------
858 procedure Record_Temp_File (Path : Path_Name_Type) is
860 Temp_Files.Increment_Last;
861 Temp_Files.Table (Temp_Files.Last) := Path;
862 end Record_Temp_File;
864 ------------------------------------
865 -- Register_Default_Naming_Scheme --
866 ------------------------------------
868 procedure Register_Default_Naming_Scheme
870 Default_Spec_Suffix : File_Name_Type;
871 Default_Body_Suffix : File_Name_Type;
872 In_Tree : Project_Tree_Ref)
875 Suffix : Array_Element_Id;
876 Found : Boolean := False;
877 Element : Array_Element;
880 -- Get the language name in small letters
882 Get_Name_String (Language);
883 Name_Buffer (1 .. Name_Len) := To_Lower (Name_Buffer (1 .. Name_Len));
886 Suffix := In_Tree.Private_Part.Default_Naming.Spec_Suffix;
889 -- Look for an element of the spec sufix array indexed by the language
890 -- name. If one is found, put the default value.
892 while Suffix /= No_Array_Element and then not Found loop
893 Element := In_Tree.Array_Elements.Table (Suffix);
895 if Element.Index = Lang then
897 Element.Value.Value := Name_Id (Default_Spec_Suffix);
898 In_Tree.Array_Elements.Table (Suffix) := Element;
901 Suffix := Element.Next;
905 -- If none can be found, create a new one
911 Index_Case_Sensitive => False,
912 Value => (Project => No_Project,
914 Location => No_Location,
916 Value => Name_Id (Default_Spec_Suffix),
918 Next => In_Tree.Private_Part.Default_Naming.Spec_Suffix);
919 Array_Element_Table.Increment_Last (In_Tree.Array_Elements);
920 In_Tree.Array_Elements.Table
921 (Array_Element_Table.Last (In_Tree.Array_Elements)) :=
923 In_Tree.Private_Part.Default_Naming.Spec_Suffix :=
924 Array_Element_Table.Last (In_Tree.Array_Elements);
927 Suffix := In_Tree.Private_Part.Default_Naming.Body_Suffix;
930 -- Look for an element of the body sufix array indexed by the language
931 -- name. If one is found, put the default value.
933 while Suffix /= No_Array_Element and then not Found loop
934 Element := In_Tree.Array_Elements.Table (Suffix);
936 if Element.Index = Lang then
938 Element.Value.Value := Name_Id (Default_Body_Suffix);
939 In_Tree.Array_Elements.Table (Suffix) := Element;
942 Suffix := Element.Next;
946 -- If none can be found, create a new one
952 Index_Case_Sensitive => False,
953 Value => (Project => No_Project,
955 Location => No_Location,
957 Value => Name_Id (Default_Body_Suffix),
959 Next => In_Tree.Private_Part.Default_Naming.Body_Suffix);
960 Array_Element_Table.Increment_Last
961 (In_Tree.Array_Elements);
962 In_Tree.Array_Elements.Table
963 (Array_Element_Table.Last (In_Tree.Array_Elements))
965 In_Tree.Private_Part.Default_Naming.Body_Suffix :=
966 Array_Element_Table.Last (In_Tree.Array_Elements);
968 end Register_Default_Naming_Scheme;
974 procedure Reset (Tree : Project_Tree_Ref) is
976 -- Def_Lang : constant Name_Node :=
977 -- (Name => Name_Ada,
978 -- Next => No_Name_List);
979 -- Why is the above commented out ???
986 Present_Language_Table.Init (Tree.Present_Languages);
987 Supp_Suffix_Table.Init (Tree.Supp_Suffixes);
988 Supp_Language_Table.Init (Tree.Supp_Languages);
989 Other_Source_Table.Init (Tree.Other_Sources);
993 Language_Data_Table.Init (Tree.Languages_Data);
994 Name_List_Table.Init (Tree.Name_Lists);
995 String_Element_Table.Init (Tree.String_Elements);
996 Variable_Element_Table.Init (Tree.Variable_Elements);
997 Array_Element_Table.Init (Tree.Array_Elements);
998 Array_Table.Init (Tree.Arrays);
999 Package_Table.Init (Tree.Packages);
1000 Project_List_Table.Init (Tree.Project_Lists);
1001 Project_Table.Init (Tree.Projects);
1002 Source_Data_Table.Init (Tree.Sources);
1003 Alternate_Language_Table.Init (Tree.Alt_Langs);
1004 Unit_Table.Init (Tree.Units);
1005 Units_Htable.Reset (Tree.Units_HT);
1006 Files_Htable.Reset (Tree.Files_HT);
1007 Source_Paths_Htable.Reset (Tree.Source_Paths_HT);
1009 -- Private part table
1011 Naming_Table.Init (Tree.Private_Part.Namings);
1012 Naming_Table.Increment_Last (Tree.Private_Part.Namings);
1013 Tree.Private_Part.Namings.Table
1014 (Naming_Table.Last (Tree.Private_Part.Namings)) := Std_Naming_Data;
1015 Path_File_Table.Init (Tree.Private_Part.Path_Files);
1016 Source_Path_Table.Init (Tree.Private_Part.Source_Paths);
1017 Object_Path_Table.Init (Tree.Private_Part.Object_Paths);
1018 Tree.Private_Part.Default_Naming := Std_Naming_Data;
1020 if Current_Mode = Ada_Only then
1021 Register_Default_Naming_Scheme
1022 (Language => Name_Ada,
1023 Default_Spec_Suffix => Default_Ada_Spec_Suffix,
1024 Default_Body_Suffix => Default_Ada_Body_Suffix,
1026 Tree.Private_Part.Default_Naming.Separate_Suffix :=
1027 Default_Ada_Body_Suffix;
1031 ------------------------
1032 -- Same_Naming_Scheme --
1033 ------------------------
1035 function Same_Naming_Scheme
1036 (Left, Right : Naming_Data) return Boolean
1039 return Left.Dot_Replacement = Right.Dot_Replacement
1040 and then Left.Casing = Right.Casing
1041 and then Left.Separate_Suffix = Right.Separate_Suffix;
1042 end Same_Naming_Scheme;
1049 (Language : Language_Index;
1051 In_Project : in out Project_Data;
1052 In_Tree : Project_Tree_Ref)
1056 when No_Language_Index =>
1059 when First_Language_Indexes =>
1060 In_Project.Langs (Language) := Present;
1064 Supp : Supp_Language;
1065 Supp_Index : Supp_Language_Index := In_Project.Supp_Languages;
1068 while Supp_Index /= No_Supp_Language_Index loop
1069 Supp := In_Tree.Present_Languages.Table
1072 if Supp.Index = Language then
1073 In_Tree.Present_Languages.Table
1074 (Supp_Index).Present := Present;
1078 Supp_Index := Supp.Next;
1081 Supp := (Index => Language, Present => Present,
1082 Next => In_Project.Supp_Languages);
1083 Present_Language_Table.Increment_Last
1084 (In_Tree.Present_Languages);
1085 Supp_Index := Present_Language_Table.Last
1086 (In_Tree.Present_Languages);
1087 In_Tree.Present_Languages.Table (Supp_Index) :=
1089 In_Project.Supp_Languages := Supp_Index;
1095 (Language_Processing : Language_Processing_Data;
1096 For_Language : Language_Index;
1097 In_Project : in out Project_Data;
1098 In_Tree : Project_Tree_Ref)
1101 case For_Language is
1102 when No_Language_Index =>
1105 when First_Language_Indexes =>
1106 In_Project.First_Lang_Processing (For_Language) :=
1107 Language_Processing;
1111 Supp : Supp_Language_Data;
1112 Supp_Index : Supp_Language_Index;
1115 Supp_Index := In_Project.Supp_Language_Processing;
1116 while Supp_Index /= No_Supp_Language_Index loop
1117 Supp := In_Tree.Supp_Languages.Table (Supp_Index);
1119 if Supp.Index = For_Language then
1120 In_Tree.Supp_Languages.Table
1121 (Supp_Index).Data := Language_Processing;
1125 Supp_Index := Supp.Next;
1128 Supp := (Index => For_Language, Data => Language_Processing,
1129 Next => In_Project.Supp_Language_Processing);
1130 Supp_Language_Table.Increment_Last
1131 (In_Tree.Supp_Languages);
1132 Supp_Index := Supp_Language_Table.Last
1133 (In_Tree.Supp_Languages);
1134 In_Tree.Supp_Languages.Table (Supp_Index) := Supp;
1135 In_Project.Supp_Language_Processing := Supp_Index;
1141 (Suffix : File_Name_Type;
1142 For_Language : Language_Index;
1143 In_Project : in out Project_Data;
1144 In_Tree : Project_Tree_Ref)
1147 case For_Language is
1148 when No_Language_Index =>
1151 when First_Language_Indexes =>
1152 In_Project.Naming.Impl_Suffixes (For_Language) := Suffix;
1157 Supp_Index : Supp_Language_Index :=
1158 In_Project.Naming.Supp_Suffixes;
1161 while Supp_Index /= No_Supp_Language_Index loop
1162 Supp := In_Tree.Supp_Suffixes.Table
1165 if Supp.Index = For_Language then
1166 In_Tree.Supp_Suffixes.Table
1167 (Supp_Index).Suffix := Suffix;
1171 Supp_Index := Supp.Next;
1174 Supp := (Index => For_Language, Suffix => Suffix,
1175 Next => In_Project.Naming.Supp_Suffixes);
1176 Supp_Suffix_Table.Increment_Last
1177 (In_Tree.Supp_Suffixes);
1178 Supp_Index := Supp_Suffix_Table.Last
1179 (In_Tree.Supp_Suffixes);
1180 In_Tree.Supp_Suffixes.Table (Supp_Index) := Supp;
1181 In_Project.Naming.Supp_Suffixes := Supp_Index;
1186 ---------------------
1187 -- Set_Body_Suffix --
1188 ---------------------
1190 procedure Set_Body_Suffix
1191 (In_Tree : Project_Tree_Ref;
1193 Naming : in out Naming_Data;
1194 Suffix : File_Name_Type)
1196 Language_Id : Name_Id;
1197 Element : Array_Element;
1201 Add_Str_To_Name_Buffer (Language);
1202 To_Lower (Name_Buffer (1 .. Name_Len));
1203 Language_Id := Name_Find;
1206 (Index => Language_Id,
1208 Index_Case_Sensitive => False,
1211 Project => No_Project,
1212 Location => No_Location,
1214 Value => Name_Id (Suffix),
1216 Next => Naming.Body_Suffix);
1218 Array_Element_Table.Increment_Last (In_Tree.Array_Elements);
1219 Naming.Body_Suffix :=
1220 Array_Element_Table.Last (In_Tree.Array_Elements);
1221 In_Tree.Array_Elements.Table (Naming.Body_Suffix) := Element;
1222 end Set_Body_Suffix;
1224 --------------------------
1225 -- Set_In_Configuration --
1226 --------------------------
1228 procedure Set_In_Configuration (Value : Boolean) is
1230 Configuration_Mode := Value;
1231 end Set_In_Configuration;
1237 procedure Set_Mode (New_Mode : Mode) is
1239 Current_Mode := New_Mode;
1242 ---------------------
1243 -- Set_Spec_Suffix --
1244 ---------------------
1246 procedure Set_Spec_Suffix
1247 (In_Tree : Project_Tree_Ref;
1249 Naming : in out Naming_Data;
1250 Suffix : File_Name_Type)
1252 Language_Id : Name_Id;
1253 Element : Array_Element;
1257 Add_Str_To_Name_Buffer (Language);
1258 To_Lower (Name_Buffer (1 .. Name_Len));
1259 Language_Id := Name_Find;
1262 (Index => Language_Id,
1264 Index_Case_Sensitive => False,
1267 Project => No_Project,
1268 Location => No_Location,
1270 Value => Name_Id (Suffix),
1272 Next => Naming.Spec_Suffix);
1274 Array_Element_Table.Increment_Last (In_Tree.Array_Elements);
1275 Naming.Spec_Suffix :=
1276 Array_Element_Table.Last (In_Tree.Array_Elements);
1277 In_Tree.Array_Elements.Table (Naming.Spec_Suffix) := Element;
1278 end Set_Spec_Suffix;
1284 function Slash return Path_Name_Type is
1289 -----------------------
1290 -- Spec_Suffix_Id_Of --
1291 -----------------------
1293 function Spec_Suffix_Id_Of
1294 (In_Tree : Project_Tree_Ref;
1296 Naming : Naming_Data) return File_Name_Type
1298 Language_Id : Name_Id;
1299 Element_Id : Array_Element_Id;
1300 Element : Array_Element;
1301 Suffix : File_Name_Type := No_File;
1302 Lang : Language_Index;
1306 Add_Str_To_Name_Buffer (Language);
1307 To_Lower (Name_Buffer (1 .. Name_Len));
1308 Language_Id := Name_Find;
1310 Element_Id := Naming.Spec_Suffix;
1312 while Element_Id /= No_Array_Element loop
1313 Element := In_Tree.Array_Elements.Table (Element_Id);
1315 if Element.Index = Language_Id then
1316 return File_Name_Type (Element.Value.Value);
1319 Element_Id := Element.Next;
1322 if Current_Mode = Multi_Language then
1323 Lang := In_Tree.First_Language;
1325 while Lang /= No_Language_Index loop
1326 if In_Tree.Languages_Data.Table (Lang).Name = Language_Id then
1328 In_Tree.Languages_Data.Table
1329 (Lang).Config.Naming_Data.Spec_Suffix;
1333 Lang := In_Tree.Languages_Data.Table (Lang).Next;
1338 end Spec_Suffix_Id_Of;
1340 --------------------
1341 -- Spec_Suffix_Of --
1342 --------------------
1344 function Spec_Suffix_Of
1345 (In_Tree : Project_Tree_Ref;
1347 Naming : Naming_Data) return String
1349 Language_Id : Name_Id;
1350 Element_Id : Array_Element_Id;
1351 Element : Array_Element;
1352 Suffix : File_Name_Type := No_File;
1353 Lang : Language_Index;
1357 Add_Str_To_Name_Buffer (Language);
1358 To_Lower (Name_Buffer (1 .. Name_Len));
1359 Language_Id := Name_Find;
1361 Element_Id := Naming.Spec_Suffix;
1363 while Element_Id /= No_Array_Element loop
1364 Element := In_Tree.Array_Elements.Table (Element_Id);
1366 if Element.Index = Language_Id then
1367 return Get_Name_String (Element.Value.Value);
1370 Element_Id := Element.Next;
1373 if Current_Mode = Multi_Language then
1374 Lang := In_Tree.First_Language;
1376 while Lang /= No_Language_Index loop
1377 if In_Tree.Languages_Data.Table (Lang).Name = Language_Id then
1380 (In_Tree.Languages_Data.Table
1381 (Lang).Config.Naming_Data.Spec_Suffix);
1385 Lang := In_Tree.Languages_Data.Table (Lang).Next;
1388 if Suffix /= No_File then
1389 return Get_Name_String (Suffix);
1396 --------------------------
1397 -- Standard_Naming_Data --
1398 --------------------------
1400 function Standard_Naming_Data
1401 (Tree : Project_Tree_Ref := No_Project_Tree) return Naming_Data
1404 if Tree = No_Project_Tree then
1405 Prj.Initialize (Tree => No_Project_Tree);
1406 return Std_Naming_Data;
1409 return Tree.Private_Part.Default_Naming;
1411 end Standard_Naming_Data;
1418 (Language : Language_Index;
1419 In_Project : Project_Data;
1420 In_Tree : Project_Tree_Ref) return File_Name_Type
1424 when No_Language_Index =>
1427 when First_Language_Indexes =>
1428 return In_Project.Naming.Impl_Suffixes (Language);
1433 Supp_Index : Supp_Language_Index :=
1434 In_Project.Naming.Supp_Suffixes;
1437 while Supp_Index /= No_Supp_Language_Index loop
1438 Supp := In_Tree.Supp_Suffixes.Table (Supp_Index);
1440 if Supp.Index = Language then
1444 Supp_Index := Supp.Next;
1456 function Switches_Name
1457 (Source_File_Name : File_Name_Type) return File_Name_Type
1460 return Extend_Name (Source_File_Name, Switches_Dependency_Suffix);
1463 ---------------------------
1464 -- There_Are_Ada_Sources --
1465 ---------------------------
1467 function There_Are_Ada_Sources
1468 (In_Tree : Project_Tree_Ref;
1469 Project : Project_Id) return Boolean
1475 while Prj /= No_Project loop
1476 if In_Tree.Projects.Table (Prj).Ada_Sources /= Nil_String then
1480 Prj := In_Tree.Projects.Table (Prj).Extends;
1484 end There_Are_Ada_Sources;
1490 function Value (Image : String) return Casing_Type is
1492 for Casing in The_Casing_Images'Range loop
1493 if To_Lower (Image) = To_Lower (The_Casing_Images (Casing).all) then
1498 raise Constraint_Error;
1502 -- Make sure that the standard config and user project file extensions are
1503 -- compatible with canonical case file naming.
1505 Canonical_Case_File_Name (Config_Project_File_Extension);
1506 Canonical_Case_File_Name (Project_File_Extension);