|
|
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: 22943 (0x599f)
Types: TextFile
Names: »B«
└─⟦a7d1ea751⟧ Bits:30000550 8mm tape, Rational 1000, !users!projects 94_04_11
└─⟦129cab021⟧ »DATA«
└─⟦this⟧
└─⟦2f6cfab89⟧ Bits:30000547 8mm tape, Rational 1000, !projects 94-01-04
└─⟦d65440be7⟧ »DATA«
└─⟦this⟧
-- DISCUSSION:
--
-- This package implements the type "variable-length string" (vstring)
-- using generics. The alternative approaches are to use a discriminant
-- record in which the discriminant controls the length of a STRING inside
-- the record, or a record containing an access type which points to a
-- string, which can be deallocated and reallocated when necessary.
--
-- Advantages of this package:
-- * The other approaches force the vstring to be a limited private
-- type. Thus, their vstrings cannot appear on the left side of
-- the assignment operator; ie., their vstrings cannot be given
-- initial values or values by direct assignment. This package
-- uses a private type; therefore, these things can be done.
--
-- * The other approach stores the vstring in a string whose length
-- is determined dynamically. This package uses a fixed length
-- string. This difference might be reflected in faster and more
-- consistent execution times (this has NOT been verified).
--
-- Disadvantages of this package:
-- * Different instantiations must be used to declare vstrings with
-- different maximum lengths (this may be desirable, since
-- CONSTRAINT_ERROR will be raised if the maximum is exceeded).
--
-- * A second declaration is required to give the type declared by
-- the instantiation a name other than "VSTRING."
--
-- * The storage required for a vstring is determined by the generic
-- parameter LAST and not the actual length of its contents. Thus,
-- each object is allocated the maximum amount of storage, regardless
-- of its actual size.
--
-- MISCELLANEOUS:
-- Constraint checking is done explicitly in the code; thus, it cannot
-- be suppressed. On the other hand, constraint checking is not lost
-- if pragma suppress is supplied to the compilation (-S option)
-- (The robustness of the explicit constraint checking has NOT been
-- determined).
--
-- Compiling with the optimizer (-O option) may significantly reduce
-- the size (and possibly execution time) of the resulting executable.
--
-- Compiling an instantiation of VSTRINGS is roughly equivelent to
-- recompiling VSTRINGS. Since this takes a significant amount of time,
-- and the instantiation does not depend on any other library units,
-- it is STRONGLY recommended that the instantiation be compiled
-- separately, and thus done only ONCE.
--
-- USAGE: with VSTRINGS;
-- package package_name is new VSTRINGS(maximum_length);
-- .......................................................................... --
pragma Page;
package body Vstrings is
-- local declarations
Fill_Char : constant Character := Ascii.Nul;
procedure Format (The_String : in out Vstring;
Oldlen : in Strindex := Last) is
-- fill the string with FILL_CHAR to null out old values
begin -- FORMAT (Local Procedure)
The_String.Value (The_String.Len + 1 .. Oldlen) :=
(others => Fill_Char);
end Format;
-- bodies of visible operations
function Len (From : Vstring) return Strindex is
begin -- LEN
return (From.Len);
end Len;
function Max (From : Vstring) return Strindex is
begin -- MAX
return (Last);
end Max;
function Str (From : Vstring) return String is
begin -- STR
return (From.Value (First .. From.Len));
end Str;
function Char (From : Vstring; Position : Strindex := First)
return Character is
begin -- CHAR
if Position not in First .. From.Len then
raise Constraint_Error;
end if;
return (From.Value (Position));
end Char;
function "<" (Left : Vstring; Right : Vstring) return Boolean is
begin -- "<"
return (Left.Value < Right.Value);
end "<";
function ">" (Left : Vstring; Right : Vstring) return Boolean is
begin -- ">"
return (Left.Value > Right.Value);
end ">";
function "<=" (Left : Vstring; Right : Vstring) return Boolean is
begin -- "<="
return (Left.Value <= Right.Value);
end "<=";
function ">=" (Left : Vstring; Right : Vstring) return Boolean is
begin -- ">="
return (Left.Value >= Right.Value);
end ">=";
procedure Put (File : in File_Type; Item : in Vstring) is
begin -- PUT
Put (File, Item.Value (First .. Item.Len));
end Put;
procedure Put (Item : in Vstring) is
begin -- PUT
Put (Item.Value (First .. Item.Len));
end Put;
procedure Put_Line (File : in File_Type; Item : in Vstring) is
begin -- PUT_LINE
Put_Line (File, Item.Value (First .. Item.Len));
end Put_Line;
procedure Put_Line (Item : in Vstring) is
begin -- PUT_LINE
Put_Line (Item.Value (First .. Item.Len));
end Put_Line;
procedure Get (File : in File_Type;
Item : out Vstring;
Length : in Strindex := Last) is
begin -- GET
if Length not in First .. Last then
raise Constraint_Error;
end if;
Item := Nul;
for Index in First .. Length loop
Get (File, Item.Value (Index));
Item.Len := Index;
end loop;
end Get;
procedure Get (Item : out Vstring; Length : in Strindex := Last) is
begin -- GET
if Length not in First .. Last then
raise Constraint_Error;
end if;
Item := Nul;
for Index in First .. Length loop
Get (Item.Value (Index));
Item.Len := Index;
end loop;
end Get;
procedure Get_Line (File : in File_Type; Item : in out Vstring) is
Oldlen : constant Strindex := Item.Len;
begin -- GET_LINE
Get_Line (File, Item.Value, Item.Len);
Format (Item, Oldlen);
end Get_Line;
procedure Get_Line (Item : in out Vstring) is
Oldlen : constant Strindex := Item.Len;
begin -- GET_LINE
Get_Line (Item.Value, Item.Len);
Format (Item, Oldlen);
end Get_Line;
function Slice (From : Vstring; Front, Back : Strindex) return Vstring is
begin -- SLICE
if ((Front not in First .. From.Len) or else
(Back not in First .. From.Len)) and then Front <= Back then
raise Constraint_Error;
end if;
return (Vstr (From.Value (Front .. Back)));
end Slice;
function Substr (From : Vstring; Start, Length : Strindex) return Vstring is
begin -- SUBSTR
if (Start not in First .. From.Len) or else
((Start + Length - 1 not in First .. From.Len) and then
(Length > 0)) then
raise Constraint_Error;
end if;
return (Vstr (From.Value (Start .. Start + Length - 1)));
end Substr;
function Delete (From : Vstring; Front, Back : Strindex) return Vstring is
Temp : Vstring := From;
begin -- DELETE
if ((Front not in First .. From.Len) or else
(Back not in First .. From.Len)) and then Front <= Back then
raise Constraint_Error;
end if;
if Front > Back then
return (From);
end if;
Temp.Len := From.Len - (Back - Front) - 1;
Temp.Value (Front .. Temp.Len) := From.Value (Back + 1 .. From.Len);
Format (Temp, From.Len);
return (Temp);
end Delete;
function Insert
(Target : Vstring; Item : Vstring; Position : Strindex := First)
return Vstring is
Temp : Vstring;
begin -- INSERT
if Position not in First .. Target.Len then
raise Constraint_Error;
end if;
if Target.Len + Item.Len > Last then
raise Constraint_Error;
else
Temp.Len := Target.Len + Item.Len;
end if;
Temp.Value (First .. Position - 1) :=
Target.Value (First .. Position - 1);
Temp.Value (Position .. (Position + Item.Len - 1)) :=
Item.Value (First .. Item.Len);
Temp.Value ((Position + Item.Len) .. Temp.Len) :=
Target.Value (Position .. Target.Len);
return (Temp);
end Insert;
function Insert
(Target : Vstring; Item : String; Position : Strindex := First)
return Vstring is
begin -- INSERT
return Insert (Target, Vstr (Item), Position);
end Insert;
function Insert (Target : Vstring;
Item : Character;
Position : Strindex := First) return Vstring is
begin -- INSERT
return Insert (Target, Vstr (Item), Position);
end Insert;
function Append (Target : Vstring; Item : Vstring; Position : Strindex)
return Vstring is
Temp : Vstring;
Pos : Strindex := Position;
begin -- APPEND
if Position not in First .. Target.Len then
raise Constraint_Error;
end if;
if Target.Len + Item.Len > Last then
raise Constraint_Error;
else
Temp.Len := Target.Len + Item.Len;
end if;
Temp.Value (First .. Pos) := Target.Value (First .. Pos);
Temp.Value (Pos + 1 .. (Pos + Item.Len)) :=
Item.Value (First .. Item.Len);
Temp.Value ((Pos + Item.Len + 1) .. Temp.Len) :=
Target.Value (Pos + 1 .. Target.Len);
return (Temp);
end Append;
function Append (Target : Vstring; Item : String; Position : Strindex)
return Vstring is
begin -- APPEND
return Append (Target, Vstr (Item), Position);
end Append;
function Append (Target : Vstring; Item : Character; Position : Strindex)
return Vstring is
begin -- APPEND
return Append (Target, Vstr (Item), Position);
end Append;
function Append (Target : Vstring; Item : Vstring) return Vstring is
begin -- APPEND
return (Append (Target, Item, Target.Len));
end Append;
function Append (Target : Vstring; Item : String) return Vstring is
begin -- APPEND
return (Append (Target, Vstr (Item), Target.Len));
end Append;
function Append (Target : Vstring; Item : Character) return Vstring is
begin -- APPEND
return (Append (Target, Vstr (Item), Target.Len));
end Append;
function Replace
(Target : Vstring; Item : Vstring; Position : Strindex := First)
return Vstring is
Temp : Vstring;
begin -- REPLACE
if Position not in First .. Target.Len then
raise Constraint_Error;
end if;
if Position + Item.Len - 1 <= Target.Len then
Temp.Len := Target.Len;
elsif Position + Item.Len - 1 > Last then
raise Constraint_Error;
else
Temp.Len := Position + Item.Len - 1;
end if;
Temp.Value (First .. Position - 1) :=
Target.Value (First .. Position - 1);
Temp.Value (Position .. (Position + Item.Len - 1)) :=
Item.Value (First .. Item.Len);
Temp.Value ((Position + Item.Len) .. Temp.Len) :=
Target.Value ((Position + Item.Len) .. Target.Len);
return (Temp);
end Replace;
function Replace
(Target : Vstring; Item : String; Position : Strindex := First)
return Vstring is
begin -- REPLACE
return Replace (Target, Vstr (Item), Position);
end Replace;
function Replace (Target : Vstring;
Item : Character;
Position : Strindex := First) return Vstring is
begin -- REPLACE
return Replace (Target, Vstr (Item), Position);
end Replace;
function "&" (Left : Vstring; Right : Vstring) return Vstring is
Temp : Vstring;
begin -- "&"
if Left.Len + Right.Len > Last then
raise Constraint_Error;
else
Temp.Len := Left.Len + Right.Len;
end if;
Temp.Value (First .. Temp.Len) :=
Left.Value (First .. Left.Len) & Right.Value (First .. Right.Len);
return (Temp);
end "&";
function "&" (Left : Vstring; Right : String) return Vstring is
begin -- "&"
return Left & Vstr (Right);
end "&";
function "&" (Left : Vstring; Right : Character) return Vstring is
begin -- "&"
return Left & Vstr (Right);
end "&";
function "&" (Left : String; Right : Vstring) return Vstring is
begin -- "&"
return Vstr (Left) & Right;
end "&";
function "&" (Left : Character; Right : Vstring) return Vstring is
begin -- "&"
return Vstr (Left) & Right;
end "&";
function Index (Whole : Vstring; Part : Vstring; Occurrence : Natural := 1)
return Strindex is
Not_Found : constant Natural := 0;
Index : Natural := First;
Count : Natural := 0;
begin -- INDEX
if Part = Nul then
return (Not_Found); -- by definition
end if;
while Index + Part.Len - 1 <= Whole.Len and then Count < Occurrence loop
if Whole.Value (Index .. Part.Len + Index - 1) =
Part.Value (1 .. Part.Len) then
Count := Count + 1;
end if;
Index := Index + 1;
end loop;
if Count = Occurrence then
return (Index - 1);
else
return (Not_Found);
end if;
end Index;
function Index (Whole : Vstring; Part : String; Occurrence : Natural := 1)
return Strindex is
begin -- Index
return (Index (Whole, Vstr (Part), Occurrence));
end Index;
function Index (Whole : Vstring;
Part : Character;
Occurrence : Natural := 1) return Strindex is
begin -- Index
return (Index (Whole, Vstr (Part), Occurrence));
end Index;
function Rindex (Whole : Vstring; Part : Vstring; Occurrence : Natural := 1)
return Strindex is
Not_Found : constant Natural := 0;
Index : Integer := Whole.Len - (Part.Len - 1);
Count : Natural := 0;
begin -- RINDEX
if Part = Nul then
return (Not_Found); -- by definition
end if;
while Index >= First and then Count < Occurrence loop
if Whole.Value (Index .. Part.Len + Index - 1) =
Part.Value (1 .. Part.Len) then
Count := Count + 1;
end if;
Index := Index - 1;
end loop;
if Count = Occurrence then
if Count > 0 then
return (Index + 1);
else
return (Not_Found);
end if;
else
return (Not_Found);
end if;
end Rindex;
function Rindex (Whole : Vstring; Part : String; Occurrence : Natural := 1)
return Strindex is
begin -- Rindex
return (Rindex (Whole, Vstr (Part), Occurrence));
end Rindex;
function Rindex (Whole : Vstring;
Part : Character;
Occurrence : Natural := 1) return Strindex is
begin -- Rindex
return (Rindex (Whole, Vstr (Part), Occurrence));
end Rindex;
function Vstr (From : Character) return Vstring is
Temp : Vstring;
begin -- VSTR
if Last < 1 then
raise Constraint_Error;
else
Temp.Len := 1;
end if;
Temp.Value (First) := From;
return (Temp);
end Vstr;
function Vstr (From : String) return Vstring is
Temp : Vstring;
begin -- VSTR
if From'Length > Last then
raise Constraint_Error;
else
Temp.Len := From'Length;
end if;
Temp.Value (First .. From'Length) := From;
return (Temp);
end Vstr;
function "+" (From : String) return Vstring is
begin -- "+"
return (Vstr (From));
end "+";
function "+" (From : Character) return Vstring is
begin
return (Vstr (From));
end "+";
function Convert (X : From) return To is
begin -- CONVERT
return (Vstr (Str (X)));
end Convert;
end Vstrings;
-- .......................................................................... --
--
-- DISTRIBUTION AND COPYRIGHT:
--
-- This software is released to the Public Domain (note:
-- software released to the Public Domain is not subject
-- to copyright protection).
-- Restrictions on use or distribution: NONE
--
-- DISCLAIMER:
--
-- This software and its documentation are provided "AS IS" and
-- without any expressed or implied warranties whatsoever.
-- No warranties as to performance, merchantability, or fitness
-- for a particular purpose exist.
--
-- Because of the diversity of conditions and hardware under
-- which this software may be used, no warranty of fitness for
-- a particular purpose is offered. The user is advised to
-- test the software thoroughly before relying on it. The user
-- must assume the entire risk and liability of using this
-- software.
--
-- In no event shall any person or organization of people be
-- held responsible for any direct, indirect, consequential
-- or inconsequential damages or lost profits.
-- UNIT: generic package spec of VSTRINGS
--
-- FILES: vstring_spec.a in publiclib
-- related file is vstring_body.a in publiclib
--
-- PURPOSE: An implementation of the abstract data type "variable-length
-- string."
--
-- DESCRIPTION: This package provides a private type VSTRING. VSTRING objects
-- are "strings" that have a length between zero and LAST, where
-- LAST is the generic parameter supplied in the package
-- instantiation.
--
-- In addition to the type VSTRING, a subtype and two constants
-- are declared. The subtype STRINDEX is an index to a VSTRING,
-- The STRINDEX constant FIRST is an index to the first character
-- of the string, and the VSTRING constant NUL is a VSTRING of
-- length zero. NUL is the default initial value of a VSTRING.
--
-- The following sets of functions, procedures, and operators
-- are provided as operations on the type VSTRING:
--
-- ATTRIBUTE FUNCTIONS: LEN, MAX, STR, CHAR
-- The attribute functions return the characteristics of
-- a VSTRING.
--
-- COMPARISON OPERATORS: "=", "/=", "<", ">", "<=", ">="
-- The comparison operators are the same as for the predefined
-- type STRING.
--
-- INPUT/OUTPUT PROCEDURES: GET, GET_LINE, PUT, PUT_LINE
--
-- The input/output procedures are similar to those for the
-- predefined type STRING, with the following exceptions:
--
-- - GET has an optional parameter LENGTH, which indicates
-- the number of characters to get (default is LAST).
--
-- - GET_LINE does not have a parameter to return the length
-- of the string (the LEN function should be used instead).
--
-- EXTRACTION FUNCTIONS: SLICE, SUBSTR, DELETE
-- The SLICE function returns the slice of a VSTRING between
-- two indices (equivalent to STR(X)(A .. B)).
--
-- SUBSTR returns a substring of a VSTRING taken from a given
-- index and extending a given length.
--
-- The DELETE function returns the VSTRING which results from
-- removing the slice between two indices.
--
-- EDITING FUNCTIONS: INSERT, APPEND, REPLACE
-- The editing functions return the VSTRING which results from
-- inserting, appending, or replacing at a given index with a
-- VSTRING, STRING, or CHARACTER. The index must be in the
-- current range of the VSTRING; i.e., zero cannot be used.
--
-- CONCATENATION OPERATOR: "&"
-- The concatenation operator is the same as for the type
-- STRING. It should be used instead of APPEND when the
-- APPEND would always be after the last character.
--
-- POSITION FUNCTIONS: INDEX, RINDEX
-- The position functions return an index to the Nth occurrence
-- of a VSTRING, STRING, or CHARACTER from the front or back
-- of a VSTRING. Zero is returned if the search is not
-- successful.
--
-- CONVERSION FUNCTIONS AND OPERATOR: VSTR, CONVERT, "+"
-- VSTR converts a STRING or a CHARACTER to a VSTRING.
--
-- CONVERT is a generic function which can be instantiated to
-- convert from any given variable-length string to another,
-- provided the FROM type has a function equivelent to STR
-- defined for it, and that the TO type has a function equiv-
-- elent to VSTR defined for it. This provides a means for
-- converting between VSTRINGs declared in separate instant-
-- iations of VSTRINGS. When instantiating CONVERT for
-- VSTRINGs, the STR and VSTR functions are implicitly defined,
-- provided that they have been made visible (by a use clause).
--
-- Note: CONVERT is NOT implicitly associated with the type
-- VSTRING declared in this package (since it would not be a
-- derivable function (see RM 3.4(11))).
--
-- Caution: CONVERT cannot be instantiated directly with the
-- names VSTR and STR, since the name of the subprogram being
-- declared would hide the generic parameters with the same
-- names (see RM 8.3(16)). CONVERT can be instantiated with
-- the operator "+", and any instantiation of CONVERT can
-- subsequently be renamed VSTR or STR.
--
-- Example: Given two VSTRINGS instantiations X and Y:
-- function "+" is new X.CONVERT(X.VSTRING, Y.VSTRING);
-- function "+" is new X.CONVERT(Y.VSTRING, X.VSTRING);
--
-- (Y.CONVERT could have been used in place of X.CONVERT)
--
-- function VSTR(A : X.VSTRING) return Y.VSTRING renames "+";
-- function VSTR(A : Y.VSTRING) return X.VSTRING renames "+";
--
-- "+" is equivelent to VSTR. It is supplied as a short-hand
-- notation for the function. The "+" operator cannot immed-
-- iately follow the "&" operator; use ... & (+ ...) instead.
pragma Page;