DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦d4a1ebca6⟧ Ada Source

    Length: 23552 (0x5c00)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Pen_Class, seg_039305, seg_03940c, seg_03955e

Derivation

└─⟦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⟧ 

E3 Source Code



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;


E3 Meta Data

    nblk1=16
    nid=11
    hdr6=24
        [0x00] rec0=1a rec1=00 rec2=01 rec3=026
        [0x01] rec0=18 rec1=00 rec2=09 rec3=044
        [0x02] rec0=14 rec1=00 rec2=16 rec3=01e
        [0x03] rec0=19 rec1=00 rec2=08 rec3=012
        [0x04] rec0=19 rec1=00 rec2=0e rec3=00a
        [0x05] rec0=14 rec1=00 rec2=15 rec3=01c
        [0x06] rec0=11 rec1=00 rec2=0d rec3=070
        [0x07] rec0=14 rec1=00 rec2=04 rec3=01c
        [0x08] rec0=13 rec1=00 rec2=14 rec3=010
        [0x09] rec0=16 rec1=00 rec2=0b rec3=04a
        [0x0a] rec0=01 rec1=00 rec2=03 rec3=024
        [0x0b] rec0=12 rec1=00 rec2=07 rec3=036
        [0x0c] rec0=0f rec1=00 rec2=06 rec3=062
        [0x0d] rec0=10 rec1=00 rec2=0f rec3=046
        [0x0e] rec0=0f rec1=00 rec2=0c rec3=06c
        [0x0f] rec0=11 rec1=00 rec2=10 rec3=03e
        [0x10] rec0=12 rec1=00 rec2=02 rec3=05c
        [0x11] rec0=18 rec1=00 rec2=05 rec3=000
        [0x12] rec0=02 rec1=00 rec2=11 rec3=000
        [0x13] rec0=00 rec1=00 rec2=00 rec3=000
        [0x14] rec0=00 rec1=00 rec2=00 rec3=000
        [0x15] rec0=00 rec1=00 rec2=00 rec3=000
    tail 0x21532347884ec4c56f312 0x42a00088462060003
Free Block Chain:
  0x11: 0000  00 0a 00 13 80 0a 50 65 6e 5f 43 6c 61 73 73 3b  ┆      Pen_Class;┆
  0xa: 0000  00 13 03 fc 80 1f 20 20 20 20 20 20 20 20 20 20  ┆                ┆
  0x13: 0000  00 12 00 29 80 22 67 65 20 28 4d 65 73 73 61 67  ┆   ) "ge (Messag┆
  0x12: 0000  00 00 03 fc 80 29 53 74 72 69 6e 67 2e 49 6d 61  ┆     )String.Ima┆