with Ada.Characters.Handling; use Ada.Characters.Handling;
with Namet; use Namet;
with Osint; use Osint;
with Output; use Output;
package body Prj.Attr is
Initialization_Data : constant String :=
"SVobject_dir#" &
"SVexec_dir#" &
"LVsource_dirs#" &
"LVsource_files#" &
"LVlocally_removed_files#" &
"SVsource_list_file#" &
"SVlibrary_dir#" &
"SVlibrary_name#" &
"SVlibrary_kind#" &
"SVlibrary_version#" &
"LVlibrary_interface#" &
"SVlibrary_auto_init#" &
"LVlibrary_options#" &
"SVlibrary_src_dir#" &
"SVlibrary_gcc#" &
"SVlibrary_symbol_file#" &
"SVlibrary_symbol_policy#" &
"SVlibrary_reference_symbol_file#" &
"lVmain#" &
"LVlanguages#" &
"SVmain_language#" &
"Pnaming#" &
"Saspecification_suffix#" &
"Saspec_suffix#" &
"Saimplementation_suffix#" &
"Sabody_suffix#" &
"SVseparate_suffix#" &
"SVcasing#" &
"SVdot_replacement#" &
"sAspecification#" &
"sAspec#" &
"sAimplementation#" &
"sAbody#" &
"Laspecification_exceptions#" &
"Laimplementation_exceptions#" &
"Pcompiler#" &
"Ladefault_switches#" &
"Lcswitches#" &
"SVlocal_configuration_pragmas#" &
"Pbuilder#" &
"Ladefault_switches#" &
"Lcswitches#" &
"Scexecutable#" &
"SVexecutable_suffix#" &
"SVglobal_configuration_pragmas#" &
"Pgnatls#" &
"LVswitches#" &
"Pbinder#" &
"Ladefault_switches#" &
"Lcswitches#" &
"Plinker#" &
"Ladefault_switches#" &
"Lcswitches#" &
"LVlinker_options#" &
"Pcross_reference#" &
"Ladefault_switches#" &
"Lbswitches#" &
"Pfinder#" &
"Ladefault_switches#" &
"Lbswitches#" &
"Ppretty_printer#" &
"Ladefault_switches#" &
"Lbswitches#" &
"Pgnatstub#" &
"Ladefault_switches#" &
"Lbswitches#" &
"Peliminate#" &
"Ladefault_switches#" &
"Lbswitches#" &
"Pide#" &
"Ladefault_switches#" &
"SVremote_host#" &
"SVprogram_host#" &
"SVcommunication_protocol#" &
"Sacompiler_command#" &
"SVdebugger_command#" &
"SVgnatlist#" &
"SVvcs_kind#" &
"SVvcs_file_check#" &
"SVvcs_log_check#" &
"#";
procedure Initialize is
Start : Positive := Initialization_Data'First;
Finish : Positive := Start;
Current_Package : Package_Node_Id := Empty_Package;
Current_Attribute : Attribute_Node_Id := Empty_Attribute;
Is_An_Attribute : Boolean := False;
Kind_1 : Variable_Kind := Undefined;
Optional_Index : Boolean := False;
Kind_2 : Attribute_Kind := Single;
Package_Name : Name_Id := No_Name;
Attribute_Name : Name_Id := No_Name;
First_Attribute : Attribute_Node_Id := Attribute_First;
begin
Attributes.Init;
Package_Attributes.Init;
while Initialization_Data (Start) /= '#' loop
Is_An_Attribute := True;
case Initialization_Data (Start) is
when 'P' =>
Start := Start + 1;
Finish := Start;
while Initialization_Data (Finish) /= '#' loop
Finish := Finish + 1;
end loop;
Name_Len := Finish - Start;
Name_Buffer (1 .. Name_Len) :=
To_Lower (Initialization_Data (Start .. Finish - 1));
Package_Name := Name_Find;
for Index in Package_First .. Package_Attributes.Last loop
if Package_Name = Package_Attributes.Table (Index).Name then
Write_Line ("Duplicate package name """ &
Initialization_Data (Start .. Finish - 1) &
""" in Prj.Attr body.");
raise Program_Error;
end if;
end loop;
Is_An_Attribute := False;
Current_Attribute := Empty_Attribute;
Package_Attributes.Increment_Last;
Current_Package := Package_Attributes.Last;
Package_Attributes.Table (Current_Package).Name :=
Package_Name;
Start := Finish + 1;
when 'S' =>
Kind_1 := Single;
Optional_Index := False;
when 's' =>
Kind_1 := Single;
Optional_Index := True;
when 'L' =>
Kind_1 := List;
Optional_Index := False;
when 'l' =>
Kind_1 := List;
Optional_Index := True;
when others =>
raise Program_Error;
end case;
if Is_An_Attribute then
Start := Start + 1;
case Initialization_Data (Start) is
when 'V' =>
Kind_2 := Single;
when 'A' =>
Kind_2 := Associative_Array;
when 'a' =>
Kind_2 := Case_Insensitive_Associative_Array;
when 'b' =>
if File_Names_Case_Sensitive then
Kind_2 := Associative_Array;
else
Kind_2 := Case_Insensitive_Associative_Array;
end if;
when 'c' =>
if File_Names_Case_Sensitive then
Kind_2 := Optional_Index_Associative_Array;
else
Kind_2 :=
Optional_Index_Case_Insensitive_Associative_Array;
end if;
when others =>
raise Program_Error;
end case;
Start := Start + 1;
Finish := Start;
while Initialization_Data (Finish) /= '#' loop
Finish := Finish + 1;
end loop;
Name_Len := Finish - Start;
Name_Buffer (1 .. Name_Len) :=
To_Lower (Initialization_Data (Start .. Finish - 1));
Attribute_Name := Name_Find;
Attributes.Increment_Last;
if Current_Attribute = Empty_Attribute then
First_Attribute := Attributes.Last;
if Current_Package /= Empty_Package then
Package_Attributes.Table (Current_Package).First_Attribute
:= Attributes.Last;
end if;
else
for Index in First_Attribute .. Attributes.Last - 1 loop
if Attribute_Name =
Attributes.Table (Index).Name then
Write_Line ("Duplicate attribute name """ &
Initialization_Data (Start .. Finish - 1) &
""" in Prj.Attr body.");
raise Program_Error;
end if;
end loop;
Attributes.Table (Current_Attribute).Next :=
Attributes.Last;
end if;
Current_Attribute := Attributes.Last;
Attributes.Table (Current_Attribute) :=
(Name => Attribute_Name,
Kind_1 => Kind_1,
Optional_Index => Optional_Index,
Kind_2 => Kind_2,
Next => Empty_Attribute);
Start := Finish + 1;
end if;
end loop;
end Initialize;
end Prj.Attr;