diff --git a/mozilla/content/html/style/src/nsCSSParser.cpp b/mozilla/content/html/style/src/nsCSSParser.cpp index a5d6fb6aafb..0680e4959dd 100644 --- a/mozilla/content/html/style/src/nsCSSParser.cpp +++ b/mozilla/content/html/style/src/nsCSSParser.cpp @@ -57,6 +57,7 @@ #include "nsNetUtil.h" #include "nsCOMPtr.h" #include "nsString.h" +#include "nsUnicharUtils.h" #include "nsIAtom.h" #include "nsVoidArray.h" #include "nsISupportsArray.h" @@ -1054,7 +1055,7 @@ PRBool CSSParserImpl::GatherMedia(PRInt32& aErrorCode, nsString& aMedia, if (! first) { aMedia.AppendWithConversion(','); } - mToken.mIdent.ToLowerCase(); // case insensitive from CSS - must be lower cased + ToLowerCase(mToken.mIdent); // case insensitive from CSS - must be lower cased if (aMediaAtoms) { nsIAtom* medium = NS_NewAtom(mToken.mIdent); aMediaAtoms->AppendElement(medium); @@ -1237,7 +1238,7 @@ PRBool CSSParserImpl::ParseNameSpaceRule(PRInt32& aErrorCode, if (eCSSToken_Ident == mToken.mType) { prefix = mToken.mIdent; - prefix.ToLowerCase(); // always case insensitive, since stays within CSS + ToLowerCase(prefix); // always case insensitive, since stays within CSS if (! GetToken(aErrorCode, PR_TRUE)) { REPORT_UNEXPECTED_EOF(); return PR_FALSE; @@ -1775,7 +1776,7 @@ void CSSParserImpl::ParseTypeOrUniversalSelector(PRInt32& aDataMask, aSelector.SetTag(mToken.mIdent); } else { - mToken.mIdent.ToLowerCase(buffer); + ToLowerCase(mToken.mIdent, buffer); aSelector.SetTag(buffer); } } @@ -1819,7 +1820,7 @@ void CSSParserImpl::ParseTypeOrUniversalSelector(PRInt32& aDataMask, PRInt32 nameSpaceID = kNameSpaceID_Unknown; if (mNameSpace) { nsIAtom* prefix; - buffer.ToLowerCase(); // always case insensitive, since stays within CSS + ToLowerCase(buffer); // always case insensitive, since stays within CSS prefix = NS_NewAtom(buffer); mNameSpace->FindNameSpaceID(prefix, nameSpaceID); NS_IF_RELEASE(prefix); @@ -1842,7 +1843,7 @@ void CSSParserImpl::ParseTypeOrUniversalSelector(PRInt32& aDataMask, aSelector.SetTag(mToken.mIdent); } else { - mToken.mIdent.ToLowerCase(buffer); + ToLowerCase(mToken.mIdent, buffer); aSelector.SetTag(buffer); } } @@ -1874,7 +1875,7 @@ void CSSParserImpl::ParseTypeOrUniversalSelector(PRInt32& aDataMask, aSelector.SetTag(buffer); } else { - buffer.ToLowerCase(); + ToLowerCase(buffer); aSelector.SetTag(buffer); } aDataMask |= SEL_MASK_ELEM; @@ -1900,7 +1901,7 @@ void CSSParserImpl::ParseTypeOrUniversalSelector(PRInt32& aDataMask, aSelector.SetTag(mToken.mIdent); } else { - mToken.mIdent.ToLowerCase(buffer); + ToLowerCase(mToken.mIdent, buffer); aSelector.SetTag(buffer); } } @@ -2007,7 +2008,7 @@ void CSSParserImpl::ParseAttributeSelector(PRInt32& aDataMask, nameSpaceID = kNameSpaceID_Unknown; if (mNameSpace) { nsIAtom* prefix; - attr.ToLowerCase(); // always case insensitive, since stays within CSS + ToLowerCase(attr); // always case insensitive, since stays within CSS prefix = NS_NewAtom(attr); mNameSpace->FindNameSpaceID(prefix, nameSpaceID); NS_IF_RELEASE(prefix); @@ -2043,7 +2044,7 @@ void CSSParserImpl::ParseAttributeSelector(PRInt32& aDataMask, } if (! mCaseSensitive) { - attr.ToLowerCase(); + ToLowerCase(attr); } if (! GetToken(aErrorCode, PR_TRUE)) { // premature EOF REPORT_UNEXPECTED_EOF(); @@ -2165,7 +2166,7 @@ void CSSParserImpl::ParsePseudoSelector(PRInt32& aDataMask, buffer.Truncate(); buffer.AppendWithConversion(':'); buffer.Append(mToken.mIdent); - buffer.ToLowerCase(); + ToLowerCase(buffer); nsIAtom* pseudo = NS_NewAtom(buffer); if (eCSSToken_Ident != mToken.mType) { // malformed selector @@ -3138,7 +3139,7 @@ PRBool CSSParserImpl::ParseAttr(PRInt32& aErrorCode, nsCSSValue& aValue) PRInt32 nameSpaceID = kNameSpaceID_Unknown; if (mNameSpace) { nsIAtom* prefix; - holdIdent.ToLowerCase(); // always case insensitive, since stays within CSS + ToLowerCase(holdIdent); // always case insensitive, since stays within CSS prefix = NS_NewAtom(holdIdent); mNameSpace->FindNameSpaceID(prefix, nameSpaceID); NS_IF_RELEASE(prefix); @@ -3156,7 +3157,7 @@ PRBool CSSParserImpl::ParseAttr(PRInt32& aErrorCode, nsCSSValue& aValue) attr.Append(mToken.mIdent); } else { nsAutoString buffer; - mToken.mIdent.ToLowerCase(buffer); + ToLowerCase(mToken.mIdent, buffer); attr.Append(buffer); } } @@ -3170,7 +3171,7 @@ PRBool CSSParserImpl::ParseAttr(PRInt32& aErrorCode, nsCSSValue& aValue) attr = holdIdent; } else { - holdIdent.ToLowerCase(attr); + ToLowerCase(holdIdent, attr); } } } @@ -3202,7 +3203,7 @@ PRBool CSSParserImpl::ParseAttr(PRInt32& aErrorCode, nsCSSValue& aValue) attr.Append(mToken.mIdent); } else { nsAutoString buffer; - mToken.mIdent.ToLowerCase(buffer); + ToLowerCase(mToken.mIdent, buffer); attr.Append(buffer); } } diff --git a/mozilla/gfx/src/mac/nsDeviceContextMac.cpp b/mozilla/gfx/src/mac/nsDeviceContextMac.cpp index d4d0b72ab87..19db017982b 100644 --- a/mozilla/gfx/src/mac/nsDeviceContextMac.cpp +++ b/mozilla/gfx/src/mac/nsDeviceContextMac.cpp @@ -66,6 +66,7 @@ #include "nsIScreenManager.h" #include "nsIServiceManager.h" #include "nsReadableUtils.h" +#include "nsUnicharUtils.h" PRUint32 nsDeviceContextMac::mPixelsPerInch = 96; @@ -761,8 +762,8 @@ FontNameKey::FontNameKey(const nsString& aString) PRUint32 FontNameKey::HashCode(void) const { nsString str; - mString.ToLowerCase(str); - return nsCRT::HashCode(str.get()); + ToLowerCase(mString, str); + return nsCRT::HashCode(str.get()); } PRBool FontNameKey::Equals(const nsHashKey *aKey) const diff --git a/mozilla/intl/unicharutil/util/nsUnicharUtils.cpp b/mozilla/intl/unicharutil/util/nsUnicharUtils.cpp index 22844c41831..10fe8829ffe 100644 --- a/mozilla/intl/unicharutil/util/nsUnicharUtils.cpp +++ b/mozilla/intl/unicharutil/util/nsUnicharUtils.cpp @@ -31,7 +31,6 @@ // global cache of the case conversion service static nsICaseConversion *gCaseConv = nsnull; -static NS_DEFINE_CID(kUnicharUtilCID, NS_UNICHARUTIL_CID); class nsShutdownObserver : public nsIObserver { @@ -59,9 +58,7 @@ static nsresult NS_InitCaseConversion() { nsresult rv; - rv = nsServiceManager::GetService(kUnicharUtilCID, - NS_GET_IID(nsICaseConversion), - (nsISupports**)&gCaseConv); + rv = CallGetService(NS_UNICHARUTIL_CONTRACTID, &gCaseConv); if (NS_SUCCEEDED(rv)) { nsCOMPtr obs = @@ -76,38 +73,77 @@ static nsresult NS_InitCaseConversion() { return NS_OK; } - -// to be turned on for bug 100214 -//#if 0 class ConvertToLowerCase { public: typedef PRUnichar value_type; - PRUint32 write( const PRUnichar* aSource, PRUint32 aSourceLength) + ConvertToLowerCase() { NS_InitCaseConversion(); + } + + PRUint32 write( const PRUnichar* aSource, PRUint32 aSourceLength) + { gCaseConv->ToLower(aSource, NS_CONST_CAST(PRUnichar*,aSource), aSourceLength); return aSourceLength; } }; void -ToLowerCase( nsAString& aString) +ToLowerCase( nsAString& aString ) { nsAString::iterator fromBegin, fromEnd; ConvertToLowerCase converter; copy_string(aString.BeginWriting(fromBegin), aString.EndWriting(fromEnd), converter); } +class CopyToLowerCase + { + public: + typedef PRUnichar value_type; + + CopyToLowerCase( nsAString::iterator& aDestIter ) + : mIter(aDestIter) + { + NS_InitCaseConversion(); + } + + PRUint32 write( const PRUnichar* aSource, PRUint32 aSourceLength ) + { + PRUint32 len = PR_MIN(PRUint32(mIter.size_forward()), aSourceLength); + PRUnichar* dest = NS_CONST_CAST(PRUnichar*, mIter.get()); + gCaseConv->ToLower(aSource, dest, len); + mIter.advance(len); + return len; + } + + protected: + nsAString::iterator& mIter; + }; + +void +ToLowerCase( const nsAString& aSource, nsAString& aDest ) + { + nsAString::const_iterator fromBegin, fromEnd; + nsAString::iterator toBegin; + aDest.SetLength(aSource.Length()); + CopyToLowerCase converter(aDest.BeginWriting(toBegin)); + copy_string(aSource.BeginReading(fromBegin), aSource.EndReading(fromEnd), converter); + } + class ConvertToUpperCase { public: typedef PRUnichar value_type; - PRUint32 write( const PRUnichar* aSource, PRUint32 aSourceLength) + ConvertToUpperCase() { NS_InitCaseConversion(); + } + + PRUint32 write( const PRUnichar* aSource, PRUint32 aSourceLength) + { gCaseConv->ToUpper(aSource, NS_CONST_CAST(PRUnichar*,aSource), aSourceLength); return aSourceLength; } @@ -121,6 +157,40 @@ ToUpperCase( nsAString& aString ) copy_string(aString.BeginWriting(fromBegin), aString.EndWriting(fromEnd), converter); } +class CopyToUpperCase + { + public: + typedef PRUnichar value_type; + + CopyToUpperCase( nsAString::iterator& aDestIter ) + : mIter(aDestIter) + { + NS_InitCaseConversion(); + } + + PRUint32 write( const PRUnichar* aSource, PRUint32 aSourceLength ) + { + PRUint32 len = PR_MIN(PRUint32(mIter.size_forward()), aSourceLength); + PRUnichar* dest = NS_CONST_CAST(PRUnichar*, mIter.get()); + gCaseConv->ToUpper(aSource, dest, len); + mIter.advance(len); + return len; + } + + protected: + nsAString::iterator& mIter; + }; + +void +ToUpperCase( const nsAString& aSource, nsAString& aDest ) + { + nsAString::const_iterator fromBegin, fromEnd; + nsAString::iterator toBegin; + aDest.SetLength(aSource.Length()); + CopyToUpperCase converter(aDest.BeginWriting(toBegin)); + copy_string(aSource.BeginReading(fromBegin), aSource.EndReading(fromEnd), converter); + } + PRBool CaseInsensitiveFindInReadable( const nsAString& aPattern, nsAString::const_iterator& aSearchStart, nsAString::const_iterator& aSearchEnd ) { @@ -151,8 +221,6 @@ nsCaseInsensitiveStringComparator::operator()( PRUnichar lhs, PRUnichar rhs ) co return 1; } -///#endif - PRUnichar ToLowerCase(PRUnichar aChar) { diff --git a/mozilla/intl/unicharutil/util/nsUnicharUtils.h b/mozilla/intl/unicharutil/util/nsUnicharUtils.h index c335a08b00e..41a24b5273c 100644 --- a/mozilla/intl/unicharutil/util/nsUnicharUtils.h +++ b/mozilla/intl/unicharutil/util/nsUnicharUtils.h @@ -26,6 +26,8 @@ //#if 0 void ToLowerCase( nsAString& ); void ToUpperCase( nsAString& ); +void ToLowerCase( const nsAString& aSource, nsAString& aDest ); +void ToUpperCase( const nsAString& aSource, nsAString& aDest ); PRBool CaseInsensitiveFindInReadable( const nsAString& aPattern, nsAString::const_iterator&, nsAString::const_iterator& ); diff --git a/mozilla/layout/style/nsCSSParser.cpp b/mozilla/layout/style/nsCSSParser.cpp index a5d6fb6aafb..0680e4959dd 100644 --- a/mozilla/layout/style/nsCSSParser.cpp +++ b/mozilla/layout/style/nsCSSParser.cpp @@ -57,6 +57,7 @@ #include "nsNetUtil.h" #include "nsCOMPtr.h" #include "nsString.h" +#include "nsUnicharUtils.h" #include "nsIAtom.h" #include "nsVoidArray.h" #include "nsISupportsArray.h" @@ -1054,7 +1055,7 @@ PRBool CSSParserImpl::GatherMedia(PRInt32& aErrorCode, nsString& aMedia, if (! first) { aMedia.AppendWithConversion(','); } - mToken.mIdent.ToLowerCase(); // case insensitive from CSS - must be lower cased + ToLowerCase(mToken.mIdent); // case insensitive from CSS - must be lower cased if (aMediaAtoms) { nsIAtom* medium = NS_NewAtom(mToken.mIdent); aMediaAtoms->AppendElement(medium); @@ -1237,7 +1238,7 @@ PRBool CSSParserImpl::ParseNameSpaceRule(PRInt32& aErrorCode, if (eCSSToken_Ident == mToken.mType) { prefix = mToken.mIdent; - prefix.ToLowerCase(); // always case insensitive, since stays within CSS + ToLowerCase(prefix); // always case insensitive, since stays within CSS if (! GetToken(aErrorCode, PR_TRUE)) { REPORT_UNEXPECTED_EOF(); return PR_FALSE; @@ -1775,7 +1776,7 @@ void CSSParserImpl::ParseTypeOrUniversalSelector(PRInt32& aDataMask, aSelector.SetTag(mToken.mIdent); } else { - mToken.mIdent.ToLowerCase(buffer); + ToLowerCase(mToken.mIdent, buffer); aSelector.SetTag(buffer); } } @@ -1819,7 +1820,7 @@ void CSSParserImpl::ParseTypeOrUniversalSelector(PRInt32& aDataMask, PRInt32 nameSpaceID = kNameSpaceID_Unknown; if (mNameSpace) { nsIAtom* prefix; - buffer.ToLowerCase(); // always case insensitive, since stays within CSS + ToLowerCase(buffer); // always case insensitive, since stays within CSS prefix = NS_NewAtom(buffer); mNameSpace->FindNameSpaceID(prefix, nameSpaceID); NS_IF_RELEASE(prefix); @@ -1842,7 +1843,7 @@ void CSSParserImpl::ParseTypeOrUniversalSelector(PRInt32& aDataMask, aSelector.SetTag(mToken.mIdent); } else { - mToken.mIdent.ToLowerCase(buffer); + ToLowerCase(mToken.mIdent, buffer); aSelector.SetTag(buffer); } } @@ -1874,7 +1875,7 @@ void CSSParserImpl::ParseTypeOrUniversalSelector(PRInt32& aDataMask, aSelector.SetTag(buffer); } else { - buffer.ToLowerCase(); + ToLowerCase(buffer); aSelector.SetTag(buffer); } aDataMask |= SEL_MASK_ELEM; @@ -1900,7 +1901,7 @@ void CSSParserImpl::ParseTypeOrUniversalSelector(PRInt32& aDataMask, aSelector.SetTag(mToken.mIdent); } else { - mToken.mIdent.ToLowerCase(buffer); + ToLowerCase(mToken.mIdent, buffer); aSelector.SetTag(buffer); } } @@ -2007,7 +2008,7 @@ void CSSParserImpl::ParseAttributeSelector(PRInt32& aDataMask, nameSpaceID = kNameSpaceID_Unknown; if (mNameSpace) { nsIAtom* prefix; - attr.ToLowerCase(); // always case insensitive, since stays within CSS + ToLowerCase(attr); // always case insensitive, since stays within CSS prefix = NS_NewAtom(attr); mNameSpace->FindNameSpaceID(prefix, nameSpaceID); NS_IF_RELEASE(prefix); @@ -2043,7 +2044,7 @@ void CSSParserImpl::ParseAttributeSelector(PRInt32& aDataMask, } if (! mCaseSensitive) { - attr.ToLowerCase(); + ToLowerCase(attr); } if (! GetToken(aErrorCode, PR_TRUE)) { // premature EOF REPORT_UNEXPECTED_EOF(); @@ -2165,7 +2166,7 @@ void CSSParserImpl::ParsePseudoSelector(PRInt32& aDataMask, buffer.Truncate(); buffer.AppendWithConversion(':'); buffer.Append(mToken.mIdent); - buffer.ToLowerCase(); + ToLowerCase(buffer); nsIAtom* pseudo = NS_NewAtom(buffer); if (eCSSToken_Ident != mToken.mType) { // malformed selector @@ -3138,7 +3139,7 @@ PRBool CSSParserImpl::ParseAttr(PRInt32& aErrorCode, nsCSSValue& aValue) PRInt32 nameSpaceID = kNameSpaceID_Unknown; if (mNameSpace) { nsIAtom* prefix; - holdIdent.ToLowerCase(); // always case insensitive, since stays within CSS + ToLowerCase(holdIdent); // always case insensitive, since stays within CSS prefix = NS_NewAtom(holdIdent); mNameSpace->FindNameSpaceID(prefix, nameSpaceID); NS_IF_RELEASE(prefix); @@ -3156,7 +3157,7 @@ PRBool CSSParserImpl::ParseAttr(PRInt32& aErrorCode, nsCSSValue& aValue) attr.Append(mToken.mIdent); } else { nsAutoString buffer; - mToken.mIdent.ToLowerCase(buffer); + ToLowerCase(mToken.mIdent, buffer); attr.Append(buffer); } } @@ -3170,7 +3171,7 @@ PRBool CSSParserImpl::ParseAttr(PRInt32& aErrorCode, nsCSSValue& aValue) attr = holdIdent; } else { - holdIdent.ToLowerCase(attr); + ToLowerCase(holdIdent, attr); } } } @@ -3202,7 +3203,7 @@ PRBool CSSParserImpl::ParseAttr(PRInt32& aErrorCode, nsCSSValue& aValue) attr.Append(mToken.mIdent); } else { nsAutoString buffer; - mToken.mIdent.ToLowerCase(buffer); + ToLowerCase(mToken.mIdent, buffer); attr.Append(buffer); } } diff --git a/mozilla/string/obsolete/nsString.cpp b/mozilla/string/obsolete/nsString.cpp index fd18cc2c26a..1d3011f5fbd 100644 --- a/mozilla/string/obsolete/nsString.cpp +++ b/mozilla/string/obsolete/nsString.cpp @@ -251,28 +251,6 @@ void nsCString::ToUpperCase() { nsStr::ChangeCase(*this,PR_TRUE); } -/** - * Converts chars in this to lowercase, and - * stores them in aString - * @update gess 01/04/99 - * @param aOut is a string to contain result - */ -void nsCString::ToLowerCase(nsCString& aString) const { - aString=*this; - nsStr::ChangeCase(aString,PR_FALSE); -} - -/** - * Converts chars in this to uppercase, and - * stores them in a given output string - * @update gess 01/04/99 - * @param aOut is a string to contain result - */ -void nsCString::ToUpperCase(nsCString& aString) const { - aString=*this; - nsStr::ChangeCase(aString,PR_TRUE); -} - /** * This method is used to remove all occurances of the * characters found in aSet from this string. diff --git a/mozilla/string/obsolete/nsString.h b/mozilla/string/obsolete/nsString.h index db37021917f..3c132761534 100644 --- a/mozilla/string/obsolete/nsString.h +++ b/mozilla/string/obsolete/nsString.h @@ -155,28 +155,12 @@ public: void ToLowerCase(); - /** - * Converts chars in this to lowercase, and - * stores them in aOut - * @update gess 7/27/98 - * @param aOut is a string to contain result - */ - void ToLowerCase(nsCString& aString) const; - /** * Converts chars in this to uppercase * @update gess 7/27/98 */ void ToUpperCase(); - /** - * Converts chars in this to lowercase, and - * stores them in a given output string - * @update gess 7/27/98 - * @param aOut is a string to contain result - */ - void ToUpperCase(nsCString& aString) const; - /** * This method is used to remove all occurances of the diff --git a/mozilla/string/obsolete/nsString2.cpp b/mozilla/string/obsolete/nsString2.cpp index 8efa3dcd2ca..cba0308627d 100644 --- a/mozilla/string/obsolete/nsString2.cpp +++ b/mozilla/string/obsolete/nsString2.cpp @@ -262,28 +262,6 @@ void nsString::ToUpperCase() { nsStr::ChangeCase(*this,PR_TRUE); } -/** - * Converts chars in this to uppercase, and - * stores them in aString - * @update gess 01/04/99 - * @param aOut is a string to contain result - */ -void nsString::ToLowerCase(nsString& aString) const { - aString=*this; - nsStr::ChangeCase(aString,PR_FALSE); -} - -/** - * Converts chars in this to uppercase, and - * stores them in a given output string - * @update gess 01/04/99 - * @param aOut is a string to contain result - */ -void nsString::ToUpperCase(nsString& aString) const { - aString=*this; - nsStr::ChangeCase(aString,PR_TRUE); -} - /** * This method is used to remove all occurances of the * characters found in aSet from this string. diff --git a/mozilla/string/obsolete/nsString2.h b/mozilla/string/obsolete/nsString2.h index fb141b3a630..576187ab286 100644 --- a/mozilla/string/obsolete/nsString2.h +++ b/mozilla/string/obsolete/nsString2.h @@ -176,28 +176,12 @@ public: void ToLowerCase(); - /** - * Converts chars in this to lowercase, and - * stores them in aOut - * @update gess 7/27/98 - * @param aOut is a string to contain result - */ - void ToLowerCase(nsString& aString) const; - /** * Converts chars in this to uppercase * @update gess 7/27/98 */ void ToUpperCase(); - /** - * Converts chars in this to lowercase, and - * stores them in a given output string - * @update gess 7/27/98 - * @param aOut is a string to contain result - */ - void ToUpperCase(nsString& aString) const; - /** * This method is used to remove all occurances of the diff --git a/mozilla/string/public/nsReadableUtils.h b/mozilla/string/public/nsReadableUtils.h index 14db3bc6d8e..2188ea2db80 100755 --- a/mozilla/string/public/nsReadableUtils.h +++ b/mozilla/string/public/nsReadableUtils.h @@ -174,6 +174,13 @@ NS_COM void ToUpperCase( nsACString& ); NS_COM void ToLowerCase( nsACString& ); + /** + * Converts case from string aSource to aDest. + */ +NS_COM void ToUpperCase( const nsACString& aSource, nsACString& aDest ); + +NS_COM void ToLowerCase( const nsACString& aSource, nsACString& aDest ); + /** * Finds the leftmost occurance of |aPattern|, if any in the range |aSearchStart|..|aSearchEnd|. * diff --git a/mozilla/string/src/nsReadableUtils.cpp b/mozilla/string/src/nsReadableUtils.cpp index 3588ee49c2b..6b316e73e59 100755 --- a/mozilla/string/src/nsReadableUtils.cpp +++ b/mozilla/string/src/nsReadableUtils.cpp @@ -340,7 +340,7 @@ IsASCII( const nsAString& aString ) /** - * A character sink for case conversion. + * A character sink for in-place case conversion. */ class ConvertToUpperCase { @@ -372,6 +372,51 @@ ToUpperCase( nsACString& aCString ) } + /** + * A character sink for copying with case conversion. + */ +class CopyToUpperCase + { + public: + typedef char value_type; + + CopyToUpperCase( nsACString::iterator& aDestIter ) + : mIter(aDestIter) + { + } + + PRUint32 + write( const char* aSource, PRUint32 aSourceLength ) + { + PRUint32 len = PR_MIN(PRUint32(mIter.size_forward()), aSourceLength); + char* cp = mIter.get(); + const char* end = aSource + len; + while (aSource != end) { + char ch = *aSource; + if ((ch >= 'a') && (ch <= 'z')) + *cp = ch - ('a' - 'A'); + ++aSource; + ++cp; + } + mIter.advance(len); + return len; + } + + protected: + nsACString::iterator& mIter; + }; + +NS_COM +void +ToUpperCase( const nsACString& aSource, nsACString& aDest ) + { + nsACString::const_iterator fromBegin, fromEnd; + nsACString::iterator toBegin; + aDest.SetLength(aSource.Length()); + CopyToUpperCase converter(aDest.BeginWriting(toBegin)); + copy_string(aSource.BeginReading(fromBegin), aSource.EndReading(fromEnd), converter); + } + /** * A character sink for case conversion. */ @@ -404,6 +449,51 @@ ToLowerCase( nsACString& aCString ) copy_string(aCString.BeginWriting(fromBegin), aCString.EndWriting(fromEnd), converter); } + /** + * A character sink for copying with case conversion. + */ +class CopyToLowerCase + { + public: + typedef char value_type; + + CopyToLowerCase( nsACString::iterator& aDestIter ) + : mIter(aDestIter) + { + } + + PRUint32 + write( const char* aSource, PRUint32 aSourceLength ) + { + PRUint32 len = PR_MIN(PRUint32(mIter.size_forward()), aSourceLength); + char* cp = mIter.get(); + const char* end = aSource + len; + while (aSource != end) { + char ch = *aSource; + if ((ch >= 'A') && (ch <= 'Z')) + *cp = ch + ('a' - 'A'); + ++aSource; + ++cp; + } + mIter.advance(len); + return len; + } + + protected: + nsACString::iterator& mIter; + }; + +NS_COM +void +ToLowerCase( const nsACString& aSource, nsACString& aDest ) + { + nsACString::const_iterator fromBegin, fromEnd; + nsACString::iterator toBegin; + aDest.SetLength(aSource.Length()); + CopyToLowerCase converter(aDest.BeginWriting(toBegin)); + copy_string(aSource.BeginReading(fromBegin), aSource.EndReading(fromEnd), converter); + } + template PRBool FindInReadable_Impl( const StringT& aPattern, IteratorT& aSearchStart, IteratorT& aSearchEnd, const Comparator& compare ) diff --git a/mozilla/xpcom/string/obsolete/nsString.cpp b/mozilla/xpcom/string/obsolete/nsString.cpp index fd18cc2c26a..1d3011f5fbd 100644 --- a/mozilla/xpcom/string/obsolete/nsString.cpp +++ b/mozilla/xpcom/string/obsolete/nsString.cpp @@ -251,28 +251,6 @@ void nsCString::ToUpperCase() { nsStr::ChangeCase(*this,PR_TRUE); } -/** - * Converts chars in this to lowercase, and - * stores them in aString - * @update gess 01/04/99 - * @param aOut is a string to contain result - */ -void nsCString::ToLowerCase(nsCString& aString) const { - aString=*this; - nsStr::ChangeCase(aString,PR_FALSE); -} - -/** - * Converts chars in this to uppercase, and - * stores them in a given output string - * @update gess 01/04/99 - * @param aOut is a string to contain result - */ -void nsCString::ToUpperCase(nsCString& aString) const { - aString=*this; - nsStr::ChangeCase(aString,PR_TRUE); -} - /** * This method is used to remove all occurances of the * characters found in aSet from this string. diff --git a/mozilla/xpcom/string/obsolete/nsString.h b/mozilla/xpcom/string/obsolete/nsString.h index db37021917f..3c132761534 100644 --- a/mozilla/xpcom/string/obsolete/nsString.h +++ b/mozilla/xpcom/string/obsolete/nsString.h @@ -155,28 +155,12 @@ public: void ToLowerCase(); - /** - * Converts chars in this to lowercase, and - * stores them in aOut - * @update gess 7/27/98 - * @param aOut is a string to contain result - */ - void ToLowerCase(nsCString& aString) const; - /** * Converts chars in this to uppercase * @update gess 7/27/98 */ void ToUpperCase(); - /** - * Converts chars in this to lowercase, and - * stores them in a given output string - * @update gess 7/27/98 - * @param aOut is a string to contain result - */ - void ToUpperCase(nsCString& aString) const; - /** * This method is used to remove all occurances of the diff --git a/mozilla/xpcom/string/obsolete/nsString2.cpp b/mozilla/xpcom/string/obsolete/nsString2.cpp index 8efa3dcd2ca..cba0308627d 100644 --- a/mozilla/xpcom/string/obsolete/nsString2.cpp +++ b/mozilla/xpcom/string/obsolete/nsString2.cpp @@ -262,28 +262,6 @@ void nsString::ToUpperCase() { nsStr::ChangeCase(*this,PR_TRUE); } -/** - * Converts chars in this to uppercase, and - * stores them in aString - * @update gess 01/04/99 - * @param aOut is a string to contain result - */ -void nsString::ToLowerCase(nsString& aString) const { - aString=*this; - nsStr::ChangeCase(aString,PR_FALSE); -} - -/** - * Converts chars in this to uppercase, and - * stores them in a given output string - * @update gess 01/04/99 - * @param aOut is a string to contain result - */ -void nsString::ToUpperCase(nsString& aString) const { - aString=*this; - nsStr::ChangeCase(aString,PR_TRUE); -} - /** * This method is used to remove all occurances of the * characters found in aSet from this string. diff --git a/mozilla/xpcom/string/obsolete/nsString2.h b/mozilla/xpcom/string/obsolete/nsString2.h index fb141b3a630..576187ab286 100644 --- a/mozilla/xpcom/string/obsolete/nsString2.h +++ b/mozilla/xpcom/string/obsolete/nsString2.h @@ -176,28 +176,12 @@ public: void ToLowerCase(); - /** - * Converts chars in this to lowercase, and - * stores them in aOut - * @update gess 7/27/98 - * @param aOut is a string to contain result - */ - void ToLowerCase(nsString& aString) const; - /** * Converts chars in this to uppercase * @update gess 7/27/98 */ void ToUpperCase(); - /** - * Converts chars in this to lowercase, and - * stores them in a given output string - * @update gess 7/27/98 - * @param aOut is a string to contain result - */ - void ToUpperCase(nsString& aString) const; - /** * This method is used to remove all occurances of the diff --git a/mozilla/xpcom/string/public/nsReadableUtils.h b/mozilla/xpcom/string/public/nsReadableUtils.h index 14db3bc6d8e..2188ea2db80 100755 --- a/mozilla/xpcom/string/public/nsReadableUtils.h +++ b/mozilla/xpcom/string/public/nsReadableUtils.h @@ -174,6 +174,13 @@ NS_COM void ToUpperCase( nsACString& ); NS_COM void ToLowerCase( nsACString& ); + /** + * Converts case from string aSource to aDest. + */ +NS_COM void ToUpperCase( const nsACString& aSource, nsACString& aDest ); + +NS_COM void ToLowerCase( const nsACString& aSource, nsACString& aDest ); + /** * Finds the leftmost occurance of |aPattern|, if any in the range |aSearchStart|..|aSearchEnd|. * diff --git a/mozilla/xpcom/string/src/nsReadableUtils.cpp b/mozilla/xpcom/string/src/nsReadableUtils.cpp index 3588ee49c2b..6b316e73e59 100755 --- a/mozilla/xpcom/string/src/nsReadableUtils.cpp +++ b/mozilla/xpcom/string/src/nsReadableUtils.cpp @@ -340,7 +340,7 @@ IsASCII( const nsAString& aString ) /** - * A character sink for case conversion. + * A character sink for in-place case conversion. */ class ConvertToUpperCase { @@ -372,6 +372,51 @@ ToUpperCase( nsACString& aCString ) } + /** + * A character sink for copying with case conversion. + */ +class CopyToUpperCase + { + public: + typedef char value_type; + + CopyToUpperCase( nsACString::iterator& aDestIter ) + : mIter(aDestIter) + { + } + + PRUint32 + write( const char* aSource, PRUint32 aSourceLength ) + { + PRUint32 len = PR_MIN(PRUint32(mIter.size_forward()), aSourceLength); + char* cp = mIter.get(); + const char* end = aSource + len; + while (aSource != end) { + char ch = *aSource; + if ((ch >= 'a') && (ch <= 'z')) + *cp = ch - ('a' - 'A'); + ++aSource; + ++cp; + } + mIter.advance(len); + return len; + } + + protected: + nsACString::iterator& mIter; + }; + +NS_COM +void +ToUpperCase( const nsACString& aSource, nsACString& aDest ) + { + nsACString::const_iterator fromBegin, fromEnd; + nsACString::iterator toBegin; + aDest.SetLength(aSource.Length()); + CopyToUpperCase converter(aDest.BeginWriting(toBegin)); + copy_string(aSource.BeginReading(fromBegin), aSource.EndReading(fromEnd), converter); + } + /** * A character sink for case conversion. */ @@ -404,6 +449,51 @@ ToLowerCase( nsACString& aCString ) copy_string(aCString.BeginWriting(fromBegin), aCString.EndWriting(fromEnd), converter); } + /** + * A character sink for copying with case conversion. + */ +class CopyToLowerCase + { + public: + typedef char value_type; + + CopyToLowerCase( nsACString::iterator& aDestIter ) + : mIter(aDestIter) + { + } + + PRUint32 + write( const char* aSource, PRUint32 aSourceLength ) + { + PRUint32 len = PR_MIN(PRUint32(mIter.size_forward()), aSourceLength); + char* cp = mIter.get(); + const char* end = aSource + len; + while (aSource != end) { + char ch = *aSource; + if ((ch >= 'A') && (ch <= 'Z')) + *cp = ch + ('a' - 'A'); + ++aSource; + ++cp; + } + mIter.advance(len); + return len; + } + + protected: + nsACString::iterator& mIter; + }; + +NS_COM +void +ToLowerCase( const nsACString& aSource, nsACString& aDest ) + { + nsACString::const_iterator fromBegin, fromEnd; + nsACString::iterator toBegin; + aDest.SetLength(aSource.Length()); + CopyToLowerCase converter(aDest.BeginWriting(toBegin)); + copy_string(aSource.BeginReading(fromBegin), aSource.EndReading(fromEnd), converter); + } + template PRBool FindInReadable_Impl( const StringT& aPattern, IteratorT& aSearchStart, IteratorT& aSearchEnd, const Comparator& compare )