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

⟦e616f45b7⟧ Ada Source

    Length: 12288 (0x3000)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body String_Class, seg_0392ff, seg_03940e, seg_039565

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 Boolean_Class;
with Bounded_String;
with Errors;
with Integer_Class;
with String_Utilities;

package body String_Class is

    Iterator : Natural := 0;
    type Unary_Message is (Nul, En_Texte, Chaine_Vide, Longueur);
    type Binary_Message is (Nul, Plus, Plus_Ada, Egal, Sup, Inf, Different);

    function Convert_To_Unary
                (The_Message : Scanner.Lexeme) return Unary_Message is
    begin
        if Bounded_String.Image (The_Message) = "EN_TEXTE" then
            return En_Texte;
        elsif Bounded_String.Image (The_Message) = "CHAINE_VIDE" then
            return Chaine_Vide;
        elsif Bounded_String.Image (The_Message) = "LONGUEUR" then
            return Longueur;
        else
            return Nul;
        end if;
    end Convert_To_Unary;

    function Convert_To_Binary
                (The_Message : Scanner.Lexeme) return Binary_Message is
    begin
        if Bounded_String.Image (The_Message) = "=" then           return Egal;
        elsif Bounded_String.Image (The_Message) = "+" then
            return Plus;
        elsif Bounded_String.Image (The_Message) = "&" then
            return Plus_Ada;
        elsif Bounded_String.Image (The_Message) = ">" then
            return Sup;
        elsif Bounded_String.Image (The_Message) = "<" then
            return Inf;
        elsif Bounded_String.Image (The_Message) = "<>" then
            return Different;
        else
            return Nul;
        end if;
    end Convert_To_Binary;

    function Create (Value : String) return Object.Reference is  
    begin
        Iterator := Iterator + 1;
        if Iterator <= Custom.String_Max_Number then
            String_Tab (Iterator) := Bounded_String.Value
                                        (Value, Custom.String_Max_Length);
            return Object.Create (Object.Chaine, Iterator);
        else
            raise Errors.Max_String_Number_Exceeded;
        end if;
    end Create;

    function Create (Value : Scanner.Lexeme) return Object.Reference is  
    begin
        Iterator := Iterator + 1;
        if Iterator <= Custom.String_Max_Number then
            String_Tab (Iterator) := Value;
            return Object.Create (Object.Chaine, Iterator);
        else
            raise Errors.Max_String_Number_Exceeded;
        end if;
    end Create;

    function Get_Value (String_Object : Object.Reference)
                       return Scanner.Lexeme is
    begin
        return String_Tab (Object.Get_Id (String_Object));
    end Get_Value;

    function Send (To_Object : Object.Reference; The_Message : Scanner.Lexeme)
                  return Object.Reference is
        Current_Message : Unary_Message := Nul;
    begin
        Current_Message := Convert_To_Unary (The_Message);
        case Current_Message is
            when Nul =>
                raise Errors.Unknown_Message_For_String;
            when En_Texte =>
                return To_Object;
            when Chaine_Vide =>
                return (Boolean_Class.Create
                           (Bounded_String.Length
                               (String_Tab (Object.Get_Id (To_Object))) = 0));
            when Longueur =>
                return Integer_Class.Create
                          (Bounded_String.Length
                              (String_Tab (Object.Get_Id (To_Object))));
        end case;
    end Send;

    function Send (To_Object : Object.Reference;
                   The_Message : Scanner.Lexeme;
                   With_Object : Object.Reference) return Object.Reference is
        Current_Message : Binary_Message := Nul;
        Current_String : Scanner.Lexeme;
        L1, L2 : Natural;  
    begin
        Current_Message := Convert_To_Binary (The_Message);
        case Object.Get_Class (With_Object) is
            when Object.Chaine =>
                case Current_Message is
                    when Nul =>
                        raise Errors.Unknown_Message_For_String;
                    when Plus | Plus_Ada =>  
                        L1 := Bounded_String.Length
                                 (String_Tab (Object.Get_Id (To_Object)));
                        L2 := Bounded_String.Length
                                 (String_Tab (Object.Get_Id (With_Object)));
                        if (L1 + L2) <= Custom.String_Max_Length then
                            Bounded_String.Copy
                               (Current_String, String_Tab
                                                   (Object.Get_Id (To_Object)));
                            Bounded_String.Append
                               (Current_String,
                                String_Tab (Object.Get_Id (With_Object)));
                            return Create (Current_String);
                        else
                            raise Errors.Target_String_Is_Too_Long;
                        end if;
                    when Egal =>  
                        return Boolean_Class.Create
                                  (String_Utilities.Equal
                                      (Bounded_String.Image
                                          (String_Tab (Object.Get_Id
                                                          (To_Object))),
                                       Bounded_String.Image
                                          (String_Tab (Object.Get_Id
                                                          (With_Object)))));
                    when Sup =>
                        return Boolean_Class.Create
                                  (String_Utilities.Greater_Than
                                      (Bounded_String.Image
                                          (String_Tab (Object.Get_Id
                                                          (To_Object))),
                                       Bounded_String.Image
                                          (String_Tab (Object.Get_Id
                                                          (With_Object)))));
                    when Inf =>
                        return Boolean_Class.Create
                                  (String_Utilities.Less_Than
                                      (Bounded_String.Image
                                          (String_Tab (Object.Get_Id
                                                          (To_Object))),
                                       Bounded_String.Image
                                          (String_Tab (Object.Get_Id
                                                          (With_Object)))));
                    when Different =>
                        return Boolean_Class.Create
                                  (not String_Utilities.Equal
                                          (Bounded_String.Image
                                              (String_Tab (Object.Get_Id
                                                              (To_Object))),
                                           Bounded_String.Image
                                              (String_Tab (Object.Get_Id
                                                              (With_Object)))));
                end case;
            when others =>
                raise Errors.String_Object_Required_As_Argument;
        end case;
    end Send;

    function Get_For_Error (Value : String) return Object.Reference is
    begin
        String_Tab (1) := Bounded_String.Value
                             (Value, Custom.String_Max_Length);
        return Object.Create (Object.Chaine, 1);
    end Get_For_Error;

end String_Class;

E3 Meta Data

    nblk1=b
    nid=b
    hdr6=14
        [0x00] rec0=20 rec1=00 rec2=01 rec3=002
        [0x01] rec0=00 rec1=00 rec2=0a rec3=02e
        [0x02] rec0=1a rec1=00 rec2=05 rec3=01e
        [0x03] rec0=04 rec1=00 rec2=06 rec3=030
        [0x04] rec0=1b rec1=00 rec2=04 rec3=010
        [0x05] rec0=16 rec1=00 rec2=02 rec3=054
        [0x06] rec0=0b rec1=00 rec2=08 rec3=064
        [0x07] rec0=12 rec1=00 rec2=03 rec3=00a
        [0x08] rec0=0f rec1=00 rec2=07 rec3=066
        [0x09] rec0=16 rec1=00 rec2=09 rec3=001
        [0x0a] rec0=a5 rec1=f2 rec2=f0 rec3=000
    tail 0x215322f1e84ec4a9e001f 0x42a00088462060003
Free Block Chain:
  0xb: 0000  00 00 00 24 80 07 5f 45 72 72 6f 72 3b 07 00 00  ┆   $  _Error;   ┆