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

⟦399c3fefe⟧ Ada Source

    Length: 8192 (0x2000)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Table, seg_051639

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦5a81ac88f⟧ »Space Info Vol 1« 
        └─⟦this⟧ 

E3 Source Code



with Text_Io;

package body Table is

    Eol : constant Natural := 0;

    procedure Initialise (O : in out Object) is
    begin

        for I in O.Hashing'Range loop
            O.Hashing (I) := Eol;
        end loop;

        O.Liste_Poste_Libre := Tab_Item'First;

        for I in Tab_Item'First .. Tab_Item'Last - 1 loop
            O.Tableau (I).Suivant := I + 1;
        end loop;

        O.Tableau (O.Tableau'Last).Suivant := Eol;
    end Initialise;

    function Hash (N : Natural) return Natural is
    begin
        return (N mod Max_Taille_Hash) + 1;
    end Hash;

    procedure Get_Premier_Libre (O : in out Object; N : in out Natural) is
    begin
        if O.Liste_Poste_Libre = Eol then
            raise Overflow_Error;
        else
            N := O.Liste_Poste_Libre;  
            O.Liste_Poste_Libre := O.Tableau (N).Suivant;
        end if;  
    end Get_Premier_Libre;

    procedure Set_Premier_Libre (O : in out Object; N : Natural) is
    begin  
        O.Tableau (N).Suivant := O.Liste_Poste_Libre;
        O.Liste_Poste_Libre := N;
    end Set_Premier_Libre;

    procedure Add_Item (O : in out Object; I : Item) is
        N : Natural;
        H : Natural;
    begin  
        Get_Premier_Libre (O, N);
        O.Tableau (N).Element := I;
        H := Hash (Cle (I));  
        O.Tableau (N).Suivant := O.Hashing (H);
        O.Hashing (H) := N;
    end Add_Item;

    procedure Rem_Item (O : in out Object; I : Item) is
        H : Natural;
        N : Natural;
        Prec : Natural;
    begin  
        H := Hash (Cle (I));
        N := O.Hashing (H);
        if N = Eol then
            raise Not_Found_Error;
        else  
            if O.Tableau (N).Element = I then
                O.Hashing (H) := O.Tableau (N).Suivant;
                Set_Premier_Libre (O, N);
            else
                Prec := N;
                N := O.Tableau (N).Suivant;
                while N /= Eol loop  
                    if O.Tableau (N).Element = I then
                        O.Tableau (Prec).Suivant := O.Tableau (N).Suivant;
                        Set_Premier_Libre (O, N);
                        exit;
                    end if;
                    Prec := N;
                    N := O.Tableau (N).Suivant;
                end loop;  
                if N = Eol then
                    raise Not_Found_Error;
                end if;
            end if;
        end if;
    end Rem_Item;

    procedure Mod_Item (O : in out Object; I, Par : Item) is
    begin
        Rem_Item (O, I);
        Add_Item (O, Par);
    end Mod_Item;

    procedure Dump (O : Object) is
        N : Natural;
    begin
        N := O.Liste_Poste_Libre;
        Text_Io.Put ("postes libres : ->");
        while N /= Eol loop
            Text_Io.Put (Natural'Image (N) & "->");
            N := O.Tableau (N).Suivant;
        end loop;
        Text_Io.New_Line;
        for I in Tab_Hash'Range loop
            Text_Io.Put ("hash(" & Natural'Image (I) & ") ->");
            N := O.Hashing (I);
            while N /= Eol loop
                Text_Io.Put (Image (O.Tableau (N).Element) & "->");
                N := O.Tableau (N).Suivant;
            end loop;
            Text_Io.New_Line;
        end loop;
    end Dump;

    function First_Item (O : in Object) return Iterateur is
        Iter : Iterateur;
    begin  
        Iter.Utilise_Cle := False;
        Iter.Hash := 1;  
        Iter.Indice := Eol;
        while Iter.Hash /= Max_Taille_Hash loop
            if O.Hashing (Iter.Hash) /= Eol then
                exit;
            end if;
            Iter.Hash := Iter.Hash + 1;
        end loop;
        Iter.Indice := O.Hashing (Iter.Hash);
        return Iter;
    end First_Item;

    function First_Item (O : Object; Key : Natural) return Iterateur is
        Iter : Iterateur;
    begin
        Iter.Utilise_Cle := True;
        Iter.Cle := Key;
        Iter.Indice := O.Hashing (Hash (Key));
        while Iter.Indice /= Eol loop
            if Cle (O.Tableau (Iter.Indice).Element) = Iter.Cle then
                exit;
            end if;
            Iter.Indice := O.Tableau (Iter.Indice).Suivant;
        end loop;
        return Iter;
    end First_Item;

    procedure Next_Item (Iter : in out Iterateur; O : Object) is
    begin
        if End_Of_Iter (Iter) then
            raise Iterateur_Error;
        else  
            if Iter.Utilise_Cle then  
                Iter.Indice := O.Tableau (Iter.Indice).Suivant;
                while Iter.Indice /= Eol loop
                    if Cle (O.Tableau (Iter.Indice).Element) = Iter.Cle then
                        exit;
                    else  
                        Iter.Indice := O.Tableau (Iter.Indice).Suivant;
                    end if;
                end loop;
            else
                Iter.Indice := O.Tableau (Iter.Indice).Suivant;
                if Iter.Indice = Eol then  
                    if Iter.Hash /= Max_Taille_Hash then
                        Iter.Hash := Iter.Hash + 1;
                        while Iter.Hash /= Max_Taille_Hash loop
                            if O.Hashing (Iter.Hash) /= Eol then
                                exit;
                            end if;
                            Iter.Hash := Iter.Hash + 1;
                        end loop;
                        Iter.Indice := O.Hashing (Iter.Hash);
                    end if;
                end if;
            end if;
        end if;
    end Next_Item;

    function Current_Item (Iter : Iterateur; O : Object) return Item is
    begin
        if End_Of_Iter (Iter) then
            raise Iterateur_Error;
        else
            return O.Tableau (Iter.Indice).Element;
        end if;
    end Current_Item;

    function End_Of_Iter (Iter : Iterateur) return Boolean is
    begin  
        if Iter.Utilise_Cle then
            return (Iter.Indice = Eol);
        else
            return (Iter.Indice = Eol) and (Iter.Hash >= Max_Taille_Hash);
        end if;
    end End_Of_Iter;

    function Is_Full (O : Object) return Boolean is
    begin
        return (O.Liste_Poste_Libre = Eol);
    end Is_Full;

    function Is_In (O : Object; I : Item) return Boolean is
        P : Natural;
        Key : Natural := Cle (I);
    begin
        P := O.Hashing (Hash (Key));
        while P /= Eol loop
            if Key = Cle (O.Tableau (P).Element) then
                if O.Tableau (P).Element = I then
                    return True;
                end if;
            end if;  
            P := O.Tableau (P).Suivant;
        end loop;  
        return False;
    end Is_In;

end Table;



E3 Meta Data

    nblk1=7
    nid=0
    hdr6=e
        [0x00] rec0=27 rec1=00 rec2=01 rec3=050
        [0x01] rec0=20 rec1=00 rec2=07 rec3=04c
        [0x02] rec0=1f rec1=00 rec2=06 rec3=00e
        [0x03] rec0=1e rec1=00 rec2=05 rec3=01c
        [0x04] rec0=1b rec1=00 rec2=04 rec3=02e
        [0x05] rec0=1c rec1=00 rec2=03 rec3=00a
        [0x06] rec0=22 rec1=00 rec2=02 rec3=001
    tail 0x2154b4516879a5be3488f 0x42a00088462060003