DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400 Tapes

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 Tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: B T

⟦eb45705ec⟧ TextFile

    Length: 2606 (0xa2e)
    Types: TextFile
    Names: »B«

Derivation

└─⟦180fe333a⟧ Bits:30000405 8mm tape, Rational 1000, SW CATALOG, 10_20_0
└─⟦180fe333a⟧ Bits:30000537 8mm tape, Rational 1000, SW Catalog 10_20_0
    └─⟦5cb1d1d7f⟧ »DATA« 
        └─⟦3b1ee7bd8⟧ 
            └─⟦this⟧ 

TextFile

separate (Tar)
procedure Read (Files : Name := "?";
                Archive : Name := Tar.Tape;
                Record_Size : Positive := Tar.Tblock;
                Records_Per_Block : Positive := 8;
                Swap_Bytes : Boolean := False) is

    Buffer : System.Byte_String (1 .. Record_Size);
    Source_File : Block_Buffer.Buffer_Type;
    Target_File : Dio.File_Type;
    File_Bytes : Natural;

    procedure Open (Rational_Name : String) is
    begin
        Open_Out_File (File => Target_File, Name => Rational_Name);
    exception
        when others =>
            null;
    end Open;

    procedure Write (Data : System.Byte_String) is
    begin
        Dio.Write (Target_File, Data);
    exception
        when others =>
            null;
    end Write;

    procedure Close is
    begin
        Dio.Close (Target_File);
    exception
        when others =>
            null;
    end Close;

    procedure Read_File (Total_Bytes : Natural; Do_Process : Boolean) is
        Bytes_Left : Natural := Total_Bytes;
    begin
        while Bytes_Left > 0 loop
            Block_Buffer.Read (Source_File, Buffer);
            if Bytes_Left > Buffer'Length then
                if Do_Process then
                    Write (Buffer);
                end if;
                Bytes_Left := Bytes_Left - Buffer'Length;
            else
                if Do_Process then
                    Write (Buffer (1 .. Bytes_Left));
                end if;
                Bytes_Left := 0;
            end if;
        end loop;
    end Read_File;

begin
    Block_Buffer.Open (Source_File, Dio.In_File, Archive,
                       Record_Size, Records_Per_Block, Swap_Bytes);
    loop
        Block_Buffer.Read (Source_File, Buffer);
        exit when File_End (Buffer);
        File_Bytes := File_Byte_Count (Buffer);

        if Naming.Matches (File_Name (Buffer), Files) then
            Put_Line (File_Name (Buffer) & " => " &
                      Naming.To_Rational_Name (File_Name (Buffer)) & ";" &
                      Natural'Image (File_Bytes) & " bytes");
            if File_Bytes > 0 then
                Open (Naming.To_Rational_Name (File_Name (Buffer)));
                Read_File (File_Bytes, Do_Process => True);
                Close;
            else
                Put_Line ("directory '" & File_Name (Buffer) & "' ignored.");
            end if;
        else
            Read_File (File_Bytes, Do_Process => False);
        end if;
    end loop;
    Block_Buffer.Close (Source_File);
exception
    when others =>
        Block_Buffer.Close (Source_File);
        raise;
end Read;