A.4.3 Fixed-Length String Handling

From OC Systems Wiki!
Jump to: navigation, search

The language-defined package Strings.Fixed provides string-handling subprograms for fixed-length strings; that is, for values of type Standard.String. Several of these subprograms are procedures that modify the contents of a String that is passed as an out or an in out parameter; each has additional parameters to control the effect when the logical length of the result differs from the parameter's length.

For each function that returns a String, the lower bound of the returned value is 1.

The basic model embodied in the package is that a fixed-length string comprises significant characters and possibly padding (with space characters) on either or both ends. When a shorter string is copied to a longer string, padding is inserted, and when a longer string is copied to a shorter one, padding is stripped. The Move procedure in Strings.Fixed, which takes a String as an out parameter, allows the programmer to control these effects. Similar control is provided by the string transformation procedures.

Static Semantics

The library package Strings.Fixed has the following declaration:

with Ada.Strings.Maps;
package Ada.Strings.Fixed is
    pragma Preelaborate(Fixed);

-- "Copy" procedure for strings of possibly different lengths

    procedure Move (Source  in  String;
                    Target  out String;
                    Drop    in  Truncation := Error; 
                    Justify in  Alignment  := Left; 
                    Pad     in  Character  := Space);

-- Search subprograms

    function Index (Source   in String;
                    Pattern  in String; 
                    Going    in Direction := Forward; 
                    Mapping  in Maps.Character_Mapping 
                             := Maps.Identity)
        return Natural;

    function Index (Source   in String;
                    Pattern  in String; 
                    Going    in Direction := Forward; 
                    Mapping  in Maps.Character_Mapping_Function)
        return Natural;

    function Index (Source in String;
                    Set    in Maps.Character_Set; 
                    Test   in Membership := Inside; 
                    Going  in Direction  := Forward)
        return Natural;

    function Index_Non_Blank (Source in String; 
                             Going  in Direction := Forward)
        return Natural;

    function Count (Source   in String;
                    Pattern  in String; 
                    Mapping  in Maps.Character_Mapping 
                             := Maps.Identity)
        return Natural;

   function Count (Source   in String;                 Pattern  in String;                 Mapping  in Maps.Character_Mapping_Function)    return Natural;

   function Count (Source   in String;                 Set      in Maps.Character_Set)    return Natural;

   procedure Find_Token (Source in String;                       Set    in Maps.Character_Set;                       Test   in Membership;                       First  out Positive;                       Last   out Natural);

-- String translation subprograms

    function Translate (Source  in String;     
                        Mapping in Maps.Character_Mapping)
        return String;

    procedure Translate (Source  in out String; 
                         Mapping in Maps.Character_Mapping);

    function Translate (Source  in String;    
                        Mapping in Maps.Character_Mapping_Function)
        return String;

    procedure Translate (Source  in out String;
                         Mapping in Maps.Character_Mapping_Function);

-- String transformation subprograms

    function Replace_Slice (Source   in String; 
                            Low      in Positive; 
                            High     in Natural; 
                            By       in String)
        return String;

    procedure Replace_Slice (Source   in out String; 
                             Low      in Positive; 
                             High     in Natural; 
                             By       in String; 
                             Drop     in Truncation := Error; 
                             Justify  in Alignment  := Left; 
                             Pad      in Character  := Space);

    function Insert (Source   in String;
                     Before   in Positive;
                     New_Item in String)
        return String;

    procedure Insert (Source   in out String;
                      Before   in Positive;
                      New_Item in String; 
                      Drop     in Truncation := Error);

    function Overwrite (Source   in String;
                        Position in Positive;
                        New_Item in String)
        return String;

    procedure Overwrite (Source   in out String;                      Position in Positive;                      New_Item in String;                      Drop     in Truncation := Right);

    function Delete (Source  in String;
                    From    in Positive;
                    Through in Natural)
       return String;

    procedure Delete (Source  in out String;
                     From    in Positive;
                     Through in Natural;
                     Justify in Alignment := Left; 
                     Pad     in Character := Space);

    --String selector subprograms 
    function Trim (Source in String;                Side   in Trim_End)    return String;

   procedure Trim (Source  in out String;                 Side    in Trim_End;                 Justify in Alignment := Left;                 Pad     in Character := Space);

   function Trim (Source in String;                Left   in Maps.Character_Set;                Right  in Maps.Character_Set)    return String;

   procedure Trim (Source  in out String;                 Left    in Maps.Character_Set;                 Right   in Maps.Character_Set;                 Justify in Alignment := Strings.Left;                 Pad     in Character := Space);

    function Head (Source in String;
                   Count  in Natural;
                   Pad    in Character := Space)
        return String;

    procedure Head (Source  in out String;
                    Count   in Natural;
                    Justify in Alignment := Left; 
                    Pad     in Character := Space);

    function Tail (Source in String;           
                   Count  in Natural;
                   Pad    in Character := Space)
        return String;

    procedure Tail (Source  in out String;
                    Count   in Natural;
                    Justify in Alignment := Left; 
                    Pad     in Character := Space);

--String constructor functions

    function "*" (Left  in Natural;
                  Right in Character)
        return String;

    function "*" (Left  in Natural;
                  Right in String)
        return String;

end Ada.Strings.Fixed;

The effects of the above subprograms are as follows.

procedure Move (Source  in  String;
                Target  out String;
                Drop    in  Truncation := Error; 
                Justify in  Alignment  := Left; 
                Pad     in  Character  := Space);

The Move procedure copies characters from Source to Target. If Source has the same length as Target, then the effect is to assign Source to Target. If Source is shorter than Target then:

  • If Justify=Left, then Source is copied into the first Source'Length characters of Target.

  • If Justify=Right, then Source is copied into the last Source'Length characters of Target.

  • If Justify=Center, then Source is copied into the middle Source'Length characters of Target. In this case, if the difference in length between Target and Source is odd, then the extra Pad character is on the right.

  • Pad is copied to each Target character not otherwise assigned.

If Source is longer than Target, then the effect is based on Drop.

  • If Drop=Left, then the rightmost Target'Length characters of Source are copied into Target.

  • If Drop=Right, then the leftmost Target'Length characters of Source are copied into Target.

  • If Drop=Error, then the effect depends on the value of the Justify parameter and also on whether any characters in Source other than Pad would fail to be copied:

  • If Justify=Left, and if each of the rightmost Source'Length-Target'Length characters in Source is Pad, then the leftmost Target'Length characters of Source are copied to Target.

  • If Justify=Right, and if each of the leftmost Source'Length-Target'Length characters in Source is Pad, then the rightmost Target'Length characters of Source are copied to Target.

  • Otherwise, Length_Error is propagated.

function Index (Source   in String;
                Pattern  in String;
                Going    in Direction := Forward; 
                Mapping  in Maps.Character_Mapping 
                            := Maps.Identity) return Natural;

function Index (Source   in String;
                Pattern  in String;
                Going    in Direction := Forward; 
                Mapping  in Maps.Character_Mapping_Function)
    return Natural;

Each Index function searches for a slice of Source, with length Pattern'Length, that matches Pattern with respect to Mapping; the parameter Going indicates the direction of the lookup. If Going = Forward, then Index returns the smallest index I such that the slice of Source starting at I matches Pattern. If Going = Backward, then Index returns the largest index I such that the slice of Source starting at I matches Pattern. If there is no such slice, then 0 is returned. If Pattern is the null string then Pattern_Error is propagated.

function Index (Source in String;
                Set    in Maps.Character_Set;
                Test   in Membership := Inside; 
                Going  in Direction  := Forward)
    return Natural;

Index searches for the first or last occurrence of any of a set of characters (when Test=Inside), or any of the complement of a set of characters (when Test=Outside). It returns the smallest index I (if Going=Forward) or the largest index I (if Going=Backward) such that Source(I) satisfies the Test condition with respect to Set; it returns 0 if there is no such Character in Source.

function Index_Non_Blank (Source in String; 
                          Going  in Direction := Forward) 
    return Natural;

Returns Index(Source, Maps.To_Set(Space), Outside, Going)

function Count (Source   in String;
                Pattern  in String;
                Mapping  in Maps.Character_Mapping 
                           := Maps.Identity) 
    return Natural;

function Count (Source   in String;
                Pattern  in String;
                Mapping  in Maps.Character_Mapping_Function)
    return Natural;

Returns the maximum number of nonoverlapping slices of Source that match Pattern with respect to Mapping. If Pattern is the null string then Pattern_Error is propagated.

function Count (Source   in String;
                Set      in Maps.Character_Set)
    return Natural;

Returns the number of occurrences in Source of characters that are in Set.

procedure Find_Token (Source in String;
                      Set    in Maps.Character_Set;
                      Test   in Membership;
                      First  out Positive;
                      Last   out Natural);

Find_Token returns in First and Last the indices of the beginning and end of the first slice of Source all of whose elements satisfy the Test condition, and such that the elements (if any) immediately before and after the slice do not satisfy the Test condition. If no such slice exists, then the value returned for Last is zero, and the value returned for First is Source'First; however, if Source'First is not in Positive then Constraint_Error is raised.

function Translate (Source  in String; 
                    Mapping in Maps.Character_Mapping) 
    return String;

function Translate (Source  in String; 
                    Mapping in Maps.Character_Mapping_Function)
    return String;

Returns the string S whose length is Source'Length and such that S(I) is the character to which Mapping maps the corresponding element of Source, for I in 1..Source'Length.

procedure Translate (Source  in out String; 
                     Mapping in Maps.Character_Mapping);

procedure Translate (Source  in out String; 
                     Mapping in Maps.Character_Mapping_Function);

Equivalent to Source := Translate(Source, Mapping).

function Replace_Slice (Source   in String;
                        Low      in Positive;
                        High     in Natural;
                        By       in String)
    return String;

If Low > Source'Last+1, or High < Source'First-1, then Index_Error is propagated. Otherwise:
  • If High >= Low, then the returned string comprises Source(Source'First..Low-1) & By & Source(High+1..Source'Last), but with lower bound 1.
  • If High < Low, then the returned string is Insert(Source, Before=>Low, New_Item=>By).

procedure Replace_Slice (Source   in out String;   
                         Low      in Positive;
                         High     in Natural;
                         By       in String;
                         Drop     in Truncation := Error;
                         Justify  in Alignment  := Left;
                         Pad      in Character  := Space);

Equivalent to Move(Replace_Slice(Source, Low, High, By), Source, Drop, Justify, Pad).

function Insert (Source   in String;
                 Before   in Positive;
                 New_Item in String)
    return String;

Propagates Index_Error if Before is not in Source'First .. Source'Last+1; otherwise returns Source(Source'First..Before-1) & New_Item & Source(Before..Source'Last), but with lower bound 1.

procedure Insert (Source   in out String;
                  Before   in Positive;
                  New_Item in String;
                  Drop     in Truncation := Error);

Equivalent to Move(Insert(Source, Before, New_Item), Source, Drop).

function Overwrite (Source   in String;
                    Position in Positive; 
                    New_Item in String) 
    return String;

Propagates Index_Error if Position is not in Source'First .. Source'Last+1; otherwise returns the string obtained from Source by consecutively replacing characters starting at Position with corresponding characters from New_Item. If the end of Source is reached before the characters in New_Item are exhausted, the remaining characters from New_Item are appended to the string.

procedure Overwrite (Source   in out String;
                     Position in Positive;
                     New_Item in String; 
                     Drop     in Truncation := Right);

Equivalent to Move(Overwrite(Source, Position, New_Item), Source, Drop).

function Delete (Source  in String;
                 From    in Positive;
                 Through in Natural)
    return String;

If From <= Through, the returned string is Replace_Slice(Source, From, Through, ""), otherwise it is Source with lower bound 1.

procedure Delete (Source  in out String;
                  From    in Positive;
                  Through in Natural;
                  Justify in Alignment := Left; 
                  Pad     in Character := Space);

Equivalent to Move(Delete(Source, From, Through), Source, Justify => Justify, Pad => Pad).

function Trim (Source in String; 
               Side   in Trim_End)
    return String;

Returns the string obtained by removing from Source all leading Space characters (if Side = Left), all trailing Space characters (if Side = Right), or all leading and trailing Space characters (if Side = Both).

procedure Trim (Source  in out String;
                Side    in Trim_End;
                Justify in Alignment := Left; 
                Pad     in Character := Space);

Equivalent to Move(Trim(Source, Side), Source, Justify=>Justify, Pad=>Pad).

function Trim (Source in String;
               Left   in Maps.Character_Set;  
               Right  in Maps.Character_Set)
    return String;

Returns the string obtained by removing from Source all leading characters in Left and all trailing characters in Right.

procedure Trim (Source  in out String;              Left    in Maps.Character_Set;              Right   in Maps.Character_Set;              Justify in Alignment := Strings.Left;              Pad     in Character := Space);

Equivalent to Move(Trim(Source, Left, Right), Source, Justify => Justify, Pad=>Pad).

function Head (Source in String;
               Count  in Natural;
               Pad    in Character := Space) 
    return String;

Returns a string of length Count. If Count <= Source'Length, the string comprises the first Count characters of Source. Otherwise its contents are Source concatenated with Count-Source'Length Pad characters.

procedure Head (Source  in out String;
                Count   in Natural;
                Justify in Alignment := Left; 
                Pad     in Character := Space);

Equivalent to Move(Head(Source, Count, Pad), Source, Drop=>Error, Justify=>Justify, Pad=>Pad).

function Tail (Source in String;
               Count  in Natural;
               Pad    in Character := Space)
    return String;

Returns a string of length Count. If Count <= Source'Length, the string comprises the last Count characters of Source. Otherwise its contents are Count-Source'Length Pad characters concatenated with Source.

procedure Tail (Source  in out String;
                Count   in Natural;
                Justify in Alignment := Left; 
                Pad     in Character := Space);

Equivalent to Move(Tail(Source, Count, Pad), Source, Drop=>Error, Justify=>Justify, Pad=>Pad).

function "*" (Left  in Natural; 
              Right in Character) return String;
function "*" (Left  in Natural;
              Right in String) return String;

These functions replicate a character or string a specified number of times. The first function returns a string whose length is Left and each of whose elements is Right. The second function returns a string whose length is Left*Right'Length and whose value is the null string if Left = 0 and otherwise is (Left-1)*Right & Right with lower bound 1.

Notes

9  In the Index and Count functions taking Pattern and Mapping parameters, the actual String parameter passed to Pattern should comprise characters occurring as target characters of the mapping. Otherwise the pattern will not match.

10  In the Insert subprograms, inserting at the end of a string is obtained by passing Source'Last+1 as the Before parameter.

11  If a null Character_Mapping_Function is passed to any of the string handling subprograms, Constraint_Error is propagated.

Copyright © 1992,1993,1994,1995 Intermetrics, Inc.
Copyright © 2000 The MITRE Corporation, Inc. Ada Reference Manual