|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: B T
Length: 5954 (0x1742)
Types: TextFile
Names: »B«
└─⟦bad92a95e⟧ Bits:30000535 8mm tape, Rational 1000, RPC 1_0_2
└─⟦bb34fe6e2⟧ »DATA«
└─⟦15d8b76c6⟧
└─⟦this⟧
with Io_Exceptions;
with Transport_Interchange;
package body Rpc is
package Rkind is new Transport_Interchange.Discrete (Reject_Kind);
package Mkind is new Transport_Interchange.Discrete (Message_Kind);
package Error is new Transport_Interchange.Discrete (Error_Type);
use Transport_Interchange;
procedure Put (Into : Stream_Id; Data : Version_Range) is
begin
Put (Into, Interchange.Short_Integer (Data.First));
Put (Into, Interchange.Short_Integer (Data.Last));
end Put;
procedure Get (From : Stream_Id; Data : out Version_Range) is
begin
Get (From, Interchange.Short_Integer (Data.First));
Get (From, Interchange.Short_Integer (Data.Last));
end Get;
procedure Put_Reject (Into : Stream_Id; Data : Reject_Details) is
begin
Rkind.Put (Into, Data.Kind);
case Data.Kind is
when Rej_No_Such_Version =>
Put (Into, Data.Supported);
when others =>
null;
end case;
end Put_Reject;
function Get_Reject (From : Stream_Id) return Reject_Details is
Kind : Reject_Kind;
begin
Rkind.Get (From, Kind);
declare
Data : Reject_Details (Kind => Kind);
begin
case Data.Kind is
when Rej_No_Such_Program =>
raise No_Such_Program;
when Rej_No_Such_Version =>
Get (From, Data.Supported);
raise No_Such_Version;
when Rej_No_Such_Procedure =>
raise No_Such_Procedure;
when Rej_Invalid_Argument =>
raise Invalid_Argument;
end case;
return Data;
end;
end Get_Reject;
procedure Put_Message (Into : Stream_Id; Data : Message_Header) is
begin
Mkind.Put (Into, Data.Kind);
Put (Into, Interchange.Short_Integer (Data.Id));
case Data.Kind is
when Call_Message =>
Put (Into, Interchange.Integer (Data.Program));
Put (Into, Interchange.Short_Integer (Data.Version));
Put (Into, Interchange.Short_Integer (Data.Proc));
when Reject_Message =>
Put_Reject (Into, Data.Details);
when Return_Message =>
null;
when Abort_Message =>
Error.Put (Into, Data.Error);
end case;
end Put_Message;
function Get_Message (From : Stream_Id) return Message_Header is
Kind : Message_Kind;
begin
Mkind.Get (From, Kind);
declare
Data : Message_Header (Kind => Kind);
begin
Get (From, Interchange.Short_Integer (Data.Id));
case Kind is
when Call_Message =>
Get (From, Interchange.Integer (Data.Program));
Get (From, Interchange.Short_Integer (Data.Version));
Get (From, Interchange.Short_Integer (Data.Proc));
when Reject_Message =>
Data.Details := Get_Reject (From);
when Return_Message =>
null;
when Abort_Message =>
Error.Get (From, Data.Error);
case Data.Error is
when Error_Other =>
raise Other_Error;
when Error_Constraint =>
raise Standard.Constraint_Error;
when Error_Numeric =>
raise Standard.Numeric_Error;
when Error_Program =>
raise Standard.Program_Error;
when Error_Storage =>
raise Standard.Storage_Error;
when Error_Tasking =>
raise Standard.Tasking_Error;
when Status_Error =>
raise Io_Exceptions.Status_Error;
when Mode_Error =>
raise Io_Exceptions.Mode_Error;
when Name_Error =>
raise Io_Exceptions.Name_Error;
when Use_Error =>
raise Io_Exceptions.Use_Error;
when Device_Error =>
raise Io_Exceptions.Device_Error;
when End_Error =>
raise Io_Exceptions.End_Error;
when Data_Error =>
raise Io_Exceptions.Data_Error;
when Layout_Error =>
raise Io_Exceptions.Layout_Error;
when Error_Server_Defined =>
raise Server_Defined_Error;
when others =>
raise Protocol_Error;
end case;
end case;
return Data;
end;
end Get_Message;
procedure Put (Into : Stream_Id; Data : Exception_Number) is
begin
Transport_Interchange.Put (Into, Interchange.Integer (Data));
end Put;
procedure Get (From : Stream_Id; Data : out Exception_Number) is
begin
Transport_Interchange.Get (From, Interchange.Integer (Data));
end Get;
function Non_Null (X : Version_Range) return Boolean is
begin
return X.First <= X.Last;
end Non_Null;
function Overlaps (X, Y : Version_Range) return Boolean is
begin
return Non_Null (X) and then Non_Null (Y) and then
(X.First <= Y.Last or else X.Last >= Y.First);
end Overlaps;
function Max (X, Y : Version_Range) return Version_Number is
begin
if X.Last > Y.Last then
return Y.Last;
else
return X.Last;
end if;
end Max;
end Rpc;