DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦a9260a218⟧ Ada Source

    Length: 13312 (0x3400)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Misc_String_Utilities, seg_02ba41

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦5a81ac88f⟧ »Space Info Vol 1« 
        └─⟦this⟧ 

E3 Source Code



with String_Utilities;
package body Misc_String_Utilities is

    function Is_Blank (This_String : in String) return Boolean is

        Blank : constant Character := ' ';
        Tab : constant Character := Ascii.Ht;

    begin  
        if This_String = "" then
            return True;
        end if;
        for Index in This_String'Range loop
            case This_String (Index) is
                when Blank | Tab =>
                    null;
                when others =>
                    return False;
            end case;
        end loop;  
        return True;
    end Is_Blank;

    function Is_Continuous (This_String : in String) return Boolean is
    begin
        return Misc_String_Utilities.Continuous (This_String) = This_String;
    end Is_Continuous;

    function Continuous (This_String : in String) return String is

        Tab : constant Character := Ascii.Ht;

    begin
        return Misc_String_Utilities.Stripped
                  (Misc_String_Utilities.Stripped
                      (This_String, This_Character => Tab));
    end Continuous;

    function Is_Padded (This_String : in String) return Boolean is
    begin
        return String_Utilities.  
                  Strip_Leading (This_String) /= This_String or else
               String_Utilities.  
                  Strip_Trailing (This_String) /= This_String;
    end Is_Padded;

    function Strip (Character_At : in Integer; In_String : in String)
                   return String is

        Preceeding_Stuff : constant String :=
           In_String (In_String'First .. (Character_At - 1));
        Following_Stuff : constant String :=
           In_String ((Character_At + 1) .. In_String'Last);  
        New_String_Raw : constant String := Preceeding_Stuff & Following_Stuff;
        New_String_Normalized :
           constant String (1 .. New_String_Raw'Length) := New_String_Raw;

    begin
        return New_String_Normalized;
    end Strip;

    function Are_Equal (This_Character : in Character;
                        That_Character : in Character;
                        Ignore_Case : in Boolean) return Boolean is
    begin
        if Ignore_Case then
            return String_Utilities.Upper_Case (This_Character) =
                      String_Utilities.Upper_Case (That_Character);
        else  
            return This_Character = That_Character;
        end if;
    end Are_Equal;

    function Stripped (This_String : in String;
                       This_Character : in Character := ' ';
                       Ignore_Case : in Boolean := False;
                       Starting_At : in Positive := 1) return String is

        The_String : constant String (1 .. This_String'Length) := This_String;

    begin
        if The_String = "" then
            return The_String;
        end if;
        for Index in The_String'Range loop
            if Are_Equal  
                  (The_String (Index), This_Character, Ignore_Case) then
                return Stripped (This_String => Strip (Character_At => Index,
                                                       In_String => The_String),
                                 This_Character => This_Character,
                                 Ignore_Case => Ignore_Case,
                                 Starting_At => Index + 1);
            end if;
        end loop;
        return The_String;
    end Stripped;

    function Strip (From_Here : in Integer;
                    To_Here : in Integer;
                    In_String : in String) return String is

        Preceeding_Stuff : constant String :=
           In_String (In_String'First .. (From_Here - 1));
        Following_Stuff : constant String :=
           In_String ((To_Here + 1) .. In_String'Last);  
        New_String_Raw : constant String := Preceeding_Stuff & Following_Stuff;
        New_String_Normalized :
           constant String (1 .. New_String_Raw'Length) := New_String_Raw;

    begin
        return New_String_Normalized;
    end Strip;

    function Are_Equal (This_String : in String;
                        That_String : in String;
                        Ignore_Case : in Boolean) return Boolean is
    begin
        if Ignore_Case then
            return String_Utilities.Upper_Case (This_String) =
                      String_Utilities.Upper_Case (That_String);
        else  
            return This_String = That_String;
        end if;
    end Are_Equal;

    function Locate (This_Substring : in String;
                     Within_String : in String;
                     Ignore_Case : in Boolean;
                     Starting_At : in Positive := 1) return Natural is

        The_String : constant String (1 .. Within_String'Length) :=
           Within_String;
    begin  
        for Index in Starting_At .. The_String'Last loop
            if Are_Equal (This_Substring,
                          The_String (Index ..
                                         (Index + (This_Substring'Length - 1))),
                          Ignore_Case) then
                return Index;
            end if;
        end loop;
        return 0;

    exception
        when others =>
            return 0;

    end Locate;

    function Stripped (This_String : in String;
                       This_Substring : in String;
                       Ignore_Case : in Boolean := False;
                       Starting_At : in Positive := 1) return String is

        The_String : constant String (1 .. This_String'Length) := This_String;

        Current_Index : Natural := 0;

    begin
        if This_String = "" or else This_Substring = "" then
            -- Is a no-op.
            return This_String;
        end if;
        loop
            Current_Index := Locate (This_Substring => This_Substring,
                                     Within_String => The_String,
                                     Ignore_Case => Ignore_Case,
                                     Starting_At => Starting_At);
            if Current_Index /= 0 then
                return Stripped
                          (This_String =>
                              Strip (From_Here => Current_Index,
                                     To_Here => Current_Index +
                                                   (This_Substring'Length - 1),
                                     In_String => The_String),
                           This_Substring => This_Substring,
                           Ignore_Case => Ignore_Case,
                           Starting_At => Current_Index +
                                             This_Substring'Length);
            else
                return The_String;
            end if;
        end loop;
    end Stripped;

    function Replace (Character_At : in Integer;
                      With_Character : in Character;
                      In_String : in String) return String is

        Preceeding_Stuff : constant String :=
           In_String (In_String'First .. (Character_At - 1));
        Following_Stuff : constant String :=
           In_String ((Character_At + 1) .. In_String'Last);  
        New_String_Raw : constant String :=
           Preceeding_Stuff & With_Character & Following_Stuff;
        New_String_Normalized :
           constant String (1 .. New_String_Raw'Length) := New_String_Raw;

    begin
        return New_String_Normalized;
    end Replace;

    function Replaced (This_String : in String;  
                       Old_Character : in Character := '_';
                       New_Character : in Character := ' ';
                       Ignore_Case : in Boolean := False;
                       Starting_At : in Positive := 1) return String is

        The_String : constant String (1 .. This_String'Length) := This_String;

    begin
        if The_String = "" then
            return The_String;
        end if;
        for Index in The_String'Range loop
            if Are_Equal  
                  (The_String (Index), Old_Character, Ignore_Case) then
                return Replaced (This_String =>
                                    Replace (Character_At => Index,
                                             With_Character => New_Character,
                                             In_String => The_String),
                                 Old_Character => Old_Character,
                                 New_Character => New_Character,
                                 Ignore_Case => Ignore_Case,
                                 Starting_At => Index + 1);
            end if;
        end loop;
        return The_String;
    end Replaced;

    function Replace (From_Here : in Integer;
                      To_Here : in Integer;
                      With_Substring : in String;
                      In_String : in String) return String is

        Preceeding_Stuff : constant String :=
           In_String (In_String'First .. (From_Here - 1));
        Following_Stuff : constant String :=
           In_String ((To_Here + 1) .. In_String'Last);  
        New_String_Raw : constant String :=
           Preceeding_Stuff & With_Substring & Following_Stuff;
        New_String_Normalized :
           constant String (1 .. New_String_Raw'Length) := New_String_Raw;

    begin
        return New_String_Normalized;
    end Replace;

    function Replaced (This_String : in String;
                       Old_Substring : in String;
                       New_Substring : in String;
                       Ignore_Case : in Boolean := False;
                       Starting_At : in Positive := 1) return String is

        The_String : constant String (1 .. This_String'Length) := This_String;

        Current_Index : Natural := 0;

    begin
        if This_String = "" or else Old_Substring = "" then
            -- Is a no-op.
            return This_String;
        end if;
        loop
            Current_Index := Locate (This_Substring => Old_Substring,
                                     Within_String => The_String,
                                     Ignore_Case => Ignore_Case,
                                     Starting_At => Starting_At);
            if Current_Index /= 0 then
                return Replaced
                          (This_String =>
                              Replace (From_Here => Current_Index,
                                       To_Here => Current_Index +
                                                     (Old_Substring'Length - 1),
                                       With_Substring => New_Substring,
                                       In_String => The_String),
                           Old_Substring => Old_Substring,
                           New_Substring => New_Substring,
                           Ignore_Case => Ignore_Case,
                           Starting_At => Current_Index + New_Substring'Length);
            else
                return The_String;
            end if;
        end loop;
    end Replaced;

end Misc_String_Utilities;

E3 Meta Data

    nblk1=c
    nid=0
    hdr6=18
        [0x00] rec0=23 rec1=00 rec2=01 rec3=056
        [0x01] rec0=19 rec1=00 rec2=02 rec3=018
        [0x02] rec0=1b rec1=00 rec2=03 rec3=020
        [0x03] rec0=15 rec1=00 rec2=04 rec3=032
        [0x04] rec0=1c rec1=00 rec2=05 rec3=00c
        [0x05] rec0=1f rec1=00 rec2=06 rec3=008
        [0x06] rec0=14 rec1=00 rec2=07 rec3=05e
        [0x07] rec0=17 rec1=00 rec2=08 rec3=06c
        [0x08] rec0=18 rec1=00 rec2=09 rec3=02c
        [0x09] rec0=18 rec1=00 rec2=0a rec3=03a
        [0x0a] rec0=15 rec1=00 rec2=0b rec3=022
        [0x0b] rec0=0a rec1=00 rec2=0c rec3=000
    tail 0x21523ff7683f07912c066 0x42a00088462060003