|
|
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: 16487 (0x4067)
Types: TextFile
Names: »B«
└─⟦a7d1ea751⟧ Bits:30000550 8mm tape, Rational 1000, !users!projects 94_04_11
└─⟦129cab021⟧ »DATA«
└─⟦this⟧
with Bounded_String;
with Errors;
with Integer_Class;
with String_Class;
package body Pen_Class is
type Unary_Message is (Nul, En_Texte, Ton_X, Ton_Y, Ta_Taille, Fin, Moyen,
Epais, Rentre_Chez_Toi, Va_Au_Centre, Duplique_Toi);
type Keyword_Message is (Nul, Ton_X, Ton_Y, Va_En_X_Y, Ecris, Ton_X_Ton_Y,
En_Haut, En_Bas, A_Gauche, A_Droite);
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) = "FIN" then
return Fin;
elsif Bounded_String.Image (The_Message) = "MOYEN" then
return Moyen;
elsif Bounded_String.Image (The_Message) = "EPAIS" then
return Epais;
elsif Bounded_String.Image (The_Message) = "TA_TAILLE" then
return Ta_Taille;
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)) =
"ECRIS:" then
Back := Ecris;
elsif Bounded_String.Image (Message.Value (The_Message)) =
"EN_HAUT:" then
Back := En_Haut;
elsif Bounded_String.Image (Message.Value (The_Message)) =
"EN_BAS:" then
Back := En_Bas;
elsif Bounded_String.Image (Message.Value (The_Message)) =
"A_GAUCHE:" then
Back := A_Gauche;
elsif Bounded_String.Image (Message.Value (The_Message)) =
"A_DROITE:" then
Back := A_Droite;
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 Create return Object.Reference is
begin
Iterator := Iterator + 1;
if Iterator <= Custom.Pen_Max_Number then
return Object.Create (Object.Stylo, Iterator);
else
raise Errors.Max_Pen_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_Pen : Object.Reference;
begin
Current_Message := Convert_To_Unary (The_Message);
case Current_Message is
when Nul =>
raise Errors.Unknown_Message_For_Pen;
when Ton_X =>
return Integer_Class.Create (Pen_Table
(Object.Get_Id (To_Object)).X);
when Ton_Y =>
return Integer_Class.Create (Pen_Table
(Object.Get_Id (To_Object)).Y);
when Fin =>
Pen_Table (Index).Width := Easy_X.Small_Font;
return Object.Void_Reference;
when Moyen =>
Pen_Table (Index).Width := Easy_X.Medium_Font;
return Object.Void_Reference;
when Epais =>
Pen_Table (Index).Width := Easy_X.Large_Font;
return Object.Void_Reference;
when Ta_Taille =>
case Pen_Table (Object.Get_Id (To_Object)).Width is
when Easy_X.Small_Font =>
return String_Class.Create ("Fin");
when Easy_X.Medium_Font =>
return String_Class.Create ("Moyen");
when Easy_X.Large_Font =>
return String_Class.Create ("Epais");
end case;
when Rentre_Chez_Toi =>
Pen_Table (Object.Get_Id (To_Object)).X := 0;
Pen_Table (Object.Get_Id (To_Object)).Y := 0;
Easy_X.Move_To (Easy_X.Coordinate (Pen_Table (Index).X),
Easy_X.Coordinate (Pen_Table (Index).Y));
return Object.Void_Reference;
when Va_Au_Centre =>
Pen_Table (Object.Get_Id (To_Object)).X :=
Natural (Custom.Width) / 2;
Pen_Table (Object.Get_Id (To_Object)).Y :=
Natural (Custom.Height) / 2;
Easy_X.Move_To (Easy_X.Coordinate (Pen_Table (Index).X),
Easy_X.Coordinate (Pen_Table (Index).Y));
return Object.Void_Reference;
when Duplique_Toi =>
New_Pen := Create;
Pen_Table (Object.Get_Id (New_Pen)).X :=
Pen_Table (Object.Get_Id (To_Object)).X;
Pen_Table (Object.Get_Id (New_Pen)).Y :=
Pen_Table (Object.Get_Id (To_Object)).Y;
Pen_Table (Object.Get_Id (New_Pen)).Width :=
Pen_Table (Object.Get_Id (To_Object)).Width;
return New_Pen;
when En_Texte =>
Bounded_String.Append
(Current_Entexte, Bounded_String.Value
("Stylo no", Custom.String_Max_Length));
Bounded_String.Append
(Current_Entexte, Integer'Image (Object.Get_Id (To_Object)));
Bounded_String.Append
(Current_Entexte, Bounded_String.Value
(". X:", Custom.String_Max_Length));
Bounded_String.Append
(Current_Entexte,
Integer'Image (Pen_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 (Pen_Table (Object.Get_Id (To_Object)).Y));
Bounded_String.Append
(Current_Entexte, Bounded_String.Value
(". Font: ", Custom.String_Max_Length));
case Pen_Table (Object.Get_Id (To_Object)).Width is
when Easy_X.Small_Font =>
Bounded_String.Append
(Current_Entexte,
Bounded_String.Value
("Fin", Custom.String_Max_Length));
when Easy_X.Medium_Font =>
Bounded_String.Append
(Current_Entexte,
Bounded_String.Value
("Moyen", Custom.String_Max_Length));
when Easy_X.Large_Font =>
Bounded_String.Append
(Current_Entexte,
Bounded_String.Value
("Epais", Custom.String_Max_Length));
end case;
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_Number : Integer;
Current_Object : Object.Reference;
use Object; -- erreur sur egalite entre classes 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_Pen;
when Ton_X =>
Pen_Table (Index).X :=
Object.Get_Id (Current_Object);
when Ton_Y =>
Pen_Table (Index).Y :=
Object.Get_Id (Current_Object);
when En_Haut =>
Current_Number := Pen_Table (Index).Y -
Object.Get_Id (Current_Object);
if Current_Number < 0 then
Current_Number := 0;
end if;
Pen_Table (Index).Y := Natural (Current_Number);
Easy_X.Move_To (Easy_X.Coordinate
(Pen_Table (Index).X),
Easy_X.Coordinate
(Pen_Table (Index).Y));
when En_Bas =>
Current_Number := Pen_Table (Index).Y +
Object.Get_Id (Current_Object);
if Current_Number > Integer (Custom.Height) then
Current_Number := Integer (Custom.Height);
end if;
Pen_Table (Index).Y := Natural (Current_Number);
Easy_X.Move_To (Easy_X.Coordinate
(Pen_Table (Index).X),
Easy_X.Coordinate
(Pen_Table (Index).Y));
when A_Gauche =>
Current_Number := Pen_Table (Index).X -
Object.Get_Id (Current_Object);
if Current_Number < 0 then
Current_Number := 0;
end if;
Pen_Table (Index).X := Natural (Current_Number);
Easy_X.Move_To (Easy_X.Coordinate
(Pen_Table (Index).X),
Easy_X.Coordinate
(Pen_Table (Index).Y));
when A_Droite =>
Current_Number := Pen_Table (Index).X +
Object.Get_Id (Current_Object);
if Current_Number > Integer (Custom.Width) then
Current_Number := Integer (Custom.Width);
end if;
Pen_Table (Index).X := Natural (Current_Number);
Easy_X.Move_To (Easy_X.Coordinate
(Pen_Table (Index).X),
Easy_X.Coordinate
(Pen_Table (Index).Y));
when Va_En_X_Y =>
Pen_Table (Index).X :=
Object.Get_Id (Current_Object);
Parameters.Next (With_Arguments);
if Object.Get_Class
(Parameters.Value (With_Arguments)) =
Object.Entier then
Pen_Table (Index).Y :=
Object.Get_Id (Parameters.Value
(With_Arguments));
Easy_X.Move_To (Easy_X.Coordinate
(Pen_Table (Index).X),
Easy_X.Coordinate
(Pen_Table (Index).Y));
else
raise Errors.
Integer_Required_As_Argument_For_Pen;
end if;
when Ton_X_Ton_Y =>
Pen_Table (Index).X :=
Object.Get_Id (Current_Object);
Parameters.Next (With_Arguments);
if Object.Get_Class
(Parameters.Value (With_Arguments)) =
Object.Entier then
Pen_Table (Index).Y :=
Object.Get_Id (Parameters.Value
(With_Arguments));
else
raise Errors.
Integer_Required_As_Argument_For_Pen;
end if;
when Ecris =>
raise Errors.String_Required_As_Argument_For_Pen;
end case;
when Object.Chaine =>
Convert_To_List (The_Message, Current_Message);
case Current_Message is
when Ecris =>
Easy_X.Move_To (Easy_X.Coordinate
(Pen_Table (Index).X),
Easy_X.Coordinate
(Pen_Table (Index).Y));
Easy_X.Set_Font (Pen_Table (Index).Width);
Easy_X.Draw_String (Bounded_String.Image
(String_Class.Get_Value
(Current_Object)));
when others =>
raise Errors.String_Required_As_Argument_For_Pen;
end case;
when others =>
raise Errors.Integer_Required_As_Argument_For_Pen;
end case;
Message.Next (The_Message);
Parameters.Next (With_Arguments);
end loop;
Back_Object := Object.Void_Reference;
end Send;
function Get_For_Error return Object.Reference is
begin
return Object.Create (Object.Stylo, 1);
end Get_For_Error;
end Pen_Class;