comp.lang.ada
 help / color / mirror / Atom feed
From: David Trudgett <wpower@zeta.org.au.nospamplease>
Subject: Re: String filtering
Date: Wed, 28 Sep 2005 10:06:44 +1000
Date: 2005-09-28T10:06:44+10:00	[thread overview]
Message-ID: <m38xxi6oob.fsf@rr.trudgett> (raw)
In-Reply-To: g0gfh2urq1jv.152ajbjta2bca.dlg@40tude.net

"Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> writes:

> On Tue, 27 Sep 2005 14:42:02 +0100, Martin Dowie wrote:
>> 2nd sentence of ARM 95 A.4.5 (76) reads:
>> 
>>   "The function To_Unbounded_String(Length : in Natural)
>>     returns an Unbounded_String that represents an uninitialized
>>     String whose length is Length."
>
> Ah, now I see what you meant!

Yep, that's what I meant, too.


>
> Right, though my point was that one should use either
>
>    New_Str : String (1...Count (...));
>
> or
>
>    New_Str : Unbounded_String; -- "Uninitialized"


I've made some revisions based on various comments, and this is what I
have at the moment (incorporating both a string and unbounded_string
version):

    Space_Char  : constant Character_Range := (' ', ' ');
    Lower_Chars : constant Character_Range := ('a', 'z');
    Upper_Chars : constant Character_Range := ('A', 'Z');
    Numer_Chars : constant Character_Range := ('0', '9');
    Alpha_Num_Space : constant Character_Ranges
      := (Space_Char, Lower_Chars, Upper_Chars, Numer_Chars);
    Alpha_Num_Space_Set : constant Character_Set
      := To_Set(Alpha_Num_Space);


   function Strip_Non_Alphanumeric
     (Str : in Unbounded_String) return Unbounded_String
   is
      Dest_Size : Natural := Count(Str, Alpha_Num_Space_Set);
      New_Str : Unbounded_String := Null_Unbounded_String;
      Dest_Char : Natural := 0;
   begin
      if Dest_Size > 0 then
         New_Str := To_Unbounded_String(Dest_Size);
         for Src_Char in 1 .. Length(Str) loop
            if Is_In(Element(Str, Src_Char), Alpha_Num_Space_Set) then
               Dest_Char := Dest_Char + 1;
               Replace_Element
                 (New_Str, Dest_Char, Element(Str, Src_Char));
            end if;
         end loop;
      end if;
      return New_Str;
   end Strip_Non_Alphanumeric;


   function Strip_Non_Alphanumeric
     (Str : in String) return String
   is
      New_Str : String(1 .. Count(Str, Alpha_Num_Space_Set));
      Dest_Char : Natural := 0;
   begin
      if New_Str'Last > 0 then
         for Src_Char in Str'Range loop
            if Is_In(Str(Src_Char), Alpha_Num_Space_Set) then
               Dest_Char := Dest_Char + 1;
               New_Str(Dest_Char) := Str(Src_Char);
            end if;
         end loop;
      else
         New_Str := "";
      end if;
      return New_Str;
   end Strip_Non_Alphanumeric;



In the unbounded version, I decided to use replace_element instead of
append (with its assignment to "", which might perhaps unallocate
memory, depending on implementation??, thus potentially undoing the
purpose of the preallocation). This version might gain a bit in
efficiency, but code-wise, it is a bit more complex.

The string version also seems to work under testing. 

Profiling would show no difference in performance between the two for
my current purposes, but in a different situation, involving large
amounts of data, for instance, the fixed string version would no doubt
out-perform speed-wise. Space-wise, the unbounded strings would
probably win out in many situations.



>
> So my comment about empty string concerned the latter case.
>
> If To_Unbounded_String (Count) is ever used then of course
> Replace_Element should be in place of assignment + Append. 

This is what I have done. Have I mucked up anything else while doing so?


> Because, assignment might reclaim the memory allocated by
> To_Unbounded_String (Count).

I assume this is left up to the compiler implementation?


David


-- 

David Trudgett
http://www.zeta.org.au/~wpower/

We come here upon what, in a large proportion of cases, forms the
source of the grossest errors of mankind. Men on a lower level of
understanding, when brought into contact with phenomena of a higher
order, instead of making efforts to understand them, to raise
themselves up to the point of view from which they must look at the
subject, judge it from their lower standpoint, and the less they
understand what they are talking about, the more confidently and
unhesitatingly they pass judgment on it.

    -- Leo Tolstoy, "The Kingdom of God is Within You"




  reply	other threads:[~2005-09-28  0:06 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-09-27  6:27 String filtering David Trudgett
2005-09-27  7:38 ` Jacob Sparre Andersen
2005-09-27  9:13   ` David Trudgett
2005-09-27  9:49     ` Dmitry A. Kazakov
2005-09-27 11:01       ` Martin Dowie
2005-09-27 11:12         ` Martin Dowie
2005-09-27 12:54           ` Dmitry A. Kazakov
2005-09-27 13:42             ` Martin Dowie
2005-09-27 14:24               ` Dmitry A. Kazakov
2005-09-28  0:06                 ` David Trudgett [this message]
2005-09-28  8:15                   ` Dmitry A. Kazakov
2005-09-28 10:39                     ` David Trudgett
2005-09-28 20:55                       ` Simon Wright
2005-09-28 21:53                         ` Martin Dowie
2005-09-28  9:08                   ` Jacob Sparre Andersen
2005-09-28  9:54                     ` David Trudgett
2005-09-29 14:05                       ` Georg Bauhaus
2005-10-01 19:02                         ` tmoran
2005-10-02  6:38                           ` David Trudgett
2005-10-02 14:11                             ` Martin Dowie
2005-10-02 22:40                               ` David Trudgett
2005-10-03  5:56                                 ` Martin Dowie
2005-10-03 10:33                           ` Georg Bauhaus
2005-09-28 18:21                   ` Jeffrey R. Carter
2005-09-28 21:00                   ` Simon Wright
2005-09-27 11:22         ` David Trudgett
2005-09-27 11:15       ` David Trudgett
2005-09-27 13:21         ` Dmitry A. Kazakov
2005-09-27 13:43           ` Martin Dowie
2005-09-28  0:51           ` David Trudgett
2005-09-28 12:02             ` Dmitry A. Kazakov
2005-09-28 13:25             ` Marc A. Criley
2005-09-29 22:42           ` Randy Brukardt
2005-09-30 17:54             ` Robert A Duff
2005-10-02  6:57               ` Steve Whalen
2005-10-02 14:14                 ` Martin Dowie
2005-10-03  1:21                 ` Robert A Duff
2005-10-03  7:44                   ` Jacob Sparre Andersen
2005-10-03  8:56                     ` Dmitry A. Kazakov
2005-10-03  9:25                       ` Jean-Pierre Rosen
2005-10-03 20:17                         ` Ada Notation Jeffrey R. Carter
2005-10-03 20:41                           ` Georg Bauhaus
2005-10-05 17:16                             ` Andre
2005-10-05 18:23                               ` Ludovic Brenta
2005-10-05 18:24                               ` Jeffrey R. Carter
2005-10-04 15:13                           ` brian.b.mcguinness
2005-10-04 17:00                     ` String filtering Robert A Duff
2005-10-05  8:19                       ` Jean-Pierre Rosen
2005-10-05 11:25                         ` Robert A Duff
2005-10-04 19:47                     ` Björn Persson
2005-10-05 14:14                       ` Dmitry A. Kazakov
2005-10-03 10:06                   ` Steve Whalen
2005-10-03 17:43                   ` tmoran
2005-10-03 17:59                     ` Robert A Duff
2005-10-05 23:04                       ` Randy Brukardt
2005-09-27 13:52         ` Jacob Sparre Andersen
2005-09-28  1:01           ` David Trudgett
2005-09-28  1:50             ` David Trudgett
2005-09-27 14:08         ` Georg Bauhaus
2005-09-27 14:09         ` Marc A. Criley
2005-09-28  1:09           ` David Trudgett
2005-09-28 21:09           ` Simon Wright
2005-09-27 17:59         ` tmoran
2005-09-28  1:20           ` David Trudgett
2005-09-27 17:47     ` Jeffrey R. Carter
2005-09-28  1:29       ` David Trudgett
2005-09-28 18:32         ` Jeffrey R. Carter
2005-09-27  7:41 ` tmoran
2005-09-27  9:17   ` David Trudgett
2005-09-28  1:54 ` Steve
2005-09-28  2:20   ` David Trudgett
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox