fix speedracer bustage; r=jag and jst

git-svn-id: svn://10.0.0.236/trunk@91052 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
scc%mozilla.org
2001-04-02 22:00:34 +00:00
parent e483742f91
commit d5cfafb98f
2 changed files with 284 additions and 136 deletions

View File

@@ -410,20 +410,16 @@ ToLowerCase( nsACString& aCString )
copy_string(aCString.BeginWriting(fromBegin), aCString.EndWriting(fromEnd), converter);
}
template <class CharT>
inline // probably wishful thinking
NS_COM
PRBool
FindInReadable_Impl( const typename nsStringTraits<CharT>::abstract_string_type& aPattern,
nsReadingIterator<CharT>& aSearchStart,
nsReadingIterator<CharT>& aSearchEnd )
FindInReadable( const nsAString& aPattern, nsReadingIterator<PRUnichar>& aSearchStart, nsReadingIterator<PRUnichar>& aSearchEnd )
{
PRBool found_it = PR_FALSE;
// only bother searching at all if we're given a non-empty range to search
if ( aSearchStart != aSearchEnd )
{
nsReadingIterator<CharT> aPatternStart, aPatternEnd;
nsReadingIterator<PRUnichar> aPatternStart, aPatternEnd;
aPattern.BeginReading(aPatternStart);
aPattern.EndReading(aPatternEnd);
@@ -439,8 +435,8 @@ FindInReadable_Impl( const typename nsStringTraits<CharT>::abstract_string_type&
break;
// otherwise, we're at a potential match, let's see if we really hit one
nsReadingIterator<CharT> testPattern(aPatternStart);
nsReadingIterator<CharT> testSearch(aSearchStart);
nsReadingIterator<PRUnichar> testPattern(aPatternStart);
nsReadingIterator<PRUnichar> testSearch(aSearchStart);
// slow inner loop verifies the potential match (found by the `fast' loop) at the current position
for(;;)
@@ -480,18 +476,70 @@ FindInReadable_Impl( const typename nsStringTraits<CharT>::abstract_string_type&
return found_it;
}
NS_COM
PRBool
FindInReadable( const nsAString& aPattern, nsReadingIterator<PRUnichar>& aSearchStart, nsReadingIterator<PRUnichar>& aSearchEnd )
{
return FindInReadable_Impl(aPattern, aSearchStart, aSearchEnd);
}
NS_COM
PRBool
FindInReadable( const nsACString& aPattern, nsReadingIterator<char>& aSearchStart, nsReadingIterator<char>& aSearchEnd )
{
return FindInReadable_Impl(aPattern, aSearchStart, aSearchEnd);
PRBool found_it = PR_FALSE;
// only bother searching at all if we're given a non-empty range to search
if ( aSearchStart != aSearchEnd )
{
nsReadingIterator<char> aPatternStart, aPatternEnd;
aPattern.BeginReading(aPatternStart);
aPattern.EndReading(aPatternEnd);
// outer loop keeps searching till we find it or run out of string to search
while ( !found_it )
{
// fast inner loop (that's what it's called, not what it is) looks for a potential match
while ( aSearchStart != aSearchEnd && *aPatternStart != *aSearchStart )
++aSearchStart;
// if we broke out of the `fast' loop because we're out of string ... we're done: no match
if ( aSearchStart == aSearchEnd )
break;
// otherwise, we're at a potential match, let's see if we really hit one
nsReadingIterator<char> testPattern(aPatternStart);
nsReadingIterator<char> testSearch(aSearchStart);
// slow inner loop verifies the potential match (found by the `fast' loop) at the current position
for(;;)
{
// we already compared the first character in the outer loop,
// so we'll advance before the next comparison
++testPattern;
++testSearch;
// if we verified all the way to the end of the pattern, then we found it!
if ( testPattern == aPatternEnd )
{
found_it = PR_TRUE;
aSearchEnd = testSearch; // return the exact found range through the parameters
break;
}
// if we got to end of the string we're searching before we hit the end of the
// pattern, we'll never find what we're looking for
if ( testSearch == aSearchEnd )
{
aSearchStart = aSearchEnd;
break;
}
// else if we mismatched ... it's time to advance to the next search position
// and get back into the `fast' loop
if ( *testPattern != *testSearch )
{
++aSearchStart;
break;
}
}
}
}
return found_it;
}
/**
@@ -499,17 +547,47 @@ FindInReadable( const nsACString& aPattern, nsReadingIterator<char>& aSearchStar
* It searches the entire string from left to right, and returns the last match found, if any.
* This implementation will be replaced when I get |reverse_iterator|s working.
*/
template <class CharT>
inline // probably wishful thinking
NS_COM
PRBool
RFindInReadable_Impl( const typename nsStringTraits<CharT>::abstract_string_type& aPattern,
nsReadingIterator<CharT>& aSearchStart,
nsReadingIterator<CharT>& aSearchEnd )
RFindInReadable( const nsAString& aPattern, nsReadingIterator<PRUnichar>& aSearchStart, nsReadingIterator<PRUnichar>& aSearchEnd )
{
PRBool found_it = PR_FALSE;
nsReadingIterator<CharT> savedSearchEnd(aSearchEnd);
nsReadingIterator<CharT> searchStart(aSearchStart), searchEnd(aSearchEnd);
nsReadingIterator<PRUnichar> savedSearchEnd(aSearchEnd);
nsReadingIterator<PRUnichar> searchStart(aSearchStart), searchEnd(aSearchEnd);
while ( searchStart != searchEnd )
{
if ( FindInReadable(aPattern, searchStart, searchEnd) )
{
found_it = PR_TRUE;
// this is the best match so far, so remember it
aSearchStart = searchStart;
aSearchEnd = searchEnd;
// ...and get ready to search some more
// (it's tempting to set |searchStart=searchEnd| ... but that misses overlapping patterns)
++searchStart;
searchEnd = savedSearchEnd;
}
}
// if we never found it, return an empty range
if ( !found_it )
aSearchStart = aSearchEnd;
return found_it;
}
NS_COM
PRBool
RFindInReadable( const nsACString& aPattern, nsReadingIterator<char>& aSearchStart, nsReadingIterator<char>& aSearchEnd )
{
PRBool found_it = PR_FALSE;
nsReadingIterator<char> savedSearchEnd(aSearchEnd);
nsReadingIterator<char> searchStart(aSearchStart), searchEnd(aSearchEnd);
while ( searchStart != searchEnd )
{
@@ -536,28 +614,10 @@ RFindInReadable_Impl( const typename nsStringTraits<CharT>::abstract_string_type
}
NS_COM
PRBool
RFindInReadable( const nsAString& aPattern, nsReadingIterator<PRUnichar>& aSearchStart, nsReadingIterator<PRUnichar>& aSearchEnd )
{
return RFindInReadable_Impl(aPattern, aSearchStart, aSearchEnd);
}
NS_COM
PRBool
RFindInReadable( const nsACString& aPattern, nsReadingIterator<char>& aSearchStart, nsReadingIterator<char>& aSearchEnd )
{
return RFindInReadable_Impl(aPattern, aSearchStart, aSearchEnd);
}
template <class CharT>
inline // probably wishful thinking
PRBool
FindCharInReadable_Impl( CharT aChar,
nsReadingIterator<CharT>& aSearchStart,
const nsReadingIterator<CharT>& aSearchEnd )
NS_COM
PRBool
FindCharInReadable( PRUnichar aChar, nsReadingIterator<PRUnichar>& aSearchStart, const nsReadingIterator<PRUnichar>& aSearchEnd )
{
while ( aSearchStart != aSearchEnd )
{
@@ -567,7 +627,7 @@ FindCharInReadable_Impl( CharT aChar,
else
fragmentLength = aSearchStart.size_forward();
const CharT* charFoundAt = nsCharTraits<CharT>::find(aSearchStart.get(), fragmentLength, aChar);
const PRUnichar* charFoundAt = nsCharTraits<PRUnichar>::find(aSearchStart.get(), fragmentLength, aChar);
if ( charFoundAt ) {
aSearchStart.advance( charFoundAt - aSearchStart.get() );
return PR_TRUE;
@@ -579,28 +639,37 @@ FindCharInReadable_Impl( CharT aChar,
return PR_FALSE;
}
NS_COM
PRBool
FindCharInReadable( PRUnichar aChar, nsReadingIterator<PRUnichar>& aSearchStart, const nsReadingIterator<PRUnichar>& aSearchEnd )
{
return FindCharInReadable_Impl(aChar, aSearchStart, aSearchEnd);
}
NS_COM
PRBool
FindCharInReadable( char aChar, nsReadingIterator<char>& aSearchStart, const nsReadingIterator<char>& aSearchEnd )
{
return FindCharInReadable_Impl(aChar, aSearchStart, aSearchEnd);
while ( aSearchStart != aSearchEnd )
{
PRInt32 fragmentLength;
if ( SameFragment(aSearchStart, aSearchEnd) )
fragmentLength = aSearchEnd.get() - aSearchStart.get();
else
fragmentLength = aSearchStart.size_forward();
const char* charFoundAt = nsCharTraits<char>::find(aSearchStart.get(), fragmentLength, aChar);
if ( charFoundAt ) {
aSearchStart.advance( charFoundAt - aSearchStart.get() );
return PR_TRUE;
}
aSearchStart.advance(fragmentLength);
}
return PR_FALSE;
}
template <class CharT>
NS_COM
PRUint32
CountCharInReadable_Impl( const typename nsStringTraits<CharT>::abstract_string_type& aStr,
CharT aChar )
CountCharInReadable( const nsAString& aStr,
PRUnichar aChar )
{
PRUint32 count = 0;
nsReadingIterator<CharT> begin, end;
nsReadingIterator<PRUnichar> begin, end;
aStr.BeginReading(begin);
aStr.EndReading(end);
@@ -615,18 +684,23 @@ CountCharInReadable_Impl( const typename nsStringTraits<CharT>::abstract_string_
return count;
}
NS_COM
PRUint32
CountCharInReadable( const nsAString& aStr,
PRUnichar aChar )
{
return CountCharInReadable_Impl(aStr, aChar);
}
NS_COM
PRUint32
CountCharInReadable( const nsACString& aStr,
char aChar )
{
return CountCharInReadable_Impl(aStr, aChar);
PRUint32 count = 0;
nsReadingIterator<char> begin, end;
aStr.BeginReading(begin);
aStr.EndReading(end);
while (begin != end) {
if (*begin == aChar) {
count++;
}
begin++;
}
return count;
}