|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 11264 (0x2c00)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Fields, seg_0046d6
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦cfc2e13cd⟧ »Space Info Vol 2«
└─⟦this⟧
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;
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