Bug 335248 - Add StringBeginsWith and several other functions to the frozen CRTGlue/stringapi, r=darin

This commit is contained in:
benjamin@smedbergs.us
2006-05-04 18:34:45 +00:00
parent 4a4625180e
commit 6cc432ba53
4 changed files with 241 additions and 58 deletions

View File

@@ -37,6 +37,7 @@
* ***** END LICENSE BLOCK ***** */
#include "nscore.h"
#include "nsCRTGlue.h"
#ifdef MOZILLA_INTERNAL_API
#undef nsAString
@@ -127,6 +128,19 @@ nsAString::DefaultComparator(const char_type *a, const char_type *b,
return 0;
}
PRBool
nsAString::Equals(const char_type *other, ComparatorFunc c) const
{
const char_type *cself;
PRUint32 selflen = NS_StringGetData(*this, &cself);
PRUint32 otherlen = NS_strlen(other);
if (selflen != otherlen)
return PR_FALSE;
return c(cself, other, selflen) == 0;
}
PRBool
nsAString::Equals(const self_type &other, ComparatorFunc c) const
{
@@ -141,6 +155,23 @@ nsAString::Equals(const self_type &other, ComparatorFunc c) const
return c(cself, cother, selflen) == 0;
}
PRInt32
nsAString::RFindChar(char_type aChar) const
{
const PRUnichar *start, *end;
BeginReading(&start, &end);
do {
--end;
if (*end == aChar)
return end - start;
} while (end >= start);
return -1;
}
// nsACString
PRUint32
@@ -210,6 +241,19 @@ nsACString::DefaultComparator(const char_type *a, const char_type *b,
return memcmp(a, b, len);
}
PRBool
nsACString::Equals(const char_type *other, ComparatorFunc c) const
{
const char_type *cself;
PRUint32 selflen = NS_CStringGetData(*this, &cself);
PRUint32 otherlen = strlen(other);
if (selflen != otherlen)
return PR_FALSE;
return c(cself, other, selflen) == 0;
}
PRBool
nsACString::Equals(const self_type &other, ComparatorFunc c) const
{
@@ -224,6 +268,86 @@ nsACString::Equals(const self_type &other, ComparatorFunc c) const
return c(cself, cother, selflen) == 0;
}
PRInt32
nsACString::RFindChar(char_type aChar) const
{
const char *start, *end;
BeginReading(&start, &end);
for (; end >= start; --end) {
if (*end == aChar)
return end - start;
}
return -1;
}
// Substrings
nsDependentSubstring::nsDependentSubstring(const abstract_string_type& aStr,
PRUint32 aStartPos)
{
const PRUnichar* data;
PRUint32 len = NS_StringGetData(aStr, &data);
if (aStartPos > len)
aStartPos = len;
NS_StringContainerInit2(*this, data + aStartPos, len - aStartPos,
NS_STRING_CONTAINER_INIT_DEPEND |
NS_STRING_CONTAINER_INIT_SUBSTRING);
}
nsDependentSubstring::nsDependentSubstring(const abstract_string_type& aStr,
PRUint32 aStartPos,
PRUint32 aLength)
{
const PRUnichar* data;
PRUint32 len = NS_StringGetData(aStr, &data);
if (aStartPos > len)
aStartPos = len;
if (aStartPos + aLength > len)
aLength = len - aStartPos;
NS_StringContainerInit2(*this, data + aStartPos, aLength,
NS_STRING_CONTAINER_INIT_DEPEND |
NS_STRING_CONTAINER_INIT_SUBSTRING);
}
nsDependentCSubstring::nsDependentCSubstring(const abstract_string_type& aStr,
PRUint32 aStartPos)
{
const char* data;
PRUint32 len = NS_CStringGetData(aStr, &data);
if (aStartPos > len)
aStartPos = len;
NS_CStringContainerInit2(*this, data + aStartPos, len - aStartPos,
NS_CSTRING_CONTAINER_INIT_DEPEND |
NS_CSTRING_CONTAINER_INIT_SUBSTRING);
}
nsDependentCSubstring::nsDependentCSubstring(const abstract_string_type& aStr,
PRUint32 aStartPos,
PRUint32 aLength)
{
const char* data;
PRUint32 len = NS_CStringGetData(aStr, &data);
if (aStartPos > len)
aStartPos = len;
if (aStartPos + aLength > len)
aLength = len - aStartPos;
NS_CStringContainerInit2(*this, data + aStartPos, aLength,
NS_CSTRING_CONTAINER_INIT_DEPEND |
NS_CSTRING_CONTAINER_INIT_SUBSTRING);
}
// Utils
char*