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

⟦0e15e7115⟧ Ada Source

    Length: 18432 (0x4800)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Sort_Sup, seg_0581d9

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« 
        └─⟦this⟧ 

E3 Source Code




-- UNIT: procedure sort_sup_b.a
-- FILES: sort.a, sort_sup.a, sort_sup_b.a
-- COMPILE: ada sort_sup.a sort_sup_b.a
--                      ada -o sort sort.a
-- PURPOSE: To provide a demo for self targets ,
--              as well as a useful demo for performance analysis.
--              Of course with a few generics the support routines
--              would provide a fine addition to a general sort library.
-- DESCRIPTION: This is a menu driven demo that provides examples of
--                      four popular sorts: the bubble sort, the shell sort,
--                      the quick sort, and the quick sort with an inline swap. --
--        Menu options allow output control, random data
--                      generation, and selection of sorting options.
-- USAGE: sort
--
-- .......................................................................... --

with System, Sort_Sup, Text_Io, V_I_Bits;
use System, Sort_Sup, Text_Io;

package body Sort_Sup is
    Wait_Time : constant Integer := 10000;
    Show_Result : Boolean := False;

    procedure Pause is
        W : Integer := 1;
    begin

        for I in 1 .. Wait_Time loop
            W := W * 3;
            W := W / 3;
        end loop;

    end Pause;


    procedure Initialize is
    begin
        --
        -- set initial values
        --
        Input_Valid := False;
        Output_Valid := False;
        Num_Of_Data := 8;

        Put_Line
           ("<<<      VADS/NWIS Performance Analyzer Demonstration      >>>");

    end Initialize;


    function Make_Random (Seed : Integer) return Integer is
        use V_I_Bits;

        Rand_Num1 : Integer := Seed;
        Rand_Num2 : Integer := Rand_Num1;
        Rand_Num3 : Integer := Rand_Num1;
        Ret_Val : Integer := 0;
    begin

        -- seed >> 4
        Rand_Num1 := Rand_Num1 / (2 ** 4);
        -- seed << 10
        Rand_Num2 := Rand_Num2 * (2 ** 10);
        -- seed >> 3
        Rand_Num3 := Rand_Num3 / (2 ** 3);

        Ret_Val := Bit_Or (Rand_Num2, Rand_Num3);
        Ret_Val := Ret_Val + Rand_Num1;
        Ret_Val := Bit_And (Ret_Val, Bit_Mask);


        return Ret_Val;

    end Make_Random;


    procedure Gen_Pseudo_Random_Data
                 (A : in out Sort_Data; N : Integer; Seed : Integer) is
        Seed_Clone : Integer := Seed;
    begin

        for I in 0 .. (N - 1) loop
            A (I) := Make_Random (Seed_Clone);
            Seed_Clone := A (I);
        end loop;

    end Gen_Pseudo_Random_Data;


    procedure Gen_Random_Data (A : in out Sort_Data; N, Seed : Integer) is
    begin
        --
        -- no cross-compiled C code for a real interface
        --
        Gen_Pseudo_Random_Data (A, N, Seed);
    end Gen_Random_Data;


    procedure Gen_Ascending_Data (A : in out Sort_Data; N : Integer) is
    begin

        for I in 0 .. (N - 1) loop
            A (I) := I mod 256;
        end loop;

    end Gen_Ascending_Data;


    procedure Gen_Descending_Data (A : in out Sort_Data; N : Integer) is
    begin

        for I in 0 .. (N - 1) loop
            A (I) := 255 - (I mod 256);
        end loop;

    end Gen_Descending_Data;


    procedure Read_User_Data (A : out Sort_Data; N : Integer) is
    begin
        Put_Line ("read_user_data is not yet implemented");

    end Read_User_Data;


    procedure Show_Data is
    begin

        Put_Line (" ");

        if (Input_Valid or Output_Valid) then
            for I in 1 .. Num_Of_Data loop

                if (Input_Valid) then
                    Put (" Input data [" & Integer'Image (I));
                    Put_Line ("] = " & Integer'Image (Input_Data (I - 1)));
                end if;

                if (Output_Valid) then
                    Put (" Output data [" & Integer'Image (I));
                    Put_Line ("] = " & Integer'Image (Output_Data (I - 1)));
                end if;

            end loop;

        end if;
        Put_Line (" ");

        if ((Num_Of_Data < 1) or ((not Input_Valid) and
                                  (not Output_Valid))) then
            Put_Line (" Input and Output data not available.");
        else
            if (not Output_Valid) then
                Put_Line (" Output data not available.");
            end if;
        end if;
        Pause;

    end Show_Data;


    procedure Draw_Front_Page is
    begin
        Put_Line ("draw_front_page is not yet implemented");

    end Draw_Front_Page;


    procedure Copy (Copy_Size : in out Integer) is
    begin

        for I in 0 .. (Copy_Size - 1) loop
            Output_Data (I) := Input_Data (I);
        end loop;
        Output_Valid := Input_Valid;

    end Copy;


    procedure Swap (X, Y : in out Integer) is
        Temp : Integer;
    begin

        Temp := X;
        X := Y;
        Y := Temp;

    end Swap;


    procedure Show_Output (T : Integer) is
    begin

        if Show_Result then
            Put_Line ("Sorted data:");
            for I in 0 .. (T - 1) loop
                Put_Line (Integer'Image (Output_Data (I)));
            end loop;

            Pause;
        end if;

    end Show_Output;


    procedure Bubble_Sort (A : in out Sort_Data; N : Integer) is
        Temp : Integer;
    begin

        for I in reverse 1 .. (N - 1) loop
            for T in 0 .. (I - 1) loop
                if (A (T) > A (T + 1)) then
                    Swap (A (T), A (T + 1));
                end if;
            end loop;
        end loop;

    end Bubble_Sort;


    procedure Shell_Sort (A : in out Sort_Data; N : Integer) is
        K1 : Integer := 0;
        K2 : Integer := 0;
        Gap : Integer := N / 2;
        Temp : Integer;
    begin

        while (Gap > 0) loop
            for I in Gap .. (N - 1) loop
                K1 := I - Gap;
                while (K1 > -1) loop
                    K2 := K1 + Gap;
                    if (A (K1) <= A (K2)) then
                        K1 := -1;
                    else
                        Swap (A (K1), A (K2));
                    end if;
                    K1 := K1 - Gap;
                end loop;
            end loop;
            Gap := Gap / 2;

        end loop;

    end Shell_Sort;


    procedure Rquick (Lo : in out Integer; Hi : in out Integer) is
        Temp : Integer;
        I, J : Integer := 0;
    begin

        if (Lo < Hi) then
            Pivot := Output_Data ((Lo + Hi) / 2);
            I := Lo;
            J := Hi;
            while (I <= J) loop
                while (Output_Data (I) < Pivot) loop
                    I := I + 1;
                end loop;

                while (Output_Data (J) > Pivot) loop
                    J := J - 1;
                end loop;

                if (I <= J) then
                    Swap (Output_Data (I), Output_Data (J));
                    I := I + 1;
                    J := J - 1;
                end if;
            end loop;

            if ((J - Lo) < (Hi - I)) then
                Rquick (Lo, J);
                Rquick (I, Hi);
            else
                Rquick (I, Hi);
                Rquick (Lo, J);
            end if;
        end if;

    end Rquick;


    procedure Quick_Sort (A : in out Sort_Data; N : Integer) is
        T : Integer := 0;
        S : Integer := N - 1;
    begin
        Rquick (T, S);
    end Quick_Sort;


    procedure Rquick_Inline (Lo : in out Integer; Hi : in out Integer) is
        Temp : Integer := 0;
        I, J : Integer := 0;
    begin

        if (Lo < Hi) then
            Pivot := Output_Data ((Lo + Hi) / 2);
            I := Lo;
            J := Hi;           while (I <= J) loop
                while (Output_Data (I) < Pivot) loop
                    I := I + 1;
                end loop;

                while (Output_Data (J) > Pivot) loop
                    J := J - 1;
                end loop;

                if (I <= J) then
                    Temp := Output_Data (I);
                    Output_Data (I) := Output_Data (J);
                    Output_Data (J) := Temp;
                    I := I + 1;
                    J := J - 1;
                end if;

            end loop;

            if ((J - Lo) < (Hi - I)) then
                Rquick_Inline (Lo, J);
                Rquick_Inline (I, Hi);
            else
                Rquick_Inline (I, Hi);
                Rquick_Inline (Lo, J);
            end if;
        end if;

    end Rquick_Inline;

    procedure Quick_Sort_Inline (A : in out Sort_Data; N : Integer) is
        T : Integer := 0;
        S : Integer := N - 1;
    begin
        Rquick_Inline (T, S);
    end Quick_Sort_Inline;

    procedure Change_Number_Of_Data_Points is
    begin
        Num_Of_Data := 0;

        Put_Line (" ");
        while ((Num_Of_Data < 2) or (Num_Of_Data > Max_Num_Of_Data)) loop
            Put (" Enter number of data points ( 2 - ");
            Put (Integer'Image (Max_Num_Of_Data));
            Put (" ): ");
            Int_Io.Get (Num_Of_Data);
        end loop;
        Put_Line (" ");

    end Change_Number_Of_Data_Points;


    function Get_Option return Integer is
        I : Integer;
    begin

        Put_Line ("");
        Put_Line ("                 ----------- MENU ----------- ");
        Put_Line ("");
        Put (" 1 - Change number of data points [");
        Put_Line (Integer'Image (Num_Of_Data) & "]");
        Put (" 2 - Display results              [");
        if Show_Result then
            Put_Line ("TRUE]");
        else
            Put_Line ("FALSE]");
        end if;

        Put_Line ("");
        Put_Line (" 3 - Generate random input data ");
        Put_Line (" 4 - Generate pseudo random input data");
        Put_Line (" 5 - Generate ascending input data");
        Put_Line (" 6 - Generate descending input data");
        Put_Line (" 7 - Take input data from the user");
        Put_Line ("");
        Put_Line (" 8 - Bubble sort");
        Put_Line (" 9 - Shell  sort");
        Put_Line ("10 - Quick  sort");
        Put_Line ("11 - Quick  sort ( inline swap )");
        Put_Line ("12 - Continuous data sort");
        Put_Line ("13 - Show input and output data");
        Put_Line ("");
        Put_Line ("                 OTHERWISE - Exit to O/S");
        Put_Line ("");
        Put_Line ("");
        Put ("                 Enter the choice number: ");
        Int_Io.Get (I);
        Put_Line (" ");

        if ((I < 1) or (I > Max_Menu_Entry)) then
            I := 0;
        end if;

        return I;

    end Get_Option;

    procedure Sort_Loop is
        Loop_Last : constant Integer := 6;
        Test_Max : constant Integer := 320;
        Seed : Integer := 1372;
        Sort_Size : Integer := 5;
        Loops_Needed : Integer;
    begin

        Gen_Random_Data (Input_Data, Test_Max, Seed);

        Put (" How many iterations would you like to perform: ");
        Int_Io.Get (Loops_Needed);
        Put_Line (" ");

        for T in 1 .. Loops_Needed loop
            --
            -- endless loop for scrolling through sorts
            --
            for I in 1 .. Loop_Last loop
                --
                -- use 5, 10, 20, 40, 80, 160, and 320 elements for sort
                --
                Copy (Sort_Size);
                Put ("Bubble sort with " & Integer'Image (Sort_Size));
                Put_Line (" elements");
                Bubble_Sort (Output_Data, Sort_Size);
                Show_Output (Sort_Size);

                Copy (Sort_Size);
                Put ("Quick sort with " & Integer'Image (Sort_Size));
                Put_Line (" elements");
                Quick_Sort (Output_Data, Sort_Size);
                Show_Output (Sort_Size);

                Sort_Size := Sort_Size * 2;
            end loop;

            Pause;
            Sort_Size := 5;
            Put_Line (" ");
        end loop;

    end Sort_Loop;


    procedure Change_Display_Default is
    begin

        if Show_Result then
            Show_Result := False;
        else
            Show_Result := True;
        end if;

    end Change_Display_Default;


    procedure Do_Choice is
        Seed : Integer := 8765;
    begin

        Choice := Get_Option;

        while (Choice /= 0) loop

            case Choice is
                when 1 =>
                    Change_Number_Of_Data_Points;

                when 2 =>
                    Change_Display_Default;

                when 3 =>
                    if (Num_Of_Data > 0) then
                        Put ("enter a seed value: ");
                        Int_Io.Get (Seed);
                        Gen_Random_Data (Input_Data, Num_Of_Data, Seed);
                        Input_Valid := True;
                    end if;

                when 4 =>
                    if (Num_Of_Data > 0) then
                        Put ("enter a seed value: ");
                        Int_Io.Get (Seed);
                        Gen_Pseudo_Random_Data (Input_Data, Num_Of_Data, Seed);
                        Input_Valid := True;
                    end if;

                when 5 =>
                    if (Num_Of_Data > 0) then
                        Gen_Ascending_Data (Input_Data, Num_Of_Data);
                        Input_Valid := True;
                    end if;

                when 6 =>
                    if (Num_Of_Data > 0) then
                        Gen_Descending_Data (Input_Data, Num_Of_Data);
                        Input_Valid := True;
                    end if;

                when 7 =>
                    if (Num_Of_Data > 0) then
                        Read_User_Data (Input_Data, Num_Of_Data);
                    end if;

                when 8 =>
                    Copy (Num_Of_Data);
                    if (Output_Valid) then
                        Bubble_Sort (Output_Data, Num_Of_Data);
                        Show_Output (Num_Of_Data);
                    end if;

                when 9 =>
                    Copy (Num_Of_Data);
                    if (Output_Valid) then
                        Shell_Sort (Output_Data, Num_Of_Data);
                        Show_Output (Num_Of_Data);
                    end if;

                when 10 =>
                    Copy (Num_Of_Data);
                    if (Output_Valid) then
                        Quick_Sort (Output_Data, Num_Of_Data);
                        Show_Output (Num_Of_Data);
                    end if;

                when 11 =>
                    Copy (Num_Of_Data);
                    if (Output_Valid) then
                        Quick_Sort_Inline (Output_Data, Num_Of_Data);
                        Show_Output (Num_Of_Data);
                    end if;

                when 12 =>
                    Sort_Loop;

                when 13 =>
                    Show_Data;

                when others =>
                    null;

            end case;

            Choice := Get_Option;
        end loop;

    end Do_Choice;

end Sort_Sup;


E3 Meta Data

    nblk1=11
    nid=11
    hdr6=20
        [0x00] rec0=17 rec1=00 rec2=01 rec3=030
        [0x01] rec0=2b rec1=00 rec2=02 rec3=054
        [0x02] rec0=28 rec1=00 rec2=03 rec3=004
        [0x03] rec0=26 rec1=00 rec2=04 rec3=042
        [0x04] rec0=2a rec1=00 rec2=05 rec3=000
        [0x05] rec0=2d rec1=00 rec2=06 rec3=018
        [0x06] rec0=23 rec1=00 rec2=07 rec3=008
        [0x07] rec0=27 rec1=00 rec2=08 rec3=002
        [0x08] rec0=21 rec1=00 rec2=09 rec3=004
        [0x09] rec0=21 rec1=00 rec2=0a rec3=036
        [0x0a] rec0=1c rec1=00 rec2=0b rec3=004
        [0x0b] rec0=1e rec1=00 rec2=0c rec3=04c
        [0x0c] rec0=2c rec1=00 rec2=0d rec3=03a
        [0x0d] rec0=1a rec1=00 rec2=0e rec3=02c
        [0x0e] rec0=1a rec1=00 rec2=0f rec3=078
        [0x0f] rec0=1d rec1=00 rec2=10 rec3=000
        [0x10] rec0=00 rec1=00 rec2=00 rec3=000
    tail 0x217657a9e87e167ccc1c7 0x42a00088462060003
Free Block Chain:
  0x11: 0000  00 00 00 04 80 01 20 01 00 00 00 00 00 00 00 00  ┆                ┆