<br><font size=2 face="sans-serif">Gabor;</font>
<br>
<br><font size=2 face="sans-serif">> It just happened that I needed this function myself, and I found<br>
> two errors in my pseudo-code. Here it is, corrected:<br>
> [snip]</font>
<br>
<br><font size=2 face="sans-serif">Your algorithm is similar to what I had devised initially, but I was not happy with the performance. In my case I was using it on files that could (conceivably) be 20+ meg. Some of those files were taking 3-5 minutes for the calculations (even with a 933mhz PIII). That, I felt, was unacceptable.</font>
<br>
<br><font size=2 face="sans-serif">Basically, I had a const that was my 10 or 12 delimiter characters and I would then use the pos() function to see if each character of every string was a delimiter. Seemed like a good idea at the time, but it was very slow.</font>
<br>
<br><font size=2 face="sans-serif">What I found to be faster was to do something like this:</font>
<br>
<br><font size=2 face="sans-serif">for each character of the string check to see if it's an upper or lower case letter or number;<br>
  if TRUE, keep counting;<br>
  if FALSE, do pos() on the delimiters const<br>
    if TRUE, it's the end of a word -- add to word count<br>
    if FALSE, it's not a word -- keep looking</font>
<br>
<br><font size=2 face="sans-serif">Here's an idea of what I had done...</font>
<br>
<br>
<br><font size=2 face="sans-serif">Function GetWords (StringToCheck : string) : longint;</font>
<br>
<br><font size=2 face="sans-serif">const<br>
  DELIMITERS = ' .,!?_-)}]>;:=@/\#9';</font>
<br>
<br><font size=2 face="sans-serif">var<br>
  Index       : longint;<br>
  LineLength  : longint;<br>
  Loop        : longint;<br>
  Words       : longint;<br>
  CurrentChar : char;</font>
<br>
<br>
<br><font size=2 face="sans-serif">begin</font>
<br>
<br><font size=2 face="sans-serif">  Words := 0;<br>
  Index := 0;<br>
  LineLength := length (StringToCheck);</font>
<br>
<br><font size=2 face="sans-serif">  if LineLength <> 0 then   // don't check empty srings<br>
     while Index < LineLength do<br>
     begin<br>
       inc (Index);<br>
       CurrentChar := StringToCheck [Index];</font>
<br>
<br><font size=2 face="sans-serif">       while (Index < LineLength) and ((CurrentChar >= 'a') and (CurrentChar <= 'z')) and<br>
             ((CurrentChar >= 'A') and (CurrentChar <= 'Z')) and ((CurrentChar >= '0') and (CurrentChar <= '9'))<br>
             do inc (Index);   // skip all the "word" characters</font>
<br>
<br><font size=2 face="sans-serif">       // don't count double delims, like a period followed by a space, as 2 words<br>
       if pos (StringToCheck [succ (Index)],DELIMITERS) <> 0 then<br>
       begin<br>
         inc (Words);<br>
         inc (Index);   // move index past current delim char<br>
       end;<br>
     end;</font>
<br>
<br>
<br><font size=2 face="sans-serif">  GetWords := Words;</font>
<br>
<br><font size=2 face="sans-serif">end;</font>