with Dyn;
separate (Compilation_Unit.Produce_Metrics.Report_Metrics)
procedure Display_Operators (Operator_List : in Halstead_Operator_List.List) is
    --=============================================================
    -- This operation is used to display all the operators in the =
    -- list of operators plus their frequency. The format used    =
    -- may be found in the User's manual.                         =
    --                                                            =
    --  written by GER with help from Brad and JM                 =
    --=============================================================

    procedure Display_This_Operator (Item : in Halstead_Operator.Definition;
                                     Frequency_Of_Item : in Natural) is
        -- This procedure will be used to instantiate the iterate
        -- procedure in the Halstead_List generic. The procedure is
        -- used in the generic to display an operator and the number
        -- of occurances of the operator in the compilation unit.

        package Frequency_Io is new Text_Io.Integer_Io (Num => Natural);

    begin
        -- Display_This_Operator

        Text_Io.Set_Col (To => 5);

        case Item.Kind is

            when Halstead_Operator.And_Then_Halstead =>
                Text_Io.Put (Item => "and then");
            when Halstead_Operator.Or_Else_Halstead =>
                Text_Io.Put (Item => "or else");
            when Halstead_Operator.Equal_Halstead =>
                Text_Io.Put (Item => "=");
            when Halstead_Operator.Inequality_Halstead =>
                Text_Io.Put (Item => "/=");
            when Halstead_Operator.Less_Than_Halstead =>
                Text_Io.Put (Item => "<");
            when Halstead_Operator.Less_Than_Or_Equal_Halstead =>
                Text_Io.Put (Item => "<=");
            when Halstead_Operator.Greater_Than_Halstead =>
                Text_Io.Put (Item => ">");
            when Halstead_Operator.Greater_Than_Or_Equal_Halstead =>
                Text_Io.Put (Item => ">=");
            when Halstead_Operator.In_Out_Halstead =>
                Text_Io.Put (Item => "in out");
            when Halstead_Operator.Plus_Halstead =>
                Text_Io.Put (Item => "+");
            when Halstead_Operator.Minus_Halstead =>
                Text_Io.Put (Item => "-");
            when Halstead_Operator.Concatenate_Halstead =>
                Text_Io.Put (Item => "&");
            when Halstead_Operator.Star_Halstead =>
                Text_Io.Put (Item => "*");
            when Halstead_Operator.Divide_Halstead =>
                Text_Io.Put (Item => "/");
            when Halstead_Operator.Double_Star_Halstead =>
                Text_Io.Put (Item => "**");
            when Halstead_Operator.Assignment_Halstead =>
                Text_Io.Put (Item => ":=");
            when Halstead_Operator.Arrow_Halstead =>
                Text_Io.Put (Item => "=>");
            when Halstead_Operator.Vertical_Bar_Halstead =>
                Text_Io.Put (Item => "|");
            when Halstead_Operator.Dot_Halstead =>
                Text_Io.Put (Item => ".");
            when Halstead_Operator.Colon_Halstead =>
                Text_Io.Put (Item => ":");
            when Halstead_Operator.Exclamation_Mark_Halstead =>
                Text_Io.Put (Item => "!");
            when Halstead_Operator.Box_Halstead =>
                Text_Io.Put (Item => "<>");
            when Halstead_Operator.Double_Dot_Halstead =>
                Text_Io.Put (Item => "..");
            when Halstead_Operator.Tick_Halstead =>
                Text_Io.Put (Item => "'");
            when Halstead_Operator.Parentheses_Halstead =>
                Text_Io.Put (Item => "(...)");
            when Halstead_Operator.Apostrophes_Halstead =>
                Text_Io.Put (Item => "'...'");
            when Halstead_Operator.Quotes_Halstead =>
                Text_Io.Put (Item => """...""");
            when Halstead_Operator.Percents_Halstead =>
                Text_Io.Put (Item => "%...%");
            when Halstead_Operator.Label_Halstead =>
                Text_Io.Put (Item => "<<...>>");
            when Halstead_Operator.Semicolon_Halstead =>
                Text_Io.Put (Item => ";");
            when Halstead_Operator.Comma_Halstead =>
                Text_Io.Put (Item => ",");
            when Halstead_Operator.Abort_Halstead =>
                Text_Io.Put (Item => "abort");
            when Halstead_Operator.Abs_Halstead =>
                Text_Io.Put (Item => "abs");
            when Halstead_Operator.Accept_Halstead =>
                Text_Io.Put (Item => "accept");
            when Halstead_Operator.Accept_Do_End_Halstead =>
                Text_Io.Put (Item => "accept...do...end");
            when Halstead_Operator.Access_Halstead =>
                Text_Io.Put (Item => "access");
            when Halstead_Operator.All_Halstead =>
                Text_Io.Put (Item => "all");
            when Halstead_Operator.And_Halstead =>
                Text_Io.Put (Item => "and");
            when Halstead_Operator.Array_Of_Halstead =>
                Text_Io.Put (Item => "array...of");
            when Halstead_Operator.At_Halstead =>
                Text_Io.Put (Item => "at");
            when Halstead_Operator.At_Mod_Halstead =>
                Text_Io.Put (Item => "at...mod");
            when Halstead_Operator.Begin_End_Halstead =>
                Text_Io.Put (Item => "begin...end");
            when Halstead_Operator.Case_Is_End_Case_Halstead =>
                Text_Io.Put (Item => "case...is...end case");
            when Halstead_Operator.Constant_Halstead =>
                Text_Io.Put (Item => "constant");
            when Halstead_Operator.Declare_Halstead =>
                Text_Io.Put (Item => "declare");
            when Halstead_Operator.Delay_Halstead =>
                Text_Io.Put (Item => "delay");
            when Halstead_Operator.Digits_Halstead =>
                Text_Io.Put (Item => "digits");
            when Halstead_Operator.Else_Halstead =>
                Text_Io.Put (Item => "else");
            when Halstead_Operator.Elsif_Then_Halstead =>
                Text_Io.Put (Item => "elsif...then");
            when Halstead_Operator.Entry_Halstead =>
                Text_Io.Put (Item => "entry");
            when Halstead_Operator.Exception_Halstead =>
                Text_Io.Put (Item => "exception");
            when Halstead_Operator.Exit_Halstead =>
                Text_Io.Put (Item => "exit");
            when Halstead_Operator.For_In_Halstead =>
                Text_Io.Put (Item => "for...in");
            when Halstead_Operator.For_Use_Halstead =>
                Text_Io.Put (Item => "for use");
            when Halstead_Operator.Function_Halstead =>
                Text_Io.Put (Item => "function");
            when Halstead_Operator.Function_Is_Halstead =>
                Text_Io.Put (Item => "function...is");
            when Halstead_Operator.Generic_Halstead =>
                Text_Io.Put (Item => "generic");
            when Halstead_Operator.Goto_Halstead =>
                Text_Io.Put (Item => "goto");
            when Halstead_Operator.If_Then_End_If_Halstead =>
                Text_Io.Put (Item => "if...then...end if");
            when Halstead_Operator.In_Halstead =>
                Text_Io.Put (Item => "in");
            when Halstead_Operator.Is_New_Halstead =>
                Text_Io.Put (Item => "is new");
            when Halstead_Operator.Limited_Private_Halstead =>
                Text_Io.Put (Item => "limited private");
            when Halstead_Operator.Loop_End_Loop_Halstead =>
                Text_Io.Put (Item => "loop...end loop");
            when Halstead_Operator.Mod_Halstead =>
                Text_Io.Put (Item => "mod");
            when Halstead_Operator.New_Halstead =>
                Text_Io.Put (Item => "new");
            when Halstead_Operator.Null_Halstead =>
                Text_Io.Put (Item => "null");
            when Halstead_Operator.Or_Halstead =>
                Text_Io.Put (Item => "or");
            when Halstead_Operator.Others_Halstead =>
                Text_Io.Put (Item => "others");
            when Halstead_Operator.Out_Halstead =>
                Text_Io.Put (Item => "out");
            when Halstead_Operator.Package_Halstead =>
                Text_Io.Put (Item => "package");
            when Halstead_Operator.Package_Is_End_Halstead =>
                Text_Io.Put (Item => "package...is...end");
            when Halstead_Operator.Package_Body_Is_Halstead =>
                Text_Io.Put (Item => "package...body...is");
            when Halstead_Operator.Package_Body_Is_End_Halstead =>
                Text_Io.Put (Item => "package...body...is...end");
            when Halstead_Operator.Pragma_Halstead =>
                Text_Io.Put (Item => "pragma");
            when Halstead_Operator.Private_Halstead =>
                Text_Io.Put (Item => "private");
            when Halstead_Operator.Procedure_Halstead =>
                Text_Io.Put (Item => "procedure");
            when Halstead_Operator.Procedure_Is_Halstead =>
                Text_Io.Put (Item => "procedure...is");
            when Halstead_Operator.Raise_Halstead =>
                Text_Io.Put (Item => "raise");
            when Halstead_Operator.Range_Halstead =>
                Text_Io.Put (Item => "range");
            when Halstead_Operator.Record_End_Record_Halstead =>
                Text_Io.Put (Item => "record...end record");
            when Halstead_Operator.Rem_Halstead =>
                Text_Io.Put (Item => "rem");
            when Halstead_Operator.Renames_Halstead =>
                Text_Io.Put (Item => "renames");
            when Halstead_Operator.Return_Halstead =>
                Text_Io.Put (Item => "return");
            when Halstead_Operator.Reverse_Halstead =>
                Text_Io.Put (Item => "reverse");
            when Halstead_Operator.Select_End_Select_Halstead =>
                Text_Io.Put (Item => "select...end select");
            when Halstead_Operator.Separate_Halstead =>
                Text_Io.Put (Item => "separate");
            when Halstead_Operator.Subtype_Is_Halstead =>
                Text_Io.Put (Item => "subtype is");
            when Halstead_Operator.Task_Halstead =>
                Text_Io.Put (Item => "task");
            when Halstead_Operator.Task_Is_End_Halstead =>
                Text_Io.Put (Item => "task...is...end");
            when Halstead_Operator.Task_Body_Is_Halstead =>
                Text_Io.Put (Item => "task...body...is");
            when Halstead_Operator.Terminate_Halstead =>
                Text_Io.Put (Item => "terminate");
            when Halstead_Operator.Type_Halstead =>
                Text_Io.Put (Item => "type");
            when Halstead_Operator.Type_Is_Halstead =>
                Text_Io.Put (Item => "type...is");
            when Halstead_Operator.Use_Halstead =>
                Text_Io.Put (Item => "use");
            when Halstead_Operator.When_Halstead =>
                Text_Io.Put (Item => "when");
            when Halstead_Operator.While_Halstead =>
                Text_Io.Put (Item => "while");
            when Halstead_Operator.With_Halstead =>
                Text_Io.Put (Item => "with");
            when Halstead_Operator.Xor_Halstead =>
                Text_Io.Put (Item => "xor");
            when Halstead_Operator.Literal =>
                Text_Io.Put (Item => Dyn.Str (Item.Value));
                if Dyn.Str (Item.Value)'Length >= 35 then
                    -- skip a line before displaying the frequency
                    Text_Io.New_Line (Spacing => 1);
                end if;
            when others =>
                null;

        end case;

        Text_Io.Set_Col (To => 35);
        Frequency_Io.Put (Item => Frequency_Of_Item);
        Text_Io.New_Line (Spacing => 1);

    end Display_This_Operator;

    -- Instantiate the iterate procedure in the Halstead generic.
    -- This will allow us to display all the operators
    procedure Iterate_To_Display_Operators is
       new Halstead_Operator_List.Iterate (Process => Display_This_Operator);

begin
    -- Display_Operators

    Iterate_To_Display_Operators (Operator_List);

end Display_Operators;