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

⟦402829b92⟧ Ada Source

    Length: 10240 (0x2800)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Hierarchy_Generic, seg_0043ec

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



package body Hierarchy_Generic is

    function Location (Of_This_Element : Element; In_This_Hierarchy : Hier)
                      return Hier_Ptr is
        Search_Ptr : Hier_Ptr := In_This_Hierarchy.First;
    begin
        while Search_Ptr /= null loop
            if Are_Equal (Search_Ptr.Contents, Of_This_Element) then
                return Search_Ptr;
            end if;
            Search_Ptr := Search_Ptr.Next;
        end loop;  
        return null;
    end Location;


    function Create return Hier is
    begin
        return (True, null, null);
    end Create;



    procedure Add (This_Element      :        Element;
                   To_This_Hierarchy : in out Hier;
                   Element_Location  : out    Hier_Ptr) is
        New_Node     : Hier_Ptr;
        The_Location : Hier_Ptr := Location
                                      (Of_This_Element   => This_Element,
                                       In_This_Hierarchy => To_This_Hierarchy);
    begin
        if The_Location = null then
            New_Node := new Hier_Node'(Contents  => This_Element,
                                       Is_Marked => False,
                                       Parents   => Ptr_Lists.Create,
                                       Children  => Ptr_Lists.Create,
                                       Next      => null);
            if To_This_Hierarchy.First = null then   -- empty list
                To_This_Hierarchy.First := New_Node;
                To_This_Hierarchy.Last  := New_Node;
            else
                To_This_Hierarchy.Last.Next := New_Node;
                To_This_Hierarchy.Last      := New_Node;
            end if;
            Element_Location := New_Node;
        else
            Element_Location := The_Location;
        end if;
    end Add;


    procedure Add (This_Parent       :        Element;
                   And_This_Child    :        Element;
                   To_This_Hierarchy : in out Hier) is
        Parent_Ptr, Child_Ptr : Hier_Ptr;
    begin
        if not To_This_Hierarchy.Initialized then
            raise Hierarchy_Not_Initialized;
        end if;
        Add (This_Parent, To_This_Hierarchy, Parent_Ptr);
        Add (And_This_Child, To_This_Hierarchy, Child_Ptr);
        if not Ptr_Lists.Exists (In_This_List => Parent_Ptr.Children,
                                 This_Element => Child_Ptr) then
            Ptr_Lists.Add (To_List      => Parent_Ptr.Children,
                           This_Element => Child_Ptr);
            Ptr_Lists.Add (To_List      => Child_Ptr.Parents,
                           This_Element => Parent_Ptr);
        end if;
    end Add;


    procedure Mark_Element (This_Element      :        Element;
                            In_This_Hierarchy : in out Hier) is
        The_Element : Hier_Ptr;
    begin
        Add (This_Element, In_This_Hierarchy, The_Element);
        The_Element.Is_Marked := True;
    end Mark_Element;


    function Element_Is_Marked
                (This_Element : Element; In_This_Hierarchy : Hier)
                return Boolean is
        The_Element : Hier_Ptr := Location
                                     (Of_This_Element   => This_Element,
                                      In_This_Hierarchy => In_This_Hierarchy);
    begin
        if The_Element /= null then
            return The_Element.Is_Marked;
        else
            return False;
        end if;
    end Element_Is_Marked;



    function Map_From
                (This_Element : Element; In_This_Hierarchy : Hier) return Map is
        Num_Parents  : Natural  := 0;
        Num_Children : Natural  := 0;
        Record_Size  : Natural  := 0;
        Element_Ptr  : Hier_Ptr := Location
                                      (Of_This_Element   => This_Element,
                                       In_This_Hierarchy => In_This_Hierarchy);
    begin
        Ptr_Lists.Reset (Element_Ptr.Parents);
        while not Ptr_Lists.Done (Element_Ptr.Parents) loop
            Num_Parents := Num_Parents + 1;
            Ptr_Lists.Next (Element_Ptr.Parents);
        end loop;
        Ptr_Lists.Reset (Element_Ptr.Children);
        while not Ptr_Lists.Done (Element_Ptr.Children) loop
            Num_Children := Num_Children + 1;
            Ptr_Lists.Next (Element_Ptr.Children);
        end loop;
        if Num_Children > Num_Parents then
            Record_Size := Num_Children;
        else
            Record_Size := Num_Parents;
        end if;

        declare
            The_Map : Map (Record_Size);
        begin
            The_Map.Current := Element_Ptr.Contents;

            --
            --  set the parents
            --
            The_Map.Num_Parents := Num_Parents;
            Ptr_Lists.Reset (Element_Ptr.Parents);
            for This_Parent in 1 .. Num_Parents loop
                The_Map.Parents (This_Parent) :=
                   Ptr_Lists.Current (Element_Ptr.Parents).Contents;
                Ptr_Lists.Next (Element_Ptr.Parents);
            end loop;

            --
            --  set the children
            --
            The_Map.Num_Children := Num_Children;
            Ptr_Lists.Reset (Element_Ptr.Children);
            for This_Child in 1 .. Num_Children loop
                The_Map.Children (This_Child) :=
                   Ptr_Lists.Current (Element_Ptr.Children).Contents;
                Ptr_Lists.Next (Element_Ptr.Children);
            end loop;

            return The_Map;
        end;
    end Map_From;
end Hierarchy_Generic;

E3 Meta Data

    nblk1=9
    nid=0
    hdr6=12
        [0x00] rec0=1f rec1=00 rec2=01 rec3=06c
        [0x01] rec0=00 rec1=00 rec2=09 rec3=008
        [0x02] rec0=18 rec1=00 rec2=02 rec3=016
        [0x03] rec0=00 rec1=00 rec2=08 rec3=00c
        [0x04] rec0=17 rec1=00 rec2=03 rec3=026
        [0x05] rec0=1c rec1=00 rec2=04 rec3=004
        [0x06] rec0=00 rec1=00 rec2=07 rec3=00e
        [0x07] rec0=1c rec1=00 rec2=05 rec3=036
        [0x08] rec0=14 rec1=00 rec2=06 rec3=000
    tail 0x2150031ae815c63517382 0x42a00088462061e03