зеркало из https://github.com/mozilla/pjs.git
Add assertions that users of nsDependentC?String meet the requirements of nsAFlatC?String. Add nsDependentSingleFragmentC?Substring for users that don't. Additional cleanup after bug 100214. b=104651 r=jag sr=scc
This commit is contained in:
Родитель
06d956a0b3
Коммит
c0623fdbcd
|
@ -670,12 +670,16 @@ void Tokenizer_HandleCharacterData(void *userData, const XML_Char *s, int len) {
|
|||
break;
|
||||
case kSpace:
|
||||
case kTab:
|
||||
newToken = state->tokenAllocator->CreateTokenOfType(eToken_whitespace,eHTMLTag_unknown, nsDependentString((PRUnichar*)s, len));
|
||||
newToken = state->tokenAllocator->CreateTokenOfType(
|
||||
eToken_whitespace,
|
||||
eHTMLTag_unknown,
|
||||
Substring(NS_REINTERPRET_CAST(const PRUnichar*, s),
|
||||
NS_REINTERPRET_CAST(const PRUnichar*, s) + len));
|
||||
break;
|
||||
default:
|
||||
{
|
||||
CTextToken* textToken = (CTextToken*)state->tokenAllocator->CreateTokenOfType(eToken_text, eHTMLTag_unknown);
|
||||
PRUnichar* ptr = (PRUnichar*)s;
|
||||
const PRUnichar* ptr = NS_REINTERPRET_CAST(const PRUnichar*, s);
|
||||
if ((ptr >= state->bufferStart) && (ptr < state->bufferEnd)) {
|
||||
nsReadingIterator<PRUnichar> start, end;
|
||||
start = state->currentIterator;
|
||||
|
@ -685,7 +689,7 @@ void Tokenizer_HandleCharacterData(void *userData, const XML_Char *s, int len) {
|
|||
textToken->Bind(state->scanner, start, end);
|
||||
}
|
||||
else {
|
||||
textToken->Bind(nsDependentString(ptr, len));
|
||||
textToken->Bind(Substring(ptr, ptr+len));
|
||||
}
|
||||
newToken = textToken;
|
||||
}
|
||||
|
|
|
@ -2278,7 +2278,8 @@ nsParser::DetectMetaTag(const char* aBytes,
|
|||
|
||||
// Fast and loose parsing to determine if we have a complete
|
||||
// META tag in this block, looking upto 2k into it.
|
||||
nsDependentCString str(aBytes, PR_MIN(aLen, 2048));
|
||||
const nsASingleFragmentCString& str =
|
||||
Substring(aBytes, aBytes + PR_MIN(aLen, 2048));
|
||||
nsReadingIterator<char> begin, end;
|
||||
|
||||
str.BeginReading(begin);
|
||||
|
|
|
@ -215,15 +215,15 @@ NS_IMETHODIMP nsMetaCharsetObserver::Notify(
|
|||
while(IS_SPACE_CHARS(*keyStr))
|
||||
keyStr++;
|
||||
|
||||
if(0 == Compare(nsDependentString(keyStr, 10),
|
||||
if(0 == Compare(Substring(keyStr, keyStr+10),
|
||||
NS_LITERAL_STRING("HTTP-EQUIV"),
|
||||
nsCaseInsensitiveStringComparator()))
|
||||
httpEquivValue = values->StringAt(i)->get();
|
||||
else if(0 == Compare(nsDependentString(keyStr, 7),
|
||||
else if(0 == Compare(Substring(keyStr, keyStr+7),
|
||||
NS_LITERAL_STRING("content"),
|
||||
nsCaseInsensitiveStringComparator()))
|
||||
contentValue = values->StringAt(i)->get();
|
||||
else if (0 == Compare(nsDependentString(keyStr, 7),
|
||||
else if (0 == Compare(Substring(keyStr, keyStr+7),
|
||||
NS_LITERAL_STRING("charset"),
|
||||
nsCaseInsensitiveStringComparator()))
|
||||
charsetValue = values->StringAt(i)->get();
|
||||
|
@ -241,24 +241,24 @@ NS_IMETHODIMP nsMetaCharsetObserver::Notify(
|
|||
|
||||
if(
|
||||
// first try unquoted strings
|
||||
((0==Compare(nsDependentString(httpEquivValue,contenttype.Length()),
|
||||
((0==Compare(Substring(httpEquivValue,httpEquivValue+contenttype.Length()),
|
||||
contenttype,
|
||||
nsCaseInsensitiveStringComparator())) ||
|
||||
// now try "quoted" or 'quoted' strings
|
||||
(( (httpEquivValue[0]=='\'') ||
|
||||
(httpEquivValue[0]=='\"') ) &&
|
||||
(0==Compare(nsDependentString(httpEquivValue+1, contenttype.Length()),
|
||||
(0==Compare(Substring(httpEquivValue+1, httpEquivValue+1+contenttype.Length()),
|
||||
contenttype,
|
||||
nsCaseInsensitiveStringComparator()))
|
||||
)) &&
|
||||
// first try unquoted strings
|
||||
((0==Compare(nsDependentString(contentValue,texthtml.Length()),
|
||||
((0==Compare(Substring(contentValue,contentValue+texthtml.Length()),
|
||||
texthtml,
|
||||
nsCaseInsensitiveStringComparator())) ||
|
||||
// now try "quoted" or 'quoted' strings
|
||||
(((contentValue[0]=='\'') ||
|
||||
(contentValue[0]=='\"'))&&
|
||||
(0==Compare(nsDependentString(contentValue+1, texthtml.Length()),
|
||||
(0==Compare(Substring(contentValue+1, contentValue+1+texthtml.Length()),
|
||||
texthtml,
|
||||
nsCaseInsensitiveStringComparator()))
|
||||
))
|
||||
|
|
|
@ -2266,7 +2266,7 @@ public:
|
|||
{ }
|
||||
|
||||
XPCReadableJSStringWrapper() :
|
||||
nsDependentString(nsnull, (PRUint32)0), mStr(nsnull),
|
||||
nsDependentString(&sEmptyString, &sEmptyString), mStr(nsnull),
|
||||
mBufferHandle(nsnull), mHandleIsShared(JS_FALSE)
|
||||
{ }
|
||||
|
||||
|
@ -2289,6 +2289,9 @@ public:
|
|||
}
|
||||
|
||||
protected:
|
||||
|
||||
static const PRUnichar sEmptyString;
|
||||
|
||||
struct WrapperBufferHandle :
|
||||
public nsSharedBufferHandleWithAllocator<PRUnichar>
|
||||
{
|
||||
|
|
|
@ -58,6 +58,9 @@
|
|||
#error "JSVAL_STRING has zero value -- need to fix root management!"
|
||||
#endif
|
||||
|
||||
/* static */
|
||||
const PRUnichar XPCReadableJSStringWrapper::sEmptyString = PRUnichar(0);
|
||||
|
||||
XPCReadableJSStringWrapper::~XPCReadableJSStringWrapper()
|
||||
{
|
||||
if (mBufferHandle)
|
||||
|
|
|
@ -256,8 +256,8 @@ static PRBool CommonPrefix(const PRUnichar *aString, const PRUnichar *aSubstr, P
|
|||
if (aSubstrLen == 0 || nsCRT::strlen(aString) < aSubstrLen)
|
||||
return PR_FALSE;
|
||||
|
||||
return (Compare(nsDependentString(aString, aSubstrLen),
|
||||
nsDependentString(aSubstr, aSubstrLen),
|
||||
return (Compare(Substring(aString, aString+aSubstrLen),
|
||||
Substring(aSubstr, aSubstr+aSubstrLen),
|
||||
nsCaseInsensitiveStringComparator()) == 0);
|
||||
}
|
||||
|
||||
|
|
|
@ -3005,12 +3005,20 @@ nsresult nsMsgDatabase::RowCellColumnToCharPtr(nsIMdbRow *row, mdb_token columnT
|
|||
|
||||
/* static */void nsMsgDatabase::YarnTonsString(struct mdbYarn *yarn, nsString *str)
|
||||
{
|
||||
str->AssignWithConversion((const char *) yarn->mYarn_Buf, yarn->mYarn_Fill);
|
||||
const char* buf = (const char*)yarn->mYarn_Buf;
|
||||
if (buf)
|
||||
str->AssignWithConversion(buf, yarn->mYarn_Fill);
|
||||
else
|
||||
str->Truncate();
|
||||
}
|
||||
|
||||
/* static */void nsMsgDatabase::YarnTonsCString(struct mdbYarn *yarn, nsCString *str)
|
||||
{
|
||||
str->Assign((const char *) yarn->mYarn_Buf, yarn->mYarn_Fill);
|
||||
const char* buf = (const char*)yarn->mYarn_Buf;
|
||||
if (buf)
|
||||
str->Assign(buf, yarn->mYarn_Fill);
|
||||
else
|
||||
str->Truncate();
|
||||
}
|
||||
|
||||
// WARNING - if yarn is empty, *pResult will not be changed!!!!
|
||||
|
|
|
@ -3676,8 +3676,8 @@ nsImapMailFolder::NotifyMessageDeleted(const char *onlineFolderName,PRBool delet
|
|||
PRBool nsImapMailFolder::ShowDeletedMessages()
|
||||
{
|
||||
nsresult err;
|
||||
nsCOMPtr<nsIImapHostSessionList> hostSession =
|
||||
do_GetService(kCImapHostSessionList, &err);
|
||||
nsCOMPtr<nsIImapHostSessionList> hostSession =
|
||||
do_GetService(kCImapHostSessionList, &err);
|
||||
PRBool showDeleted = PR_FALSE;
|
||||
|
||||
if (NS_SUCCEEDED(err) && hostSession)
|
||||
|
@ -3704,11 +3704,13 @@ PRBool nsImapMailFolder::ShowDeletedMessages()
|
|||
nsXPIDLString convertedName;
|
||||
rv = imapServer->ConvertFolderName(specialTrashName.get(), getter_Copies(convertedName));
|
||||
if (NS_SUCCEEDED(rv))
|
||||
{
|
||||
nsXPIDLString folderName;
|
||||
GetName(getter_Copies(folderName));
|
||||
if (!Compare(folderName, convertedName, nsCaseInsensitiveStringComparator()))
|
||||
showDeleted = PR_TRUE;
|
||||
{
|
||||
nsXPIDLString folderName;
|
||||
GetName(getter_Copies(folderName));
|
||||
if (!Compare(Substring(folderName,0,convertedName.Length()),
|
||||
convertedName,
|
||||
nsCaseInsensitiveStringComparator()))
|
||||
showDeleted = PR_TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -275,7 +275,8 @@ NS_IMETHODIMP nsMsgHeaderParser::ParseHeadersWithEnumerator(const PRUnichar *lin
|
|||
nsresult nsMsgHeaderParser::ParseHeaderAddresses (const char *charset, const char *line, char **names, char **addresses, PRUint32 *numAddresses)
|
||||
{
|
||||
#if DEBUG
|
||||
(void) NS_ConvertUTF8toUCS2(line).get(); // asserts if invalid UTF-8
|
||||
if (line)
|
||||
(void) NS_ConvertUTF8toUCS2(line).get(); // asserts if invalid UTF-8
|
||||
#endif
|
||||
|
||||
*numAddresses = msg_parse_Header_addresses(line, names, addresses);
|
||||
|
@ -288,7 +289,8 @@ nsresult nsMsgHeaderParser::ExtractHeaderAddressMailboxes (const char *charset,
|
|||
if (mailboxes)
|
||||
{
|
||||
#if DEBUG
|
||||
(void) NS_ConvertUTF8toUCS2(line).get(); // asserts if invalid UTF-8
|
||||
if (line)
|
||||
(void) NS_ConvertUTF8toUCS2(line).get(); // asserts if invalid UTF-8
|
||||
#endif
|
||||
|
||||
*mailboxes = msg_extract_Header_address_mailboxes(line);
|
||||
|
@ -303,7 +305,8 @@ nsresult nsMsgHeaderParser::ExtractHeaderAddressNames (const char *charset, cons
|
|||
if (names)
|
||||
{
|
||||
#if DEBUG
|
||||
(void) NS_ConvertUTF8toUCS2(line).get(); // asserts if invalid UTF-8
|
||||
if (line)
|
||||
(void) NS_ConvertUTF8toUCS2(line).get(); // asserts if invalid UTF-8
|
||||
#endif
|
||||
|
||||
*names = msg_extract_Header_address_names(line);
|
||||
|
@ -319,7 +322,8 @@ nsresult nsMsgHeaderParser::ExtractHeaderAddressName (const char *charset, const
|
|||
if (name)
|
||||
{
|
||||
#if DEBUG
|
||||
(void) NS_ConvertUTF8toUCS2(line).get(); // asserts if invalid UTF-8
|
||||
if (line)
|
||||
(void) NS_ConvertUTF8toUCS2(line).get(); // asserts if invalid UTF-8
|
||||
#endif
|
||||
|
||||
*name = msg_extract_Header_address_name(line);
|
||||
|
@ -334,7 +338,8 @@ nsresult nsMsgHeaderParser::ReformatHeaderAddresses (const char *charset, const
|
|||
if (reformattedAddress)
|
||||
{
|
||||
#if DEBUG
|
||||
(void) NS_ConvertUTF8toUCS2(line).get(); // asserts if invalid UTF-8
|
||||
if (line)
|
||||
(void) NS_ConvertUTF8toUCS2(line).get(); // asserts if invalid UTF-8
|
||||
#endif
|
||||
|
||||
*reformattedAddress = msg_reformat_Header_addresses(line);
|
||||
|
@ -349,8 +354,10 @@ nsresult nsMsgHeaderParser::RemoveDuplicateAddresses (const char *charset, const
|
|||
if (newOutput)
|
||||
{
|
||||
#if DEBUG
|
||||
(void) NS_ConvertUTF8toUCS2(addrs).get(); // asserts if invalid UTF-8
|
||||
(void) NS_ConvertUTF8toUCS2(other_addrs).get();
|
||||
if (addrs)
|
||||
(void) NS_ConvertUTF8toUCS2(addrs).get(); // asserts if invalid UTF-8
|
||||
if (other_addrs)
|
||||
(void) NS_ConvertUTF8toUCS2(other_addrs).get();
|
||||
#endif
|
||||
|
||||
*newOutput = msg_remove_duplicate_addresses(addrs, other_addrs, removeAliasesToMe);
|
||||
|
@ -365,7 +372,8 @@ nsresult nsMsgHeaderParser::MakeFullAddress (const char *charset, const char* na
|
|||
if (fullAddress)
|
||||
{
|
||||
#if DEBUG
|
||||
(void) NS_ConvertUTF8toUCS2(addr).get(); // asserts if invalid UTF-8
|
||||
if (addr)
|
||||
(void) NS_ConvertUTF8toUCS2(addr).get(); // asserts if invalid UTF-8
|
||||
#endif
|
||||
|
||||
*fullAddress = msg_make_full_address(name, addr);
|
||||
|
@ -378,7 +386,8 @@ nsresult nsMsgHeaderParser::MakeFullAddress (const char *charset, const char* na
|
|||
nsresult nsMsgHeaderParser::UnquotePhraseOrAddr (const char *charset, const char *line, char** lineout)
|
||||
{
|
||||
#if DEBUG
|
||||
(void) NS_ConvertUTF8toUCS2(line).get(); // asserts if invalid UTF-8
|
||||
if (line)
|
||||
(void) NS_ConvertUTF8toUCS2(line).get(); // asserts if invalid UTF-8
|
||||
#endif
|
||||
|
||||
msg_unquote_phrase_or_addr(line, lineout);
|
||||
|
|
|
@ -542,7 +542,11 @@ mozTXTToHTMLConv::ItMatchesDelimited(const PRUnichar * aInString,
|
|||
nsCRT::IsAsciiDigit(textAfterPos) ||
|
||||
textAfterPos == *rep
|
||||
) ||
|
||||
Compare(nsDependentString(aInString + (before == LT_IGNORE ? 0 : 1) ), nsDependentString(rep, aRepLen), nsCaseInsensitiveStringComparator())
|
||||
Compare(Substring(nsDependentString(aInString, aInLength),
|
||||
(before == LT_IGNORE ? 0 : 1),
|
||||
aRepLen),
|
||||
nsDependentString(rep, aRepLen),
|
||||
nsCaseInsensitiveStringComparator())
|
||||
)
|
||||
return PR_FALSE;
|
||||
|
||||
|
@ -974,8 +978,8 @@ mozTXTToHTMLConv::CiteLevelTXT(const PRUnichar *line,
|
|||
const PRUnichar * indexString = &line[logLineStart];
|
||||
// here, |logLineStart < lineLength| is always true
|
||||
PRUint32 minlength = MinInt(6,nsCRT::strlen(indexString));
|
||||
if (!Compare(nsDependentString(indexString, minlength),
|
||||
nsDependentString(NS_LITERAL_STRING(">From ").get(), minlength), nsCaseInsensitiveStringComparator()))
|
||||
if (!Compare(Substring(indexString, indexString+minlength),
|
||||
Substring(NS_LITERAL_STRING(">From "), 0, minlength), nsCaseInsensitiveStringComparator()))
|
||||
//XXX RFC2646
|
||||
moreCites = PR_FALSE;
|
||||
else
|
||||
|
|
|
@ -670,12 +670,16 @@ void Tokenizer_HandleCharacterData(void *userData, const XML_Char *s, int len) {
|
|||
break;
|
||||
case kSpace:
|
||||
case kTab:
|
||||
newToken = state->tokenAllocator->CreateTokenOfType(eToken_whitespace,eHTMLTag_unknown, nsDependentString((PRUnichar*)s, len));
|
||||
newToken = state->tokenAllocator->CreateTokenOfType(
|
||||
eToken_whitespace,
|
||||
eHTMLTag_unknown,
|
||||
Substring(NS_REINTERPRET_CAST(const PRUnichar*, s),
|
||||
NS_REINTERPRET_CAST(const PRUnichar*, s) + len));
|
||||
break;
|
||||
default:
|
||||
{
|
||||
CTextToken* textToken = (CTextToken*)state->tokenAllocator->CreateTokenOfType(eToken_text, eHTMLTag_unknown);
|
||||
PRUnichar* ptr = (PRUnichar*)s;
|
||||
const PRUnichar* ptr = NS_REINTERPRET_CAST(const PRUnichar*, s);
|
||||
if ((ptr >= state->bufferStart) && (ptr < state->bufferEnd)) {
|
||||
nsReadingIterator<PRUnichar> start, end;
|
||||
start = state->currentIterator;
|
||||
|
@ -685,7 +689,7 @@ void Tokenizer_HandleCharacterData(void *userData, const XML_Char *s, int len) {
|
|||
textToken->Bind(state->scanner, start, end);
|
||||
}
|
||||
else {
|
||||
textToken->Bind(nsDependentString(ptr, len));
|
||||
textToken->Bind(Substring(ptr, ptr+len));
|
||||
}
|
||||
newToken = textToken;
|
||||
}
|
||||
|
|
|
@ -2278,7 +2278,8 @@ nsParser::DetectMetaTag(const char* aBytes,
|
|||
|
||||
// Fast and loose parsing to determine if we have a complete
|
||||
// META tag in this block, looking upto 2k into it.
|
||||
nsDependentCString str(aBytes, PR_MIN(aLen, 2048));
|
||||
const nsASingleFragmentCString& str =
|
||||
Substring(aBytes, aBytes + PR_MIN(aLen, 2048));
|
||||
nsReadingIterator<char> begin, end;
|
||||
|
||||
str.BeginReading(begin);
|
||||
|
|
|
@ -30,6 +30,16 @@
|
|||
#include "nsASingleFragmentString.h"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* |nsAFlatC?String| is an abstract class. Strings implementing
|
||||
* |nsAFlatC?String| have a buffer that is stored as a single fragment
|
||||
* and is NULL-terminated. That buffer can be accessed for reading
|
||||
* using the |get| method.
|
||||
*
|
||||
* See also |nsASingleFragmentC?String| and |nsAC?String|, base
|
||||
* classes of |nsAFlatC?String|.
|
||||
*/
|
||||
|
||||
class NS_COM nsAFlatString
|
||||
: public nsASingleFragmentString
|
||||
{
|
||||
|
|
|
@ -1,193 +0,0 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Mozilla.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications. Portions created by Netscape Communications are
|
||||
* Copyright (C) 2001 by Netscape Communications. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Scott Collins <scc@mozilla.org> (original author)
|
||||
*/
|
||||
|
||||
/* nsASingleFragmentString.h --- */
|
||||
|
||||
#ifndef nsASingleFragmentString_h___
|
||||
#define nsASingleFragmentString_h___
|
||||
|
||||
#ifndef nsAString_h___
|
||||
#include "nsAString.h"
|
||||
#endif
|
||||
|
||||
class NS_COM nsASingleFragmentString
|
||||
: public nsAString
|
||||
{
|
||||
// protected:
|
||||
// Foundation for more efficient iterators on single fragment strings
|
||||
// typedef abstract_string_type::const_iterator general_const_iterator;
|
||||
// typedef abstract_string_type::iterator general_iterator;
|
||||
|
||||
public:
|
||||
typedef const char_type* const_char_iterator;
|
||||
typedef char_type* char_iterator;
|
||||
|
||||
#ifdef HAVE_CPP_AMBIGUITY_RESOLVING_USING
|
||||
using abstract_string_type::BeginReading;
|
||||
using abstract_string_type::EndReading;
|
||||
using abstract_string_type::BeginWriting;
|
||||
using abstract_string_type::EndWriting;
|
||||
#else
|
||||
inline const_iterator& BeginReading( const_iterator& I ) const { return abstract_string_type::BeginReading(I); }
|
||||
inline const_iterator& EndReading( const_iterator& I ) const { return abstract_string_type::EndReading(I); }
|
||||
inline iterator& BeginWriting( iterator& I ) { return abstract_string_type::BeginWriting(I); }
|
||||
inline iterator& EndWriting( iterator& I ) { return abstract_string_type::EndWriting(I); }
|
||||
#endif
|
||||
|
||||
inline
|
||||
const_char_iterator&
|
||||
BeginReading( const_char_iterator& aResult ) const
|
||||
{
|
||||
const_fragment_type f;
|
||||
GetReadableFragment(f, kFirstFragment, 0);
|
||||
return aResult = f.mStart;
|
||||
}
|
||||
|
||||
inline
|
||||
const_char_iterator&
|
||||
EndReading( const_char_iterator& aResult ) const
|
||||
{
|
||||
const_fragment_type f;
|
||||
GetReadableFragment(f, kLastFragment, 0);
|
||||
return aResult = f.mEnd;
|
||||
}
|
||||
|
||||
inline
|
||||
char_iterator&
|
||||
BeginWriting( char_iterator& aResult )
|
||||
{
|
||||
fragment_type f;
|
||||
GetWritableFragment(f, kFirstFragment, 0);
|
||||
return aResult = NS_CONST_CAST(char_iterator, f.mStart);
|
||||
}
|
||||
|
||||
inline
|
||||
char_iterator&
|
||||
EndWriting( char_iterator& aResult )
|
||||
{
|
||||
fragment_type f;
|
||||
GetWritableFragment(f, kLastFragment, 0);
|
||||
return aResult = NS_CONST_CAST(char_iterator, f.mEnd);
|
||||
}
|
||||
|
||||
char_type operator[]( PRUint32 i ) const { const_char_iterator temp; return BeginReading(temp)[ i ]; }
|
||||
char_type CharAt( PRUint32 ) const;
|
||||
|
||||
virtual PRUint32 Length() const;
|
||||
|
||||
// protected: // can't hide these (yet), since I call them from forwarding routines in |nsPromiseFlatString|
|
||||
public:
|
||||
virtual const char_type* GetReadableFragment( const_fragment_type&, nsFragmentRequest, PRUint32 ) const;
|
||||
virtual char_type* GetWritableFragment( fragment_type&, nsFragmentRequest, PRUint32 );
|
||||
};
|
||||
|
||||
class NS_COM nsASingleFragmentCString
|
||||
: public nsACString
|
||||
{
|
||||
// protected:
|
||||
// Foundation for more efficient iterators on single fragment strings
|
||||
// typedef abstract_string_type::const_iterator general_const_iterator;
|
||||
// typedef abstract_string_type::iterator general_iterator;
|
||||
|
||||
public:
|
||||
typedef const char_type* const_char_iterator;
|
||||
typedef char_type* char_iterator;
|
||||
|
||||
#ifdef HAVE_CPP_AMBIGUITY_RESOLVING_USING
|
||||
using abstract_string_type::BeginReading;
|
||||
using abstract_string_type::EndReading;
|
||||
using abstract_string_type::BeginWriting;
|
||||
using abstract_string_type::EndWriting;
|
||||
#else
|
||||
inline const_iterator& BeginReading( const_iterator& I ) const { return abstract_string_type::BeginReading(I); }
|
||||
inline const_iterator& EndReading( const_iterator& I ) const { return abstract_string_type::EndReading(I); }
|
||||
inline iterator& BeginWriting( iterator& I ) { return abstract_string_type::BeginWriting(I); }
|
||||
inline iterator& EndWriting( iterator& I ) { return abstract_string_type::EndWriting(I); }
|
||||
#endif
|
||||
|
||||
inline
|
||||
const_char_iterator&
|
||||
BeginReading( const_char_iterator& aResult ) const
|
||||
{
|
||||
const_fragment_type f;
|
||||
GetReadableFragment(f, kFirstFragment, 0);
|
||||
return aResult = f.mStart;
|
||||
}
|
||||
|
||||
inline
|
||||
const_char_iterator&
|
||||
EndReading( const_char_iterator& aResult ) const
|
||||
{
|
||||
const_fragment_type f;
|
||||
GetReadableFragment(f, kLastFragment, 0);
|
||||
return aResult = f.mEnd;
|
||||
}
|
||||
|
||||
inline
|
||||
char_iterator&
|
||||
BeginWriting( char_iterator& aResult )
|
||||
{
|
||||
fragment_type f;
|
||||
GetWritableFragment(f, kFirstFragment, 0);
|
||||
return aResult = NS_CONST_CAST(char_iterator, f.mStart);
|
||||
}
|
||||
|
||||
inline
|
||||
char_iterator&
|
||||
EndWriting( char_iterator& aResult )
|
||||
{
|
||||
fragment_type f;
|
||||
GetWritableFragment(f, kLastFragment, 0);
|
||||
return aResult = NS_CONST_CAST(char_iterator, f.mEnd);
|
||||
}
|
||||
|
||||
char_type operator[]( PRUint32 i ) const { const_char_iterator temp; return BeginReading(temp)[ i ]; }
|
||||
char_type CharAt( PRUint32 ) const;
|
||||
|
||||
virtual PRUint32 Length() const;
|
||||
|
||||
// protected: // can't hide these (yet), since I call them from forwarding routines in |nsPromiseFlatString|
|
||||
public:
|
||||
virtual const char_type* GetReadableFragment( const_fragment_type&, nsFragmentRequest, PRUint32 ) const;
|
||||
virtual char_type* GetWritableFragment( fragment_type&, nsFragmentRequest, PRUint32 );
|
||||
};
|
||||
|
||||
inline
|
||||
nsASingleFragmentString::char_type
|
||||
nsASingleFragmentString::CharAt( PRUint32 i ) const
|
||||
{
|
||||
NS_ASSERTION(i<Length(), "|CharAt| out-of-range");
|
||||
return operator[](i);
|
||||
}
|
||||
|
||||
inline
|
||||
nsASingleFragmentCString::char_type
|
||||
nsASingleFragmentCString::CharAt( PRUint32 i ) const
|
||||
{
|
||||
NS_ASSERTION(i<Length(), "|CharAt| out-of-range");
|
||||
return operator[](i);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif /* !defined(nsASingleFragmentString_h___) */
|
|
@ -42,7 +42,14 @@
|
|||
|
||||
|
||||
/**
|
||||
* |nsAC?String| is the most abstract class in the string hierarchy.
|
||||
* Strings implementing |nsAC?String| may be stored in multiple
|
||||
* fragments. They need not be null-terminated and they may contain
|
||||
* embedded null characters. They may be dependent objects that
|
||||
* depend on other strings.
|
||||
*
|
||||
* See also |nsASingleFragmentC?String| and |nsAFlatC?String|, the
|
||||
* other main abstract classes in the string hierarchy.
|
||||
*/
|
||||
|
||||
class NS_COM nsAString
|
||||
|
|
|
@ -51,13 +51,19 @@ class NS_COM nsDependentString
|
|||
void
|
||||
Rebind( const char_type* aPtr )
|
||||
{
|
||||
NS_ASSERTION(aPtr, "nsDependentString must wrap a non-NULL buffer");
|
||||
mHandle.DataStart(aPtr);
|
||||
// XXX This should not be NULL-safe, but we should flip the switch
|
||||
// early in a milestone.
|
||||
//mHandle.DataEnd(aPtr+nsCharTraits<char_type>::length(aPtr));
|
||||
mHandle.DataEnd(aPtr ? (aPtr+nsCharTraits<char_type>::length(aPtr)) : 0);
|
||||
}
|
||||
|
||||
void
|
||||
Rebind( const char_type* aStartPtr, const char_type* aEndPtr )
|
||||
{
|
||||
NS_ASSERTION(aStartPtr && aEndPtr, "nsDependentString must wrap a non-NULL buffer");
|
||||
NS_ASSERTION(!*aEndPtr, "nsDependentString must wrap only null-terminated strings");
|
||||
mHandle.DataStart(aStartPtr);
|
||||
mHandle.DataEnd(aEndPtr);
|
||||
}
|
||||
|
@ -65,13 +71,8 @@ class NS_COM nsDependentString
|
|||
void
|
||||
Rebind( const char_type* aPtr, PRUint32 aLength )
|
||||
{
|
||||
if ( aLength == PRUint32(-1) )
|
||||
{
|
||||
// NS_WARNING("Tell scc: Caller binding a dependent string doesn't know the real length. Please pick the appropriate call.");
|
||||
Rebind(aPtr);
|
||||
}
|
||||
else
|
||||
Rebind(aPtr, aPtr+aLength);
|
||||
NS_ASSERTION(aLength != PRUint32(-1), "caller passing bogus length");
|
||||
Rebind(aPtr, aPtr+aLength);
|
||||
}
|
||||
|
||||
nsDependentString( const char_type* aStartPtr, const char_type* aEndPtr ) { Rebind(aStartPtr, aEndPtr); }
|
||||
|
@ -104,13 +105,19 @@ class NS_COM nsDependentCString
|
|||
void
|
||||
Rebind( const char_type* aPtr )
|
||||
{
|
||||
NS_ASSERTION(aPtr, "nsDependentCString must wrap a non-NULL buffer");
|
||||
mHandle.DataStart(aPtr);
|
||||
// XXX This should not be NULL-safe, but we should flip the switch
|
||||
// early in a milestone.
|
||||
//mHandle.DataEnd(aPtr+nsCharTraits<char_type>::length(aPtr));
|
||||
mHandle.DataEnd(aPtr ? (aPtr+nsCharTraits<char_type>::length(aPtr)) : 0);
|
||||
}
|
||||
|
||||
void
|
||||
Rebind( const char_type* aStartPtr, const char_type* aEndPtr )
|
||||
{
|
||||
NS_ASSERTION(aStartPtr && aEndPtr, "nsDependentCString must wrap a non-NULL buffer");
|
||||
NS_ASSERTION(!*aEndPtr, "nsDependentCString must wrap only null-terminated strings");
|
||||
mHandle.DataStart(aStartPtr);
|
||||
mHandle.DataEnd(aEndPtr);
|
||||
}
|
||||
|
@ -118,13 +125,8 @@ class NS_COM nsDependentCString
|
|||
void
|
||||
Rebind( const char_type* aPtr, PRUint32 aLength )
|
||||
{
|
||||
if ( aLength == PRUint32(-1) )
|
||||
{
|
||||
// NS_WARNING("Tell scc: Caller binding a dependent string doesn't know the real length. Please pick the appropriate call.");
|
||||
Rebind(aPtr);
|
||||
}
|
||||
else
|
||||
Rebind(aPtr, aPtr+aLength);
|
||||
NS_ASSERTION(aLength != PRUint32(-1), "caller passing bogus length");
|
||||
Rebind(aPtr, aPtr+aLength);
|
||||
}
|
||||
|
||||
nsDependentCString( const char_type* aStartPtr, const char_type* aEndPtr ) { Rebind(aStartPtr, aEndPtr); }
|
||||
|
@ -136,7 +138,7 @@ class NS_COM nsDependentCString
|
|||
|
||||
private:
|
||||
// NOT TO BE IMPLEMENTED
|
||||
void operator=( const self_type& ); // we're immutable, so no copy-assignment operator
|
||||
void operator=( const self_type& ); // we're immutable, so no copy-assignment operator
|
||||
|
||||
public:
|
||||
virtual const buffer_handle_type* GetFlatBufferHandle() const { return NS_REINTERPRET_CAST(const buffer_handle_type*, &mHandle); }
|
||||
|
|
|
@ -28,6 +28,10 @@
|
|||
#include "nsAString.h"
|
||||
#endif
|
||||
|
||||
#ifndef nsASingleFragmentString_h___
|
||||
#include "nsASingleFragmentString.h"
|
||||
#endif
|
||||
|
||||
#ifndef nsStringTraits_h___
|
||||
#include "nsStringTraits.h"
|
||||
#endif
|
||||
|
@ -145,8 +149,88 @@ class NS_COM nsDependentCSubstring
|
|||
};
|
||||
|
||||
|
||||
class NS_COM nsDependentSingleFragmentSubstring
|
||||
: public nsASingleFragmentString
|
||||
{
|
||||
public:
|
||||
typedef nsDependentSingleFragmentSubstring self_type;
|
||||
typedef nsASingleFragmentString abstract_single_fragment_type;
|
||||
|
||||
void
|
||||
Rebind( const char_type* aStartPtr, const char_type* aEndPtr )
|
||||
{
|
||||
NS_ASSERTION(aStartPtr && aEndPtr, "nsDependentSingleFragmentString must wrap a non-NULL buffer");
|
||||
mHandle.DataStart(aStartPtr);
|
||||
mHandle.DataEnd(aEndPtr);
|
||||
}
|
||||
|
||||
void
|
||||
Rebind( const abstract_single_fragment_type& aString, const PRUint32 aStartPos, const PRUint32 aLength )
|
||||
{
|
||||
const_char_iterator iter;
|
||||
mHandle.DataStart(aString.BeginReading(iter) + NS_MIN(aStartPos, aString.Length()));
|
||||
mHandle.DataEnd( NS_MIN(mHandle.DataStart() + aLength, aString.EndReading(iter)) );
|
||||
}
|
||||
|
||||
nsDependentSingleFragmentSubstring( const char_type* aStartPtr, const char_type* aEndPtr ) { Rebind(aStartPtr, aEndPtr); }
|
||||
nsDependentSingleFragmentSubstring( const abstract_single_fragment_type& aString, const PRUint32 aStartPos, const PRUint32 aLength ) { Rebind(aString, aStartPos, aLength); }
|
||||
|
||||
// nsDependentSingleFragmentSubstring( const self_type& ); // auto-generated copy-constructor OK
|
||||
// ~nsDependentSingleFragmentSubstring(); // auto-generated destructor OK
|
||||
|
||||
private:
|
||||
// NOT TO BE IMPLEMENTED
|
||||
void operator=( const self_type& ); // we're immutable, so no copy-assignment operator
|
||||
|
||||
public:
|
||||
virtual const buffer_handle_type* GetFlatBufferHandle() const { return NS_REINTERPRET_CAST(const buffer_handle_type*, &mHandle); }
|
||||
virtual const buffer_handle_type* GetBufferHandle() const { return NS_REINTERPRET_CAST(const buffer_handle_type*, &mHandle); }
|
||||
|
||||
private:
|
||||
const_buffer_handle_type mHandle;
|
||||
};
|
||||
|
||||
|
||||
class NS_COM nsDependentSingleFragmentCSubstring
|
||||
: public nsASingleFragmentCString
|
||||
{
|
||||
public:
|
||||
typedef nsDependentSingleFragmentCSubstring self_type;
|
||||
typedef nsASingleFragmentCString abstract_single_fragment_type;
|
||||
|
||||
void
|
||||
Rebind( const char_type* aStartPtr, const char_type* aEndPtr )
|
||||
{
|
||||
NS_ASSERTION(aStartPtr && aEndPtr, "nsDependentSingleFragmentCString must wrap a non-NULL buffer");
|
||||
mHandle.DataStart(aStartPtr);
|
||||
mHandle.DataEnd(aEndPtr);
|
||||
}
|
||||
|
||||
void
|
||||
Rebind( const abstract_single_fragment_type& aString, const PRUint32 aStartPos, const PRUint32 aLength )
|
||||
{
|
||||
const_char_iterator iter;
|
||||
mHandle.DataStart(aString.BeginReading(iter) + NS_MIN(aStartPos, aString.Length()));
|
||||
mHandle.DataEnd( NS_MIN(mHandle.DataStart() + aLength, aString.EndReading(iter)) );
|
||||
}
|
||||
|
||||
nsDependentSingleFragmentCSubstring( const char_type* aStartPtr, const char_type* aEndPtr ) { Rebind(aStartPtr, aEndPtr); }
|
||||
nsDependentSingleFragmentCSubstring( const abstract_single_fragment_type& aString, const PRUint32 aStartPos, const PRUint32 aLength ) { Rebind(aString, aStartPos, aLength); }
|
||||
|
||||
// nsDependentSingleFragmentCSubstring( const self_type& ); // auto-generated copy-constructor OK
|
||||
// ~nsDependentSingleFragmentCSubstring(); // auto-generated destructor OK
|
||||
|
||||
private:
|
||||
// NOT TO BE IMPLEMENTED
|
||||
void operator=( const self_type& ); // we're immutable, so no copy-assignment operator
|
||||
|
||||
public:
|
||||
virtual const buffer_handle_type* GetFlatBufferHandle() const { return NS_REINTERPRET_CAST(const buffer_handle_type*, &mHandle); }
|
||||
virtual const buffer_handle_type* GetBufferHandle() const { return NS_REINTERPRET_CAST(const buffer_handle_type*, &mHandle); }
|
||||
|
||||
private:
|
||||
const_buffer_handle_type mHandle;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
@ -179,4 +263,33 @@ Substring( const nsAString::const_iterator& aStart, const nsAString::const_itera
|
|||
}
|
||||
|
||||
|
||||
inline
|
||||
const nsDependentSingleFragmentCSubstring
|
||||
Substring( const nsASingleFragmentCString& aString, PRUint32 aStartPos, PRUint32 aSubstringLength )
|
||||
{
|
||||
return nsDependentSingleFragmentCSubstring(aString, aStartPos, aSubstringLength);
|
||||
}
|
||||
|
||||
inline
|
||||
const nsDependentSingleFragmentSubstring
|
||||
Substring( const nsASingleFragmentString& aString, PRUint32 aStartPos, PRUint32 aSubstringLength )
|
||||
{
|
||||
return nsDependentSingleFragmentSubstring(aString, aStartPos, aSubstringLength);
|
||||
}
|
||||
|
||||
inline
|
||||
const nsDependentSingleFragmentCSubstring
|
||||
Substring( const nsASingleFragmentCString::const_char_iterator& aStart, const nsASingleFragmentCString::const_char_iterator& aEnd )
|
||||
{
|
||||
return nsDependentSingleFragmentCSubstring(aStart, aEnd);
|
||||
}
|
||||
|
||||
inline
|
||||
const nsDependentSingleFragmentSubstring
|
||||
Substring( const nsASingleFragmentString::const_char_iterator& aStart, const nsASingleFragmentString::const_char_iterator& aEnd )
|
||||
{
|
||||
return nsDependentSingleFragmentSubstring(aStart, aEnd);
|
||||
}
|
||||
|
||||
|
||||
#endif /* !defined(nsDependentSubstring_h___) */
|
||||
|
|
|
@ -306,13 +306,13 @@ nsAString::do_AssignFromElementPtr( const char_type* aPtr )
|
|||
void
|
||||
nsAString::do_AssignFromElementPtrLength( const char_type* aPtr, size_type aLength )
|
||||
{
|
||||
do_AssignFromReadable(nsDependentString(aPtr, aLength));
|
||||
do_AssignFromReadable(Substring(aPtr, aPtr+aLength));
|
||||
}
|
||||
|
||||
void
|
||||
nsAString::do_AssignFromElement( char_type aChar )
|
||||
{
|
||||
do_AssignFromReadable(nsDependentString(&aChar, 1));
|
||||
do_AssignFromReadable(Substring(&aChar, &aChar+1));
|
||||
}
|
||||
|
||||
|
||||
|
@ -371,13 +371,13 @@ nsAString::do_AppendFromElementPtr( const char_type* aPtr )
|
|||
void
|
||||
nsAString::do_AppendFromElementPtrLength( const char_type* aPtr, size_type aLength )
|
||||
{
|
||||
do_AppendFromReadable(nsDependentString(aPtr, aLength));
|
||||
do_AppendFromReadable(Substring(aPtr, aPtr+aLength));
|
||||
}
|
||||
|
||||
void
|
||||
nsAString::do_AppendFromElement( char_type aChar )
|
||||
{
|
||||
do_AppendFromReadable(nsDependentString(&aChar, 1));
|
||||
do_AppendFromReadable(Substring(&aChar, &aChar + 1));
|
||||
}
|
||||
|
||||
|
||||
|
@ -440,13 +440,13 @@ nsAString::do_InsertFromElementPtr( const char_type* aPtr, index_type atPosition
|
|||
void
|
||||
nsAString::do_InsertFromElementPtrLength( const char_type* aPtr, index_type atPosition, size_type aLength )
|
||||
{
|
||||
do_InsertFromReadable(nsDependentString(aPtr, aLength), atPosition);
|
||||
do_InsertFromReadable(Substring(aPtr, aPtr+aLength), atPosition);
|
||||
}
|
||||
|
||||
void
|
||||
nsAString::do_InsertFromElement( char_type aChar, index_type atPosition )
|
||||
{
|
||||
do_InsertFromReadable(nsDependentString(&aChar, 1), atPosition);
|
||||
do_InsertFromReadable(Substring(&aChar, &aChar+1), atPosition);
|
||||
}
|
||||
|
||||
|
||||
|
@ -825,13 +825,13 @@ nsACString::do_AssignFromElementPtr( const char_type* aPtr )
|
|||
void
|
||||
nsACString::do_AssignFromElementPtrLength( const char_type* aPtr, size_type aLength )
|
||||
{
|
||||
do_AssignFromReadable(nsDependentCString(aPtr, aLength));
|
||||
do_AssignFromReadable(Substring(aPtr, aPtr+aLength));
|
||||
}
|
||||
|
||||
void
|
||||
nsACString::do_AssignFromElement( char_type aChar )
|
||||
{
|
||||
do_AssignFromReadable(nsDependentCString(&aChar, 1));
|
||||
do_AssignFromReadable(Substring(&aChar, &aChar+1));
|
||||
}
|
||||
|
||||
|
||||
|
@ -890,13 +890,13 @@ nsACString::do_AppendFromElementPtr( const char_type* aPtr )
|
|||
void
|
||||
nsACString::do_AppendFromElementPtrLength( const char_type* aPtr, size_type aLength )
|
||||
{
|
||||
do_AppendFromReadable(nsDependentCString(aPtr, aLength));
|
||||
do_AppendFromReadable(Substring(aPtr, aPtr+aLength));
|
||||
}
|
||||
|
||||
void
|
||||
nsACString::do_AppendFromElement( char_type aChar )
|
||||
{
|
||||
do_AppendFromReadable(nsDependentCString(&aChar, 1));
|
||||
do_AppendFromReadable(Substring(&aChar, &aChar + 1));
|
||||
}
|
||||
|
||||
|
||||
|
@ -959,13 +959,13 @@ nsACString::do_InsertFromElementPtr( const char_type* aPtr, index_type atPositio
|
|||
void
|
||||
nsACString::do_InsertFromElementPtrLength( const char_type* aPtr, index_type atPosition, size_type aLength )
|
||||
{
|
||||
do_InsertFromReadable(nsDependentCString(aPtr, aLength), atPosition);
|
||||
do_InsertFromReadable(Substring(aPtr, aPtr+aLength), atPosition);
|
||||
}
|
||||
|
||||
void
|
||||
nsACString::do_InsertFromElement( char_type aChar, index_type atPosition )
|
||||
{
|
||||
do_InsertFromReadable(nsDependentCString(&aChar, 1), atPosition);
|
||||
do_InsertFromReadable(Substring(&aChar, &aChar+1), atPosition);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -262,11 +262,10 @@ nsLocalFile::InitWithPath(const char *filePath)
|
|||
NS_ENSURE_ARG(filePath);
|
||||
|
||||
ssize_t len = strlen(filePath);
|
||||
char *name = (char *) nsMemory::Clone(filePath, len+1);
|
||||
while (name[len-1] == '/' && len > 1)
|
||||
name[--len] = '\0';
|
||||
|
||||
mPath.Adopt(name);
|
||||
while (filePath[len-1] == '/' && len > 1)
|
||||
--len;
|
||||
// XXXldb change to |Assign| rather than |Adopt(ToNewCString|
|
||||
mPath.Adopt(ToNewCString(Substring(filePath, filePath+len)));
|
||||
|
||||
InvalidateCache();
|
||||
return NS_OK;
|
||||
|
|
|
@ -30,6 +30,16 @@
|
|||
#include "nsASingleFragmentString.h"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* |nsAFlatC?String| is an abstract class. Strings implementing
|
||||
* |nsAFlatC?String| have a buffer that is stored as a single fragment
|
||||
* and is NULL-terminated. That buffer can be accessed for reading
|
||||
* using the |get| method.
|
||||
*
|
||||
* See also |nsASingleFragmentC?String| and |nsAC?String|, base
|
||||
* classes of |nsAFlatC?String|.
|
||||
*/
|
||||
|
||||
class NS_COM nsAFlatString
|
||||
: public nsASingleFragmentString
|
||||
{
|
||||
|
|
|
@ -1,193 +0,0 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Mozilla.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications. Portions created by Netscape Communications are
|
||||
* Copyright (C) 2001 by Netscape Communications. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Scott Collins <scc@mozilla.org> (original author)
|
||||
*/
|
||||
|
||||
/* nsASingleFragmentString.h --- */
|
||||
|
||||
#ifndef nsASingleFragmentString_h___
|
||||
#define nsASingleFragmentString_h___
|
||||
|
||||
#ifndef nsAString_h___
|
||||
#include "nsAString.h"
|
||||
#endif
|
||||
|
||||
class NS_COM nsASingleFragmentString
|
||||
: public nsAString
|
||||
{
|
||||
// protected:
|
||||
// Foundation for more efficient iterators on single fragment strings
|
||||
// typedef abstract_string_type::const_iterator general_const_iterator;
|
||||
// typedef abstract_string_type::iterator general_iterator;
|
||||
|
||||
public:
|
||||
typedef const char_type* const_char_iterator;
|
||||
typedef char_type* char_iterator;
|
||||
|
||||
#ifdef HAVE_CPP_AMBIGUITY_RESOLVING_USING
|
||||
using abstract_string_type::BeginReading;
|
||||
using abstract_string_type::EndReading;
|
||||
using abstract_string_type::BeginWriting;
|
||||
using abstract_string_type::EndWriting;
|
||||
#else
|
||||
inline const_iterator& BeginReading( const_iterator& I ) const { return abstract_string_type::BeginReading(I); }
|
||||
inline const_iterator& EndReading( const_iterator& I ) const { return abstract_string_type::EndReading(I); }
|
||||
inline iterator& BeginWriting( iterator& I ) { return abstract_string_type::BeginWriting(I); }
|
||||
inline iterator& EndWriting( iterator& I ) { return abstract_string_type::EndWriting(I); }
|
||||
#endif
|
||||
|
||||
inline
|
||||
const_char_iterator&
|
||||
BeginReading( const_char_iterator& aResult ) const
|
||||
{
|
||||
const_fragment_type f;
|
||||
GetReadableFragment(f, kFirstFragment, 0);
|
||||
return aResult = f.mStart;
|
||||
}
|
||||
|
||||
inline
|
||||
const_char_iterator&
|
||||
EndReading( const_char_iterator& aResult ) const
|
||||
{
|
||||
const_fragment_type f;
|
||||
GetReadableFragment(f, kLastFragment, 0);
|
||||
return aResult = f.mEnd;
|
||||
}
|
||||
|
||||
inline
|
||||
char_iterator&
|
||||
BeginWriting( char_iterator& aResult )
|
||||
{
|
||||
fragment_type f;
|
||||
GetWritableFragment(f, kFirstFragment, 0);
|
||||
return aResult = NS_CONST_CAST(char_iterator, f.mStart);
|
||||
}
|
||||
|
||||
inline
|
||||
char_iterator&
|
||||
EndWriting( char_iterator& aResult )
|
||||
{
|
||||
fragment_type f;
|
||||
GetWritableFragment(f, kLastFragment, 0);
|
||||
return aResult = NS_CONST_CAST(char_iterator, f.mEnd);
|
||||
}
|
||||
|
||||
char_type operator[]( PRUint32 i ) const { const_char_iterator temp; return BeginReading(temp)[ i ]; }
|
||||
char_type CharAt( PRUint32 ) const;
|
||||
|
||||
virtual PRUint32 Length() const;
|
||||
|
||||
// protected: // can't hide these (yet), since I call them from forwarding routines in |nsPromiseFlatString|
|
||||
public:
|
||||
virtual const char_type* GetReadableFragment( const_fragment_type&, nsFragmentRequest, PRUint32 ) const;
|
||||
virtual char_type* GetWritableFragment( fragment_type&, nsFragmentRequest, PRUint32 );
|
||||
};
|
||||
|
||||
class NS_COM nsASingleFragmentCString
|
||||
: public nsACString
|
||||
{
|
||||
// protected:
|
||||
// Foundation for more efficient iterators on single fragment strings
|
||||
// typedef abstract_string_type::const_iterator general_const_iterator;
|
||||
// typedef abstract_string_type::iterator general_iterator;
|
||||
|
||||
public:
|
||||
typedef const char_type* const_char_iterator;
|
||||
typedef char_type* char_iterator;
|
||||
|
||||
#ifdef HAVE_CPP_AMBIGUITY_RESOLVING_USING
|
||||
using abstract_string_type::BeginReading;
|
||||
using abstract_string_type::EndReading;
|
||||
using abstract_string_type::BeginWriting;
|
||||
using abstract_string_type::EndWriting;
|
||||
#else
|
||||
inline const_iterator& BeginReading( const_iterator& I ) const { return abstract_string_type::BeginReading(I); }
|
||||
inline const_iterator& EndReading( const_iterator& I ) const { return abstract_string_type::EndReading(I); }
|
||||
inline iterator& BeginWriting( iterator& I ) { return abstract_string_type::BeginWriting(I); }
|
||||
inline iterator& EndWriting( iterator& I ) { return abstract_string_type::EndWriting(I); }
|
||||
#endif
|
||||
|
||||
inline
|
||||
const_char_iterator&
|
||||
BeginReading( const_char_iterator& aResult ) const
|
||||
{
|
||||
const_fragment_type f;
|
||||
GetReadableFragment(f, kFirstFragment, 0);
|
||||
return aResult = f.mStart;
|
||||
}
|
||||
|
||||
inline
|
||||
const_char_iterator&
|
||||
EndReading( const_char_iterator& aResult ) const
|
||||
{
|
||||
const_fragment_type f;
|
||||
GetReadableFragment(f, kLastFragment, 0);
|
||||
return aResult = f.mEnd;
|
||||
}
|
||||
|
||||
inline
|
||||
char_iterator&
|
||||
BeginWriting( char_iterator& aResult )
|
||||
{
|
||||
fragment_type f;
|
||||
GetWritableFragment(f, kFirstFragment, 0);
|
||||
return aResult = NS_CONST_CAST(char_iterator, f.mStart);
|
||||
}
|
||||
|
||||
inline
|
||||
char_iterator&
|
||||
EndWriting( char_iterator& aResult )
|
||||
{
|
||||
fragment_type f;
|
||||
GetWritableFragment(f, kLastFragment, 0);
|
||||
return aResult = NS_CONST_CAST(char_iterator, f.mEnd);
|
||||
}
|
||||
|
||||
char_type operator[]( PRUint32 i ) const { const_char_iterator temp; return BeginReading(temp)[ i ]; }
|
||||
char_type CharAt( PRUint32 ) const;
|
||||
|
||||
virtual PRUint32 Length() const;
|
||||
|
||||
// protected: // can't hide these (yet), since I call them from forwarding routines in |nsPromiseFlatString|
|
||||
public:
|
||||
virtual const char_type* GetReadableFragment( const_fragment_type&, nsFragmentRequest, PRUint32 ) const;
|
||||
virtual char_type* GetWritableFragment( fragment_type&, nsFragmentRequest, PRUint32 );
|
||||
};
|
||||
|
||||
inline
|
||||
nsASingleFragmentString::char_type
|
||||
nsASingleFragmentString::CharAt( PRUint32 i ) const
|
||||
{
|
||||
NS_ASSERTION(i<Length(), "|CharAt| out-of-range");
|
||||
return operator[](i);
|
||||
}
|
||||
|
||||
inline
|
||||
nsASingleFragmentCString::char_type
|
||||
nsASingleFragmentCString::CharAt( PRUint32 i ) const
|
||||
{
|
||||
NS_ASSERTION(i<Length(), "|CharAt| out-of-range");
|
||||
return operator[](i);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif /* !defined(nsASingleFragmentString_h___) */
|
|
@ -42,7 +42,14 @@
|
|||
|
||||
|
||||
/**
|
||||
* |nsAC?String| is the most abstract class in the string hierarchy.
|
||||
* Strings implementing |nsAC?String| may be stored in multiple
|
||||
* fragments. They need not be null-terminated and they may contain
|
||||
* embedded null characters. They may be dependent objects that
|
||||
* depend on other strings.
|
||||
*
|
||||
* See also |nsASingleFragmentC?String| and |nsAFlatC?String|, the
|
||||
* other main abstract classes in the string hierarchy.
|
||||
*/
|
||||
|
||||
class NS_COM nsAString
|
||||
|
|
|
@ -51,13 +51,19 @@ class NS_COM nsDependentString
|
|||
void
|
||||
Rebind( const char_type* aPtr )
|
||||
{
|
||||
NS_ASSERTION(aPtr, "nsDependentString must wrap a non-NULL buffer");
|
||||
mHandle.DataStart(aPtr);
|
||||
// XXX This should not be NULL-safe, but we should flip the switch
|
||||
// early in a milestone.
|
||||
//mHandle.DataEnd(aPtr+nsCharTraits<char_type>::length(aPtr));
|
||||
mHandle.DataEnd(aPtr ? (aPtr+nsCharTraits<char_type>::length(aPtr)) : 0);
|
||||
}
|
||||
|
||||
void
|
||||
Rebind( const char_type* aStartPtr, const char_type* aEndPtr )
|
||||
{
|
||||
NS_ASSERTION(aStartPtr && aEndPtr, "nsDependentString must wrap a non-NULL buffer");
|
||||
NS_ASSERTION(!*aEndPtr, "nsDependentString must wrap only null-terminated strings");
|
||||
mHandle.DataStart(aStartPtr);
|
||||
mHandle.DataEnd(aEndPtr);
|
||||
}
|
||||
|
@ -65,13 +71,8 @@ class NS_COM nsDependentString
|
|||
void
|
||||
Rebind( const char_type* aPtr, PRUint32 aLength )
|
||||
{
|
||||
if ( aLength == PRUint32(-1) )
|
||||
{
|
||||
// NS_WARNING("Tell scc: Caller binding a dependent string doesn't know the real length. Please pick the appropriate call.");
|
||||
Rebind(aPtr);
|
||||
}
|
||||
else
|
||||
Rebind(aPtr, aPtr+aLength);
|
||||
NS_ASSERTION(aLength != PRUint32(-1), "caller passing bogus length");
|
||||
Rebind(aPtr, aPtr+aLength);
|
||||
}
|
||||
|
||||
nsDependentString( const char_type* aStartPtr, const char_type* aEndPtr ) { Rebind(aStartPtr, aEndPtr); }
|
||||
|
@ -104,13 +105,19 @@ class NS_COM nsDependentCString
|
|||
void
|
||||
Rebind( const char_type* aPtr )
|
||||
{
|
||||
NS_ASSERTION(aPtr, "nsDependentCString must wrap a non-NULL buffer");
|
||||
mHandle.DataStart(aPtr);
|
||||
// XXX This should not be NULL-safe, but we should flip the switch
|
||||
// early in a milestone.
|
||||
//mHandle.DataEnd(aPtr+nsCharTraits<char_type>::length(aPtr));
|
||||
mHandle.DataEnd(aPtr ? (aPtr+nsCharTraits<char_type>::length(aPtr)) : 0);
|
||||
}
|
||||
|
||||
void
|
||||
Rebind( const char_type* aStartPtr, const char_type* aEndPtr )
|
||||
{
|
||||
NS_ASSERTION(aStartPtr && aEndPtr, "nsDependentCString must wrap a non-NULL buffer");
|
||||
NS_ASSERTION(!*aEndPtr, "nsDependentCString must wrap only null-terminated strings");
|
||||
mHandle.DataStart(aStartPtr);
|
||||
mHandle.DataEnd(aEndPtr);
|
||||
}
|
||||
|
@ -118,13 +125,8 @@ class NS_COM nsDependentCString
|
|||
void
|
||||
Rebind( const char_type* aPtr, PRUint32 aLength )
|
||||
{
|
||||
if ( aLength == PRUint32(-1) )
|
||||
{
|
||||
// NS_WARNING("Tell scc: Caller binding a dependent string doesn't know the real length. Please pick the appropriate call.");
|
||||
Rebind(aPtr);
|
||||
}
|
||||
else
|
||||
Rebind(aPtr, aPtr+aLength);
|
||||
NS_ASSERTION(aLength != PRUint32(-1), "caller passing bogus length");
|
||||
Rebind(aPtr, aPtr+aLength);
|
||||
}
|
||||
|
||||
nsDependentCString( const char_type* aStartPtr, const char_type* aEndPtr ) { Rebind(aStartPtr, aEndPtr); }
|
||||
|
@ -136,7 +138,7 @@ class NS_COM nsDependentCString
|
|||
|
||||
private:
|
||||
// NOT TO BE IMPLEMENTED
|
||||
void operator=( const self_type& ); // we're immutable, so no copy-assignment operator
|
||||
void operator=( const self_type& ); // we're immutable, so no copy-assignment operator
|
||||
|
||||
public:
|
||||
virtual const buffer_handle_type* GetFlatBufferHandle() const { return NS_REINTERPRET_CAST(const buffer_handle_type*, &mHandle); }
|
||||
|
|
|
@ -28,6 +28,10 @@
|
|||
#include "nsAString.h"
|
||||
#endif
|
||||
|
||||
#ifndef nsASingleFragmentString_h___
|
||||
#include "nsASingleFragmentString.h"
|
||||
#endif
|
||||
|
||||
#ifndef nsStringTraits_h___
|
||||
#include "nsStringTraits.h"
|
||||
#endif
|
||||
|
@ -145,8 +149,88 @@ class NS_COM nsDependentCSubstring
|
|||
};
|
||||
|
||||
|
||||
class NS_COM nsDependentSingleFragmentSubstring
|
||||
: public nsASingleFragmentString
|
||||
{
|
||||
public:
|
||||
typedef nsDependentSingleFragmentSubstring self_type;
|
||||
typedef nsASingleFragmentString abstract_single_fragment_type;
|
||||
|
||||
void
|
||||
Rebind( const char_type* aStartPtr, const char_type* aEndPtr )
|
||||
{
|
||||
NS_ASSERTION(aStartPtr && aEndPtr, "nsDependentSingleFragmentString must wrap a non-NULL buffer");
|
||||
mHandle.DataStart(aStartPtr);
|
||||
mHandle.DataEnd(aEndPtr);
|
||||
}
|
||||
|
||||
void
|
||||
Rebind( const abstract_single_fragment_type& aString, const PRUint32 aStartPos, const PRUint32 aLength )
|
||||
{
|
||||
const_char_iterator iter;
|
||||
mHandle.DataStart(aString.BeginReading(iter) + NS_MIN(aStartPos, aString.Length()));
|
||||
mHandle.DataEnd( NS_MIN(mHandle.DataStart() + aLength, aString.EndReading(iter)) );
|
||||
}
|
||||
|
||||
nsDependentSingleFragmentSubstring( const char_type* aStartPtr, const char_type* aEndPtr ) { Rebind(aStartPtr, aEndPtr); }
|
||||
nsDependentSingleFragmentSubstring( const abstract_single_fragment_type& aString, const PRUint32 aStartPos, const PRUint32 aLength ) { Rebind(aString, aStartPos, aLength); }
|
||||
|
||||
// nsDependentSingleFragmentSubstring( const self_type& ); // auto-generated copy-constructor OK
|
||||
// ~nsDependentSingleFragmentSubstring(); // auto-generated destructor OK
|
||||
|
||||
private:
|
||||
// NOT TO BE IMPLEMENTED
|
||||
void operator=( const self_type& ); // we're immutable, so no copy-assignment operator
|
||||
|
||||
public:
|
||||
virtual const buffer_handle_type* GetFlatBufferHandle() const { return NS_REINTERPRET_CAST(const buffer_handle_type*, &mHandle); }
|
||||
virtual const buffer_handle_type* GetBufferHandle() const { return NS_REINTERPRET_CAST(const buffer_handle_type*, &mHandle); }
|
||||
|
||||
private:
|
||||
const_buffer_handle_type mHandle;
|
||||
};
|
||||
|
||||
|
||||
class NS_COM nsDependentSingleFragmentCSubstring
|
||||
: public nsASingleFragmentCString
|
||||
{
|
||||
public:
|
||||
typedef nsDependentSingleFragmentCSubstring self_type;
|
||||
typedef nsASingleFragmentCString abstract_single_fragment_type;
|
||||
|
||||
void
|
||||
Rebind( const char_type* aStartPtr, const char_type* aEndPtr )
|
||||
{
|
||||
NS_ASSERTION(aStartPtr && aEndPtr, "nsDependentSingleFragmentCString must wrap a non-NULL buffer");
|
||||
mHandle.DataStart(aStartPtr);
|
||||
mHandle.DataEnd(aEndPtr);
|
||||
}
|
||||
|
||||
void
|
||||
Rebind( const abstract_single_fragment_type& aString, const PRUint32 aStartPos, const PRUint32 aLength )
|
||||
{
|
||||
const_char_iterator iter;
|
||||
mHandle.DataStart(aString.BeginReading(iter) + NS_MIN(aStartPos, aString.Length()));
|
||||
mHandle.DataEnd( NS_MIN(mHandle.DataStart() + aLength, aString.EndReading(iter)) );
|
||||
}
|
||||
|
||||
nsDependentSingleFragmentCSubstring( const char_type* aStartPtr, const char_type* aEndPtr ) { Rebind(aStartPtr, aEndPtr); }
|
||||
nsDependentSingleFragmentCSubstring( const abstract_single_fragment_type& aString, const PRUint32 aStartPos, const PRUint32 aLength ) { Rebind(aString, aStartPos, aLength); }
|
||||
|
||||
// nsDependentSingleFragmentCSubstring( const self_type& ); // auto-generated copy-constructor OK
|
||||
// ~nsDependentSingleFragmentCSubstring(); // auto-generated destructor OK
|
||||
|
||||
private:
|
||||
// NOT TO BE IMPLEMENTED
|
||||
void operator=( const self_type& ); // we're immutable, so no copy-assignment operator
|
||||
|
||||
public:
|
||||
virtual const buffer_handle_type* GetFlatBufferHandle() const { return NS_REINTERPRET_CAST(const buffer_handle_type*, &mHandle); }
|
||||
virtual const buffer_handle_type* GetBufferHandle() const { return NS_REINTERPRET_CAST(const buffer_handle_type*, &mHandle); }
|
||||
|
||||
private:
|
||||
const_buffer_handle_type mHandle;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
@ -179,4 +263,33 @@ Substring( const nsAString::const_iterator& aStart, const nsAString::const_itera
|
|||
}
|
||||
|
||||
|
||||
inline
|
||||
const nsDependentSingleFragmentCSubstring
|
||||
Substring( const nsASingleFragmentCString& aString, PRUint32 aStartPos, PRUint32 aSubstringLength )
|
||||
{
|
||||
return nsDependentSingleFragmentCSubstring(aString, aStartPos, aSubstringLength);
|
||||
}
|
||||
|
||||
inline
|
||||
const nsDependentSingleFragmentSubstring
|
||||
Substring( const nsASingleFragmentString& aString, PRUint32 aStartPos, PRUint32 aSubstringLength )
|
||||
{
|
||||
return nsDependentSingleFragmentSubstring(aString, aStartPos, aSubstringLength);
|
||||
}
|
||||
|
||||
inline
|
||||
const nsDependentSingleFragmentCSubstring
|
||||
Substring( const nsASingleFragmentCString::const_char_iterator& aStart, const nsASingleFragmentCString::const_char_iterator& aEnd )
|
||||
{
|
||||
return nsDependentSingleFragmentCSubstring(aStart, aEnd);
|
||||
}
|
||||
|
||||
inline
|
||||
const nsDependentSingleFragmentSubstring
|
||||
Substring( const nsASingleFragmentString::const_char_iterator& aStart, const nsASingleFragmentString::const_char_iterator& aEnd )
|
||||
{
|
||||
return nsDependentSingleFragmentSubstring(aStart, aEnd);
|
||||
}
|
||||
|
||||
|
||||
#endif /* !defined(nsDependentSubstring_h___) */
|
||||
|
|
|
@ -306,13 +306,13 @@ nsAString::do_AssignFromElementPtr( const char_type* aPtr )
|
|||
void
|
||||
nsAString::do_AssignFromElementPtrLength( const char_type* aPtr, size_type aLength )
|
||||
{
|
||||
do_AssignFromReadable(nsDependentString(aPtr, aLength));
|
||||
do_AssignFromReadable(Substring(aPtr, aPtr+aLength));
|
||||
}
|
||||
|
||||
void
|
||||
nsAString::do_AssignFromElement( char_type aChar )
|
||||
{
|
||||
do_AssignFromReadable(nsDependentString(&aChar, 1));
|
||||
do_AssignFromReadable(Substring(&aChar, &aChar+1));
|
||||
}
|
||||
|
||||
|
||||
|
@ -371,13 +371,13 @@ nsAString::do_AppendFromElementPtr( const char_type* aPtr )
|
|||
void
|
||||
nsAString::do_AppendFromElementPtrLength( const char_type* aPtr, size_type aLength )
|
||||
{
|
||||
do_AppendFromReadable(nsDependentString(aPtr, aLength));
|
||||
do_AppendFromReadable(Substring(aPtr, aPtr+aLength));
|
||||
}
|
||||
|
||||
void
|
||||
nsAString::do_AppendFromElement( char_type aChar )
|
||||
{
|
||||
do_AppendFromReadable(nsDependentString(&aChar, 1));
|
||||
do_AppendFromReadable(Substring(&aChar, &aChar + 1));
|
||||
}
|
||||
|
||||
|
||||
|
@ -440,13 +440,13 @@ nsAString::do_InsertFromElementPtr( const char_type* aPtr, index_type atPosition
|
|||
void
|
||||
nsAString::do_InsertFromElementPtrLength( const char_type* aPtr, index_type atPosition, size_type aLength )
|
||||
{
|
||||
do_InsertFromReadable(nsDependentString(aPtr, aLength), atPosition);
|
||||
do_InsertFromReadable(Substring(aPtr, aPtr+aLength), atPosition);
|
||||
}
|
||||
|
||||
void
|
||||
nsAString::do_InsertFromElement( char_type aChar, index_type atPosition )
|
||||
{
|
||||
do_InsertFromReadable(nsDependentString(&aChar, 1), atPosition);
|
||||
do_InsertFromReadable(Substring(&aChar, &aChar+1), atPosition);
|
||||
}
|
||||
|
||||
|
||||
|
@ -825,13 +825,13 @@ nsACString::do_AssignFromElementPtr( const char_type* aPtr )
|
|||
void
|
||||
nsACString::do_AssignFromElementPtrLength( const char_type* aPtr, size_type aLength )
|
||||
{
|
||||
do_AssignFromReadable(nsDependentCString(aPtr, aLength));
|
||||
do_AssignFromReadable(Substring(aPtr, aPtr+aLength));
|
||||
}
|
||||
|
||||
void
|
||||
nsACString::do_AssignFromElement( char_type aChar )
|
||||
{
|
||||
do_AssignFromReadable(nsDependentCString(&aChar, 1));
|
||||
do_AssignFromReadable(Substring(&aChar, &aChar+1));
|
||||
}
|
||||
|
||||
|
||||
|
@ -890,13 +890,13 @@ nsACString::do_AppendFromElementPtr( const char_type* aPtr )
|
|||
void
|
||||
nsACString::do_AppendFromElementPtrLength( const char_type* aPtr, size_type aLength )
|
||||
{
|
||||
do_AppendFromReadable(nsDependentCString(aPtr, aLength));
|
||||
do_AppendFromReadable(Substring(aPtr, aPtr+aLength));
|
||||
}
|
||||
|
||||
void
|
||||
nsACString::do_AppendFromElement( char_type aChar )
|
||||
{
|
||||
do_AppendFromReadable(nsDependentCString(&aChar, 1));
|
||||
do_AppendFromReadable(Substring(&aChar, &aChar + 1));
|
||||
}
|
||||
|
||||
|
||||
|
@ -959,13 +959,13 @@ nsACString::do_InsertFromElementPtr( const char_type* aPtr, index_type atPositio
|
|||
void
|
||||
nsACString::do_InsertFromElementPtrLength( const char_type* aPtr, index_type atPosition, size_type aLength )
|
||||
{
|
||||
do_InsertFromReadable(nsDependentCString(aPtr, aLength), atPosition);
|
||||
do_InsertFromReadable(Substring(aPtr, aPtr+aLength), atPosition);
|
||||
}
|
||||
|
||||
void
|
||||
nsACString::do_InsertFromElement( char_type aChar, index_type atPosition )
|
||||
{
|
||||
do_InsertFromReadable(nsDependentCString(&aChar, 1), atPosition);
|
||||
do_InsertFromReadable(Substring(&aChar, &aChar+1), atPosition);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 0 -*-
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
|
@ -323,7 +323,6 @@ nsUrlbarHistory::SearchPreviousResults(const PRUnichar *searchStr, nsIAutoComple
|
|||
nsXPIDLString prevSearchString;
|
||||
PRUint32 searchStrLen = nsCRT::strlen(searchStr);
|
||||
nsresult rv;
|
||||
nsAutoString searchAutoStr(searchStr);
|
||||
|
||||
rv = previousSearchResult->GetSearchString(getter_Copies(prevSearchString));
|
||||
if (NS_FAILED(rv))
|
||||
|
@ -333,8 +332,12 @@ nsUrlbarHistory::SearchPreviousResults(const PRUnichar *searchStr, nsIAutoComple
|
|||
return NS_ERROR_FAILURE;
|
||||
|
||||
PRUint32 prevSearchStrLen = nsCRT::strlen(prevSearchString);
|
||||
// XXXldb This code used to be the line:
|
||||
// if (searchStrLen < prevSearchStrLen || nsCRT::strncasecmp(searchStr, prevSearchString, prevSearchStrLen != 0))
|
||||
// which doesn't make any sense (since the "!= 0" was inside the
|
||||
// parentheses)
|
||||
if (searchStrLen < prevSearchStrLen ||
|
||||
Compare(nsDependentString(searchStr),
|
||||
Compare(Substring(searchStr, searchStr+prevSearchStrLen),
|
||||
nsDependentString(prevSearchString, prevSearchStrLen),
|
||||
nsCaseInsensitiveStringComparator())!= 0)
|
||||
return NS_ERROR_ABORT;
|
||||
|
@ -365,11 +368,11 @@ nsUrlbarHistory::SearchPreviousResults(const PRUnichar *searchStr, nsIAutoComple
|
|||
|
||||
if (itemValue.IsEmpty())
|
||||
continue;
|
||||
if (Compare(nsDependentString(searchStr, searchStrLen),
|
||||
itemValue,
|
||||
if (Compare(nsDependentString(searchStr, searchStrLen),
|
||||
Substring(itemValue, 0, searchStrLen),
|
||||
nsCaseInsensitiveStringComparator()) == 0)
|
||||
continue;
|
||||
|
||||
continue;
|
||||
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче