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

⟦f92bec053⟧ Ada Source

    Length: 17408 (0x4400)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Maps, seg_0046e4

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 Io;
with Files;
with String_Utilities;
with Low_Level_File_Operations;
package body Maps is

    Key_Field : constant Positive := 1;

    function Create (From_String : in String) return Mapping is

        New_Mapping : Mapping;

    begin
        if From_String = "" then
            -- No fields in string, so no key field.
            raise Parse_Failure;
        end if;
        New_Mapping := Mapping (Mappings.Iterator'
                                (Mappings.Create (From_String)));
        if Mappings.Current  
              (Mappings.Iterator (New_Mapping)) = "" then
            -- Key field is null.
            raise Parse_Failure;
        end if;
        return New_Mapping;

    exception
        when others =>
            raise;

    end Create;

    function Image (Of_Fields : in Mapping) return String is
    begin
        return Mappings.Image (Mappings.Iterator (Of_Fields));

    exception
        when Mappings.Not_Initialized =>
            raise Not_Initialized;
        when others =>
            raise;

    end Image;

    function Done (This_Mapping : in Mapping) return Boolean is
    begin
        return Mappings.Done (Mappings.Iterator (This_Mapping));

    exception
        when Mappings.Not_Initialized =>
            raise Not_Initialized;
        when others =>
            raise;

    end Done;

    procedure Reset (This_Mapping : in out Mapping) is
    begin
        Mappings.Reset (Mappings.Iterator (This_Mapping));

    exception
        when Mappings.Not_Initialized =>
            raise Not_Initialized;
        when others =>
            raise;

    end Reset;

    function Current (This_Mapping : in Mapping) return Field is
    begin
        return Mappings.Current (Mappings.Iterator (This_Mapping));

    exception
        when Mappings.Not_Initialized =>
            raise Not_Initialized;
        when Mappings.No_Current_Field =>
            raise No_Current_Field;
        when others =>
            raise;

    end Current;

    procedure Modify (This_Mapping : in out Mapping; New_Field : in Field) is
    begin
        if Mappings.Position (Mappings.Iterator (This_Mapping)) = Key_Field then
            -- Attempt to modify key field.
            raise Out_Of_Range;
        end if;
        Mappings.Modify (Mappings.Iterator (This_Mapping), New_Field);

    exception
        when Mappings.Not_Initialized =>
            raise Not_Initialized;
        when Mappings.No_Current_Field =>
            raise No_Current_Field;
        when Mappings.Parse_Failure =>
            raise Parse_Failure;
        when others =>
            raise;

    end Modify;

    procedure Next (This_Mapping : in out Mapping) is
    begin
        Mappings.Next (Mappings.Iterator (This_Mapping));

    exception
        when Mappings.Not_Initialized =>
            raise Not_Initialized;
        when Mappings.No_Next_Field =>
            raise No_Next_Field;
        when others =>
            raise;

    end Next;

    function Position (In_Mapping : in Mapping) return Field_Number is
    begin
        return Mappings.Position (Mappings.Iterator (In_Mapping));

    exception
        when Mappings.Not_Initialized =>
            raise Not_Initialized;
        when Mappings.No_Current_Field =>
            raise No_Current_Field;
        when others =>
            raise;

    end Position;

    procedure Set (This_Mapping : in out Mapping; To_Field : in Field_Number) is
    begin
        Mappings.Set (Mappings.Iterator (This_Mapping), To_Field);

    exception
        when Mappings.Not_Initialized =>
            raise Not_Initialized;
        when Mappings.Out_Of_Range =>
            raise Out_Of_Range;
        when others =>
            raise;

    end Set;

    function Field_At (This_Position : in Field_Number; In_Mapping : in Mapping)
                      return Field is
    begin
        return Mappings.Field_At (This_Position,
                                  Mappings.Iterator (In_Mapping));
    exception
        when Mappings.Not_Initialized =>
            raise Not_Initialized;
        when Mappings.Out_Of_Range =>
            raise Out_Of_Range;
        when others =>
            raise;

    end Field_At;

    function Fields_In (This_Mapping : in Mapping) return Positive is
    begin
        return Mappings.Fields_In (Mappings.Iterator (This_Mapping));

    exception
        when Mappings.Not_Initialized =>
            raise Not_Initialized;
        when others =>
            raise;

    end Fields_In;

    procedure Add (This_Field      : in     Field;
                   To_Mapping      : in out Mapping;
                   Using_Separator : in     Character) is
    begin
        Mappings.Add (This_Field, Mappings.Iterator (To_Mapping),
                      Using_Separator);
    exception
        when Mappings.Not_Initialized =>
            raise Not_Initialized;
        when Mappings.Parse_Failure =>
            raise Parse_Failure;
        when others =>
            raise;

    end Add;

    function Key_For (This_Mapping : in Mapping) return String is
    begin
        return Mappings.Field_At (Key_Field, Mappings.Iterator (This_Mapping));
    exception
        when Mappings.Not_Initialized =>
            raise Not_Initialized;
        when others =>
            raise Bad_Mapping;

    end Key_For;

    function Create
                (From_Map_File : in String; Ignore_Case : in Boolean := True)
                return Map is

        New_Map : Map;

        Input : Io.File_Type;

    begin  
        New_Map.Contents    := Lines.Create;
        New_Map.Ignore_Case := Ignore_Case;
        Low_Level_File_Operations.Create (From_Map_File);
        Low_Level_File_Operations.Open_To_Read (From_Map_File, Input);
        while not Io.End_Of_File (Input) loop
            declare
                Current_Line    : constant String := Io.Get_Line (Input);
                Current_Mapping : Mapping         := Create (Current_Line);
            begin
                declare
                    Current_Key : constant String := Key_For (Current_Mapping);
                begin
                    if Is_Mapped (Current_Key, New_Map) then
                        -- Duplicate entry.
                        raise Parse_Failure;
                    end if;  
                    Lines.Add (New_Map.Contents, Lines.Create (Current_Line));
                end;  
            end;  
        end loop;
        Low_Level_File_Operations.Close (Input);
        Lines.Reset_To_First (New_Map.Contents);
        return New_Map;

    exception
        when Low_Level_File_Operations.Io_Failure =>
            Low_Level_File_Operations.Close (Input);
            raise Io_Failure;
        when others =>
            Low_Level_File_Operations.Close (Input);
            raise Parse_Failure;

    end Create;

    procedure Save (To_Map_File : in String; This_Map : in out Map) is
    begin  
        Files.Save (To_Map_File, This_Map.Contents);

    exception
        when Files.Not_Initialized =>
            raise Not_Initialized;
        when Files.Io_Failure =>
            raise Io_Failure;  
        when others =>
            raise;

    end Save;

    function Is_Mapped (This_Key : in String; In_Map : in Map) return Boolean is

        The_Mapping : Mapping;

    begin
        The_Mapping := Mapping_For (This_Key, In_Map);
        return True;

    exception
        when Not_Initialized =>
            raise Not_Initialized;
        when Bad_Mapping =>
            raise Bad_Mapping;
        when others =>
            return False;

    end Is_Mapped;

    procedure Locate (This_Key    : in     String;
                      In_Map      : in out Map;
                      The_Mapping : in out Mapping) is

        -- Looks for the specified key in the specified map. If
        -- finds it, the map will be left with Current pointing
        -- to the entry matching the key, and the mapping itself
        -- will be passed to the caller. If not found, raises
        -- "No_Mapping".

        This_Key_Normalized : constant String :=
           String_Utilities.Upper_Case (This_Key);

    begin
        Lines.Reset_To_First (In_Map.Contents);
        while not Lines.Done (In_Map.Contents) loop
            declare  
                Current_Line : constant String :=
                   Lines.Image (Lines.Current (In_Map.Contents));
                Current_Mapping : Mapping := Create (Current_Line);
                Key_Field : constant String := Key_For (Current_Mapping);
                Key_Field_Normalized : constant String :=
                   String_Utilities.Upper_Case (Key_Field);
            begin  
                The_Mapping := Current_Mapping;
                if In_Map.Ignore_Case then
                    if Key_Field_Normalized = This_Key_Normalized then
                        -- Found match ignoring casing.
                        exit;
                    end if;
                else
                    if Key_Field = This_Key then
                        -- Found match including casing.
                        exit;
                    end if;
                end if;
                -- Didn't find match on this pass.
            end;
            Lines.Next (In_Map.Contents);
        end loop;  
        if Lines.Done (In_Map.Contents) then
            -- Never found match.
            raise No_Mapping;
        end if;

    exception
        when Lines.Not_Initialized =>
            raise Not_Initialized;
        when Bad_Mapping | Parse_Failure =>
            raise Bad_Mapping;
        when No_Mapping =>
            raise No_Mapping;
        when others =>
            raise;

    end Locate;

    function Mapping_For
                (This_Key : in String; In_Map : in Map) return Mapping is

        The_Mapping : Mapping;

        The_Map : Map := In_Map;

    begin
        Locate (This_Key, The_Map, The_Mapping);
        return The_Mapping;
    end Mapping_For;

    procedure Add (This_Mapping : in Mapping; To_Map : in out Map) is

        Old_Mapping : Mapping;

    begin  
        Locate (This_Key    => Key_For (This_Mapping),
                In_Map      => To_Map,
                The_Mapping => Old_Mapping);
        -- Found existing mapping with same key: need to overwrite.
        Lines.Modify (To_Map.Contents, Lines.Create (Image (This_Mapping)));

    exception
        when No_Mapping =>
            -- No mapping with the given key exists: need to add.
            Lines.Add (To_Map.Contents, Lines.Create (Image (This_Mapping)));
        when others =>
            raise;

    end Add;

    procedure Add (This_Mapping : in String; To_Map : in out Map) is
    begin  
        Add (Create (This_Mapping), To_Map);
    end Add;

    procedure Delete (From_Map : in out Map) is
    begin
        Lines.Delete (From_Map.Contents);

    exception
        when Lines.No_Current_Line =>
            raise No_Current_Mapping;
        when others =>
            raise;

    end Delete;

    function Done (This_Map : in Map) return Boolean is
    begin
        return Lines.Done (This_Map.Contents);

    exception
        when Lines.Not_Initialized =>
            raise Not_Initialized;
        when others =>
            raise;

    end Done;

    procedure Reset (This_Map : in out Map) is
    begin
        Lines.Reset_To_First (This_Map.Contents);

    exception
        when Lines.Not_Initialized =>
            raise Not_Initialized;
        when others =>
            raise;

    end Reset;

    function Current (This_Map : in Map) return Mapping is
    begin
        return Create (Lines.Image (Lines.Current (This_Map.Contents)));

    exception
        when Lines.Not_Initialized =>
            raise Not_Initialized;
        when Lines.No_Current_Line =>
            raise No_Current_Mapping;
        when Parse_Failure | Bad_Mapping =>
            raise Bad_Mapping;
        when others =>
            raise;

    end Current;

    procedure Next (This_Map : in out Map) is
    begin
        Lines.Next (This_Map.Contents);

    exception
        when Lines.Not_Initialized =>
            raise Not_Initialized;  
        when Lines.No_Next_Line =>
            raise No_Next_Mapping;
        when others =>
            raise;

    end Next;

    function Is_Empty (This_Map : in Map) return Boolean is
    begin
        return Lines.Is_Empty (This_Map.Contents);

    exception
        when Lines.Not_Initialized =>
            raise Not_Initialized;
        when others =>
            raise;

    end Is_Empty;

    function Mappings_In (This_Map : in Map) return Natural is
    begin
        return Lines.Lines_In (This_Map.Contents);

    exception
        when Mappings.Not_Initialized =>
            raise Not_Initialized;
        when others =>
            raise;

    end Mappings_In;

    procedure Dispose (Of_This_Map : in out Map) is
    begin
        Lines.Dispose (Of_This_Map.Contents);
    end Dispose;

end Maps;

E3 Meta Data

    nblk1=10
    nid=0
    hdr6=20
        [0x00] rec0=27 rec1=00 rec2=01 rec3=026
        [0x01] rec0=26 rec1=00 rec2=02 rec3=03a
        [0x02] rec0=21 rec1=00 rec2=03 rec3=03c
        [0x03] rec0=24 rec1=00 rec2=04 rec3=06e
        [0x04] rec0=1f rec1=00 rec2=05 rec3=082
        [0x05] rec0=23 rec1=00 rec2=06 rec3=038
        [0x06] rec0=00 rec1=00 rec2=10 rec3=006
        [0x07] rec0=18 rec1=00 rec2=07 rec3=00e
        [0x08] rec0=00 rec1=00 rec2=0f rec3=016
        [0x09] rec0=27 rec1=00 rec2=08 rec3=054
        [0x0a] rec0=16 rec1=00 rec2=09 rec3=03c
        [0x0b] rec0=1c rec1=00 rec2=0a rec3=010
        [0x0c] rec0=21 rec1=00 rec2=0b rec3=078
        [0x0d] rec0=2a rec1=00 rec2=0c rec3=01a
        [0x0e] rec0=27 rec1=00 rec2=0d rec3=01a
        [0x0f] rec0=1a rec1=00 rec2=0e rec3=000
    tail 0x217002a4c815c67496af4 0x42a00088462061e03