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

⟦3f24b454f⟧ Ada Source

    Length: 34816 (0x8800)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Requirements, seg_01077c

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 Asa_Definitions;
with Gateway_Object;
with Job_Segment;
with Object_Class;
with Simple_Status;
with String_Utilities;
with System;
with Table_Sort_Generic;
with Unchecked_Conversion;
package body Requirements is

    package Asap renames Asa_Definitions.Properties;
    package Dtr renames Directory.Traversal;
    package Dst renames Directory.Statistics;
    package Gwo renames Gateway_Object;
    package Ss renames Simple_Status;


    --                    ---------------------------------------------
    --                    ( ) Declarations for permanent representation
    --                    ---------------------------------------------


    type Record_Permanent_Representation is
        record
            Kind : Requirement_Kind;
            Object : Dir.Object;
            Id : Functional_Requirement_Number;
        end record;

    --
    -- It is necessary to use a 31-bit integer internally, because
    -- unchecked conversion to a 30-bit integer may yield -2**31,
    -- which is the uninitialized value, and will raise NUMERIC_ERROR
    -- when read.
    --
    type Integer31 is range -2 ** 30 .. 2 ** 30 - 1;  
    for Integer31'Size use 31;

    pragma Assert (Record_Permanent_Representation'Size <=
                   Permanent_Representation'Length * Integer31'Size);

    type Integer31_Permanent_Representation is
       array (Permanent_Representation'Range) of Integer31;

    function To_Record is new Unchecked_Conversion
                                 (Source => Integer31_Permanent_Representation,
                                  Target => Record_Permanent_Representation);

    function From_Record is
       new Unchecked_Conversion (Source => Record_Permanent_Representation,
                                 Target => Integer31_Permanent_Representation);


    --                    ------------------
    --                    ( ) Error handling
    --                    ------------------


    function Diagnosis (Error : in Status) return String is
    begin
        case Error.Kind is

            when Module_Id_Error =>
                return "the specified requirement id could not be found";

            when Directory_Error =>
                return String_Utilities.Lower_Case
                          (Dir.Error_Status'Image (Error.Error_Status));

            when Directory_Naming_Error =>
                return String_Utilities.Lower_Case
                          (Dna.Name_Status'Image (Error.Name_Status));

            when General_Error =>
                return Ss.Display_Message (Error.Condition);
        end case;
    end Diagnosis;


    function Module_Id_Error return Requirement is
    begin
        return (Kind => Not_A_Requirement,
                Error => (Kind => Status_Kind'(Module_Id_Error)));
    end Module_Id_Error;

    function Directory_Error (E : in Dir.Error_Status) return Requirement is
    begin
        return (Kind => Not_A_Requirement,
                Error => (Kind => Directory_Error, Error_Status => E));
    end Directory_Error;

    function Directory_Error (E : in Dir.Error_Status) return Dependents is
    begin
        return (Is_Bad => True,
                Error => (Kind => Directory_Error, Error_Status => E));
    end Directory_Error;

    function Directory_Naming_Error
                (N : in Dna.Name_Status) return Requirement is
    begin
        return (Kind => Not_A_Requirement,
                Error => (Kind => Directory_Naming_Error, Name_Status => N));
    end Directory_Naming_Error;

    function Directory_Naming_Error
                (N : in Dna.Name_Status) return Dependents is
    begin
        return (Is_Bad => True,
                Error => (Kind => Directory_Naming_Error, Name_Status => N));
    end Directory_Naming_Error;

    function General_Error (S : in Ss.Condition) return Requirement is
    begin
        return (Kind => Not_A_Requirement,
                Error => (Kind => General_Error, Condition => S));
    end General_Error;

    function General_Error (S : in Ss.Condition) return Dependents is
    begin
        return (Is_Bad => True,
                Error => (Kind => General_Error, Condition => S));
    end General_Error;


    --                    -------------
    --                    ( ) Utilities
    --                    -------------


    function Name (Objects : in Object_List; Before : in String)
                  return String is
    begin
        if Objects'First > Objects'Last then
            return Before;
        elsif Before = "" then
            return Name (Objects => Objects (Objects'First + 1 .. Objects'Last),
                         Before => Dna.Get_Full_Name (Objects (Objects'First)));
        else
            return Name (Objects => Objects (Objects'First + 1 .. Objects'Last),
                         Before => Before & ',' & Dna.Get_Full_Name
                                                     (Objects (Objects'First)));
        end if;
    end Name;

    procedure Search_By_Id (Root : in Dir.Object;
                            Id : in Positive;
                            Action_Id : in Action.Id;
                            Found : out Boolean;
                            Object : out Dir.Object) is
        E : Dir.Error_Status;
        Found_In_Subobject : Boolean;
        Object_In_Subobject : Dir.Object;
        Gateway : Gwo.Handle;
        N : Dna.Name_Status;  
        S : Ss.Condition;  
        Subobject : Dir.Object;
        Subobjects : Dna.Iterator;
        use Dir;
        use Dna;
    begin
        Gwo.Open_Main_Object (Object => Root,  
                              H => Gateway,
                              Update => False,
                              Errors => S);
        if Ss.Error (S) then
            Found := False;
            Object := Dir.Nil;
            return;
        end if;

        if Asap.Asa_Id (Gateway) = Id then
            Gwo.Close (Gateway);
            Found := True;
            Object := Root;
            return;
        else
            Gwo.Close (Gateway);

            Dna.Resolve (Iter => Subobjects,
                         Source => Dna.Get_Full_Name (Root) & ".@'C(~TEXT)",
                         Status => N,
                         Action_Id => Action_Id);
            if N = Dna.Successful then
                while not Dna.Done (Subobjects) loop
                    Dna.Get_Object (Iter => Subobjects,  
                                    The_Object => Subobject,
                                    Status => E);
                    if E /= Dir.Successful then
                        Found := False;
                        Object := Dir.Nil;
                        return;
                    end if;

                    Search_By_Id (Root => Subobject,
                                  Id => Id,
                                  Action_Id => Action_Id,
                                  Found => Found_In_Subobject,
                                  Object => Object_In_Subobject);
                    if Found_In_Subobject then
                        Found := Found_In_Subobject;
                        Object := Object_In_Subobject;
                        return;
                    end if;
                    Dna.Next (Subobjects);
                end loop;
            end if;
            Found := False;
            Object := Dir.Nil;
        end if;
    end Search_By_Id;


    --                    ----------------------------------
    --                    ( ) Bodies of external subprograms
    --                    ----------------------------------


    --                    -----------------------------
    --                    ( . ) Individual requirements
    --                    -----------------------------


    function Resolve (Model_Gateway_Name : in String;
                      Module_Id : in Positive;  
                      Requirement_Id : in Requirement_Number;
                      Action_Id : in Action.Id) return Requirement is
        E : Dir.Error_Status;
        Found : Boolean;
        Gateway : Gwo.Handle;
        N : Dna.Name_Status;  
        S : Ss.Condition;  
        The_Module : Dir.Object;
        The_Object : Dir.Object;  
        The_Requirement : Dir.Object;
        The_Requirements : Dna.Iterator;
        use Asa_Definitions;
        use Dir;
        use Dna;
    begin
        Dna.Resolve (Name => Model_Gateway_Name,
                     The_Object => The_Object,
                     Status => N);
        if N /= Dna.Successful then  
            return Directory_Naming_Error (N);
        end if;

        Search_By_Id (Root => The_Object,
                      Id => Module_Id,
                      Action_Id => Action_Id,
                      Found => Found,
                      Object => The_Module);

        if Found then
            case Requirement_Id is

                when Functional_Requirement_Number =>
                    return (Kind => Functional,
                            Action_Id => Action_Id,
                            Object => The_Module,
                            Id => Requirement_Id);

                when Non_Functional_Requirement_Number =>
                    Dna.Resolve (Iter => The_Requirements,
                                 Source => Dna.Get_Full_Name (The_Module) &
                                              ".@'C(TEXT)",
                                 Status => N,
                                 Action_Id => Action_Id);
                    if N = Dna.Successful then

                        while not Dna.Done (The_Requirements) loop
                            Dna.Get_Object (Iter => The_Requirements,  
                                            The_Object => The_Requirement,
                                            Status => E);
                            if E /= Dir.Successful then
                                return Directory_Error (E);
                            end if;

                            Gwo.Open_Main_Object (Object => The_Requirement,  
                                                  H => Gateway,
                                                  Update => False,
                                                  Errors => S);
                            if Ss.Error (S) then
                                return General_Error (S);
                            end if;

                            if Requirement_Number (Asap.Asa_Id (Gateway)) =
                               Requirement_Id then

                                declare
                                    Result : Requirement
                                                (Asap.Asa_Requirement_Kind
                                                    (Gateway));
                                begin
                                    Result.Action_Id := Action_Id;
                                    Result.Object := The_Requirement;
                                    Gwo.Close (Gateway);
                                    return Result;
                                end;
                            end if;

                            Gwo.Close (Gateway);
                            Dna.Next (The_Requirements);
                        end loop;
                    else
                        return Directory_Naming_Error (N);
                    end if;
            end case;
        else
            return Module_Id_Error;
        end if;
    end Resolve;

    function Comment (Asa_Gateway_Name : in String;  
                      Action_Id : in Action.Id) return String is
        Gateway : Gwo.Handle;
        Gateway_Object : Dir.Object;
        S : Ss.Condition;
    begin
        Gwo.Open_Main_Object (Object => Asa_Gateway_Name,
                              H => Gateway,
                              Update => False,
                              Action_Id => Action_Id,
                              Errors => S);  
        if Ss.Error (S) then
            return "";
        end if;

        declare
            Comment : constant String := Asap.Asa_Comment (Gateway);
        begin
            if Comment = "" then
                Gateway_Object := Gwo.Directory_Object (Gateway);
                Gwo.Close (Gateway);
                return Dna.Get_Simple_Name (Gateway_Object);
            else
                Gwo.Close (Gateway);
                return Comment;
            end if;
        end;

    end Comment;

    function Diagnosis (Req : in Requirement) return String is
    begin
        case Req.Kind is

            when Not_A_Requirement =>
                return Diagnosis (Req.Error);

            when Functional | Non_Functional =>
                return "";
        end case;
    end Diagnosis;

    function Gateway_Full_Name (Req : in Requirement) return String is
    begin
        return Dna.Get_Full_Name (Req.Object);
    end Gateway_Full_Name;

    function Unique_Id (Req : in Requirement) return String is
        Data : Dst.Object_Data;
        E : Dir.Error_Status;
        Gateway : Gwo.Handle;
        Id : Positive;
        Module_Id : Positive;
        S : Ss.Condition;
        use Dir;
    begin
        case Req.Kind is

            when Not_A_Requirement =>
                raise Requirement_Error;

            when Functional =>

                Gwo.Open_Main_Object (Object => Req.Object,  
                                      H => Gateway,
                                      Update => False,
                                      Action_Id => Req.Action_Id,
                                      Errors => S);
                if Ss.Error (S) then
                    raise Requirement_Error;
                end if;

                Module_Id := Asap.Asa_Id (Gateway);
                Gwo.Close (Gateway);

                declare
                    Module_Id_Image : constant String :=
                       Positive'Image (Module_Id);  
                    Id_Image : constant String :=
                       Functional_Requirement_Number'Image (Req.Id);  
                begin
                    return Module_Id_Image (Module_Id_Image'First + 1 ..
                                               Module_Id_Image'Last) & '.' &
                           Id_Image (Id_Image'First + 1 .. Id_Image'Last);
                end;

            when Non_Functional =>
                Dst.Get_Object_Data (The_Object => Req.Object,  
                                     The_Data => Data,
                                     Action_Id => Req.Action_Id,
                                     Status => E);
                if E /= Dir.Successful then
                    raise Requirement_Error;
                end if;
                Gwo.Open_Main_Object (Object => Dst.Object_Parent (Data),  
                                      H => Gateway,
                                      Update => False,
                                      Action_Id => Req.Action_Id,
                                      Errors => S);
                if Ss.Error (S) then
                    raise Requirement_Error;
                end if;

                Module_Id := Asap.Asa_Id (Gateway);
                Gwo.Close (Gateway);

                Gwo.Open_Main_Object (Object => Req.Object,  
                                      H => Gateway,
                                      Update => False,
                                      Action_Id => Req.Action_Id,
                                      Errors => S);
                if Ss.Error (S) then
                    raise Requirement_Error;
                end if;

                Id := Asap.Asa_Id (Gateway);
                Gwo.Close (Gateway);

                declare
                    Module_Id_Image : constant String :=
                       Positive'Image (Module_Id);  
                    Id_Image : constant String := Positive'Image (Id);  
                begin
                    return Module_Id_Image (Module_Id_Image'First + 1 ..
                                               Module_Id_Image'Last) & '.' &
                           Id_Image (Id_Image'First + 1 .. Id_Image'Last);
                end;

        end case;
    end Unique_Id;

    function Text (Req : in Requirement) return String is
        Gateway : Gwo.Handle;
        S : Ss.Condition;
    begin
        Gwo.Open_Main_Object (Object => Req.Object,  
                              H => Gateway,
                              Update => False,
                              Action_Id => Req.Action_Id,
                              Errors => S);
        if Ss.Error (S) then
            raise Requirement_Error;
        end if;  
        case Req.Kind is

            when Not_A_Requirement =>
                raise Requirement_Error;

            when Functional =>

                declare
                    The_Text : constant String :=
                       Asap.Asa_Requirement (Gateway, Number => Req.Id);
                begin
                    Gwo.Close (Gateway);
                    return The_Text;
                end;

            when Non_Functional =>

                declare
                    The_Text : constant String :=
                       Asap.Asa_Requirement_Text (Gateway);
                begin
                    Gwo.Close (Gateway);
                    return The_Text;
                end;

        end case;
    end Text;

    function Convert (Req : in Requirement) return Permanent_Representation is
        Irep : Integer31_Permanent_Representation := (others => 0);
        Rep : Permanent_Representation;
    begin
        case Req.Kind is

            when Not_A_Requirement =>
                raise Requirement_Error;

            when Functional =>
                Irep := From_Record ((Kind => Req.Kind,
                                      Object => Req.Object,
                                      Id => Req.Id));

            when Non_Functional =>
                Irep := From_Record
                           ((Kind => Req.Kind, Object => Req.Object, Id => 1));
        end case;
        for I in Rep'Range loop
            Rep (I) := Integer (Irep (I));
        end loop;
        return Rep;
    end Convert;

    function Convert (Rep : in Permanent_Representation;
                      Action_Id : in Action.Id) return Requirement is
        Irep : Integer31_Permanent_Representation;
        Rrep : Record_Permanent_Representation;
    begin  
        for I in Rep'Range loop
            Irep (I) := Integer31 (Rep (I));
        end loop;

        Rrep := To_Record (Irep);

        declare
            Result : Requirement (Rrep.Kind);
        begin
            case Result.Kind is

                when Not_A_Requirement =>
                    raise Requirement_Error;

                when Functional =>
                    Result.Action_Id := Action_Id;
                    Result.Object := Rrep.Object;
                    Result.Id := Rrep.Id;

                when Non_Functional =>
                    Result.Action_Id := Action_Id;
                    Result.Object := Rrep.Object;
            end case;
            return Result;
        end;

    end Convert;


    --                    ----------------------------
    --                    ( . ) Requirements hierarchy
    --                    ----------------------------


    function Resolve (Asa_Gateway_Name : in String;  
                      Kind : in Requirement_Kind;
                      Action_Id : Action.Id) return Requirement_Iterator is

        type Object_And_Id is
            record
                Object : Dir.Object;
                Id : Positive;
            end record;

        type Objects_And_Ids is array (Count range <>) of Object_And_Id;

        E : Dir.Error_Status;
        Gateway : Gwo.Handle;
        Gateway_Object : Dir.Object;
        Gateway_Objects : Dna.Iterator;
        N : Dna.Name_Status;  
        Result : Requirement_Iterator;
        S : Ss.Condition;
        Size : Count := 0;
        The_Objects : Objects_And_Ids (Count range 1 .. Count'Last);

        function "<" (Left : in Object_And_Id; Right : in Object_And_Id)
                     return Boolean is
        begin
            return Left.Id < Right.Id;
        end "<";

        procedure Sort_By_Id is
           new Table_Sort_Generic (Element => Object_And_Id,
                                   Index => Count,
                                   Element_Array => Objects_And_Ids);

        use Dir;
        use Dna;
    begin
        case Kind is

            when Not_A_Requirement =>
                raise Requirement_Error;

            when Functional =>
                Dna.Resolve (Name => Asa_Gateway_Name,
                             The_Object => Gateway_Object,
                             Status => N,
                             Action_Id => Action_Id);
                if N /= Dna.Successful then
                    raise Requirement_Error;
                end if;  
                Gwo.Open_Main_Object (Object => Gateway_Object,  
                                      H => Gateway,
                                      Update => False,
                                      Action_Id => Action_Id,
                                      Errors => S);
                if Ss.Error (S) then
                    raise Requirement_Error;
                end if;
                for R in reverse Functional_Requirement_Number loop
                    if Asap.Asa_Requirement (Gateway, Number => R) /= "" then
                        Size := Count (R);
                        exit;  
                    end if;
                end loop;  
                Gwo.Close (Gateway);  
                Result := (Size => Size,
                           Pos => 1,
                           Contents => (others => (Kind => Functional,
                                                   Action_Id => Action_Id,
                                                   Object => Gateway_Object,
                                                   Id => 1)));
                for I in Result.Contents'Range loop
                    Result.Contents (I).Id := Functional_Requirement_Number (I);
                end loop;  
                return Result;

            when Non_Functional =>
                Dna.Resolve (Source => Asa_Gateway_Name & ".@'C(Text)",
                             Iter => Gateway_Objects,
                             Status => N,
                             Action_Id => Action_Id);
                if N /= Dna.Undefined then
                    if N /= Dna.Successful then
                        raise Requirement_Error;
                    end if;
                    while not Dna.Done (Gateway_Objects) loop
                        Dna.Get_Object (Iter => Gateway_Objects,
                                        The_Object => Gateway_Object,
                                        Status => E);
                        if E /= Dir.Successful then
                            raise Requirement_Error;
                        end if;  
                        Gwo.Open_Main_Object (Object => Gateway_Object,  
                                              H => Gateway,
                                              Update => False,
                                              Action_Id => Action_Id,
                                              Errors => S);
                        if Ss.Error (S) then
                            raise Requirement_Error;
                        end if;
                        if Asap.Asa_Requirement_Kind (Gateway) = Kind then
                            Size := Size + 1;
                            The_Objects (Size) := (Object => Gateway_Object,
                                                   Id => Asap.Asa_Id (Gateway));
                        end if;
                        Gwo.Close (Gateway);
                        Dna.Next (Gateway_Objects);
                    end loop;
                end if;

                Sort_By_Id (The_Objects (The_Objects'First .. Size));

                declare
                    Null_Requirement : Requirement (Kind);
                begin  
                    Null_Requirement.Action_Id := Action_Id;
                    Null_Requirement.Object := Dir.Nil;
                    Result := (Size => Size,
                               Pos => 1,
                               Contents => (others => Null_Requirement));
                end;

                for I in Result.Contents'Range loop
                    Result.Contents (I).Object := The_Objects (I).Object;
                end loop;  
                return Result;
        end case;
    end Resolve;

    function Value (Reqs : in Requirement_Iterator) return Requirement is
    begin  
        return Reqs.Contents (Reqs.Pos);
    end Value;

    function Done (Reqs : in Requirement_Iterator) return Boolean is
    begin
        return Reqs.Pos > Reqs.Size;
    end Done;

    procedure Next (Reqs : in out Requirement_Iterator) is
    begin
        Reqs.Pos := Reqs.Pos + 1;
    end Next;

    procedure Add (Req : in Requirement; Reqs : in out Requirement_Iterator) is
        Result : Requirement_Iterator (Reqs.Size + 1);
    begin
        Result.Pos := Reqs.Pos;
        Result.Contents := Reqs.Contents & Req;
        Reqs := Result;
    end Add;

    procedure Remove (Req : in Requirement;
                      Reqs : in out Requirement_Iterator) is
        Result : Requirement_Iterator (Reqs.Size - 1);
    begin
        for I in Reqs.Contents'Range loop
            if Reqs.Contents (I) = Req then
                Result.Contents := Reqs.Contents (1 .. I - 1) &
                                      Reqs.Contents (I + 1 .. Reqs.Size);
            end if;
        end loop;
        Reqs := Result;
    end Remove;


    --                    ----------------
    --                    ( ) Dependencies
    --                    ----------------


    function Get_Dependents (Req : in Requirement) return Dependents is
        Dependent_Objects : Dna.Iterator;
        E : Dir.Error_Status;
        Gateway : Gwo.Handle;  
        N : Dna.Name_Status;
        S : Ss.Condition;
        Size : Count := 0;
        The_Objects : Object_List (Count);

        function Asa_Dependents (Req : in Requirement) return String is
        begin
            case Req.Kind is

                when Not_A_Requirement =>
                    raise Requirement_Error;

                when Functional =>
                    return Asap.Asa_Dependents (Gateway, Number => Req.Id);

                when Non_Functional =>
                    return Asap.Asa_Dependents (Gateway);
            end case;
        end Asa_Dependents;

        use Dir;
        use Dna;
    begin
        Gwo.Open_Main_Object (Object => Req.Object,  
                              H => Gateway,
                              Update => False,
                              Action_Id => Req.Action_Id,
                              Errors => S);
        if Ss.Error (S) then
            return General_Error (S);
        end if;

        declare
            The_Dependents : constant String := Asa_Dependents (Req);
        begin

            Gwo.Close (Gateway, S);
            if Ss.Error (S) then
                return General_Error (S);
            end if;

            if The_Dependents = "" then
                return (Is_Bad => False,
                        Objects => new Object_List'(1 .. 0 => Dir.Nil));
                pragma Heap (Job_Segment.Get);
            end if;

            Dna.Resolve (Iter => Dependent_Objects,
                         Source => '[' & The_Dependents &
                                      "]'S(Installed,Coded)",
                         Status => N,
                         Objects_Only => False,
                         Action_Id => Req.Action_Id);
        end;

        if N = Dna.Undefined then
            return (Is_Bad => False,
                    Objects => new Object_List'(1 .. 0 => Dir.Nil));
            pragma Heap (Job_Segment.Get);
        elsif N /= Dna.Successful then
            return Directory_Naming_Error (N);
        end if;

        while not Dna.Done (Dependent_Objects) loop
            Size := Size + 1;  
            Dna.Get_Object (Iter => Dependent_Objects,
                            The_Object => The_Objects (Size),
                            Status => E);
            if E /= Dir.Successful then
                return Directory_Error (E);
            end if;
            Dna.Next (Dependent_Objects);
        end loop;

        return (Is_Bad => False,
                Objects => new Object_List'(The_Objects (1 .. Size)));
        pragma Heap (Job_Segment.Get);
    end Get_Dependents;

    procedure Set_Dependents (Req : in Requirement;  
                              Dep : in Dependents) is
        Dependent_Objects : Dna.Iterator;
        Gateway : Gwo.Handle;
        S : Ss.Condition;
        Size : Count := 0;
        The_Objects : Object_List (Count);
    begin
        if Dep.Is_Bad then
            raise Dependent_Error;
        end if;
        Gwo.Open_Main_Object (Object => Req.Object,  
                              H => Gateway,
                              Update => False,
                              Action_Id => Req.Action_Id,
                              Errors => S);
        if Ss.Error (S) then
            raise Requirement_Error;
        end if;

        case Req.Kind is

            when Not_A_Requirement =>
                raise Requirement_Error;

            when Functional =>
                Asap.Set_Asa_Dependents
                   (Gateway,
                    Number => Req.Id,
                    Value => Name (Objects => Dep.Objects.all, Before => ""));

            when Non_Functional =>
                Asap.Set_Asa_Dependents
                   (Gateway,
                    Value => Name (Objects => Dep.Objects.all, Before => ""));
        end case;

        Gwo.Close (Gateway);
    end Set_Dependents;

    procedure Add (Dep : in out Dependents;  
                   Onto : in String) is
        N : Dna.Name_Status;
        The_Object : Dir.Object;
        use Dna;
    begin
        if Dep.Is_Bad then
            raise Dependent_Error;
        end if;
        Dna.Resolve (Name => Onto,
                     The_Object => The_Object,
                     Status => N,
                     Action_Id => Action.Null_Id);
        Dep := (Is_Bad => False,
                Objects => new Object_List'(Dep.Objects.all & The_Object));
        pragma Heap (Job_Segment.Get);
    end Add;

    procedure Remove (Dep : in out Dependents;  
                      Onto : in String) is
        N : Dna.Name_Status;
        The_Object : Dir.Object;
        use Dir;
    begin
        if Dep.Is_Bad then
            raise Dependent_Error;
        end if;
        Dna.Resolve (Name => Onto,
                     The_Object => The_Object,
                     Status => N,
                     Action_Id => Action.Null_Id);
        for I in Dep.Objects'Range loop
            if The_Object = Dep.Objects (I) then

                Dep := (Is_Bad => False,
                        Objects => new Object_List'
                                          (Dep.Objects
                                              (Dep.Objects'First .. I - 1) &
                                           Dep.Objects
                                              (I + 1 .. Dep.Objects'Last)));
                pragma Heap (Job_Segment.Get);

            end if;
        end loop;
    end Remove;

    function Diagnosis (Dep : in Dependents) return String is
    begin
        case Dep.Is_Bad is

            when False =>
                return "";

            when True =>
                return Diagnosis (Dep.Error);
        end case;
    end Diagnosis;

end Requirements;

E3 Meta Data

    nblk1=21
    nid=0
    hdr6=42
        [0x00] rec0=22 rec1=00 rec2=01 rec3=024
        [0x01] rec0=18 rec1=00 rec2=02 rec3=01e
        [0x02] rec0=1e rec1=00 rec2=03 rec3=074
        [0x03] rec0=1a rec1=00 rec2=04 rec3=082
        [0x04] rec0=1c rec1=00 rec2=05 rec3=020
        [0x05] rec0=1a rec1=00 rec2=06 rec3=030
        [0x06] rec0=1c rec1=00 rec2=07 rec3=038
        [0x07] rec0=1a rec1=00 rec2=08 rec3=012
        [0x08] rec0=1c rec1=00 rec2=09 rec3=04c
        [0x09] rec0=17 rec1=00 rec2=0a rec3=072
        [0x0a] rec0=14 rec1=00 rec2=0b rec3=042
        [0x0b] rec0=18 rec1=00 rec2=0c rec3=03a
        [0x0c] rec0=20 rec1=00 rec2=0d rec3=03e
        [0x0d] rec0=20 rec1=00 rec2=0e rec3=07c
        [0x0e] rec0=17 rec1=00 rec2=0f rec3=04e
        [0x0f] rec0=15 rec1=00 rec2=10 rec3=066
        [0x10] rec0=1b rec1=00 rec2=11 rec3=04e
        [0x11] rec0=22 rec1=00 rec2=12 rec3=02e
        [0x12] rec0=1b rec1=00 rec2=13 rec3=006
        [0x13] rec0=21 rec1=00 rec2=14 rec3=06c
        [0x14] rec0=20 rec1=00 rec2=15 rec3=016
        [0x15] rec0=19 rec1=00 rec2=16 rec3=00c
        [0x16] rec0=15 rec1=00 rec2=17 rec3=004
        [0x17] rec0=12 rec1=00 rec2=18 rec3=044
        [0x18] rec0=15 rec1=00 rec2=19 rec3=05a
        [0x19] rec0=1e rec1=00 rec2=1a rec3=014
        [0x1a] rec0=1e rec1=00 rec2=1b rec3=006
        [0x1b] rec0=1e rec1=00 rec2=1c rec3=018
        [0x1c] rec0=1c rec1=00 rec2=1d rec3=046
        [0x1d] rec0=1b rec1=00 rec2=1e rec3=054
        [0x1e] rec0=1f rec1=00 rec2=1f rec3=01a
        [0x1f] rec0=1f rec1=00 rec2=20 rec3=04c
        [0x20] rec0=1f rec1=00 rec2=21 rec3=000
    tail 0x2150c079c8230772f270d 0x42a00088462060003