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

⟦5605902ea⟧ Ada Source

    Length: 28672 (0x7000)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Summary, package body Unit_Error_Recording, seg_0046a5

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 Bounded_String;
with Sequential;
with Table_Formatter;
with Directory_Tools;
with String_Utilities;
package body Unit_Error_Recording is

    package Object renames Directory_Tools.Object;
    package Naming renames Directory_Tools.Naming;
    package Data_Io is new Pio.Operations (Error_Data);
    package Pipe_Io is new Pipe.Type_Specific_Operations (Error_Data);

    package Names renames Sequential.Names;

    function Make (Label       : Item;
                   Kind        : Error_Kind := Error;
                   In_Unit     : String;
                   Line_Number : Natural) return Error_Data is
        D : Error_Data;
    begin
        D.Label       := Label;
        D.Kind        := Kind;
        D.Line_Number := Line_Number;
        Bounded_String.Copy (D.Unit, In_Unit);
        return D;
    end Make;

    function Kind (Of_Data : Error_Data) return Error_Kind is
    begin
        return Of_Data.Kind;
    end Kind;
    procedure Write (To_File : Pio.File_Type; D : Error_Data) is
    begin
        Data_Io.Write (File => To_File, Item => D);
    end Write;

    procedure Read (From_File : Pio.File_Type; D : out Error_Data) is
    begin
        Data_Io.Read (File => From_File, Item => D);
    end Read;

    procedure Write (To_Pipe : in out Pipe.Handle;
                     D       :        Error_Data;
                     Wait    :        Duration) is
    begin
        Pipe_Io.Write (Pipe => To_Pipe, Message => D, Max_Wait => Wait);
    end Write;

    procedure Read (From_Pipe       :     Pipe.Handle;
                    Wait            :     Duration;
                    D               : out Error_Data;
                    Timeout_Expired : out Boolean) is
        Null_Data : Error_Data;
    begin
        loop
            begin
                D := Pipe_Io.Read (Pipe => From_Pipe, Max_Wait => Wait);
                Timeout_Expired := False;
                exit;
            exception
                when Pipe.Use_Error =>
                    D               := Null_Data;
                    Timeout_Expired := True;
                    exit;
                when Pipe.End_Error =>
                    null;     -- ignore end_error
            end;
        end loop;

    end Read;

    procedure Init (From_Files : String; Iter : in out Entry_Iterator) is

        Head, The_List : Data_List.List  := Data_List.Nil;
        Files          : Object.Iterator := Naming.Resolution (From_Files);

        procedure Append_To_List (D : Error_Data) is
            Local : Data_List.List := Data_List.Make (D, Data_List.Nil);
        begin
            if Data_List.Is_Empty (The_List) then
                The_List := Local;
                Head     := Local;
            else
                Data_List.Set_Rest (The_List, Local);
                The_List := Local;
            end if;
        end Append_To_List;
    begin
        if Object.Is_Bad (Files) then
            return;
        end if;

        while not Object.Done (Files) loop
            declare
                Handle : Pio.File_Type;
                D      : Error_Data;
            begin
                Pio.Open (File => Handle,
                          Mode => Pio.In_File,
                          Name => Naming.Unique_Full_Name
                                     (Object.Value (Files)),
                          Form => "");

                while not Pio.End_Of_File (Handle) loop
                    Data_Io.Read (Handle, D);
                    Append_To_List (D);
                end loop;
            exception
                when Pio.Use_Error =>
                    null;  -- skip locked files
                           -- one file (the file currently being written
                           -- will always be locked

            end;


            Object.Next (Files);
        end loop;

        --  Initialize the iterator and current data value
        Data_List.Init (Iter.List_Iter, Head);
        if not Data_List.Done (Iter.List_Iter) then
            Iter.Current_Data := Data_List.Value (Iter.List_Iter);
        end if;
    end Init;

    function Done (Iter : Entry_Iterator) return Boolean is
    begin
        return Data_List.Done (Iter.List_Iter);
    end Done;

    procedure Next (Iter : in out Entry_Iterator) is
    begin
        Data_List.Next (Iter.List_Iter);
        if not Data_List.Done (Iter.List_Iter) then
            Iter.Current_Data := Data_List.Value (Iter.List_Iter);
        end if;
    end Next;

    function User_Name (Iter : Entry_Iterator) return String is
    begin
        return Bounded_String.Image (Iter.Current_Data.User);
    end User_Name;

    function Date (Iter : Entry_Iterator) return Time_Utilities.Time is
    begin
        return Iter.Current_Data.Date;
    end Date;

    function Label (Iter : Entry_Iterator) return Item is
    begin
        return Iter.Current_Data.Label;
    end Label;

    function Kind (Iter : Entry_Iterator) return Error_Kind is
    begin
        return Iter.Current_Data.Kind;
    end Kind;

    function Unit (Iter : Entry_Iterator) return String is
    begin
        return Bounded_String.Image (Iter.Current_Data.Unit);
    end Unit;

    function Line_Number (Iter : Entry_Iterator) return Natural is
    begin
        return Iter.Current_Data.Line_Number;
    end Line_Number;

    function Image (Name : Column_Name) return String is
    begin
        case Name is
            when User =>
                return "User Name";
            when Date =>
                return "Date";
            when Incompatibility =>
                return "Check";
            when Error_Designation =>
                return "Error Kind";
            when Unit_Name =>
                return "Unit Name (Ref #)";
            when Line_Number =>
                return "Line";
        end case;
    end Image;

    procedure Generate_Report (From_Files : String;
                               To_File : Io.File_Type := Io.Standard_Output) is

        package Table is new Table_Formatter (Included_Columns'Length);

        Sort_Fields : Table.Field_List
                         (Included_Columns'First .. Included_Columns'Last);

        Name_Map : Names.Map;

        Unit_Name_Max : constant := 25;

        Entry_Iter : Entry_Iterator;

        The_Summary : Summary.Summary_Data;

        function Include_Column (Name : Column_Name; Iter : Entry_Iterator)
                                return Boolean is
        begin
            case Name is
                when User =>
                    return Include (User_Name (Iter));
                    -- calls to generic formals to test for inclusion
                when Date =>
                    return Include (Date (Iter));
                when Incompatibility =>
                    return Include (Label (Iter));
                when Error_Designation =>
                    return Include (Kind (Iter));
                when Unit_Name =>
                    return Include_Unit (Unit (Iter));
                when Line_Number =>
                    return True;
            end case;

        end Include_Column;

        function Included (Columns : Column_List; Iter : Entry_Iterator)
                          return Boolean is
        begin
            for I in Columns'Range loop
                if not Include_Column (Columns (I), Iter) then
                    return False;
                end if;
            end loop;
            return True;
        end Included;

        function Data_Value (Column : Column_Name; Iter : Entry_Iterator)
                            return String is
        begin
            case Column is
                when User =>
                    return User_Name (Iter);
                when Date =>
                    return Time_Utilities.Image
                              (Date (Iter),
                               Contents => Time_Utilities.Date_Only);
                when Incompatibility =>
                    return Image (Label (Iter));
                when Error_Designation =>
                    return Error_Kind'Image (Kind (Iter));
                when Unit_Name =>
                    declare
                        Name        : constant String := Unit (Iter);
                        Simple_Name : constant String :=
                           Naming.Simple_Name (Name);
                        Unit_Name   : Sequential.Var_String;
                    begin
                        Bounded_String.Copy (Unit_Name, Name);
                        Names.Add (Unit_Name, To => Name_Map);
                        if Simple_Name'Length < Unit_Name_Max then
                            return
                               Simple_Name & " (" &
                                  String_Utilities.Strip
                                     (Integer'Image
                                         (Names.Index (Unit_Name, Name_Map))) &
                                  ")";

                        else
                            return
                               Simple_Name
                                  (Simple_Name'First ..
                                      Simple_Name'First + Unit_Name_Max - 1) &
                               " (" &
                               String_Utilities.Strip
                                  (Integer'Image
                                      (Names.Index (Unit_Name, Name_Map))) &
                               ")";
                        end if;
                    end;
                when Line_Number =>
                    return Natural'Image (Line_Number (Iter));
            end case;

        end Data_Value;

    begin
        for I in Included_Columns'Range loop
            Sort_Fields (I) := Integer (I);
            Table.Header (Image (Included_Columns (I)));
        end loop;

        Names.Initialize (Name_Map);

        Init (From_Files, Entry_Iter);

        Summary.Initialize (The_Summary);
        while not Done (Entry_Iter) loop

            if Included (Included_Columns, Entry_Iter) then
                Summary.Add (Entry_Iter.Current_Data, The_Summary);

                for Column in Included_Columns'Range loop
                    Table.Item (Data_Value
                                   (Included_Columns (Column), Entry_Iter));
                end loop;
            end if;

            Next (Entry_Iter);
        end loop;

        Names.Display (Name_Map, To_File);
        Io.New_Line (To_File);

        Table.Sort (Sort_Fields);
        Table.Display (To_File);

        Io.New_Line (To_File);
        Io.Put_Line ("SUMMARY REPORT:");
        Io.New_Line (To_File);  
        Summary.Display (The_Summary, To_File);
    end Generate_Report;

    procedure Display_Summary (Of_Entries : in out Entry_Iterator;
                               To_File    :        Io.File_Type) is
        The_Summary : Summary.Summary_Data;
    begin
        Summary.Initialize (The_Summary);
        while not Done (Of_Entries) loop
            Summary.Add (Of_Entries.Current_Data, The_Summary);
            Next (Of_Entries);
        end loop;
        Summary.Display (The_Summary, To_File);
    end Display_Summary;

    package body Summary is
        subtype Real_Errors is Error_Kind range Error .. Batch_Warning;

        Prefix_Length : constant := 8;
        Longest_Item  : constant Integer := Item'Width;
        Item_Blanks   : constant String (1 .. Longest_Item + Prefix_Length) :=
           (others => ' ');
        Item_Line     : constant String (1 .. Longest_Item + Prefix_Length) :=
           (others => '-');

        Longest_Error : constant Integer := Real_Errors'Width;
        Error_Blanks  : constant String (1 .. Longest_Error) := (others => ' ');
        Error_Line    : constant String (1 .. Longest_Error) := (others => '-');

        procedure Initialize (Summary : in out Summary_Data) is
        begin
            Summary.Total_Count  := 0;
            Summary.Item_Counts  := (others => 0);
            Summary.Error_Counts := (others => 0);
            Name_Map.Initialize (Summary.Unit_Map);
            Name_Map.Initialize (Summary.User_Map);
            Name_Map.Initialize (Summary.Date_Map);
        end Initialize;

        procedure Add (To : in out Name_Map.Map; Name : String) is
            Value : Natural;
        begin
            Value := Name_Map.Eval (To, Name);
            Value := Value + 1;
            Name_Map.Define (To, Name, Value);
        exception
            when Name_Map.Undefined =>
                Name_Map.Define (To, Name, 1);
        end Add;

        procedure Add (D : Error_Data; To_Summary : in out Summary_Data) is
        begin
            To_Summary.Total_Count           := To_Summary.Total_Count + 1;
            To_Summary.Item_Counts (D.Label) :=
               To_Summary.Item_Counts (D.Label) + 1;
            To_Summary.Error_Counts (D.Kind) :=
               To_Summary.Error_Counts (D.Kind) + 1;
            Add (To_Summary.Unit_Map, Bounded_String.Image (D.Unit));
            Add (To_Summary.User_Map, Bounded_String.Image (D.User));
            Add (To_Summary.Date_Map,
                 Time_Utilities.Image (D.Date,
                                       Contents => Time_Utilities.Date_Only));
        end Add;

        function Item_Image (I : Item) return String is
            Imag : constant String := Image (I) & " : " & Item'Image (I);
            Pad  : constant String (1 .. Longest_Item + Prefix_Length -
                                            Imag'Length + 1) := (others => ' ');
        begin
            return Imag & Pad;       end Item_Image;

        function Image (E : Error_Kind) return String is
            Imag : constant String := Error_Kind'Image (E);
            Pad  : constant String (1 .. Longest_Error - Imag'Length + 1) :=
               (others => ' ');
        begin
            return Imag & Pad;
        end Image;

        function Pad_For_Items (S : String) return String is
            Pad : constant String (1 .. Longest_Item + Prefix_Length -
                                           S'Length + 1) := (others => ' ');
        begin
            return S & Pad;
        end Pad_For_Items;

        function Pad_For_Errors (S : String) return String is
            Pad : constant String (1 .. Longest_Error - S'Length + 1) :=
               (others => ' ');
        begin
            return S & Pad;
        end Pad_For_Errors;

        function Average (Map : Name_Map.Map) return Natural is
            Total, Number : Natural := 0;
            Iter          : Name_Map.Iterator;
        begin
            Name_Map.Init (Iter, Map);
            while not Name_Map.Done (Iter) loop
                Total  := Total + Name_Map.Eval (Map, Name_Map.Value (Iter));
                Number := Number + 1;
                Name_Map.Next (Iter);
            end loop;

            if Number > 0 then
                return Total / Number;
            else
                return 0;
            end if;
        end Average;

        procedure Display (Summary : Summary_Data; To : Io.File_Type) is
        begin
            Io.Put_Line (To, "INCOMPATIBILITY TOTALS:");
            for I in Item loop
                Io.Put_Line (To, "  " & Item_Image (I) & ": " &
                                    Natural'Image (Summary.Item_Counts (I)));
            end loop;
            Io.Put_Line (To, "  " & Item_Line);
            Io.Put_Line (To, "  " & Pad_For_Items ("TOTAL") & ": " &
                                Natural'Image (Summary.Total_Count))
            Io.New_Line (To);

            Io.Put_Line (To, "ERROR KIND TOTALS:");
            for E in Real_Errors loop
                Io.Put_Line (To, "  " & Image (E) & ": " &
                                    Natural'Image (Summary.Error_Counts (E)));
            end loop;
            Io.Put_Line (To, "  " & Error_Line);
            Io.Put_Line (To, "  " & Pad_For_Errors ("TOTAL") & ": " &
                                Natural'Image (Summary.Total_Count));
            Io.New_Line (To);

            Io.Put_Line (To, "AVERAGE ERRORS PER Unit: " &
                                Natural'Image (Average (Summary.Unit_Map)));

            Io.Put_Line (To, "AVERAGE ERRORS PER User: " &
                                Natural'Image (Average (Summary.User_Map)));

            Io.Put_Line (To, "AVERAGE ERRORS PER Day : " &
                                Natural'Image (Average (Summary.Date_Map)));

        end Display;
    end Summary;
end Unit_Error_Recording;

E3 Meta Data

    nblk1=1b
    nid=0
    hdr6=36
        [0x00] rec0=21 rec1=00 rec2=01 rec3=00e
        [0x01] rec0=00 rec1=00 rec2=1b rec3=01a
        [0x02] rec0=1c rec1=00 rec2=02 rec3=01c
        [0x03] rec0=1d rec1=00 rec2=03 rec3=020
        [0x04] rec0=01 rec1=00 rec2=1a rec3=008
        [0x05] rec0=1e rec1=00 rec2=04 rec3=05a
        [0x06] rec0=00 rec1=00 rec2=19 rec3=00a
        [0x07] rec0=1f rec1=00 rec2=05 rec3=012
        [0x08] rec0=21 rec1=00 rec2=06 rec3=032
        [0x09] rec0=1e rec1=00 rec2=07 rec3=004
        [0x0a] rec0=1c rec1=00 rec2=08 rec3=01c
        [0x0b] rec0=13 rec1=00 rec2=09 rec3=066
        [0x0c] rec0=01 rec1=00 rec2=18 rec3=012
        [0x0d] rec0=18 rec1=00 rec2=0a rec3=04e
        [0x0e] rec0=21 rec1=00 rec2=0b rec3=016
        [0x0f] rec0=19 rec1=00 rec2=0c rec3=044
        [0x10] rec0=00 rec1=00 rec2=17 rec3=00e
        [0x11] rec0=19 rec1=00 rec2=0d rec3=030
        [0x12] rec0=00 rec1=00 rec2=16 rec3=00c
        [0x13] rec0=13 rec1=00 rec2=0e rec3=02c
        [0x14] rec0=01 rec1=00 rec2=15 rec3=002
        [0x15] rec0=1a rec1=00 rec2=0f rec3=036
        [0x16] rec0=00 rec1=00 rec2=14 rec3=014
        [0x17] rec0=19 rec1=00 rec2=10 rec3=088
        [0x18] rec0=00 rec1=00 rec2=13 rec3=002
        [0x19] rec0=18 rec1=00 rec2=11 rec3=02a
        [0x1a] rec0=01 rec1=00 rec2=12 rec3=000
    tail 0x215004854815c66bb0540 0x42a00088462061e03