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

⟦a2f2c7bd2⟧ Ada Source

    Length: 11264 (0x2c00)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Fields, seg_0046d6

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



with More_String_Utilities;
package body Fields is

    Is_Done : exception;

    function Is_Null (This_Iterator : in Iterator) return Boolean is
    begin
        return This_Iterator.The_Fields.all = "";
    end Is_Null;

    procedure Advance_Field_In (This_Iterator : in out Iterator) is
    begin  
        This_Iterator.Characters_In_Current_Field := 0;
        This_Iterator.Current_Field_Number        :=
           This_Iterator.Current_Field_Number + 1;
        if This_Iterator.Trailing_Separator_Position >
           This_Iterator.The_Fields'Last then
            This_Iterator.Done := True;
        end if;
        loop  
            exit when This_Iterator.Done;
            This_Iterator.Trailing_Separator_Position :=
               This_Iterator.Trailing_Separator_Position + 1;
            exit when This_Iterator.Trailing_Separator_Position >
                         This_Iterator.The_Fields'Last;
            exit when Is_Separator
                         (This_Iterator.The_Fields
                             (This_Iterator.Trailing_Separator_Position));
            This_Iterator.Characters_In_Current_Field :=
               This_Iterator.Characters_In_Current_Field + 1;
        end loop;
    end Advance_Field_In;

    procedure Set_State (This_Iterator : in out Iterator) is
    begin
        if not Is_Null (This_Iterator) then
            This_Iterator.Trailing_Separator_Position :=
               This_Iterator.The_Fields'First - 1;
            This_Iterator.Characters_In_Current_Field := 0;
            This_Iterator.Current_Field_Number := 0;
            This_Iterator.Done := False;
            Advance_Field_In (This_Iterator);
        end if;
    end Set_State;

    function Create (From_String : in String) return Iterator is

        New_Iterator : Iterator;

        The_String : constant String (1 .. From_String'Length) := From_String;

    begin
        New_Iterator.The_Fields := new String'(The_String);
        Set_State (New_Iterator);
        return New_Iterator;  
    end Create;

    function Image (Of_Fields : in Iterator) return String is
    begin
        return Of_Fields.The_Fields.all;
    end Image;

    procedure Assert_Is_Initialized (This_Iterator : in Iterator) is
    begin
        if This_Iterator.The_Fields = null then
            raise Not_Initialized;
        end if;
    end Assert_Is_Initialized;

    function Done (This_Iterator : in Iterator) return Boolean is
    begin
        Assert_Is_Initialized (This_Iterator);
        return This_Iterator.Done;
    end Done;

    procedure Reset (This_Iterator : in out Iterator) is
    begin
        Assert_Is_Initialized (This_Iterator);
        Set_State (This_Iterator);  
    end Reset;

    procedure Assert_Not_Done (This_Iterator : in Iterator) is
    begin
        if Done (This_Iterator) then
            raise Is_Done;
        end if;
    end Assert_Not_Done;

    function Current_Field_Start (This_Iterator : in Iterator) return Natural is
    begin
        return This_Iterator.Trailing_Separator_Position -
                  This_Iterator.Characters_In_Current_Field;
    end Current_Field_Start;

    function Current_Field_End (This_Iterator : in Iterator) return Natural is
    begin
        return This_Iterator.Trailing_Separator_Position - 1;
    end Current_Field_End;

    function Current (This_Iterator : in Iterator) return Field is
    begin
        Assert_Not_Done (This_Iterator);
        declare
            The_Current_Field_Raw        : constant String         :=
               This_Iterator.The_Fields (Current_Field_Start (This_Iterator) ..
                                            Current_Field_End (This_Iterator));
            The_Current_Field_Normalized :
               constant String (1 .. The_Current_Field_Raw'Length) :=
               The_Current_Field_Raw;
        begin
            return The_Current_Field_Normalized;
        end;

    exception
        when Is_Done =>
            raise No_Current_Field;

    end Current;

    procedure Assert_Field_Valid (This_Field : in Field) is
    begin
        for Index in This_Field'Range loop
            if Is_Separator (This_Field (Index)) then
                raise Parse_Failure;
            end if;
        end loop;
    end Assert_Field_Valid;

    procedure Modify (This_Iterator : in out Iterator; New_Field : in Field) is

        Original_Position : constant Positive := Position (This_Iterator);

    begin
        Assert_Not_Done (This_Iterator);
        Assert_Field_Valid (New_Field);
        declare
            New_Fields : constant String :=
               More_String_Utilities.Replace
                  (From_Here      => Current_Field_Start (This_Iterator),
                   To_Here        => Current_Field_End (This_Iterator),
                   With_Substring => New_Field,
                   In_String      => This_Iterator.The_Fields.all);
        begin
            This_Iterator.The_Fields := new String'(New_Fields);
        end;
        Set (This_Iterator, Original_Position);

    exception
        when Is_Done =>
            raise No_Current_Field;

    end Modify;

    procedure Next (This_Iterator : in out Iterator) is
    begin
        Assert_Not_Done (This_Iterator);
        Advance_Field_In (This_Iterator);

    exception
        when Is_Done =>
            raise No_Next_Field;

    end Next;

    function Position (In_Iterator : in Iterator) return Field_Number is
    begin
        Assert_Not_Done (In_Iterator);
        return In_Iterator.Current_Field_Number;
    end Position;

    procedure Set (This_Iterator : in out Iterator;
                   To_Field      : in     Field_Number) is
    begin
        Reset (This_Iterator);
        for Counter in 1 .. (To_Field - 1) loop
            Next (This_Iterator);
        end loop;

    exception
        when No_Next_Field =>
            raise Out_Of_Range;

    end Set;

    function Field_At
                (This_Position : in Field_Number; In_Iterator : in Iterator)
                return Field is

        The_Iterator : Iterator := In_Iterator;

    begin
        Set (The_Iterator, This_Position);
        return Current (The_Iterator);
    end Field_At;

    function Is_Empty (This_Iterator : in Iterator) return Boolean is
    begin
        Assert_Is_Initialized (This_Iterator);
        return Is_Null (This_Iterator);
    end Is_Empty;

    function Fields_In (This_Iterator : in Iterator) return Natural is

        The_Iterator : Iterator := This_Iterator;

    begin  
        Assert_Is_Initialized (The_Iterator);
        Reset (The_Iterator);
        for Counter in 0 .. Integer'Last loop
            if Done (The_Iterator) then
                return Counter;
            end if;
            Next (The_Iterator);
        end loop;
    end Fields_In;

    procedure Add (This_Field      : in     Field;
                   To_Iterator     : in out Iterator;
                   Using_Separator : in     Character) is
    begin
        Assert_Field_Valid (This_Field);
        if not Is_Separator (Using_Separator) then
            raise Parse_Failure;
        end if;  
        if Fields_In (To_Iterator) = 0 then
            To_Iterator := Create (This_Field);
        else
            To_Iterator := Create (Image (To_Iterator) &
                                   Using_Separator & This_Field);
        end if;
    end Add;

end Fields;

E3 Meta Data

    nblk1=a
    nid=0
    hdr6=14
        [0x00] rec0=1c rec1=00 rec2=01 rec3=00e
        [0x01] rec0=00 rec1=00 rec2=0a rec3=00e
        [0x02] rec0=1a rec1=00 rec2=02 rec3=050
        [0x03] rec0=22 rec1=00 rec2=03 rec3=01e
        [0x04] rec0=18 rec1=00 rec2=04 rec3=012
        [0x05] rec0=00 rec1=00 rec2=09 rec3=01e
        [0x06] rec0=1f rec1=00 rec2=05 rec3=00a
        [0x07] rec0=22 rec1=00 rec2=06 rec3=034
        [0x08] rec0=24 rec1=00 rec2=07 rec3=026
        [0x09] rec0=16 rec1=00 rec2=08 rec3=000
    tail 0x217002a30815c67282319 0x42a00088462061e03