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:
dbaron%fas.harvard.edu 2001-11-07 04:12:20 +00:00
Родитель 06d956a0b3
Коммит c0623fdbcd
26 изменённых файлов: 410 добавлений и 491 удалений

Просмотреть файл

@ -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;
}