Bug 413477 - nsStringAPI needs RFind set of functions, patch by Prasad Sunkari (prasad@medhas.org), r=bsmedberg, a=beltzner

This commit is contained in:
2008-04-08 23:01:13 -07:00
parent f0f0da089a
commit b57407d171
3 changed files with 239 additions and 5 deletions

View File

@@ -22,6 +22,7 @@
* Darin Fisher <darin@meer.net>
* Benjamin Smedberg <benjamin@smedbergs.us>
* Ben Turner <mozilla@songbirdnest.com>
* Prasad Sunkari <prasad@medhas.org>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
@@ -403,6 +404,56 @@ nsAString::Find(const char *aStr, PRUint32 aOffset, PRBool aIgnoreCase) const
return -1;
}
PRInt32
nsAString::RFind(const self_type& aStr, PRInt32 aOffset, ComparatorFunc c) const
{
const char_type *begin, *end;
PRUint32 selflen = BeginReading(&begin, &end);
const char_type *other;
PRUint32 otherlen = aStr.BeginReading(&other);
if (selflen < otherlen)
return -1;
if (aOffset < 0 || aOffset > (selflen - otherlen))
end -= otherlen;
else
end = begin + aOffset;
for (const char_type *cur = end; cur >= begin; --cur) {
if (!c(cur, other, otherlen))
return cur - begin;
}
return -1;
}
PRInt32
nsAString::RFind(const char *aStr, PRInt32 aOffset, PRBool aIgnoreCase) const
{
PRBool (*match)(const PRUnichar*, const char*, PRUint32) =
aIgnoreCase ? ns_strnimatch : ns_strnmatch;
const char_type *begin, *end;
PRUint32 selflen = BeginReading(&begin, &end);
PRUint32 otherlen = strlen(aStr);
if (selflen < otherlen)
return -1;
if (aOffset < 0 || aOffset > (selflen - otherlen))
end -= otherlen;
else
end = begin + aOffset;
for (const char_type *cur = end; cur >= begin; --cur) {
if (match(cur, aStr, otherlen)) {
return cur - begin;
}
}
return -1;
}
PRInt32
nsAString::FindChar(char_type aChar, PRUint32 aOffset) const
{
@@ -762,6 +813,60 @@ nsACString::Find(const char_type *aStr, PRUint32 aLen, ComparatorFunc c) const
return -1;
}
PRInt32
nsACString::RFind(const self_type& aStr, PRInt32 aOffset, ComparatorFunc c) const
{
const char_type *begin, *end;
PRUint32 selflen = BeginReading(&begin, &end);
const char_type *other;
PRUint32 otherlen = aStr.BeginReading(&other);
if (selflen < otherlen)
return -1;
if (aOffset < 0 || aOffset > (selflen - otherlen))
end -= otherlen;
else
end = begin + aOffset;
for (const char_type *cur = end; cur >= begin; --cur) {
if (!c(cur, other, otherlen))
return cur - begin;
}
return -1;
}
PRInt32
nsACString::RFind(const char_type *aStr, ComparatorFunc c) const
{
return RFind(aStr, strlen(aStr), c);
}
PRInt32
nsACString::RFind(const char_type *aStr, PRInt32 aLen, ComparatorFunc c) const
{
const char_type *begin, *end;
PRUint32 selflen = BeginReading(&begin, &end);
if (aLen == 0) {
NS_WARNING("Searching for zero-length string.");
return -1;
}
if (aLen > selflen)
return -1;
// We want to start searching otherlen characters before the end of the string
end -= aLen;
for (const char_type *cur = end; cur >= begin; --cur) {
if (!c(cur, aStr, aLen))
return cur - begin;
}
return -1;
}
PRInt32
nsACString::FindChar(char_type aChar, PRUint32 aOffset) const
{