|
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 - 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