|
|
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: 20048 (0x4e50)
Types: TextFile
Names: »B«
└─⟦a7d1ea751⟧ Bits:30000550 8mm tape, Rational 1000, !users!projects 94_04_11
└─⟦129cab021⟧ »DATA«
└─⟦this⟧
with Boolean_Class;
with Bounded_String;
with Easy_X;
with Elementary_Functions;
with Errors;
with Integer_Class;
with String_Class;
package body Turtle_Class is
type Unary_Message is (Nul, En_Texte, Ton_X, Ton_Y, Ton_Angle, Ta_Plume,
Ta_Taille, Leve_Ta_Plume, Baisse_Ta_Plume,
Rentre_Chez_Toi, Va_Au_Centre, Duplique_Toi);
type Keyword_Message is (Nul, Ton_X, Ton_Y, Ton_Angle, Va_En_X_Y, Ta_Taille,
Avance, Recule, A_Droite, A_Gauche, Ton_X_Ton_Y);
Pi : constant Float := 3.1416;
subtype Radian is Float range 0.0 .. 2.0 * Pi;
Iterator : Natural := 0;
function Convert_To_Unary
(The_Message : Scanner.Lexeme) return Unary_Message is
begin
if Bounded_String.Image (The_Message) = "TON_X" then
return Ton_X;
elsif Bounded_String.Image (The_Message) = "TON_Y" then
return Ton_Y;
elsif Bounded_String.Image (The_Message) = "EN_TEXTE" then
return En_Texte;
elsif Bounded_String.Image (The_Message) = "TON_ANGLE" then
return Ton_Angle;
elsif Bounded_String.Image (The_Message) = "TA_PLUME" then
return Ta_Plume;
elsif Bounded_String.Image (The_Message) = "TA_TAILLE" then
return Ta_Taille;
elsif Bounded_String.Image (The_Message) = "BAISSE_TA_PLUME" then
return Baisse_Ta_Plume;
elsif Bounded_String.Image (The_Message) = "LEVE_TA_PLUME" then
return Leve_Ta_Plume;
elsif Bounded_String.Image (The_Message) = "RENTRE_CHEZ_TOI" then
return Rentre_Chez_Toi;
elsif Bounded_String.Image (The_Message) = "VA_AU_CENTRE" then
return Va_Au_Centre;
elsif Bounded_String.Image (The_Message) = "DUPLIQUE_TOI" then
return Duplique_Toi;
else
return Nul;
end if;
end Convert_To_Unary;
procedure Convert_To_List (The_Message : in out Message.Selector;
Back : out Keyword_Message) is
begin
Back := Nul;
case Message.Arg_Number (The_Message) is
when 1 =>
Message.Init (The_Message);
if Bounded_String.Image (Message.Value (The_Message)) =
"TON_X:" then
Back := Ton_X;
elsif Bounded_String.Image (Message.Value (The_Message)) =
"TON_Y:" then
Back := Ton_Y;
elsif Bounded_String.Image (Message.Value (The_Message)) =
"TON_ANGLE:" then
Back := Ton_Angle;
elsif Bounded_String.Image (Message.Value (The_Message)) =
"TA_TAILLE:" then
Back := Ta_Taille;
elsif Bounded_String.Image (Message.Value (The_Message)) =
"A_DROITE:" then
Back := A_Droite;
elsif Bounded_String.Image (Message.Value (The_Message)) =
"A_GAUCHE:" then
Back := A_Gauche;
elsif Bounded_String.Image (Message.Value (The_Message)) =
"AVANCE:" then
Back := Avance;
elsif Bounded_String.Image (Message.Value (The_Message)) =
"RECULE:" then
Back := Recule;
end if;
when 2 =>
Message.Init (The_Message);
if Bounded_String.Image (Message.Value (The_Message)) =
"VA_EN_X:" then
Message.Next (The_Message);
if Bounded_String.Image (Message.Value (The_Message)) =
"Y:" then
Back := Va_En_X_Y;
end if;
elsif Bounded_String.Image (Message.Value (The_Message)) =
"TON_X:" then
Message.Next (The_Message);
if Bounded_String.Image (Message.Value (The_Message)) =
"TON_Y:" then
Back := Ton_X_Ton_Y;
end if;
end if;
when others =>
null;
end case;
end Convert_To_List;
function Radians (This_Angle : Degre) return Radian is
begin
return Float (This_Angle) * Pi / 180.0;
end Radians;
function Create return Object.Reference is
begin
Iterator := Iterator + 1;
if Iterator <= Custom.Turtle_Max_Number then
return Object.Create (Object.Tortue, Iterator);
else
raise Errors.Max_Turtle_Number_Exceeded;
end if;
end Create;
function Send (To_Object : Object.Reference; The_Message : Scanner.Lexeme)
return Object.Reference is
Current_Message : Unary_Message := Nul;
Index : Integer := Object.Get_Id (To_Object);
Current_Entexte : Scanner.Lexeme;
New_Turtle : Object.Reference;
begin
Current_Message := Convert_To_Unary (The_Message);
case Current_Message is
when Nul =>
raise Errors.Unknown_Message_For_Turtle;
when Ton_X =>
return Integer_Class.Create (Turtle_Table
(Object.Get_Id (To_Object)).X);
when Ton_Y =>
return Integer_Class.Create (Turtle_Table
(Object.Get_Id (To_Object)).Y);
when Ton_Angle =>
return Integer_Class.Create
(Turtle_Table (Object.Get_Id (To_Object)).Angle);
when Ta_Plume =>
return Boolean_Class.Create
(Turtle_Table (Object.Get_Id (To_Object)).Marker);
when Ta_Taille =>
return Integer_Class.Create
(Turtle_Table (Object.Get_Id (To_Object)).Size);
when Leve_Ta_Plume =>
Turtle_Table (Object.Get_Id (To_Object)).Marker := False;
return Object.Void_Reference;
when Baisse_Ta_Plume =>
Turtle_Table (Object.Get_Id (To_Object)).Marker := True;
return Object.Void_Reference;
when Rentre_Chez_Toi =>
Turtle_Table (Object.Get_Id (To_Object)).X := 0;
Turtle_Table (Object.Get_Id (To_Object)).Y := 0;
Turtle_Table (Object.Get_Id (To_Object)).Angle := 0;
Easy_X.Move_To (Easy_X.Coordinate (Turtle_Table (Index).X),
Easy_X.Coordinate (Turtle_Table (Index).Y));
return Object.Void_Reference;
when Va_Au_Centre =>
Turtle_Table (Object.Get_Id (To_Object)).X :=
Natural (Custom.Width) / 2;
Turtle_Table (Object.Get_Id (To_Object)).Y :=
Natural (Custom.Height) / 2;
Easy_X.Move_To (Easy_X.Coordinate (Turtle_Table (Index).X),
Easy_X.Coordinate (Turtle_Table (Index).Y));
return Object.Void_Reference;
when Duplique_Toi =>
New_Turtle := Create;
Turtle_Table (Object.Get_Id (New_Turtle)).X :=
Turtle_Table (Object.Get_Id (To_Object)).X;
Turtle_Table (Object.Get_Id (New_Turtle)).Y :=
Turtle_Table (Object.Get_Id (To_Object)).Y;
Turtle_Table (Object.Get_Id (New_Turtle)).Angle :=
Turtle_Table (Object.Get_Id (To_Object)).Angle;
Turtle_Table (Object.Get_Id (New_Turtle)).Marker :=
Turtle_Table (Object.Get_Id (To_Object)).Marker;
Turtle_Table (Object.Get_Id (New_Turtle)).Size :=
Turtle_Table (Object.Get_Id (To_Object)).Size;
return New_Turtle;
when En_Texte =>
Bounded_String.Append
(Current_Entexte, Bounded_String.Value
("Tortue no", Custom.
String_Max_Length));
Bounded_String.Append
(Current_Entexte, Integer'Image (Object.Get_Id (To_Object)));
if Turtle_Table (Object.Get_Id (To_Object)).Marker then
Bounded_String.Append
(Current_Entexte, Bounded_String.Value
(" baissee", Custom.
String_Max_Length));
else
Bounded_String.Append
(Current_Entexte,
Bounded_String.Value
(" levee", Custom.String_Max_Length));
end if;
Bounded_String.Append
(Current_Entexte, Bounded_String.Value
(". X:", Custom.String_Max_Length));
Bounded_String.Append
(Current_Entexte,
Integer'Image (Turtle_Table (Object.Get_Id (To_Object)).X));
Bounded_String.Append
(Current_Entexte, Bounded_String.Value
(". Y:", Custom.String_Max_Length));
Bounded_String.Append
(Current_Entexte,
Integer'Image (Turtle_Table (Object.Get_Id (To_Object)).Y));
Bounded_String.Append
(Current_Entexte, Bounded_String.Value
(". Taille:", Custom.
String_Max_Length));
Bounded_String.Append
(Current_Entexte,
Integer'Image
(Turtle_Table (Object.Get_Id (To_Object)).Size));
return String_Class.Create (Current_Entexte);
end case;
end Send;
procedure Send (To_Object : Object.Reference;
The_Message : in out Message.Selector;
With_Arguments : in out Parameters.List;
Back_Object : out Object.Reference) is
Current_Message : Keyword_Message;
Index : Integer := Object.Get_Id (To_Object);
Current_Object : Object.Reference;
Current_Angle : Degre;
use Object; -- erreur sur egalite entre classe d'objets si absent
begin
Message.Init (The_Message);
Parameters.Init (With_Arguments);
while not Message.Done (The_Message) loop
Current_Object := Parameters.Value (With_Arguments);
case Object.Get_Class (Current_Object) is
when Object.Entier =>
Convert_To_List (The_Message, Current_Message);
case Current_Message is
when Nul =>
raise Errors.Unknown_Message_For_Turtle;
when Ton_X =>
Turtle_Table (Index).X :=
Object.Get_Id (Current_Object);
when Ton_Y =>
Turtle_Table (Index).Y :=
Object.Get_Id (Current_Object);
when Ton_Angle =>
Turtle_Table (Index).Angle :=
Object.Get_Id (Current_Object);
when Ta_Taille =>
Turtle_Table (Index).Size :=
Object.Get_Id (Current_Object);
when A_Droite =>
Current_Angle :=
(Turtle_Table (Index).Angle +
Object.Get_Id (Current_Object)) mod 360;
Turtle_Table (Index).Angle := Current_Angle;
when A_Gauche =>
Current_Angle :=
(Turtle_Table (Index).Angle + 360 -
Object.Get_Id (Current_Object)) mod 360;
Turtle_Table (Index).Angle := Current_Angle;
when Avance =>
Easy_X.Move_To (Easy_X.Coordinate
(Turtle_Table (Index).X),
Easy_X.Coordinate
(Turtle_Table (Index).Y));
Turtle_Table (Index).X :=
Turtle_Table (Index).X +
Integer (Float
(Object.Get_Id (Current_Object)) *
Elementary_Functions.Cos
(Radians (Turtle_Table (Index).
Angle)));
Turtle_Table (Index).Y :=
Turtle_Table (Index).Y +
Integer (Float
(Object.Get_Id (Current_Object)) *
Elementary_Functions.Sin
(Radians (Turtle_Table (Index).
Angle)));
if Turtle_Table (Index).Marker then
Easy_X.Set_Pen (Easy_X.Dimension
(Turtle_Table (Index).Size));
Easy_X.Line_To (Easy_X.Coordinate
(Turtle_Table (Index).X),
Easy_X.Coordinate
(Turtle_Table (Index).Y));
else
Easy_X.Move_To (Easy_X.Coordinate
(Turtle_Table (Index).X),
Easy_X.Coordinate
(Turtle_Table (Index).Y));
end if;
when Recule =>
Easy_X.Move_To (Easy_X.Coordinate
(Turtle_Table (Index).X),
Easy_X.Coordinate
(Turtle_Table (Index).Y));
Current_Angle :=
(Turtle_Table (Index).Angle + 180) mod 360;
Turtle_Table (Index).X :=
Turtle_Table (Index).X +
Integer (Float (Object.Get_Id
(Current_Object)) *
Elementary_Functions.Cos
(Radians (Current_Angle)));
Turtle_Table (Index).Y :=
Turtle_Table (Index).Y +
Integer (Float (Object.Get_Id
(Current_Object)) *
Elementary_Functions.Sin
(Radians (Current_Angle)));
if Turtle_Table (Index).Marker then
Easy_X.Set_Pen (Easy_X.Dimension
(Turtle_Table (Index).Size));
Easy_X.Line_To (Easy_X.Coordinate
(Turtle_Table (Index).X),
Easy_X.Coordinate
(Turtle_Table (Index).Y));
else
Easy_X.Move_To (Easy_X.Coordinate
(Turtle_Table (Index).X),
Easy_X.Coordinate
(Turtle_Table (Index).Y));
end if;
when Va_En_X_Y =>
Easy_X.Move_To (Easy_X.Coordinate
(Turtle_Table (Index).X),
Easy_X.Coordinate
(Turtle_Table (Index).Y));
Turtle_Table (Index).X :=
Object.Get_Id (Current_Object);
Parameters.Next (With_Arguments);
case Object.Get_Class
(Parameters.Value (With_Arguments)) is
when Object.Entier =>
Turtle_Table (Index).Y :=
Object.Get_Id (Parameters.Value
(With_Arguments));
if Turtle_Table (Index).Marker then
Easy_X.Set_Pen
(Easy_X.Dimension
(Turtle_Table (Index).Size));
Easy_X.Line_To
(Easy_X.Coordinate
(Turtle_Table (Index).X),
Easy_X.Coordinate
(Turtle_Table (Index).Y));
else
Easy_X.Move_To
(Easy_X.Coordinate
(Turtle_Table (Index).X),
Easy_X.Coordinate
(Turtle_Table (Index).Y));
end if;
when others =>
raise
Errors.
Integer_Required_As_Argument_For_Turtle;
end case;
Easy_X.Move_To (Easy_X.Coordinate
(Turtle_Table (Index).X),
Easy_X.Coordinate
(Turtle_Table (Index).Y));
when Ton_X_Ton_Y =>
Turtle_Table (Index).X :=
Object.Get_Id (Current_Object);
Parameters.Next (With_Arguments);
case Object.Get_Class
(Parameters.Value (With_Arguments)) is
when Object.Entier =>
Turtle_Table (Index).Y :=
Object.Get_Id (Parameters.Value
(With_Arguments));
when others =>
raise
Errors.
Integer_Required_As_Argument_For_Turtle;
end case;
end case;
when others =>
raise Errors.Integer_Required_As_Argument_For_Turtle;
end case;
Message.Next (The_Message);
Parameters.Next (With_Arguments);
end loop;
Back_Object := Object.Void_Reference;
end Send;
end Turtle_Class;