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

⟦38d7dee24⟧ Ada Source

    Length: 67584 (0x10800)
    Types: Ada Source
    Notes: 03_class, FILE, Long Ada Source, R1k_Segment, e3_tag, generic, package body Lrm_Utilities, seg_028aed

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 Unbounded_String;
with String_Utilities;
with Universal;
with Ada_Program;
with Diana;  
with Lrm_Renames;
use Lrm_Renames;
package body Lrm_Utilities is

    package Unbounded is new Unbounded_String (80);

    type State is
        record
            Data_Types_List : Ada.Element_List := Ada.Nil_List;
        end record;

    function Diana_Node (An_Element : Ada_Program.Element) return Diana.Tree
        renames Ada_Program.Conversion.Convert;

    function Count (Elements : Ada_Program.Element_Iterator) return Natural is
        Iter  : Ada_Program.Element_Iterator := Elements;
        Count : Natural := 0;
    begin
        while not Ada_Program.Done (Iter) loop
            Count := Count + 1;
            Ada_Program.Next (Iter);
        end loop;  
        return Count;
    end Count;

    function Count (Elements : Ada_Program.Element_List) return Natural is
        Iter  : Ada_Program.Element_List := Elements;
        Count : Natural := 0;
    begin
        while not Ada_Program.Done (Iter) loop
            Count := Count + 1;
            Ada_Program.Next (Iter);
        end loop;  
        return Count;
    end Count;

    function Ground_Type (Type_Def : Ada_Program.Type_Definition)
                         return Ada_Program.Type_Definition is
        Local : Ada.Element := Type_Def;
    begin
        loop
            case Types.Kind (Local) is
                when Types.A_Subtype_Indication =>
                    Local := Decls.Type_Specification
                                (Ada.Definition (Types.Type_Mark (Local)));
                when Types.A_Derived_Type_Definition =>
                    Local := Types.Derived_From (Local);
                when others =>
                    return Local;
            end case;
        end loop;
    end Ground_Type;
    function Is_Named_Loop
                (Loop_Statement : Ada_Program.Statement) return Boolean is
    begin
        case Diana.Kind (Ada.Conversion.Convert (Loop_Statement)) is
            when Diana.Dn_Named_Stm =>
                return True;
            when others =>
                return False;
        end case;
    end Is_Named_Loop;
    function Get_Named_Loop (Statement_Element : Ada_Program.Element)
                            return Ada_Program.Statement is
        Tree : Diana.Tree := Ada.Conversion.Convert (Statement_Element);
    begin
        case Diana.Kind (Tree) is
            when Diana.Dn_Named_Stm =>
                return Ada.Conversion.Convert (Diana.As_Stm (Tree));
            when others =>
                raise Ada.Inappropriate_Program_Element;
        end case;
    end Get_Named_Loop;

    function Loop_Name (Named_Loop : Ada_Program.Element) return String is
        Tree : Diana.Tree := Ada.Conversion.Convert (Named_Loop);
    begin
        case Diana.Kind (Tree) is
            when Diana.Dn_Named_Stm =>
                return Diana.Image (Diana.Lx_Symrep (Diana.As_Id (Tree)));
            when others =>
                raise Ada.Inappropriate_Program_Element;
        end case;

    end Loop_Name;
    function Is_Named_Parameter_Id
                (Id_Ref : Ada_Program.Identifier_Reference) return Boolean is

        Elem_Diana : Diana.Tree := Ada_Program.Conversion.Convert (Id_Ref);
    begin
        case Diana.Kind (Elem_Diana) is
            when Diana.Dn_Used_Name_Id =>
                case Diana.Kind (Diana.As_Parent (Elem_Diana)) is
                    when Diana.Dn_Choice_S =>
                        return True;
                    when others =>
                        return False;
                end case;
            when others =>
                return False;
        end case;
    end Is_Named_Parameter_Id;

    function Is_Actual_Declaration
                (Item : Ada_Program.Element) return Boolean is
    begin
        return Item = Declarations.Enclosing_Declaration (Item);
    end Is_Actual_Declaration;

    function Is_Initialized  
                (Object_Decl : Declarations.Object_Declaration)
                return Boolean is
        Decl : Diana.Tree := Diana_Node (Object_Decl);
    begin
        if Diana."=" (Diana.Kind (Decl), Diana.Dn_Dscrmt_Var) then
            return not Diana.Is_Empty (Diana.As_Object_Def (Decl));
        else
            return Declarations.Is_Initialized (Object_Decl);
        end if;
    end Is_Initialized;

    function In_Scope (Subprogram_Name : String;
                       Of_Element      : Ada_Program.Element) return Boolean is

        Found      : Boolean := False;
        Scope      : Ada_Program.Element;
        Scope_Kind : Ada_Program.Element_Kinds;
        Decl_Kind  : Declarations.Declaration_Kinds;
        Decl_List  : Ada_Program.Element_Iterator;
    begin

        Scope      := Ada_Program.Parent (Of_Element);
        Scope_Kind := Ada_Program.Kind (Scope);
        case Scope_Kind is
            when Ada.A_Declaration =>

                Decl_Kind := Declarations.Kind (Scope);
                case Decl_Kind is
                    when Declarations.A_Package_Body_Declaration =>
                        Decl_List :=
                           Stmts.Declarative_Items
                              (Declarations.Package_Body_Block (Scope));
                    when Declarations.A_Procedure_Body_Declaration |
                         Declarations.A_Function_Body_Declaration =>
                        Decl_List := Stmts.Declarative_Items
                                        (Declarations.Subprogram_Block (Scope));  
                    when Declarations.A_Task_Body_Declaration =>
                        Decl_List := Stmts.Declarative_Items
                                        (Declarations.Task_Body_Block (Scope));
                    when Declarations.A_Package_Declaration =>
                        Decl_List :=
                           Declarations.Visible_Part_Declarations (Scope);
                    when Declarations.Not_A_Declaration =>
                        --if Scope /= Ada_Program.Nil_Element and then
                        -- stmts.Kind (Scope) =
                        --stmts.A_Block_Statement then
                        --Decl_List := stmts.Declarative_Items (Scope);
                        --else
                        return False;
                        --end if;
                    when others =>
                        return False;
                end case;
            when Ada.A_Compilation_Unit =>
                declare
                    Unit : Ada.Element := Comp_Units.Unit_Declaration (Scope);
                    Unit_Kind : Declarations.Declaration_Kinds :=
                       Declarations.Kind (Unit);
                begin
                    if (Unit_Kind = Declarations.A_Procedure_Declaration or else
                        Unit_Kind = Declarations.
                                       A_Function_Declaration) and then
                       String_Utilities.Equal
                          (Declarations.Name (Unit), Subprogram_Name) then
                        return True;
                    else
                        return False;
                    end if;
                end;
            when Ada.A_Statement =>
                if Stmts.Kind (Scope) = Stmts.A_Block_Statement then
                    Decl_List := Stmts.Declarative_Items (Scope);
                else
                    return False;
                end if;
            when others =>
                return False;
        end case;

        while not Ada_Program.Done (Decl_List) loop
            declare
                A_Decl : Ada_Program.Element;
            begin
                A_Decl    := Ada_Program.Value (Decl_List);  
                Decl_Kind := Declarations.Kind (A_Decl);
                if (Decl_Kind = Declarations.A_Procedure_Declaration or else
                    Decl_Kind = Declarations.
                                   A_Procedure_Body_Declaration or else
                    Decl_Kind = Declarations.A_Function_Declaration or else
                    Decl_Kind = Declarations.
                                   A_Function_Body_Declaration) and then
                   String_Utilities.Equal
                      (Declarations.Name (A_Decl), Subprogram_Name) then
                    Found := True;
                    exit;
                end if;
                Ada_Program.Next (Decl_List);
            end;
        end loop;

        return Found;
    end In_Scope;

    generic
        type T is private;
        with function Static_Value (Expr : Ada_Program.Expression) return T;
    function Look_Through (Expr : Ada_Program.Expression) return T;

    function Look_Through (Expr : Ada_Program.Expression) return T is

    begin
        case Exprs.Kind (Expr) is
            when Exprs.An_Attribute =>
                declare
                    Att_Name : constant String :=
                       Ada_Program.Image
                          (Exprs.Attribute_Designator_Name (Expr));

                    Type_Spec  : Ada_Program.Element :=
                       Declarations.Type_Specification
                          (Ada_Program.Definition (Expr));
                    Constraint : Ada_Program.Element;
                    Range_Info : Ada_Program.Element;

                    Ubound, Lbound : Ada_Program.Element;
                begin
                    loop
                        case Types.Kind (Type_Spec) is
                            when Types.A_Subtype_Indication =>
                                Constraint := Types.Constraint (Type_Spec);
                                case Types.Constraint_Kind (Constraint) is

                                    when Types.A_Simple_Range =>
                                       Range_Info := Constraint;
                                    when Types.A_Floating_Point_Constraint =>
                                        Range_Info :=
                                           Types.Floating_Point_Constraint
                                              (Constraint);
                                    when Types.A_Fixed_Point_Constraint =>
                                        Range_Info :=
                                           Types.Fixed_Point_Constraint
                                              (Constraint);
                                    when others =>
                                        Type_Spec := Declarations.
                                                        Type_Specification
                                                        (Ada_Program.Definition
                                                            (Type_Spec));

                                end case;

                                case Types.Constraint_Kind (Constraint) is

                                    when Types.A_Simple_Range |
                                         Types.A_Floating_Point_Constraint |
                                         Types.A_Fixed_Point_Constraint =>

                                        Types.Bounds (Range_Info,
                                                      Lbound, Ubound);

                                        if String_Utilities.Equal
                                              (Att_Name, "FIRST") then
                                            return Static_Value (Lbound);
                                        elsif String_Utilities.Equal
                                                 (Att_Name, "LAST") then
                                            return Static_Value (Ubound);
                                        else
                                            raise Not_Static;
                                        end if;
                                    when others =>
                                        null;
                                end case;

                            when Types.A_Derived_Type_Definition =>
                                Type_Spec := Types.Derived_From (Type_Spec);
                            when others =>
                                raise Not_Static;
                        end case;
                    end loop;

                end;
            when Exprs.A_Simple_Name | Exprs.A_Selected_Component =>

                declare
                    Def : Ada.Element := Ada_Program.Definition (Expr);
                begin
                    case Declarations.Kind (Def) is
                        when Declarations.A_Constant_Declaration =>
                            return Static_Value
                                      (Declarations.Initial_Value (Def));
                        when others =>
                            raise Not_Static;
                    end case;
                end;
            when others =>
                raise Not_Static;
        end case;
    end Look_Through;

    function Integer_Look_Through is
       new Look_Through (Long_Integer, Static_Value);
    function Float_Look_Through   is new Look_Through (Float, Static_Value);

    function Static_Value (Expression : Ada_Program.Expression)
                          return Long_Integer is
        Exp : Diana.Tree := Ada_Program.Conversion.Convert (Expression);
        Li  : Long_Integer;
    begin
        if Exprs.Is_Literal (Expression) then
            return Exprs.Position_Number (Expression);
        end if;

        case Diana.Kind (Diana.Sm_Value (Exp)) is
            when Diana.Integer_Valued =>
                Li := Universal.Convert (Diana.Integer_Value
                                            (Diana.Sm_Value (Exp)));
                return Li;
            when Diana.Float_Valued =>
               raise Not_Static;
            when Diana.No_Value | Diana.Uninitialized =>
                return Integer_Look_Through (Expression);
        end case;
    exception
        when others =>
            raise Not_Static;
    end Static_Value;

    function Static_Value (Expression : Ada_Program.Expression) return Float is
        Exp : Diana.Tree := Ada_Program.Conversion.Convert (Expression);
        Fl  : Float;
        Ufl : Universal.Float;
    begin
        case Diana.Kind (Diana.Sm_Value (Exp)) is
            when Diana.Float_Valued =>
                Ufl := Diana.Float_Value (Diana.Sm_Value (Exp));
                Fl  := Universal.Convert (Ufl);
                return Fl;
            when Diana.Integer_Valued =>
                raise Not_Static;
            when others =>
                return Float_Look_Through (Expression);
        end case;
    exception
        when others =>
            raise Not_Static;
    end Static_Value;

    function Is_Actual_Variable_Declaration
                (Variable_Declaration : Ada_Program.Element) return Boolean is
        Parent : Ada_Program.Element :=
           Ada_Program.Parent (Variable_Declaration);
    begin
        case Declarations.Kind (Parent) is
            when Declarations.A_Type_Declaration =>
                return False;
            when others =>
                return True;
        end case;
    end Is_Actual_Variable_Declaration;

    function Is_Library_Unit_Id
                (Decl : Ada_Program.Declaration) return Boolean is
        Parent : Ada_Program.Element;
    begin
        case Ada_Program.Id_Kind (Decl) is
            when Ada_Program.An_Identifier_Definition =>
                Parent := Ada_Program.Parent
                             (Declarations.Enclosing_Declaration (Decl));
                return Ada_Program.Kind (Parent) =
                          Ada_Program.A_Compilation_Unit;
            when others =>
                return False;
        end case;
    end Is_Library_Unit_Id;

    function Qualified_Reference
                (Decl : Ada_Program.Declaration) return String is

        Parent_Comp_Unit_Name : constant String :=
           Declarations.Name (Comp_Units.Unit_Declaration
                                 (Comp_Units.Parent_Compilation_Unit (Decl)));

        function Parent_Name (Decl : Ada_Program.Declaration) return String is
            Enclosing : Ada_Program.Declaration :=
               Declarations.Enclosing_Declaration (Ada_Program.Parent (Decl));
        begin
            if Is_Actual_Declaration (Decl) or Is_Library_Unit_Id (Decl) then
                null;
            else
                Enclosing := Declarations.Enclosing_Declaration
                                (Ada_Program.Parent (Enclosing));
            end if;

            declare
                Name : constant String := Declarations.Name (Enclosing);
            begin
                if String_Utilities.Equal (Name, Parent_Comp_Unit_Name) then
                    return Name;
                else
                    return Parent_Name (Enclosing) & "." & Name;
                end if;
            end;
        end Parent_Name;
    begin
        if Is_Library_Unit_Id (Decl) or
           String_Utilities.Equal ("Standard", Parent_Comp_Unit_Name) then
            return Declarations.Name (Decl);
        else
            return Parent_Name (Decl) & "." & Declarations.Name (Decl);
        end if;
    end Qualified_Reference;
    function Get_Full_Name (Simple_Name : Ada_Program.Element)
                           return Ada_Program.Element is
        Local  : Diana.Tree := Ada.Conversion.Convert (Simple_Name);
        Parent : Diana.Tree;
    begin
        loop
            Parent := Diana.As_Parent (Local);
            case Diana.Kind (Parent) is
                when Diana.Dn_Selected | Diana.Dn_Indexed =>
                    ocal := Parent;
                when others =>
                    return Ada.Conversion.Convert (Local);
            end case;
        end loop;
    end Get_Full_Name;


    function Hash (Elem : Ada_Program.Element) return Integer is
        Id : Long_Integer := Ada_Program.Conversion.Unique_Id (Elem);
    begin
        return Integer (Id mod Long_Integer (Integer'Last));
    end Hash;

    function Comp_Unit_Id (For_Element : Ada_Program.Element)
                          return Ada_Program.Identifier_Definition is
    begin
        return Ada.Value (Declarations.Identifiers
                             (Comp_Units.Unit_Declaration
                                 (Comp_Units.Parent_Compilation_Unit
                                     (For_Element))));
    end Comp_Unit_Id;
    function Pragma_Name (For_Pragma : Pragmas.Pragma_Kinds) return String is
    begin
        case For_Pragma is
            when Pragmas.Controlled =>
                return "Controlled";
            when Pragmas.Elaborate =>
                return "Elaborate";
            when Pragmas.Inline =>
                return "Inline";
            when Pragmas.Interface =>
                return "Interface";
            when Pragmas.List =>
                return "List";
            when Pragmas.Memory_Size =>
                return "Memory_Size";
            when Pragmas.Optimize =>
                return "Optimize";
            when Pragmas.Pack =>
                return "Pack";
            when Pragmas.Page =>
                return "Page";
            when Pragmas.Priority =>
                return "Priority";
            when Pragmas.Shared =>
                return "Shared";
            when Pragmas.Storage_Unit =>
                return "Storage_Unit";
            when Pragmas.Suppress =>
                return "Suppress";
            when Pragmas.System_Name =>
                return "System_Name";
            when Pragmas.Bias_Key =>
                return "Bias_Key";
            when Pragmas.Closed_Private_Part =>
                return "Closed_PRivate_Part";
            when Pragmas.Disable_Deallocation =>
                return "Disable_Deallocation";
            when Pragmas.Enable_Deallocation =>
                return "Enable_Deallocation";
            when Pragmas.Loaded_Main =>
                return "Loaded_Main";
            when Pragmas.Main =>
                return "Main";
            when Pragmas.Module_Name =>
                return "Module_Name";
            when Pragmas.Must_Be_Constrained =>
                return "Must_Be_Constrained";
            when Pragmas.Open_Private_Part =>
                return "Open_Private_Part";
            when Pragmas.Page_Limit =>
                return "Page_Limit";
            when Pragmas.Private_Eyes_Only =>
                return "Private_Eyes_Only";
            when Pragmas.Subsystem =>
                return "Subsystem";
            when others =>
                return "UNKNOWN";
        end case;

    end Pragma_Name;
    function Is_Numeric_Type (Type_Decl : Ada_Program.Element) return Boolean is
        Ground : Ada.Element := Types.Ground_Type
                                   (Decls.Type_Specification (Type_Decl));
    begin
        case Types.Kind (Ground) is
            when Types.An_Integer_Type_Definition |
                 Types.A_Float_Type_Definition |
                 Types.A_Fixed_Type_Definition =>
                return True;
            when others =>
                return False;
        end case;
    end Is_Numeric_Type;
    function Position_Number
                (Enum_Lit_Or_Id : Ada_Program.Element) return Long_Integer is
        Node : Diana.Tree;
    begin
        case Exprs.Kind (Enum_Lit_Or_Id) is
            when Exprs.An_Enumeration_Literal =>
                return Exprs.Position_Number (Enum_Lit_Or_Id);
            when others =>
                return Long_Integer (Diana.Sm_Pos (Ada.Conversion.Convert
                                                      (Enum_Lit_Or_Id)));
        end case;
    exception
        when others =>
            raise Ada.Inappropriate_Program_Element;
    end Position_Number;

    function Is_Name_Id (Elem : Ada_Program.Element) return Boolean is
        Elem_Diana : Diana.Tree := Ada_Program.Conversion.Convert (Elem);
    begin
        case Diana.Kind (Elem_Diana) is
            when Diana.Dn_Used_Name_Id =>
                case Diana.Kind (Diana.As_Parent (Elem_Diana)) is
                    when Diana.Dn_Choice_S =>
                        return True;
                    when others =>
                        return False;
                end case;
            when others =>
                return False;
        end case;
    end Is_Name_Id;

    function Get_Component_Expression
                (Named : String; In_Aggregate : Ada_Program.Element)
                return Ada_Program.Element is
        Components : Ada.Element_Iterator := Exprs.Components (In_Aggregate);
        Component  : Ada.Element;
        Choice     : Ada.Element;
        Id         : Ada.Element;
    begin
        while not Ada.Done (Components) loop
            Component := Ada.Value (Components);
            Choice    := Ada.Value (Exprs.Component_Choices (Component));
            Id        := Types.Choice_Identifier (Choice);

            if String_Utilities.Equal (Named, Ada.String_Name (Id)) then  
                return (Exprs.Component_Expression (Component));
            end if;

            Ada.Next (Components);
        end loop;

        raise No_Component;
    end Get_Component_Expression;

    function Is_Boolean
                (Type_Def : Type_Information.Type_Definition) return Boolean is
        Type_Decl : Ada_Program.Element :=
           Declarations.Enclosing_Declaration (Type_Def);
    begin
        return String_Utilities.Equal
                  ("BOOLEAN", Declarations.Name
                                 (Declarations.Enclosing_Declaration
                                     (Type_Decl)));
    end Is_Boolean;

    function Is_Character_Literal (Elem : Ada.Element) return Boolean is
        Node : Diana.Tree := Ada.Conversion.Convert (Elem);
    begin
        case Diana.Kind (Node) is
            when Diana.Dn_Def_Char =>
                return True;
            when others =>
                return False;
        end case;
    end Is_Character_Literal;

    function Is_Character (Enum_Type_Def : Type_Information.Type_Definition)
                          return Boolean is
        Lits  : Ada.Element_Iterator;
        A_Lit : Ada.Element;
    begin
        Lits := Type_Information.Enumeration_Literals (Enum_Type_Def);
        while not Ada.Done (Lits) loop
            A_Lit := Ada.Value (Lits);
            if Is_Character_Literal (A_Lit) then
               -- character types are those with a least one
                -- character literal in their enumeration list.
                return True;
            end if;

            Ada.Next (Lits);
        end loop;
        return False;
    end Is_Character;

    function Get_Kind (Type_Def : Type_Information.Type_Definition)
                      return Type_Kinds is
    begin
        if Ada_Program.Is_Nil (Type_Def) then
            return None_Of_Above;  -- perhaps an incomplete type
        end if;

        case Type_Information.Kind (Type_Def) is
            when Type_Information.A_Subtype_Indication =>
                return A_Subtype;
            when Type_Information.An_Enumeration_Type_Definition =>
                if Is_Character (Type_Def) then
                    return A_Character_Type;
                elsif Type_Information.Is_Predefined (Type_Def) and then
                      Is_Boolean (Type_Def) then
                    return A_Boolean_Type;
                else
                    return An_Enumeration;
                end if;
            when Type_Information.An_Integer_Type_Definition =>
                return An_Integer_Type;
            when Type_Information.A_Float_Type_Definition =>
                return A_Float_Type;
            when Type_Information.A_Fixed_Type_Definition =>
                return A_Fixed_Type;
            when Type_Information.An_Array_Type_Definition =>
                declare
                    Comp_Type : Ada_Program.Element;
                    Comp_Id   : Ada_Program.Element;
                begin
                    Comp_Type := Type_Information.Component_Type (Type_Def);
                    Comp_Id   := Ada_Program.Definition (Comp_Type);
                    case Get_Kind (Declarations.Type_Specification (Comp_Id)) is
                        when A_Character_Type =>
                            return A_String_Type;
                        when others =>
                            return An_Array_Type;
                    end case;
                exception
                    when others =>
                        return An_Array_Type;
                end;

            when Type_Information.A_Record_Type_Definition =>
                return A_Record_Type;
            when Type_Information.An_Access_Type_Definition =>
                return An_Access_Type;
            when Type_Information.A_Derived_Type_Definition =>
                return A_Derived_Type;
            when Type_Information.A_Task_Type_Definition =>
                return A_Task_Type;
            when Type_Information.A_Private_Type_Definition =>
                return A_Private_Type;
            when Type_Information.A_Limited_Private_Type_Definition =>
                return A_Limited_Private_Type;
            when Type_Information.Not_A_Type_Definition =>
                declare
                    Tree : Diana.Tree := Ada.Conversion.Convert (Type_Def);
                begin
                    case Diana.Kind (Tree) is
                        when Diana.Dn_Universal_Real =>
                            return A_Float_Type;
                        when Diana.Dn_Universal_Fixed =>
                            return A_Fixed_Type;
                        when Diana.Dn_Universal_Integer =>
                            return An_Integer_Type;
                        when others =>
                            return None_Of_Above;
                    end case;
                end;
        end case;

    end Get_Kind;

    function Last_Line_Number
                (For_This_Element : Ada_Program.Element) return Natural is
        The_Image    : Ada_Program.Line_Iterator :=
           Ada_Program.Image (For_This_Element);
        Current_Line : Natural := Ada_Program.Line_Number (For_This_Element);

    begin
        while not Ada_Program.Done (The_Image) loop
            Current_Line := Current_Line + 1;           Ada_Program.Next (The_Image);
        end loop;  
        return Current_Line - 1;

    end Last_Line_Number;


    procedure Analyze_Element (This_Element : in     Ada.Element;
                               With_State   : in out State;
                               And_Control  : in out Ada.Traversal_Control) is
        Declaration_Kind : Decls.Declaration_Kinds :=
           Decls.Kind (A_Declaration => This_Element);
    begin  
        if Declaration_Kind = Decls.A_Type_Declaration or
           Declaration_Kind = Decls.A_Subtype_Declaration then
            Ada.Append (Program_Element => This_Element,
                        To_List         => With_State.Data_Types_List);
            And_Control := Ada.Abandon_Children;
        else
            And_Control := Ada.Continue;
        end if;
    end Analyze_Element;

    procedure No_Op (This_Element : in     Ada.Element;
                     With_State   : in out State;
                     And_Control  : in out Ada.Traversal_Control) is
    begin
        And_Control := Ada.Continue;
    end No_Op;

    procedure Traverse_For_Types is new Ada.Depth_First_Traversal
                                           (State, Analyze_Element, No_Op);

    function Types_Defined (In_This_Ada_Unit : in String)
                           return Ada_Program.Element_List is

        The_State : State;

        The_Comp_Unit : Ada.Compilation_Unit :=
           Comp_Units.Parent_Compilation_Unit
              (Of_Program_Element =>
                  Ada.Conversion.Resolve
                     (Element_Name => "\" & In_This_Ada_Unit));
    begin
        Traverse_For_Types (The_Comp_Unit,  
                            The_State,
                            Major_Elements_Only => False);
        return The_State.Data_Types_List;
    end Types_Defined;

    function Last_Rep_Clause (For_This_Type_Definition : Ada_Program.Element)
                             return Ada_Program.Element is

        Size_Rep_Spec : Ada.Element :=  
           Rep_Specs.Associated_Size (For_This_Type_Definition);

        function Enum_Rep_Clause
                    (This_Type_Def : Ada.Element) return Ada.Element is

            type Type_Defs is
                record
                    The_Definition : Ada.Element := This_Type_Def;
                    Rep_Spec       : Ada.Element := Ada.Nil_Element;
                end record;

            The_Def : Type_Defs;

            procedure Pre_Op (The_Element :        Ada.Element;
                              Type_Def    : in out Type_Defs;
                              Control     : in out Ada.Traversal_Control) is
            begin  
                case Rep_Specs.Kind (The_Element) is
                    when Rep_Specs.An_Enumeration_Representation_Clause =>
                        if Ada."=" (Type_Def.The_Definition,
                                    Rep_Specs.Associated_Type
                                       (The_Element)) then
                            Type_Def.Rep_Spec := The_Element;
                            Control           := Ada.Terminate_Immediately;
                        end if;
                    when others =>
                        null;
                end case;
            end Pre_Op;

            procedure Post_Op (The_Element :        Ada.Element;
                               Curr_State  : in out Type_Defs;
                               Control     : in out Ada.Traversal_Control) is
            begin
                Control := Ada.Continue;
            end Post_Op;

            procedure Traverse_Unit is new Ada.Depth_First_Traversal
                                              (Type_Defs, Pre_Op, Post_Op);

        begin  
            Traverse_Unit (Root_Element        =>
                              Comp_Units.Parent_Compilation_Unit
                                 (Of_Program_Element => This_Type_Def),
                           State               => The_Def,
                           Major_Elements_Only => True);
            return The_Def.Rep_Spec;

        end Enum_Rep_Clause;


    begin  
        case Type_Information.Kind (For_This_Type_Definition) is
            when Type_Information.An_Enumeration_Type_Definition =>
                declare
                    Enum_Rep_Spec : Ada.Element :=
                       Enum_Rep_Clause (For_This_Type_Definition);
                begin  
                    if Ada.Is_Nil (Enum_Rep_Spec) then
                        return Size_Rep_Spec;
                    elsif Ada.Is_Nil (Size_Rep_Spec) then
                        return Enum_Rep_Spec;
                    elsif Ada.Line_Number (Enum_Rep_Spec) >
                          Ada.Line_Number (Size_Rep_Spec) then
                        return Enum_Rep_Spec;
                    else
                        return Size_Rep_Spec;  
                    end if;
                end;
            when others =>
                return Ada.Nil_Element;
        end case;

    end Last_Rep_Clause;

    function Initial_Value (For_This_Type_Definition : Ada.Type_Definition;
                            Original_Comp_Unit_Name  : String) return String is

        function Type_Definition_From (This_Type_Identifier : Ada.Element)
                                      return Ada.Type_Definition is
            The_Type_Definition : Ada.Element;
        begin
            begin  
                The_Type_Definition :=
                   Ada.Definition (Reference => This_Type_Identifier,
                                   Visible   => True);
            exception
                when Ada.Failed =>
                    raise It_Has_No_Definition;
            end;
            return Decls.Type_Specification
                      (Type_Declaration_Or_Id =>
                          Decls.Enclosing_Declaration
                             (Element => The_Type_Definition));
        end Type_Definition_From;

        function Lower_Bound (Of_This_Discrete_Range : Ada.Element)
                             return Ada.Expression is
            Lower, Upper : Ada.Expression;
        begin
            Types.Bounds (Of_This_Discrete_Range, Lower, Upper);
            return Lower;
        end Lower_Bound;

        function Prefix_Name (For_This_Type_Definition : Ada.Type_Definition;
                              Original_Comp_Unit_Name : String) return String is  
            This_Prefix : constant String :=
               Declarations.Name (Comp_Units.Unit_Declaration
                                     (Comp_Units.Parent_Compilation_Unit
                                         (For_This_Type_Definition)));
        begin
            if This_Prefix = Original_Comp_Unit_Name then
                return "";
            elsif This_Prefix = "Standard" then
                return "";
            else
                return This_Prefix & ".";
            end if;
        end Prefix_Name;


    begin
        declare
            Full_Type_Name : constant String :=
               Prefix_Name (For_This_Type_Definition, Original_Comp_Unit_Name) &
                  Decls.Name (A_Declaration =>
                                 Types.Parent_Declaration
                                    (Type_Def => For_This_Type_Definition));
        begin
            case Types.Kind (A_Type_Definition => For_This_Type_Definition) is

                when Types.An_Enumeration_Type_Definition |
                     Types.An_Integer_Type_Definition |
                     Types.A_Float_Type_Definition |
                     Types.A_Fixed_Type_Definition =>
                    return Full_Type_Name & "'First";


                when Types.An_Access_Type_Definition =>
                    return "null";


                when Types.A_Subtype_Indication =>
                    declare
                        Constraint : Ada.Element :=
                           Types.Constraint (For_This_Type_Definition);
                    begin  
                        case Types.Constraint_Kind (Constraint) is
                            when Types.An_Index_Constraint =>
                                return
                                   "(others => " &
                                      Initial_Value
                                         (Type_Definition_From
                                             (This_Type_Identifier =>
                                                 Types.Component_Type
                                                    (Array_Type =>
                                                        Type_Definition_From
                                                           (This_Type_Identifier =>
                                                               For_This_Type_Definition))),
                                          Original_Comp_Unit_Name) &
                                      ")";

                            when Types.Not_A_Constraint =>
                                return Initial_Value
                                          (Type_Definition_From
                                              (For_This_Type_Definition),
                                           Original_Comp_Unit_Name);

                            when others =>
                                return Full_Type_Name & "'First";
                        end case;
                    end;

                when Types.A_Derived_Type_Definition =>
                    declare
                        The_Subtype : Ada.Element :=
                           Types.Derived_From (For_This_Type_Definition);
                        Constraint  : Ada.Element :=
                           Types.Constraint (The_Subtype);
                    begin  
                        case Types.Constraint_ind (Constraint) is
                            when Types.An_Index_Constraint =>
                                return
                                   "(others => " &
                                      Initial_Value
                                         (Type_Definition_From
                                             (Types.Component_Type
                                                 (Type_Definition_From
                                                     (For_This_Type_Definition))),
                                          Original_Comp_Unit_Name) &
                                      ")";

                            when Types.Not_A_Constraint =>
                                declare
                                    Default_Value : constant String :=
                                       Initial_Value (Type_Definition_From
                                                         (The_Subtype),
                                                      Original_Comp_Unit_Name);
                                begin
                                    if String_Utilities.Locate
                                          ("=>", Default_Value) > 0 then
                                        return Default_Value;
                                    else
                                        return  
                                           Full_Type_Name & "(" &
                                              Default_Value & ")";
                                    end if;
                                end;

                            when others =>
                                return Full_Type_Name & "'First";
                        end case;
                    end;


                when Types.An_Array_Type_Definition =>
                    declare
                        Base_Type_Definition : Ada.Element :=
                           Type_Definition_From
                              (Types.Component_Type
                                  (Array_Type => For_This_Type_Definition));
                    begin
                        if Types.Is_Constrained_Array
                              (For_This_Type_Definition) then
                            declare
                                The_Indices    : Ada.Element_Iterator :=
                                   Types.Index_Constraints
                                      (For_This_Type_Definition);
                                Num_Dimensions : Natural := 0;
                                Init_Value     : Unbounded.Variable_String :=
                                   Unbounded.Nil;
                            begin
                                Ada.Reset (The_Indices);
                                while not Ada.Done (The_Indices) loop
                                    Num_Dimensions := Num_Dimensions + 1;
                                    Ada.Next (The_Indices);
                                end loop;
                                for I in 1 .. Num_Dimensions loop
                                    Unbounded.Append
                                       (Init_Value, "(others => ");
                                end loop;
                                Unbounded.Append
                                   (Init_Value, Initial_Value
                                                   (Base_Type_Definition,
                                                    Original_Comp_Unit_Name));
                                for I in 1 .. Num_Dimensions loop
                                    Unbounded.Append (Init_Value, ")");
                                end loop;
                                return Unbounded.Image (Init_Value);
                            end;
                        else  
                            declare
                                Index_Type_Name : constant String :=
                                   Ada.Image
                                      (Ada.Value
                                          (Types.Index_Subtype_Definitions
                                              (For_This_Type_Definition)));
                            begin
                                return
                                   "(" & Index_Type_Name
                                            (Index_Type_Name'First ..
                                                String_Utilities.Locate
                                                   (' ', Index_Type_Name) - 1) &
                                      "'First => " &
                                      Initial_Value (Base_Type_Definition,
                                                     Original_Comp_Unit_Name) &
                                      ")";
                            end;
                        end if;
                    end;


                when Types.A_Record_Type_Definition =>
                    declare
                        Components : Ada.Element_Iterator      :=
                           Types.Record_Components (For_This_Type_Definition);
                        The_Value  : Unbounded.Variable_String := Unbounded.Nil;

                    begin  
                        Ada.Reset (Components);
                        while not Ada.Done (Components) loop
                            declare
                                One_Component        : Ada.Element     :=
                                   Ada.Value (Components);
                                Component_Name       : constant String :=
                                   Decls.Name (One_Component);
                                Component_Type       : Ada.Element     :=
                                   Decls.Object_Type (One_Component);
                                Component_Constraint : Ada.Element     :=
                                   Types.Constraint (Component_Type);
                            begin  
                                Unbounded.Append (The_Value,
                                                  Component_Name & " => ");
                                case Types.Constraint_Kind
                                        (Component_Constraint) is
                                    when Types.An_Index_Constraint =>
                                        Unbounded.Append
                                           (The_Value,
                                            "(others => " &
                                               Initial_Value
                                                  (Type_Definition_From
                                                      (Types.Component_Type
                                                          (Type_Definition_From
                                                              (Component_Type))),
                                                   Original_Comp_Unit_Name) &
                                               ")");

                                    when Types.Not_A_Constraint =>
                                        Unbounded.Append
                                           (The_Value,
                                            Initial_Value
                                               (Type_Definition_From
                                                   (Component_Type),
                                                Original_Comp_Unit_Name));
                                    when others =>
                                        Unbounded.Append
                                           (The_Value,
                                            Ada.Image
                                               (Lower_Bound
                                                   (Component_Constraint)));
                                end case;  
                                Ada.Next (Components);
                                if not Ada.Done (Components) then
                                    Unbounded.Append (The_Value, ", ");
                                end if;
                            end;
                        end loop;
                        return "(" & Unbounded.Image (The_Value) & ")";
                    end;


                when Types.A_Private_Type_Definition |
                     Types.A_Limited_Private_Type_Definition =>
                    raise Its_A_Private_Type;

                when others =>
                    return "; --[Can't generate " &
                              Types.Type_Definition_Kinds'Image
                                 (Types.Kind (For_This_Type_Definition)) &
                              "_Null_Parameter constant definition]  ";
            end case;
        end;
    end Initial_Value;

    function Initial_Value
                (For_This_Type_Definition : Ada_Program.Type_Definition)
                return String is
        Comp_Unit_Name : constant String :=
           Declarations.Name (Comp_Units.Unit_Declaration
                                 (Comp_Units.Parent_Compilation_Unit
                                     (For_This_Type_Definition)));
    begin
        return Initial_Value (For_This_Type_Definition, Comp_Unit_Name);
    end Initial_Value;


end Lrm_Utilities;

E3 Meta Data

    nblk1=41
    nid=0
    hdr6=82
        [0x00] rec0=22 rec1=00 rec2=01 rec3=01a
        [0x01] rec0=00 rec1=00 rec2=41 rec3=004
        [0x02] rec0=1b rec1=00 rec2=02 rec3=012
        [0x03] rec0=19 rec1=00 rec2=03 rec3=038
        [0x04] rec0=1b rec1=00 rec2=04 rec3=062
        [0x05] rec0=1a rec1=00 rec2=05 rec3=058
        [0x06] rec0=01 rec1=00 rec2=40 rec3=016
        [0x07] rec0=12 rec1=00 rec2=06 rec3=026
        [0x08] rec0=13 rec1=00 rec2=07 rec3=062
        [0x09] rec0=19 rec1=00 rec2=08 rec3=05c
        [0x0a] rec0=00 rec1=00 rec2=3f rec3=006
        [0x0b] rec0=1a rec1=00 rec2=09 rec3=042
        [0x0c] rec0=16 rec1=00 rec2=0a rec3=042
        [0x0d] rec0=00 rec1=00 rec2=3e rec3=002
        [0x0e] rec0=11 rec1=00 rec2=0b rec3=040
        [0x0f] rec0=11 rec1=00 rec2=0c rec3=05e
        [0x10] rec0=17 rec1=00 rec2=0d rec3=050
        [0x11] rec0=1b rec1=00 rec2=0e rec3=00c
        [0x12] rec0=00 rec1=00 rec2=3d rec3=002
        [0x13] rec0=1c rec1=00 rec2=37 rec3=000
        [0x14] rec0=01 rec1=00 rec2=0f rec3=006
        [0x15] rec0=18 rec1=00 rec2=10 rec3=006
        [0x16] rec0=19 rec1=00 rec2=11 rec3=004
        [0x17] rec0=18 rec1=00 rec2=12 rec3=028
        [0x18] rec0=00 rec1=00 rec2=3c rec3=002
        [0x19] rec0=1a rec1=00 rec2=13 rec3=02c
        [0x1a] rec0=1b rec1=00 rec2=14 rec3=028
        [0x1b] rec0=17 rec1=00 rec2=15 rec3=036
        [0x1c] rec0=1a rec1=00 rec2=16 rec3=02e
        [0x1d] rec0=1a rec1=00 rec2=17 rec3=078
        [0x1e] rec0=1a rec1=00 rec2=18 rec3=012
        [0x1f] rec0=01 rec1=00 rec2=3b rec3=028
        [0x20] rec0=1a rec1=00 rec2=19 rec3=016
        [0x21] rec0=00 rec1=00 rec2=3a rec3=002
        [0x22] rec0=19 rec1=00 rec2=1a rec3=04c
        [0x23] rec0=15 rec1=00 rec2=1b rec3=006
        [0x24] rec0=00 rec1=00 rec2=39 rec3=008
        [0x25] rec0=15 rec1=00 rec2=1c rec3=08c
        [0x26] rec0=19 rec1=00 rec2=1d rec3=05a
        [0x27] rec0=01 rec1=00 rec2=38 rec3=002
        [0x28] rec0=19 rec1=00 rec2=1e rec3=022
        [0x29] rec0=1a rec1=00 rec2=1f rec3=032
        [0x2a] rec0=17 rec1=00 rec2=20 rec3=076
        [0x2b] rec0=01 rec1=00 rec2=36 rec3=002
        [0x2c] rec0=16 rec1=00 rec2=21 rec3=07a
        [0x2d] rec0=00 rec1=00 rec2=35 rec3=014
        [0x2e] rec0=18 rec1=00 rec2=22 rec3=036
        [0x2f] rec0=1a rec1=00 rec2=23 rec3=028
        [0x30] rec0=16 rec1=00 rec2=24 rec3=018
        [0x31] rec0=1c rec1=00 rec2=25 rec3=01a
        [0x32] rec0=10 rec1=00 rec2=26 rec3=030
        [0x33] rec0=15 rec1=00 rec2=27 rec3=05c
        [0x34] rec0=00 rec1=00 rec2=34 rec3=002
        [0x35] rec0=11 rec1=00 rec2=28 rec3=05a
        [0x36] rec0=16 rec1=00 rec2=29 rec3=044
        [0x37] rec0=11 rec1=00 rec2=2a rec3=034
        [0x38] rec0=00 rec1=00 rec2=33 rec3=00e
        [0x39] rec0=12 rec1=00 rec2=2b rec3=020
        [0x3a] rec0=14 rec1=00 rec2=2c rec3=01c
        [0x3b] rec0=11 rec1=00 rec2=2d rec3=006
        [0x3c] rec0=00 rec1=00 rec2=32 rec3=04a
        [0x3d] rec0=10 rec1=00 rec2=2e rec3=024
        [0x3e] rec0=10 rec1=00 rec2=2f rec3=044
        [0x3f] rec0=19 rec1=00 rec2=30 rec3=036
        [0x40] rec0=09 rec1=00 rec2=31 rec3=000
    tail 0x21500444e815c65fc0ca1 0x42a00088462061e03