diff --git a/htmlparser/src/nsExpatTokenizer.cpp b/htmlparser/src/nsExpatTokenizer.cpp
index 4845753b991a..ae991a487bc4 100644
--- a/htmlparser/src/nsExpatTokenizer.cpp
+++ b/htmlparser/src/nsExpatTokenizer.cpp
@@ -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 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;
}
diff --git a/htmlparser/src/nsParser.cpp b/htmlparser/src/nsParser.cpp
index 4485ef06e054..d4ede756f0b6 100644
--- a/htmlparser/src/nsParser.cpp
+++ b/htmlparser/src/nsParser.cpp
@@ -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 begin, end;
str.BeginReading(begin);
diff --git a/intl/chardet/src/nsMetaCharsetObserver.cpp b/intl/chardet/src/nsMetaCharsetObserver.cpp
index b601edfcfceb..c6e367e40c2b 100644
--- a/intl/chardet/src/nsMetaCharsetObserver.cpp
+++ b/intl/chardet/src/nsMetaCharsetObserver.cpp
@@ -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()))
))
diff --git a/js/src/xpconnect/src/xpcprivate.h b/js/src/xpconnect/src/xpcprivate.h
index e3a695ea6b04..c6e37ae4b9a7 100644
--- a/js/src/xpconnect/src/xpcprivate.h
+++ b/js/src/xpconnect/src/xpcprivate.h
@@ -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
{
diff --git a/js/src/xpconnect/src/xpcstring.cpp b/js/src/xpconnect/src/xpcstring.cpp
index 7cc31f106f44..1e26a3d83d51 100644
--- a/js/src/xpconnect/src/xpcstring.cpp
+++ b/js/src/xpconnect/src/xpcstring.cpp
@@ -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)
diff --git a/mailnews/addrbook/src/nsAbAutoCompleteSession.cpp b/mailnews/addrbook/src/nsAbAutoCompleteSession.cpp
index 4f839d997901..3f6d25982b96 100644
--- a/mailnews/addrbook/src/nsAbAutoCompleteSession.cpp
+++ b/mailnews/addrbook/src/nsAbAutoCompleteSession.cpp
@@ -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);
}
diff --git a/mailnews/db/msgdb/src/nsMsgDatabase.cpp b/mailnews/db/msgdb/src/nsMsgDatabase.cpp
index aaa58d7034f8..52b43b14014c 100644
--- a/mailnews/db/msgdb/src/nsMsgDatabase.cpp
+++ b/mailnews/db/msgdb/src/nsMsgDatabase.cpp
@@ -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!!!!
diff --git a/mailnews/imap/src/nsImapMailFolder.cpp b/mailnews/imap/src/nsImapMailFolder.cpp
index db75e497d514..118d3ab05946 100644
--- a/mailnews/imap/src/nsImapMailFolder.cpp
+++ b/mailnews/imap/src/nsImapMailFolder.cpp
@@ -3676,8 +3676,8 @@ nsImapMailFolder::NotifyMessageDeleted(const char *onlineFolderName,PRBool delet
PRBool nsImapMailFolder::ShowDeletedMessages()
{
nsresult err;
- nsCOMPtr hostSession =
- do_GetService(kCImapHostSessionList, &err);
+ nsCOMPtr 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;
}
}
}
diff --git a/mailnews/mime/src/nsMsgHeaderParser.cpp b/mailnews/mime/src/nsMsgHeaderParser.cpp
index 1f9d10a29c1c..0e5bc308fe1a 100644
--- a/mailnews/mime/src/nsMsgHeaderParser.cpp
+++ b/mailnews/mime/src/nsMsgHeaderParser.cpp
@@ -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);
diff --git a/netwerk/streamconv/converters/mozTXTToHTMLConv.cpp b/netwerk/streamconv/converters/mozTXTToHTMLConv.cpp
index 8bb767aa04b9..a57082c6e56b 100644
--- a/netwerk/streamconv/converters/mozTXTToHTMLConv.cpp
+++ b/netwerk/streamconv/converters/mozTXTToHTMLConv.cpp
@@ -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
diff --git a/parser/htmlparser/src/nsExpatTokenizer.cpp b/parser/htmlparser/src/nsExpatTokenizer.cpp
index 4845753b991a..ae991a487bc4 100644
--- a/parser/htmlparser/src/nsExpatTokenizer.cpp
+++ b/parser/htmlparser/src/nsExpatTokenizer.cpp
@@ -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 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;
}
diff --git a/parser/htmlparser/src/nsParser.cpp b/parser/htmlparser/src/nsParser.cpp
index 4485ef06e054..d4ede756f0b6 100644
--- a/parser/htmlparser/src/nsParser.cpp
+++ b/parser/htmlparser/src/nsParser.cpp
@@ -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 begin, end;
str.BeginReading(begin);
diff --git a/string/public/nsAFlatString.h b/string/public/nsAFlatString.h
index 5db9dbc3a501..a79b3944a65a 100644
--- a/string/public/nsAFlatString.h
+++ b/string/public/nsAFlatString.h
@@ -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
{
diff --git a/string/public/nsASingleFragmentString.h b/string/public/nsASingleFragmentString.h
index f693143950fc..c18b957e7b54 100644
--- a/string/public/nsASingleFragmentString.h
+++ b/string/public/nsASingleFragmentString.h
@@ -30,6 +30,16 @@
#include "nsAString.h"
#endif
+ /**
+ * |nsASingleFragmentC?String| is an abstract class. Strings
+ * implementing |nsASingleFragmentC?String| have a buffer that is
+ * stored as a single fragment. However, they are not necessarily
+ * NULL-terminated.
+ *
+ * See also |nsAFlatC?String|, the remaining more-specific abstract
+ * class in the string hierarchy.
+ */
+
class NS_COM nsASingleFragmentString
: public nsAString
{
diff --git a/string/public/nsAString.h b/string/public/nsAString.h
index b22a4091feec..362039a55fc7 100644
--- a/string/public/nsAString.h
+++ b/string/public/nsAString.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
diff --git a/string/public/nsDependentString.h b/string/public/nsDependentString.h
index f8d1703182d5..34981d7918cd 100644
--- a/string/public/nsDependentString.h
+++ b/string/public/nsDependentString.h
@@ -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::length(aPtr));
mHandle.DataEnd(aPtr ? (aPtr+nsCharTraits::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::length(aPtr));
mHandle.DataEnd(aPtr ? (aPtr+nsCharTraits::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); }
diff --git a/string/public/nsDependentSubstring.h b/string/public/nsDependentSubstring.h
index c0ddc6a1112c..1e4e709bd4de 100644
--- a/string/public/nsDependentSubstring.h
+++ b/string/public/nsDependentSubstring.h
@@ -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___) */
diff --git a/string/src/nsAString.cpp b/string/src/nsAString.cpp
index 454530201b9c..e4dcfbf22dfa 100644
--- a/string/src/nsAString.cpp
+++ b/string/src/nsAString.cpp
@@ -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);
}
diff --git a/xpcom/io/nsLocalFileUnix.cpp b/xpcom/io/nsLocalFileUnix.cpp
index d440bd53251e..e3d4f286b17e 100644
--- a/xpcom/io/nsLocalFileUnix.cpp
+++ b/xpcom/io/nsLocalFileUnix.cpp
@@ -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;
diff --git a/xpcom/string/public/nsAFlatString.h b/xpcom/string/public/nsAFlatString.h
index 5db9dbc3a501..a79b3944a65a 100644
--- a/xpcom/string/public/nsAFlatString.h
+++ b/xpcom/string/public/nsAFlatString.h
@@ -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
{
diff --git a/xpcom/string/public/nsASingleFragmentString.h b/xpcom/string/public/nsASingleFragmentString.h
index f693143950fc..c18b957e7b54 100644
--- a/xpcom/string/public/nsASingleFragmentString.h
+++ b/xpcom/string/public/nsASingleFragmentString.h
@@ -30,6 +30,16 @@
#include "nsAString.h"
#endif
+ /**
+ * |nsASingleFragmentC?String| is an abstract class. Strings
+ * implementing |nsASingleFragmentC?String| have a buffer that is
+ * stored as a single fragment. However, they are not necessarily
+ * NULL-terminated.
+ *
+ * See also |nsAFlatC?String|, the remaining more-specific abstract
+ * class in the string hierarchy.
+ */
+
class NS_COM nsASingleFragmentString
: public nsAString
{
diff --git a/xpcom/string/public/nsAString.h b/xpcom/string/public/nsAString.h
index b22a4091feec..362039a55fc7 100644
--- a/xpcom/string/public/nsAString.h
+++ b/xpcom/string/public/nsAString.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
diff --git a/xpcom/string/public/nsDependentString.h b/xpcom/string/public/nsDependentString.h
index f8d1703182d5..34981d7918cd 100644
--- a/xpcom/string/public/nsDependentString.h
+++ b/xpcom/string/public/nsDependentString.h
@@ -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::length(aPtr));
mHandle.DataEnd(aPtr ? (aPtr+nsCharTraits::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::length(aPtr));
mHandle.DataEnd(aPtr ? (aPtr+nsCharTraits::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); }
diff --git a/xpcom/string/public/nsDependentSubstring.h b/xpcom/string/public/nsDependentSubstring.h
index c0ddc6a1112c..1e4e709bd4de 100644
--- a/xpcom/string/public/nsDependentSubstring.h
+++ b/xpcom/string/public/nsDependentSubstring.h
@@ -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___) */
diff --git a/xpcom/string/src/nsAString.cpp b/xpcom/string/src/nsAString.cpp
index 454530201b9c..e4dcfbf22dfa 100644
--- a/xpcom/string/src/nsAString.cpp
+++ b/xpcom/string/src/nsAString.cpp
@@ -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);
}
diff --git a/xpfe/components/urlbarhistory/src/nsUrlbarHistory.cpp b/xpfe/components/urlbarhistory/src/nsUrlbarHistory.cpp
index 0dfc0e2b150b..3ce28c1c7b8a 100644
--- a/xpfe/components/urlbarhistory/src/nsUrlbarHistory.cpp
+++ b/xpfe/components/urlbarhistory/src/nsUrlbarHistory.cpp
@@ -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;
}