|
|
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: 4485 (0x1185)
Types: TextFile
Names: »B«
└─⟦a7d1ea751⟧ Bits:30000550 8mm tape, Rational 1000, !users!projects 94_04_11
└─⟦129cab021⟧ »DATA«
└─⟦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;