int32_t nsACString::Find(const self_type& aStr, uint32_t aOffset, ComparatorFunc c) const { const char_type *begin, *end; uint32_t selflen = BeginReading(&begin, &end); if (aOffset > selflen) return -1; const char_type *other; uint32_t otherlen = aStr.BeginReading(&other); if (otherlen > selflen - aOffset) return -1; // We want to stop searching otherlen characters before the end of the string end -= otherlen; for (const char_type *cur = begin + aOffset; cur <= end; ++cur) { if (!c(cur, other, otherlen)) return cur - begin; } return -1; }
int32_t nsACString::RFind(const self_type& aStr, int32_t aOffset, ComparatorFunc aComparator) const { const char_type* begin; const char_type* end; uint32_t selflen = BeginReading(&begin, &end); const char_type* other; uint32_t otherlen = aStr.BeginReading(&other); if (selflen < otherlen) { return -1; } if (aOffset < 0 || uint32_t(aOffset) > (selflen - otherlen)) { end -= otherlen; } else { end = begin + aOffset; } for (const char_type* cur = end; cur >= begin; --cur) { if (!aComparator(cur, other, otherlen)) { return cur - begin; } } 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; }