|
|
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: 8192 (0x2000)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Block_Class, seg_037f39, seg_038abe
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦5a81ac88f⟧ »Space Info Vol 1«
└─⟦this⟧
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦cfc2e13cd⟧ »Space Info Vol 2«
└─⟦this⟧
with Arguments;
with Block;
with Boolean_Class;
with Message;
with Msg_Report;
with Object;
with String_Utilities;
package body Block_Class is
Max : constant := 100;
Instance_Table : array (1 .. Max) of Struct_Table;
function Is_Equal_String
(Str1 : String; Str2 : String; Ignore_Case : Boolean := True)
return Boolean renames String_Utilities.Equal;
function First_Free return Natural is
Pos : Natural := 0;
begin
for I in Instance_Table'Range loop
if Instance_Table (I).Indic = Unused then
Pos := I;
exit;
end if;
end loop;
if Pos /= 0 then
return Pos;
else
Msg_Report.Interpret_Error ("sorry, block instance table is full");
raise Instance_Table_Full;
end if;
end First_Free;
function Create (Value : Block.Node) return Object.Reference is
Pos : Natural;
The_Class : Object.Class := Object.C_Block;
begin
Pos := First_Free;
Instance_Table (Pos).Indic := Used;
Instance_Table (Pos).Value := Value;
return Object.Create (The_Class, Pos);
end Create;
function Send (To_Object : Object.Reference;
The_Message : Message.Selector;
With_Arguments : Arguments.List := Arguments.Void_Arguments)
return Object.Reference is
Result : Object.Reference;
N : Block.Node;
Msg : Message.Selector;
Evaluate_Msg_While_True : constant String := "Tantquevrai";
Evaluate_Msg_While_False : constant String := "Tantquefaux";
use Object;
begin
N := Instance_Table (Object.Identificator (To_Object)).Value;
if Message.Is_Keyword (The_Message) then
if Is_Equal_String (Message.Format (The_Message),
Evaluate_Msg_While_True) then
loop
Message.Copy (Msg, Evaluate_Msg);
Result := Send (To_Object, Msg);
if Object.The_Class (Result) = C_Boolean then
Message.Copy (Msg, Boolean_Class.Evaluate_Msg_Is_True);
Result := Boolean_Class.Send
(Result, Msg, With_Arguments);
if Object.The_Class (Result) = C_Void then
exit;
end if;
else
Msg_Report.Interpret_Error
("Incorrect return block object, must be a boolean not " &
Object.Class'Image (Object.The_Class (Result)));
raise Incorrect_Return_Object;
end if;
end loop;
elsif Is_Equal_String (Message.Format (The_Message),
Evaluate_Msg_While_False) then
loop
Message.Copy (Msg, Evaluate_Msg);
Result := Send (To_Object, Msg);
if Object.The_Class (Result) = C_Boolean then
Message.Copy (Msg, Boolean_Class.Evaluate_Msg_Is_False);
Result := Boolean_Class.Send
(Result, Msg, With_Arguments);
if Object.The_Class (Result) = C_Void then
exit;
end if;
else
Msg_Report.Interpret_Error
("Incorrect return block object, must be a boolean not " &
Object.Class'Image (Object.The_Class (Result)));
raise Incorrect_Return_Object;
end if;
end loop;
else
Result := Block.Interpret
(N, To_Object, The_Message, With_Arguments);
end if;
else
if Is_Equal_String (Message.Image (The_Message), Evaluate_Msg) then
Result := Block.Interpret (N, To_Object, The_Message);
else
Msg_Report.Interpret_Error ("Incorrect block method " &
Message.Image (The_Message));
raise Incorrect_Method;
end if;
end if;
return Result;
end Send;
end Block_Class;
nblk1=7
nid=6
hdr6=c
[0x00] rec0=2b rec1=00 rec2=01 rec3=056
[0x01] rec0=1f rec1=00 rec2=07 rec3=05a
[0x02] rec0=00 rec1=00 rec2=05 rec3=020
[0x03] rec0=16 rec1=00 rec2=02 rec3=038
[0x04] rec0=14 rec1=00 rec2=03 rec3=022
[0x05] rec0=18 rec1=00 rec2=04 rec3=000
[0x06] rec0=0a rec1=00 rec2=05 rec3=001
tail 0x215314b3484e66614f630 0x42a00088462060003
Free Block Chain:
0x6: 0000 00 00 01 7d 80 11 20 20 20 20 20 20 20 20 20 20 ┆ } ┆