|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: B T
Length: 13781 (0x35d5) Types: TextFile Names: »B«
└─⟦85b835f43⟧ Bits:30000549 8mm tape, Rational 1000, Xlib rev 6.00 └─⟦0c20f784e⟧ »DATA« └─⟦1abbe589f⟧ └─⟦591c5b094⟧ └─⟦this⟧
with Text_Io; use Text_Io; with Vstring_Heap; use Vstring_Heap; with Vstring_Type; use Vstring_Type; package body Vstring_Io is ------------------------------------------------------------------------------ -- Vstring I/O ------------------------------------------------------------------------------ -- Copyright 1988 - 1991 by Rational, Santa Clara, California. -- -- All Rights Reserved. -- -- Permission to use, copy, modify, and distribute this software and its -- documentation for any purpose and without fee is hereby granted, -- provided that the above copyright notice(s) appear in all copies and that -- both that copyright notice(s) and this permission notice appear in -- supporting documentation, and that the name of Rational not be used in -- advertising or publicity pertaining to distribution of the software -- without specific, written prior permission. -- -- Rational disclaims all warranties with regard to this software, including -- all implied warranties of merchantability and fitness, in no event shall -- Rational be liable for any special, indirect or consequential damages or -- any damages whatsoever resulting from loss of use, data or profits, whether -- in an action of contract, negligence or other tortious action, arising out -- of or in connection with the use or performance of this software. ------------------------------------------------------------------------------ ----Some Text_Io's have problems with strings(1..Natural'Last) so we'll do -- approximately (1..Natural'Last/2) at most in one I/O. Natural_Last : constant S_Natural := (S_Natural (Natural'Last) + 1) / 2; --\f procedure Get (File : Text_Io.File_Type; Line : in out Vstring_Data; End_Of_Line : in out Boolean; End_Of_Page : in out Boolean; End_Of_File : in out Boolean) is ----Just line Get. Get all or part of a line. -- End_Of_Line iff Item contains the end of line (possibly null) -- End_Of_Page iff End_Of_Line and this is the last line of the page -- End_Of_File iff End_Of_Page and this is the last page of the file -- -- The intent if for each call to return as many characters from the -- line as fit, but Line.Length /= Line.Maximum_Length doesn't imply -- End_Of_Line. Lno : Positive_Count := Text_Io.Line (File); Pno : Positive_Count := Text_Io.Page (File); Length : Natural; Buffer : String (1 .. Natural (Min (512, Line.Maximum_Length))); begin if Text_Io.End_Of_File (File) then Line.Length := 0; End_Of_File := True; End_Of_Page := True; End_Of_Line := True; return; end if; Get_Line (File, Buffer, Length); Line.Length := S_Natural (Length); Line.Chars (1 .. Line.Length) := E_String (Buffer (1 .. Length)); while Line.Length < Line.Maximum_Length and then not Text_Io.End_Of_Line (File) loop if S_Natural (Buffer'Length) > Line.Maximum_Length - Line.Length then Get_Line (File, Buffer (1 .. Natural (Line.Maximum_Length - Line.Length)), Length); else Get_Line (File, Buffer, Length); end if; Line.Chars (Line.Length + 1 .. Line.Length + S_Natural (Length)) := E_String (Buffer (1 .. Length)); Line.Length := Line.Length + S_Natural (Length); end loop; End_Of_File := Text_Io.End_Of_File (File); End_Of_Page := End_Of_File or else Pno /= Text_Io.Page (File); End_Of_Line := End_Of_Page or else Lno /= Text_Io.Line (File); end Get; --\f procedure Get (File : Text_Io.File_Type; Line : Vstring; End_Of_Line : in out Boolean; End_Of_Page : in out Boolean; End_Of_File : in out Boolean) is ----Just line Get. Get all or part of a line. -- End_Of_Line iff Item contains the end of line (possibly null) -- End_Of_Page iff End_Of_Line and this is the last line of the page -- End_Of_File iff End_Of_Page and this is the last page of the file -- -- The intent if for each call to return as many characters from the -- line as fit, but Line.Length /= Line.Maximum_Length doesn't imply -- End_Of_Line. Lno : Positive_Count := Text_Io.Line (File); Pno : Positive_Count := Text_Io.Page (File); Length : Natural; Buffer : String (1 .. Natural (Min (512, Line.Maximum_Length))); begin if Text_Io.End_Of_File (File) then Line.Length := 0; End_Of_File := True; End_Of_Page := True; End_Of_Line := True; return; end if; Get_Line (File, Buffer, Length); Line.Length := S_Natural (Length); Line.Chars (1 .. Line.Length) := E_String (Buffer (1 .. Length)); while Line.Length < Line.Maximum_Length and then not Text_Io.End_Of_Line (File) loop if S_Natural (Buffer'Length) > Line.Maximum_Length - Line.Length then Get_Line (File, Buffer (1 .. Natural (Line.Maximum_Length - Line.Length)), Length); else Get_Line (File, Buffer, Length); end if; Line.Chars (Line.Length + 1 .. Line.Length + S_Natural (Length)) := E_String (Buffer (1 .. Length)); Line.Length := Line.Length + S_Natural (Length); end loop; End_Of_File := Text_Io.End_Of_File (File); End_Of_Page := End_Of_File or else Pno /= Text_Io.Page (File); End_Of_Line := End_Of_Page or else Lno /= Text_Io.Line (File); end Get; --\f procedure Get_Resize (File : Text_Io.File_Type; Line : in out Vstring; Resize_Amount : S_Positive; End_Of_Line : in out Boolean; End_Of_Page : in out Boolean; End_Of_File : in out Boolean) is ----Just like Get above except that Line will be continually resized -- by Resize_Amount's until we can fit in an entire line (or until we -- hit End_Of_Page/File). Lno : Positive_Count := Text_Io.Line (File); Pno : Positive_Count := Text_Io.Page (File); Length : Natural; Buffer : String (1 .. 512); begin ----Try to fit a line into the space available. if Text_Io.End_Of_File (File) then Line.Length := 0; End_Of_File := True; End_Of_Page := True; End_Of_Line := True; return; end if; Get_Line (File, Buffer (1 .. Natural (Min (S_Natural (Buffer'Last), Line.Maximum_Length))), Length); Line.Length := S_Natural (Length); Line.Chars (1 .. Line.Length) := E_String (Buffer (1 .. Length)); End_Of_File := Text_Io.End_Of_File (File); End_Of_Page := End_Of_File or else Pno /= Text_Io.Page (File); End_Of_Line := End_Of_Page or else Lno /= Text_Io.Line (File); ----If we succeeded then return our result. if End_Of_Line then return; end if; ----Loop until we hit End_Of something. declare Start : S_Natural := Line.Length + 1; Finish : S_Natural; begin loop ----Grab up to the next 512 characters of line. Get_Line (File, Buffer, Length); ----Resize the buffer up one notch and then read into the new space. Finish := Line.Length + S_Natural (Length); if Finish > Line.Maximum_Length then Resize_Vstring (Line, (Finish + Resize_Amount - 1) / Resize_Amount * Resize_Amount); end if; Line.Chars (Start .. Finish) := E_String (Buffer (1 .. Length)); Line.Length := Finish; End_Of_File := Text_Io.End_Of_File (File); End_Of_Page := End_Of_File or else Pno /= Text_Io.Page (File); End_Of_Line := End_Of_Page or else Lno /= Text_Io.Line (File); ----If we've reached End_Of something then set our length and return. Line.Length := Finish; if End_Of_Line then return; end if; ----No luck, record the high-water mark and continue. Start := Finish + 1; end loop; end; end Get_Resize; --\f procedure Put (Vstr : Vstring_Data) is ----Do output of the contents of a Vstring. Start : S_Natural := 1; Finish : S_Natural; begin if Vstr.Length > 0 then for I in S_Natural range 0 .. (Vstr.Length - 1) / Natural_Last loop Finish := Min (Vstr.Length, Start + Natural_Last - 1); Put (String (Vstr.Chars (Start .. Finish))); Start := Finish + 1; end loop; end if; end Put; --\f procedure Put (File : Text_Io.File_Type; Vstr : Vstring_Data) is ----Do output of the contents of a Vstring. Start : S_Natural := 1; Finish : S_Natural; begin if Vstr.Length > 0 then for I in S_Natural range 0 .. (Vstr.Length - 1) / Natural_Last loop Finish := Min (Vstr.Length, Start + Natural_Last - 1); Put (File, String (Vstr.Chars (Start .. Finish))); Start := Finish + 1; end loop; end if; end Put; --\f procedure Put_Line (Vstr : Vstring_Data) is ----Do output of the contents of a Vstring. Start : S_Natural := 1; Finish : S_Natural; begin if Vstr.Length > 0 then for I in S_Natural range 1 .. (Vstr.Length - 1) / Natural_Last loop Finish := Min (Vstr.Length, Start + Natural_Last - 1); Put (String (Vstr.Chars (Start .. Finish))); Start := Finish + 1; end loop; Put_Line (String (Vstr.Chars (Start .. Vstr.Length))); else New_Line; end if; end Put_Line; --\f procedure Put_Line (File : Text_Io.File_Type; Vstr : Vstring_Data) is ----Do output of the contents of a Vstring. Start : S_Natural := 1; Finish : S_Natural; begin if Vstr.Length > 0 then for I in S_Natural range 1 .. (Vstr.Length - 1) / Natural_Last loop Finish := Min (Vstr.Length, Start + Natural_Last - 1); Put (File, String (Vstr.Chars (Start .. Finish))); Start := Finish + 1; end loop; Put_Line (File, String (Vstr.Chars (Start .. Vstr.Length))); else New_Line (File); end if; end Put_Line; --\f procedure Put (Vstr : Vstring) is ----Do output of the contents of a Vstring. Start : S_Natural := 1; Finish : S_Natural; begin if Vstr.Length > 0 then for I in S_Natural range 0 .. (Vstr.Length - 1) / Natural_Last loop Finish := Min (Vstr.Length, Start + Natural_Last - 1); Put (String (Vstr.Chars (Start .. Finish))); Start := Finish + 1; end loop; end if; end Put; --\f procedure Put (File : Text_Io.File_Type; Vstr : Vstring) is ----Do output of the contents of a Vstring. Start : S_Natural := 1; Finish : S_Natural; begin if Vstr.Length > 0 then for I in S_Natural range 0 .. (Vstr.Length - 1) / Natural_Last loop Finish := Min (Vstr.Length, Start + Natural_Last - 1); Put (File, String (Vstr.Chars (Start .. Finish))); Start := Finish + 1; end loop; end if; end Put; --\f procedure Put_Line (Vstr : Vstring) is ----Do output of the contents of a Vstring. Start : S_Natural := 1; Finish : S_Natural; begin if Vstr.Length > 0 then for I in S_Natural range 1 .. (Vstr.Length - 1) / Natural_Last loop Finish := Min (Vstr.Length, Start + Natural_Last - 1); Put (String (Vstr.Chars (Start .. Finish))); Start := Finish + 1; end loop; Put_Line (String (Vstr.Chars (Start .. Vstr.Length))); else New_Line; end if; end Put_Line; --\f procedure Put_Line (File : Text_Io.File_Type; Vstr : Vstring) is ----Do output of the contents of a Vstring. Start : S_Natural := 1; Finish : S_Natural; begin if Vstr.Length > 0 then for I in S_Natural range 1 .. (Vstr.Length - 1) / Natural_Last loop Finish := Min (Vstr.Length, Start + Natural_Last - 1); Put (File, String (Vstr.Chars (Start .. Finish))); Start := Finish + 1; end loop; Put_Line (File, String (Vstr.Chars (Start .. Vstr.Length))); else New_Line (File); end if; end Put_Line; --\f end Vstring_Io;