|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 56320 (0xdc00)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Build, package body Extensions_Support, package body Imports, seg_0211de
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦5a81ac88f⟧ »Space Info Vol 1«
└─⟦this⟧
with Cmvc;
with Compilation_Interface;
with Debug_Tools;
with Directory_Tools;
with Download_Times;
with Import_Interface;
with Library;
with Library_Interface;
with Log;
with Polymorphic_Io;
with Profile;
with Remote_Links;
with String_Utilities;
with Switch_Implementation;
with Time_Utilities;
with Utilities;
package body Extensions_Support is
package Dtable renames Download_Times.Table;
package Link_Table renames Remote_Links.Link_Table;
package View_Table renames Remote_Links.View_Table;
package Ci renames Compilation_Interface;
package Dt renames Directory_Tools;
package Du renames Utilities.Directory_Utilities;
package Li renames Library_Interface;
package Naming renames Directory.Naming;
package Object renames Dt.Object;
package Pio renames Polymorphic_Io;
package Rci renames Remote_Command_Interface;
package Rsu renames Utilities.Rci_Switch_Utilities;
package Si renames Switch_Implementation;
package Ss renames Simple_Status;
package Su renames String_Utilities;
Debugging : Boolean := False;
Target_Key : constant String := "I386_Unix_Als_Xt";
-- Maximum length of a remote command.
Max_Command_Length : Natural := 254;
-- Default suffix of a family directory name.
Family_Suffix : constant String := "_f/";
-- The name of this switch is defined in Get_Operational_Info.
Family_Name_Switch : constant String :=
Target_Key & "_User_Set_Family_Name";
function "=" (L, R : Directory.Object) return Boolean renames Directory."=";
function "=" (L, R : Directory.Error_Status) return Boolean
renames Directory."=";
function Problem (Status : Ss.Condition;
Trace_Command : Boolean) return Boolean is
begin
if Ss.Error (Status => Status,
Level => Ss.Problem) then
if Debugging or else Trace_Command then
Log.Put_Line (Message => "#~" & Ss.Message (Status),
Kind => Profile.Negative_Msg);
end if;
return True;
end if;
return False;
end Problem;
function Qt (Str : String) return String is
begin
return " => """ & Str & """";
end Qt;
function Quot (Str : String) return String is
begin
return """" & Str & """";
end Quot;
procedure Rci_Execute_Command (Command_Line : String;
Remote_Connection : Rci.Context;
Status : in out Ss.Condition;
Trace_Command : Boolean) is
begin
Rci.Execute_Command (Command_Line => Command_Line,
Remote_Connection => Remote_Connection,
Status => Status,
Trace_Command => Debugging or else Trace_Command);
end Rci_Execute_Command;
procedure Delete_Links_Files (View_Obj : Directory.Object) is
begin
-- Delete the view's Remote_Links file.
Library.Delete (Existing => Remote_Links.File_Name (View_Obj),
Limit => "<DIRECTORIES>",
Response => "<QUIET>");
-- Delete the view's Download_Times file.
Library.Delete (Existing =>
Download_Times.Download_Times_File_Name (View_Obj),
Limit => "<DIRECTORIES>",
Response => "<QUIET>");
end Delete_Links_Files;
function Get_Enclosing_Directory
(Remote_Directory : String) return String is
Last_Slash : Natural := Su.Reverse_Locate ("/", Remote_Directory);
begin
-- Get the name of the Unix directory that immediately encloses a
-- view's Remote_Directory.
if Last_Slash = 0 or else Last_Slash = Remote_Directory'First then
Log.Put_Line ("Can't get the directory " &
"which contains Remote_Directory " &
Quot (Remote_Directory), Profile.Error_Msg);
return "";
end if;
return Remote_Directory (Remote_Directory'First .. Last_Slash - 1);
end Get_Enclosing_Directory;
function Extract_Family_Name (Remote_Directory : String) return String is
Loc : Natural;
begin
-- Extract the default family name from a Remote_Directory string.
Loc := Su.Reverse_Locate (Family_Suffix, Remote_Directory);
if Loc = 0 then
-- The Remote_Directory string doesn't contain a default family
-- directory name.
Log.Put_Line ("Can't find a family directory name in " &
"the Remote_Directory string " &
Quot (Remote_Directory), Profile.Warning_Msg);
return "";
end if;
if Remote_Directory (Remote_Directory'First) /= '/' then
Log.Put_Line ("Remote_Directory name " &
Quot (Remote_Directory) & " must begin with '/'",
Profile.Error_Msg);
return "";
end if;
declare
Head : constant String :=
Remote_Directory (Remote_Directory'First + 1 .. Loc - 1);
Tail : constant String := Remote_Directory
(Loc + 1 .. Remote_Directory'Last);
begin
-- At least 2 directories must precede the family directory.
if Su.Locate ("/", Head) = Su.Reverse_Locate ("/", Head) then
Log.Put_Line ("The family directory name is misplaced in " &
"the Remote_Directory string " &
Quot (Remote_Directory), Profile.Error_Msg);
return "";
end if;
return Remote_Directory (Remote_Directory'First .. Loc - 1);
end;
end Extract_Family_Name;
function Get_Family_Name (Host_View : Directory.Object;
Remote_Directory : String) return String is
begin
if not Directory.Is_Nil (Host_View) then
declare
Family : constant String := Rsu.Value
(Name => Family_Name_Switch,
For_Directory => Host_View);
begin
if Family'Length /= 0 then
-- Use the family name that is already specified in the
-- User_Set_Family_Name switch.
return Family;
end if;
end;
end if;
-- Extract a family name from the given Remote_Directory.
return Extract_Family_Name (Remote_Directory);
end Get_Family_Name;
function Remote_Family (View_Obj : Directory.Object) return String is
-- If the user set it to a non-null value, the name of the remote
-- family directory is obtained from the view's Family_Name library
-- switch. If the switch value is null, we will derive the family name
-- from the view's Remote_Directory name.
Family : constant String := Rsu.Value (Name => Family_Name_Switch,
For_Directory => View_Obj);
begin
if Family'Length /= 0 then
-- Use the family name that is already specified in the switch.
return Family;
end if;
-- Get the view's Remote_Directory so we can extract the family name
-- from it.
declare
View_Name : constant String := Naming.Get_Full_Name (View_Obj);
Remote_Directory_Result : constant Li.String_Result :=
Li.Remote_Directory (View => View_Name);
Remote_Directory : constant String :=
Su.Lower_Case (Remote_Directory_Result.Result
(1 .. Remote_Directory_Result.Size));
begin
if Problem (Remote_Directory_Result.Condition, True) then
Log.Put_Line ("Can't get the remote directory name for view " &
Quot (View_Name), Profile.Error_Msg);
return "";
end if;
-- Extract the family name from the view's Remote_Directory name.
return Extract_Family_Name (Remote_Directory);
end;
end Remote_Family;
procedure Create_Remote_Directory (Remote_Directory : String;
Remote_Connection : Rci.Context;
Status : in out Ss.Condition;
Trace_Command : Boolean) is
Create_Dir_Command : constant String := "mkdir -p " & Remote_Directory;
begin
if Debugging or else Trace_Command then
Log.Put_Line (Message =>
"#~Create_Remote_Directory (Remote_Directory" &
Qt (Remote_Directory) & ")",
Kind => Profile.Sharp_Msg);
end if;
Log.Put_Line (Message =>
"Creating remote directory " & Quot (Remote_Directory),
Kind => Profile.Position_Msg);
Rci_Execute_Command (Command_Line => Create_Dir_Command,
Remote_Connection => Remote_Connection,
Status => Status,
Trace_Command => Trace_Command);
if Problem (Status, Trace_Command) then
Log.Put_Line ("Can't create the remote directory " &
Quot (Remote_Directory) & ". " & Ss.Message (Status),
Profile.Error_Msg);
end if;
exception
when others =>
Unhandled_Exception (Status, "Create_Remote_Directory");
end Create_Remote_Directory;
procedure Directory_Exists
(Remote_Directory : String;
Remote_Connection : Remote_Command_Interface.Context;
Status : in out Simple_Status.Condition;
Exists : out Boolean;
Trace_Command : Boolean) is
begin
if Debugging or else Trace_Command then
Log.Put_Line (Message => "#~Directory_Exists (Remote_Directory" &
Qt (Remote_Directory) & ")",
Kind => Profile.Sharp_Msg);
end if;
Exists := False;
Rci.File_Exists (The_File => Remote_Directory,
Remote_Connection => Remote_Connection,
Status => Status,
Exists => Exists,
Trace_Command => Debugging or else Trace_Command);
exception
when others =>
Unhandled_Exception (Status, "Directory_Exists");
end Directory_Exists;
package Build is
procedure Build_Libraries (View_Obj : Directory.Object;
Remote_Machine : String;
Remote_Directory : String;
Remote_Program_Library : String;
Status : in out Simple_Status.Condition;
Trace_Command : Boolean);
procedure Destroy_Library
(Host_View : Directory.Object;
Remote_Directory : String;
Remote_Connection : Remote_Command_Interface.Context;
Status : in out Simple_Status.Condition;
Trace_Command : Boolean);
end Build;
package Imports is
procedure Batch_Import_Units
(Host_File_Id : Io.File_Type;
Imported_Units : Compilation_Interface.Unit_List;
Into_View : Directory.Object;
Remote_Directory : String;
Status : in out Simple_Status.Condition;
Trace_Command : Boolean);
procedure Import_Units
(Imported_Units : Compilation_Interface.Unit_List;
Into_View : Directory.Object;
Remote_Directory : String;
Remote_Connection : Remote_Command_Interface.Context;
Status : in out Simple_Status.Condition;
Trace_Command : Boolean);
procedure Perform_Remote_Import
(Host_View : String;
Views_To_Import : Directory.Naming.Iterator;
Remote_Machine : String;
Status : in out Simple_Status.Condition;
Trace_Command : Boolean);
procedure Remove_Remote_Import
(View_To_Remove : Directory.Object;
From_View : String;
Remote_Machine : String;
Remote_Directory : String;
Remote_Connection : Remote_Command_Interface.Context;
Destroying_Library : Boolean;
Status : in out Simple_Status.Condition;
Trace_Command : Boolean);
end Imports;
package body Build is separate;
package body Imports is separate;
------------------------------------------------------------
function Is_True (For_Switch : String;
Enclosing_View_Name : String) return Boolean is
Switch_Handle : Pio.Handle;
Pio_Status : Pio.Error_Status;
Value : Boolean := False;
begin
Pio.Open (The_Handle => Switch_Handle,
Mode => Pio.Read_Only,
File_Name => Enclosing_View_Name & ".State.Compiler_Switches",
Status => Pio_Status);
if Pio_Status /= Directory.Successful then
Log.Put_Line (Message =>
"Can't open switch file " & Enclosing_View_Name &
".STATE.COMPILER_SWITCHES. Error Status = " &
Directory.Error_Status'Image (Pio_Status),
Kind => Profile.Negative_Msg);
return False;
end if;
Value := Si.Value (Switches => Switch_Handle,
Name => "Rci." & Target_Key & "_" & For_Switch);
Pio.Close (File => Switch_Handle,
Status => Pio_Status);
if Pio_Status /= Directory.Successful then
Log.Put_Line (Message =>
"Can't close switch file " & Enclosing_View_Name &
".STATE.COMPILER_SWITCHES. Error Status = " &
Directory.Error_Status'Image (Pio_Status),
Kind => Profile.Negative_Msg);
return False;
end if;
return Value;
end Is_True;
procedure Rename_Remote_File (Remote_Directory : String;
Remote_Machine : String;
From_Simple_Name : String;
To_Simple_Name : String;
Remote_Connection : Rci.Context;
Status : in out Ss.Condition;
Trace_Command : Boolean) is
Copy_Command : constant String :=
"cp " & Remote_Directory & "/" & From_Simple_Name &
" " & Remote_Directory & "/" & To_Simple_Name;
Remove_Temp_File_Command : constant String :=
"rm " & Remote_Directory & "/" & From_Simple_Name;
begin
if Debugging or else Trace_Command then
Log.Put_Line (Message =>
"#~Rename_Remote_File (Remote_Directory" &
Qt (Remote_Directory) & ", Remote_Machine" &
Qt (Remote_Machine) & ", From_Simple_Name" &
Qt (From_Simple_Name) & ", To_Simple_Name" &
Qt (To_Simple_Name) & ")",
Kind => Profile.Sharp_Msg);
end if;
-- Copy the file to its new name.
Rci_Execute_Command (Command_Line => Copy_Command,
Remote_Connection => Remote_Connection,
Status => Status,
Trace_Command => Trace_Command);
if Problem (Status, Trace_Command) then
Log.Put_Line ("Can't copy file " & Quot (From_Simple_Name) &
" to " & Quot (To_Simple_Name) &
". " & Ss.Message (Status), Profile.Error_Msg);
else
-- Now that we have the copy, we can destroy the original file.
Rci_Execute_Command (Command_Line => Remove_Temp_File_Command,
Remote_Connection => Remote_Connection,
Status => Status,
Trace_Command => Trace_Command);
if Problem (Status, Trace_Command) then
Log.Put_Line ("Can't remove the renamed file " &
From_Simple_Name & ". " & Ss.Message (Status),
Profile.Error_Msg);
end if;
end if;
exception
when others =>
Unhandled_Exception (Status, "Rename_Remote_File");
end Rename_Remote_File;
procedure Build_Libraries (View_Obj : Directory.Object;
Remote_Machine : String;
Remote_Directory : String;
Remote_Program_Library : String;
Status : in out Simple_Status.Condition;
Trace_Command : Boolean) is
begin
Build.Build_Libraries (View_Obj => View_Obj,
Remote_Machine => Remote_Machine,
Remote_Directory => Remote_Directory,
Remote_Program_Library => Remote_Program_Library,
Status => Status,
Trace_Command => Trace_Command);
end Build_Libraries;
procedure Destroy_Library
(Host_View : Directory.Object;
Remote_Directory : String;
Remote_Connection : Remote_Command_Interface.Context;
Status : in out Simple_Status.Condition;
Trace_Command : Boolean) is
begin
Build.Destroy_Library (Host_View => Host_View,
Remote_Directory => Remote_Directory,
Remote_Connection => Remote_Connection,
Status => Status,
Trace_Command => Trace_Command);
end Destroy_Library;
procedure Batch_Import_Units
(Host_File_Id : Io.File_Type;
Imported_Units : Compilation_Interface.Unit_List;
Into_View : Directory.Object;
Remote_Directory : String;
Status : in out Simple_Status.Condition;
Trace_Command : Boolean) is
begin
Imports.Batch_Import_Units (Host_File_Id => Host_File_Id,
Imported_Units => Imported_Units,
Into_View => Into_View,
Remote_Directory => Remote_Directory,
Status => Status,
Trace_Command => Trace_Command);
end Batch_Import_Units;
procedure Import_Units
(Imported_Units : Compilation_Interface.Unit_List;
Into_View : Directory.Object;
Remote_Directory : String;
Remote_Connection : Remote_Command_Interface.Context;
Status : in out Simple_Status.Condition;
Trace_Command : Boolean) is
begin
Imports.Import_Units (Imported_Units => Imported_Units,
Into_View => Into_View,
Remote_Directory => Remote_Directory,
Remote_Connection => Remote_Connection,
Status => Status,
Trace_Command => Trace_Command);
end Import_Units;
procedure Perform_Remote_Import
(Host_View : String;
Views_To_Import : Directory.Naming.Iterator;
Remote_Machine : String;
Status : in out Simple_Status.Condition;
Trace_Command : Boolean) is
begin
Imports.Perform_Remote_Import (Host_View => Host_View,
Views_To_Import => Views_To_Import,
Remote_Machine => Remote_Machine,
Status => Status,
Trace_Command => Trace_Command);
end Perform_Remote_Import;
procedure Remove_Remote_Import
(View_To_Remove : Directory.Object;
From_View : String;
Remote_Machine : String;
Remote_Directory : String;
Remote_Connection : Remote_Command_Interface.Context;
Destroying_Library : Boolean;
Status : in out Simple_Status.Condition;
Trace_Command : Boolean) is
begin
Imports.Remove_Remote_Import (View_To_Remove => View_To_Remove,
From_View => From_View,
Remote_Machine => Remote_Machine,
Remote_Directory => Remote_Directory,
Remote_Connection => Remote_Connection,
Destroying_Library => Destroying_Library,
Status => Status,
Trace_Command => Trace_Command);
end Remove_Remote_Import;
procedure Retrieve_Files (Main_Unit : String;
Executable_Name : String;
Enclosing_View_Name : String;
Remote_Machine : String;
Remote_Directory : String;
Status : in out Simple_Status.Condition;
Trace_Command : Boolean) is
Main : Dt.Object.Handle := Dt.Naming.Resolution (Main_Unit);
Main_Full_Name : constant String := Dt.Naming.Full_Name (Main);
Main_Simple_Name : constant String :=
Su.Lower_Case (Dt.Naming.Simple_Name (Main));
Host_Cui_Name : constant String := Main_Full_Name & "'Body" & ".<Cui>";
Host_Exe_Name : constant String := Main_Full_Name & "'Body" & ".<Exe>";
Host_Lnk_Name : constant String := Main_Full_Name & "'Body" & ".<Lnk>";
Host_Map_Name : constant String := Main_Full_Name & "'Body" & ".<Map>";
Linker_Generated_Exe : String (1 .. 14) := (others => ' ');
Remote_Connection : Rci.Context;
Name_Length : Natural;
Final_Name_Length : Natural;
procedure Upload_File (Switch : String;
Extension : String;
To_Host_File : String;
The_Type : Rci.File_Type;
Status : in out Ss.Condition) is
Remote_File : constant String :=
Linker_Generated_Exe (1 .. Name_Length) & Extension;
begin
if Debugging or else Trace_Command then
Log.Put_Line (Message =>
"#~Upload_File (Switch" &
Qt (Switch) & ", Extension" &
Qt (Extension) & ", To_Host_File" &
Qt (To_Host_File) & ", The_Type => " &
Rci.File_Type'Image (The_Type) & ")",
Kind => Profile.Sharp_Msg);
end if;
if Is_True (Switch, Enclosing_View_Name) then
Log.Put_Line (Message =>
"Uploading file " &
Quot (Remote_Directory & "/" & Remote_File),
Kind => Profile.Positive_Msg);
Rci.Get (Host_File_Name => To_Host_File,
Target_File_Name =>
Remote_Directory & "/" & Remote_File,
Remote_Connection => Remote_Connection,
Status => Status,
The_Type => The_Type,
Trace_Command => Debugging or else Trace_Command);
if Problem (Status, Trace_Command) then
Set_Status (Message => "Can't upload remote file " &
Quot (Remote_Directory &
"/" & Remote_File) &
" to " & To_Host_File,
Status => Status);
return;
end if;
end if;
if Final_Name_Length > 10 and Executable_Name = "" then
Rename_Remote_File
(Remote_Directory => Remote_Directory,
Remote_Machine => Remote_Machine,
From_Simple_Name => Remote_File,
To_Simple_Name => Main_Simple_Name & Extension,
Remote_Connection => Remote_Connection,
Status => Status,
Trace_Command => Trace_Command);
if Problem (Status, Trace_Command) then
Set_Status (Message =>
"Can't rename remote file " &
Quot (Remote_File) & " as " &
Quot (Main_Simple_Name & Extension),
Status => Status);
return;
end if;
end if;
end Upload_File;
begin
if Debugging or else Trace_Command then
Log.Put_Line
(Message => "#~Retrieve_Files (Main_Unit" &
Qt (Main_Unit) & ", Executable_Name" &
Qt (Executable_Name) & ", Enclosing_View_Name" &
Qt (Enclosing_View_Name) & ", Remote_Machine" &
Qt (Remote_Machine) & ", Remote_Directory" &
Qt (Remote_Directory) & ")",
Kind => Profile.Sharp_Msg);
end if;
Log.Put_Line
(Message => "Entering Retrieve_Files",
Kind => Profile.Position_Msg);
--
-- If the user specified executable name is > 14 chars, then the link
-- operation on the target will fail. If the Ada simple name of the
-- main unit is greater than 10 characters, then the Alsys compiler
-- will truncate that name to 10 characters.
--
if Executable_Name /= "" then
-- Use the given Executable_Name.
Name_Length := Executable_Name'Length;
Final_Name_Length := Name_Length;
if Name_Length > 14 then
Log.Put_Line (Message => "Maximum length of executable name " &
Quot (Executable_Name) &
" is 14 characters",
Kind => Profile.Negative_Msg);
Set_Status (Status => Status,
Message => "Executable name " &
Quot (Executable_Name) &
" is too long");
return;
end if;
-- This will fail if Name_Length > 14.
Linker_Generated_Exe (1 .. Name_Length) :=
Executable_Name (1 .. Name_Length);
else
Final_Name_Length := Main_Simple_Name'Length;
if Main_Simple_Name'Length > 10 then
-- Truncate the name to 10 characters.
Name_Length := 10;
else
-- We can use the name as it is.
Name_Length := Main_Simple_Name'Length;
end if;
Linker_Generated_Exe (1 .. Name_Length) :=
Su.Lower_Case (Main_Simple_Name (1 .. Name_Length));
end if;
Rci.Acquire (Remote_Connection => Remote_Connection,
Status => Status,
Target_Key => Target_Key,
Remote_Machine => Remote_Machine,
Trace_Command => Debugging or else Trace_Command);
if Problem (Status, Trace_Command) then
Set_Status
("Can't acquire a connection to " & Remote_Machine, Status);
return;
end if;
-- Retrieve the Cui File
--
Upload_File (Switch => "Get_Cui_File",
Extension => ".cui",
To_Host_File => Host_Cui_Name,
The_Type => Rci.Binary,
Status => Status);
if Problem (Status, Trace_Command) then
Set_Status (Status => Status,
Message => "Can't retrieve the Cui File");
else
-- Retrieve the Map File
--
Upload_File (Switch => "Get_Binder_Listing",
Extension => ".map",
To_Host_File => Host_Map_Name,
The_Type => Rci.Text,
Status => Status);
if Problem (Status, Trace_Command) then
Set_Status
(Status => Status,
Message => "Can't retrieve the Binder listing file");
else
-- Retrieve the Lnk File
--
Upload_File (Switch => "Get_Lnk_File",
Extension => ".lnk",
To_Host_File => Host_Lnk_Name,
The_Type => Rci.Text,
Status => Status);
if Problem (Status, Trace_Command) then
Set_Status (Status => Status,
Message => "Can't retrieve the LNK file");
else
-- Retrieve the Executable File
--
Upload_File (Switch => "Get_Executable_File",
Extension => "",
To_Host_File => Host_Exe_Name,
The_Type => Rci.Binary,
Status => Status);
if Problem (Status, Trace_Command) then
Set_Status
(Status => Status,
Message => "Can't retrieve the Executable file");
end if;
end if;
end if;
end if;
exception
when others =>
Unhandled_Exception (Status, "Retrieve_Files");
end Retrieve_Files;
procedure Set_Status (Message : String;
Status : in out Simple_Status.Condition;
Severity : Simple_Status.Condition_Class :=
Simple_Status.Problem;
Error_Type : String := "Library_Extensions Error") is
begin
Ss.Create_Condition (Status => Status,
Error_Type => Error_Type,
Message => Message,
Severity => Severity);
end Set_Status;
procedure Unhandled_Exception (Status : in out Simple_Status.Condition;
Routine : String) is
begin
Set_Status (Message => "Exception " & Debug_Tools.Get_Exception_Name &
" was caught in " & Routine,
Status => Status,
Error_Type => "Unhandled exception ");
end Unhandled_Exception;
procedure Close_Download_File (The_Handle : in out Dtable.Handle) is
begin
Dtable.Close (The_Handle);
exception
when others =>
null;
end Close_Download_File;
function Get_Download_Time
(Unit_Obj : Directory.Object) return Calendar.Time is
The_Time : Calendar.Time;
The_Handle : Dtable.Handle;
Element_To_Match : Download_Times.Table_Entry;
Element_From_File : Download_Times.Table_Entry;
Element_File_Position : Dtable.File_Position;
Next_Position : Dtable.File_Position;
begin
Dtable.Open (The_Handle, Download_Times.Download_Times_File_Name
(Du.Get_View (Unit_Obj, Profile.Get)),
Dtable.Read);
-- Open the Download_Times table in the view to which this object
-- belongs.
Element_To_Match.Obj := Unit_Obj;
Element_To_Match.Time := Calendar.Clock;
Dtable.Lookup (The_Handle, Element_To_Match, Element_From_File,
Element_File_Position, Next_Position);
-- Look in the table for the specified directory object.
if Dtable.Is_Nil (The_Position => Element_File_Position) then
-- No download time has been entered for our unit, so assume the
-- current time.
The_Time := Calendar.Clock;
else
-- Use the download time from our unit's table entry.
The_Time := Element_From_File.Time;
end if;
Close_Download_File (The_Handle);
return The_Time;
exception
when others =>
Close_Download_File (The_Handle);
Log.Put_Line ("An exception was raised while getting the " &
"download time for a unit", Profile.Warning_Msg);
return Calendar.Clock;
end Get_Download_Time;
procedure Set_Download_Time (Unit_Obj : Directory.Object;
Time : Calendar.Time) is
The_Handle : Dtable.Handle;
Element_To_Match : Download_Times.Table_Entry;
Eleent_From_File : Download_Times.Table_Entry;
Element_File_Position : Dtable.File_Position;
Next_Position : Dtable.File_Position;
begin
Dtable.Open (The_Handle, Download_Times.Download_Times_File_Name
(Du.Get_View (Unit_Obj, Profile.Get)),
Dtable.Read_Write);
-- Open the Download_Times table in the view to which this object
-- belongs. If the table doesn't exist, it will be created (and it
-- will be empty).
Element_To_Match.Obj := Unit_Obj;
Element_To_Match.Time := Time;
Dtable.Lookup (The_Handle, Element_To_Match, Element_From_File,
Element_File_Position, Next_Position);
-- Look in the table for the specified directory object.
if Dtable.Is_Nil (The_Position => Element_File_Position) then
-- It isn't there, so add it.
Dtable.Update (The_Handle, Element_To_Match, Next_Position);
else
-- We found it, so update its table entry.
Dtable.Update (The_Handle, Element_To_Match, Element_File_Position);
end if;
Close_Download_File (The_Handle);
exception
when others =>
Close_Download_File (The_Handle);
Log.Put_Line ("An exception was raised while setting the " &
"download time for a unit", Profile.Warning_Msg);
end Set_Download_Time;
function Discard_Units_From_Same_View
(Units : Compilation_Interface.Unit_List;
Host_Unit : Directory.Object)
return Compilation_Interface.Unit_List is
View_Obj : Directory.Object;
Filtered_Units : Ci.Unit_List (Units.Data'Length);
Next_Entry : Integer := Filtered_Units.Data'First - 1;
Null_Units : Ci.Unit_List (0);
begin
if Units.Size = 0 then
return Null_Units;
end if;
View_Obj := Du.Get_View (Host_Unit, Profile.Get);
Filtered_Units.Condition := Units.Condition;
for Index in Units.Data'First .. Units.Data'Last loop
if Directory."/=" (View_Obj, Du.Get_View (Units.Data (Index),
Profile.Get)) then
Next_Entry := Next_Entry + 1;
Filtered_Units.Data (Next_Entry) := Units.Data (Index);
end if;
end loop;
-- Collect into an array all units not belonging to the same view as
-- the host unit.
if Next_Entry >= Filtered_Units.Data'First then
-- The filtered list is non empty.
declare
Return_Units : Ci.Unit_List (Next_Entry -
Filtered_Units.Data'First + 1);
begin
Return_Units.Condition := Filtered_Units.Condition;
Return_Units.Data :=
Filtered_Units.Data
(Filtered_Units.Data'First .. Next_Entry);
-- Copy back to an array of the proper size and return.
return Return_Units;
end;
end if;
return Null_Units;
end Discard_Units_From_Same_View;
procedure Check_Family (View_Obj : Directory.Object;
Remote_Machine : String;
Remote_Directory : String;
Status : in out Simple_Status.Condition) is
Family_Name : constant String :=
Get_Family_Name (Host_View => View_Obj,
Remote_Directory => Remote_Directory);
begin
if Family_Name'Length = 0 then
if Directory.Is_Nil (View_Obj) then
Set_Status (Message => "Can't extract a family name from " &
"the specified remote directory " &
Quot (Remote_Directory),
Status => Status,
Severity => Ss.Problem);
else
Set_Status (Message =>
"Can't get a valid family name for view " &
Naming.Get_Full_Name (View_Obj),
Status => Status,
Severity => Ss.Fatal);
end if;
end if;
end Check_Family;
end Extensions_Support;
nblk1=36
nid=0
hdr6=6c
[0x00] rec0=21 rec1=00 rec2=01 rec3=074
[0x01] rec0=01 rec1=00 rec2=36 rec3=03e
[0x02] rec0=1e rec1=00 rec2=02 rec3=02a
[0x03] rec0=00 rec1=00 rec2=35 rec3=010
[0x04] rec0=1f rec1=00 rec2=03 rec3=054
[0x05] rec0=1a rec1=00 rec2=04 rec3=08e
[0x06] rec0=18 rec1=00 rec2=05 rec3=074
[0x07] rec0=17 rec1=00 rec2=06 rec3=026
[0x08] rec0=1c rec1=00 rec2=07 rec3=032
[0x09] rec0=17 rec1=00 rec2=08 rec3=07c
[0x0a] rec0=18 rec1=00 rec2=09 rec3=02c
[0x0b] rec0=00 rec1=00 rec2=34 rec3=022
[0x0c] rec0=16 rec1=00 rec2=0a rec3=03c
[0x0d] rec0=17 rec1=00 rec2=0b rec3=06a
[0x0e] rec0=1b rec1=00 rec2=0c rec3=02e
[0x0f] rec0=16 rec1=00 rec2=0d rec3=050
[0x10] rec0=13 rec1=00 rec2=0e rec3=03c
[0x11] rec0=1a rec1=00 rec2=0f rec3=092
[0x12] rec0=01 rec1=00 rec2=33 rec3=004
[0x13] rec0=19 rec1=00 rec2=10 rec3=03a
[0x14] rec0=13 rec1=00 rec2=11 rec3=064
[0x15] rec0=14 rec1=00 rec2=12 rec3=01e
[0x16] rec0=16 rec1=00 rec2=13 rec3=074
[0x17] rec0=15 rec1=00 rec2=14 rec3=010
[0x18] rec0=12 rec1=00 rec2=15 rec3=07e
[0x19] rec0=16 rec1=00 rec2=16 rec3=024
[0x1a] rec0=14 rec1=00 rec2=17 rec3=004
[0x1b] rec0=11 rec1=00 rec2=18 rec3=032
[0x1c] rec0=11 rec1=00 rec2=19 rec3=086
[0x1d] rec0=02 rec1=00 rec2=32 rec3=016
[0x1e] rec0=14 rec1=00 rec2=1a rec3=072
[0x1f] rec0=00 rec1=00 rec2=31 rec3=00c
[0x20] rec0=14 rec1=00 rec2=1b rec3=03a
[0x21] rec0=15 rec1=00 rec2=1c rec3=06e
[0x22] rec0=18 rec1=00 rec2=1d rec3=028
[0x23] rec0=14 rec1=00 rec2=1e rec3=046
[0x24] rec0=00 rec1=00 rec2=30 rec3=00c
[0x25] rec0=1c rec1=00 rec2=1f rec3=01a
[0x26] rec0=1b rec1=00 rec2=20 rec3=038
[0x27] rec0=19 rec1=00 rec2=21 rec3=004
[0x28] rec0=18 rec1=00 rec2=22 rec3=050
[0x29] rec0=1b rec1=00 rec2=23 rec3=038
[0x2a] rec0=1a rec1=00 rec2=24 rec3=068
[0x2b] rec0=00 rec1=00 rec2=2f rec3=018
[0x2c] rec0=1e rec1=00 rec2=25 rec3=016
[0x2d] rec0=00 rec1=00 rec2=2e rec3=002
[0x2e] rec0=16 rec1=00 rec2=26 rec3=05a
[0x2f] rec0=00 rec1=00 rec2=2d rec3=012
[0x30] rec0=1d rec1=00 rec2=27 rec3=00a
[0x31] rec0=00 rec1=00 rec2=2c rec3=010
[0x32] rec0=17 rec1=00 rec2=28 rec3=048
[0x33] rec0=01 rec1=00 rec2=2b rec3=008
[0x34] rec0=19 rec1=00 rec2=29 rec3=042
[0x35] rec0=10 rec1=00 rec2=2a rec3=000
tail 0x2151cafa0838d6b0fa013 0x42a00088462065003