separate (Tracker.Report_Generator)
procedure List_By_Subsystem is
    ----------------------------------------------------------------------
    --|  NAME:  LIST_BY_SUBSYSTEM
    --|
    --|  OVERVIEW:
    --|    A separate report is printed for each subsystem.  All of the element
    --|    data for each subsystem is displayed including the remaining man-hours
    --|    of work to complete each element, the total original size, the total
    --|    current size, the average complexity, and the total remaining man-hours
    --|    of work to complete each subsystem.
    --|
    --|  EXCEPTIONS HANDLED:
    --|    others   an error message is printed and execution continues
    --|
    --|  HISTORY:
    --|    written by   Bonnie Burkhardt   March 1985
    ----------------------------------------------------------------------

    use Ac_List_Pkg;
    use El_List_Pkg;
    use Ss_List_Pkg;

    Header1 : String (1 .. 132) := (others => ' ');
    Header2 : String (1 .. 132) := (others => ' ');
    Header_Lines : String (1 .. 132) := (others => ' ');

    Ac_Index : Integer := 0;
    Ac_Ptr : Activity_Pointer;
    End_List : Boolean := False;
    Ele_Count : Integer := 0;
    Ele_In_Ss : Integer := 0;
    Ele_Ptr : Element_Pointer;
    Line_Count : Integer := 0;
    Ss_Index : Integer := 0;
    Ss_Ptr : Subsystem_Pointer;
    Title : constant String := "LIST BY SUBSYSTEM REPORT";
    Tot_Currnt : Integer range 0 .. 9_999_999 := 0;
    Tot_Eq_New : Integer range 0 .. 9_999_999 := 0;
    Tot_Orig : Integer range 0 .. 9_999_999 := 0;
    Tot_Cpxy : Float := 0.0;
    Tot_Hours : Float := 0.0;

    procedure Init_Ss_Headers is separate;
    procedure Print_Ss_Element is separate;
    procedure Print_Ss_Total is separate;

begin
    Init_Ss_Headers;

    Start_Walk (Ss_List);

    loop
        Walk (Ss_List, Ss_Ptr, End_List);
        exit when End_List;
        Line_Count := 0;

        -- create the subtitle string
        Start_Page (Title, Ss_Ptr.Name, Header1, Header2, Header_Lines);

        -- print out each subsystem's list of elements
        Start_Walk (Ss_Ptr.Element_List);
        Ele_In_Ss := 0;

        loop
            Walk (Ss_Ptr.Element_List, Ele_Ptr, End_List);
            -- if end of list, print out totals

            if End_List then
                if (Ele_In_Ss > 0) then
                    Print_Ss_Total;
                end if;

                exit;
            end if;

            -- update running totals
            Ele_Count := Ele_Count + 1;
            Tot_Currnt := Tot_Currnt + Ele_Ptr.Current_Size;
            Tot_Eq_New := Tot_Eq_New - Ele_Ptr.Size_Done_At_Start +
                             Ele_Ptr.Current_Size;
            Tot_Orig := Tot_Orig + Ele_Ptr.Original_Size;
            Tot_Cpxy := Tot_Cpxy + Ele_Ptr.Complexity;
            Tot_Hours := Tot_Hours + Ele_Ptr.Hours_To_Complete;

            Print_Ss_Element;

            Ele_In_Ss := Ele_In_Ss + 1;
            Line_Count := Line_Count + 1;

            if Line_Count >= Max_Data_Lines - 2 then
                Start_Page (Title, Ss_Ptr.Name, Header1, Header2, Header_Lines);
                Line_Count := 0;
            end if;
        end loop;
    end loop;
exception
    when others =>
        Put_Line ("exception raised in LIST BY SUBSYSTEM REPORT");
end List_By_Subsystem;



