diff options
author | Noel <noel.grandin@collabora.co.uk> | 2021-01-28 11:01:28 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2021-01-28 11:11:28 +0100 |
commit | 1da69081732c8a429840edaaf10cfb789ea68df8 (patch) | |
tree | f343c9559e9dfb0263f7e33fe4306f81ec60e3fa | |
parent | b3737c638671ab39c5e6aaeaf5426d102392cc0a (diff) |
add string_view variants of methods to O[U]StringBuffer
and update the stringview loplugin to detect cases where we can
use these new methods.
Change-Id: I998efe02e35c8efcb3abfb4d7186165bbe6dfb2c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110046
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
33 files changed, 257 insertions, 53 deletions
diff --git a/chart2/source/tools/ObjectIdentifier.cxx b/chart2/source/tools/ObjectIdentifier.cxx index b5faa312d46b..29f2b83efbec 100644 --- a/chart2/source/tools/ObjectIdentifier.cxx +++ b/chart2/source/tools/ObjectIdentifier.cxx @@ -170,7 +170,7 @@ OUString lcl_getIndexStringAfterString( const OUString& rString, const OUString& sal_Int32 nNextColon = rString.indexOf( ':', nIndexStart ); if( nNextColon != -1 ) nIndexEnd = nNextColon; - aRet = rString.copy(nIndexStart,nIndexEnd-nIndexStart); + aRet = rString.subView(nIndexStart,nIndexEnd-nIndexStart); } return aRet.makeStringAndClear(); diff --git a/compilerplugins/clang/stringview.cxx b/compilerplugins/clang/stringview.cxx index abfc87f78fd6..5df91dcad054 100644 --- a/compilerplugins/clang/stringview.cxx +++ b/compilerplugins/clang/stringview.cxx @@ -51,8 +51,11 @@ public: bool VisitFunctionDecl(FunctionDecl const*); bool VisitCXXOperatorCallExpr(CXXOperatorCallExpr const*); bool VisitImplicitCastExpr(ImplicitCastExpr const*); + bool VisitCXXMemberCallExpr(CXXMemberCallExpr const*); + bool VisitCXXConstructExpr(CXXConstructExpr const*); private: + void handleSubExprThatCouldBeView(Expr const* expr); void handleCXXConstructExpr(CXXConstructExpr const* expr); void handleCXXMemberCallExpr(CXXMemberCallExpr const* expr); }; @@ -88,6 +91,20 @@ bool StringView::VisitCXXOperatorCallExpr(CXXOperatorCallExpr const* cxxOperator check(cxxOperatorCallExpr->getArg(1)); else if (op == OO_Subscript) check(cxxOperatorCallExpr->getArg(0)); + else if (op == OO_Equal) + { + if (loplugin::TypeCheck(cxxOperatorCallExpr->getType()) + .Class("OUStringBuffer") + .Namespace("rtl") + .GlobalNamespace() + || loplugin::TypeCheck(cxxOperatorCallExpr->getType()) + .Class("OStringBuffer") + .Namespace("rtl") + .GlobalNamespace()) + { + check(cxxOperatorCallExpr->getArg(1)); + } + } return true; } @@ -111,12 +128,18 @@ bool StringView::VisitImplicitCastExpr(ImplicitCastExpr const* expr) { return true; } - auto const e = expr->getSubExprAsWritten()->IgnoreParens(); + handleSubExprThatCouldBeView(expr->getSubExprAsWritten()); + return true; +} + +void StringView::handleSubExprThatCouldBeView(Expr const* subExpr) +{ + auto const e = subExpr->IgnoreParens(); auto const tc = loplugin::TypeCheck(e->getType()); if (!(tc.Class("OString").Namespace("rtl").GlobalNamespace() || tc.Class("OUString").Namespace("rtl").GlobalNamespace())) { - return true; + return; } if (auto const e1 = dyn_cast<CXXConstructExpr>(e)) { @@ -138,7 +161,6 @@ bool StringView::VisitImplicitCastExpr(ImplicitCastExpr const* expr) { handleCXXMemberCallExpr(e3); } - return true; } void StringView::handleCXXConstructExpr(CXXConstructExpr const* expr) @@ -229,6 +251,61 @@ void StringView::handleCXXMemberCallExpr(CXXMemberCallExpr const* expr) << expr->getSourceRange(); } +/** check for calls to O[U]StringBuffer::append that could be passed as a + std::u16string_view */ +bool StringView::VisitCXXMemberCallExpr(CXXMemberCallExpr const* expr) +{ + if (ignoreLocation(expr)) + { + return true; + } + if (!loplugin::TypeCheck(expr->getType()) + .Class("OUStringBuffer") + .Namespace("rtl") + .GlobalNamespace() + && !loplugin::TypeCheck(expr->getType()) + .Class("OStringBuffer") + .Namespace("rtl") + .GlobalNamespace()) + { + return true; + } + auto const dc = loplugin::DeclCheck(expr->getMethodDecl()); + if (dc.Function("append") || dc.Function("indexOf") || dc.Function("lastIndexOf")) + { + handleSubExprThatCouldBeView(compat::IgnoreImplicit(expr->getArg(0))); + } + else if (dc.Function("insert")) + { + handleSubExprThatCouldBeView(compat::IgnoreImplicit(expr->getArg(1))); + } + return true; +} + +/** check for calls to O[U]StringBuffer constructor that could be passed as a + std::u16string_view */ +bool StringView::VisitCXXConstructExpr(CXXConstructExpr const* expr) +{ + if (ignoreLocation(expr)) + { + return true; + } + if (!loplugin::TypeCheck(expr->getType()) + .Class("OUStringBuffer") + .Namespace("rtl") + .GlobalNamespace() + && !loplugin::TypeCheck(expr->getType()) + .Class("OStringBuffer") + .Namespace("rtl") + .GlobalNamespace()) + { + return true; + } + if (expr->getNumArgs() > 0) + handleSubExprThatCouldBeView(compat::IgnoreImplicit(expr->getArg(0))); + return true; +} + loplugin::Plugin::Registration<StringView> stringview("stringview"); } diff --git a/compilerplugins/clang/test/stringview.cxx b/compilerplugins/clang/test/stringview.cxx index d40ee50175a1..142bba799008 100644 --- a/compilerplugins/clang/test/stringview.cxx +++ b/compilerplugins/clang/test/stringview.cxx @@ -140,4 +140,16 @@ void f5(char const* s1, sal_Int32 n1, char16_t const* s2, sal_Int32 n2) call_view(OUString(OUString::number(0))); } +void f5(OUString s) +{ + // expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}} + OUStringBuffer buf(s.copy(5)); + // expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}} + buf = s.copy(5); + // expected-error@+1 {{rather than copy, pass with a view using subView() [loplugin:stringview]}} + buf.append(s.copy(12)); + // expected-error@+1 {{instead of an 'rtl::OUString', pass a 'std::u16string_view' [loplugin:stringview]}} + buf.append(OUString(std::u16string_view(u"foo"))); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/cui/source/dialogs/FontFeaturesDialog.cxx b/cui/source/dialogs/FontFeaturesDialog.cxx index b9120b0371c8..fae448b6a283 100644 --- a/cui/source/dialogs/FontFeaturesDialog.cxx +++ b/cui/source/dialogs/FontFeaturesDialog.cxx @@ -182,7 +182,7 @@ OUString FontFeaturesDialog::createFontNameWithFeatures() if (sal_uInt32(rItem.m_xCheck->get_active()) != rItem.m_nDefault) { if (!bFirst) - sNameSuffix.append(OUString(vcl::font::FeatureSeparator)); + sNameSuffix.append(vcl::font::FeatureSeparator); else bFirst = false; @@ -197,7 +197,7 @@ OUString FontFeaturesDialog::createFontNameWithFeatures() if (nSelection != int(rItem.m_nDefault)) { if (!bFirst) - sNameSuffix.append(OUString(vcl::font::FeatureSeparator)); + sNameSuffix.append(vcl::font::FeatureSeparator); else bFirst = false; diff --git a/extensions/source/propctrlr/browserline.cxx b/extensions/source/propctrlr/browserline.cxx index 5f185c594243..8618ecffc8fe 100644 --- a/extensions/source/propctrlr/browserline.cxx +++ b/extensions/source/propctrlr/browserline.cxx @@ -188,7 +188,7 @@ namespace pcr if (AllSettings::GetLayoutRTL()) { sal_Unicode const cRTL_mark = 0x200F; - aText.append( OUString(cRTL_mark) ); + aText.append( cRTL_mark ); } m_xFtTitle->set_label(aText.makeStringAndClear()); diff --git a/framework/source/accelerators/acceleratorconfiguration.cxx b/framework/source/accelerators/acceleratorconfiguration.cxx index 85edc3833025..96c0056d35c0 100644 --- a/framework/source/accelerators/acceleratorconfiguration.cxx +++ b/framework/source/accelerators/acceleratorconfiguration.cxx @@ -63,7 +63,7 @@ namespace framework static OUString lcl_getKeyString(const css::awt::KeyEvent& aKeyEvent) { const sal_Int32 nBeginIndex = 4; // "KEY_" is the prefix of an identifier... - OUStringBuffer sKeyBuffer((KeyMapping::get().mapCodeToIdentifier(aKeyEvent.KeyCode)).copy(nBeginIndex)); + OUStringBuffer sKeyBuffer((KeyMapping::get().mapCodeToIdentifier(aKeyEvent.KeyCode)).subView(nBeginIndex)); if ( (aKeyEvent.Modifiers & css::awt::KeyModifier::SHIFT) == css::awt::KeyModifier::SHIFT ) sKeyBuffer.append("_SHIFT"); diff --git a/i18nutil/source/utility/unicode.cxx b/i18nutil/source/utility/unicode.cxx index f944d69c40e2..6a4fdd061f9d 100644 --- a/i18nutil/source/utility/unicode.cxx +++ b/i18nutil/source/utility/unicode.cxx @@ -1007,7 +1007,7 @@ OUString ToggleUnicodeCodepoint::StringToReplace() nUnicode = sIn.copy(0, nUPlus).toUInt32(16); //prevent creating control characters or invalid Unicode values if( !rtl::isUnicodeCodePoint(nUnicode) || nUnicode < 0x20 ) - maInput = sIn.copy(nUPlus); + maInput = sIn.subView(nUPlus); sIn = sIn.copy(nUPlus+2); nUPlus = sIn.indexOf("U+"); } diff --git a/include/rtl/strbuf.hxx b/include/rtl/strbuf.hxx index 2f2df8624f25..28f48a221ee5 100644 --- a/include/rtl/strbuf.hxx +++ b/include/rtl/strbuf.hxx @@ -132,6 +132,17 @@ public: @param value the initial string value. */ +#if defined LIBO_INTERNAL_ONLY + explicit OStringBuffer(std::string_view sv) + : pData(nullptr) + , nCapacity( sv.length() + 16 ) + { + if (sv.size() > sal_uInt32(std::numeric_limits<sal_Int32>::max())) { + throw std::bad_alloc(); + } + rtl_stringbuffer_newFromStr_WithLength( &pData, sv.data(), sv.length() ); + } +#endif OStringBuffer(const OString& value) : pData(NULL) , nCapacity( value.getLength() + 16 ) @@ -251,6 +262,17 @@ public: @since LibreOffice 5.3 */ +#if defined LIBO_INTERNAL_ONLY + OStringBuffer & operator =(std::string_view string) { + sal_Int32 n = string.length(); + if (n >= nCapacity) { + ensureCapacity(n + 16); //TODO: check for overflow + } + std::memcpy(pData->buffer, string.data(), n + 1); + pData->length = n; + return *this; + } +#endif OStringBuffer & operator =(OString const & string) { sal_Int32 n = string.getLength(); if (n >= nCapacity) { @@ -764,6 +786,12 @@ public: @param str a string. @return this string buffer. */ +#if defined LIBO_INTERNAL_ONLY + OStringBuffer & insert(sal_Int32 offset, std::string_view str) + { + return insert( offset, str.data(), str.length() ); + } +#endif OStringBuffer & insert(sal_Int32 offset, const OString & str) { return insert( offset, str.getStr(), str.getLength() ); diff --git a/include/rtl/ustrbuf.hxx b/include/rtl/ustrbuf.hxx index bd7f77b503b7..080e2ea96259 100644 --- a/include/rtl/ustrbuf.hxx +++ b/include/rtl/ustrbuf.hxx @@ -133,6 +133,17 @@ public: @param value the initial contents of the buffer. */ +#if defined LIBO_INTERNAL_ONLY + explicit OUStringBuffer(std::u16string_view sv) + : pData(nullptr) + , nCapacity( sv.length() + 16 ) + { + if (sv.size() > sal_uInt32(std::numeric_limits<sal_Int32>::max())) { + throw std::bad_alloc(); + } + rtl_uStringbuffer_newFromStr_WithLength( &pData, sv.data(), sv.length() ); + } +#endif OUStringBuffer(const OUString& value) : pData(NULL) , nCapacity( value.getLength() + 16 ) @@ -257,6 +268,19 @@ public: @since LibreOffice 5.3 */ +#if defined LIBO_INTERNAL_ONLY + OUStringBuffer & operator =(std::u16string_view string) { + sal_Int32 n = string.length(); + if (n >= nCapacity) { + ensureCapacity(n + 16); //TODO: check for overflow + } + std::memcpy( + pData->buffer, string.data(), + (n + 1) * sizeof (sal_Unicode)); + pData->length = n; + return *this; + } +#endif OUStringBuffer & operator =(OUString const & string) { sal_Int32 n = string.getLength(); if (n >= nCapacity) { @@ -955,6 +979,12 @@ public: @param str a string. @return this string buffer. */ +#if defined LIBO_INTERNAL_ONLY + OUStringBuffer & insert(sal_Int32 offset, std::u16string_view str) + { + return insert( offset, str.data(), str.length() ); + } +#endif OUStringBuffer & insert(sal_Int32 offset, const OUString & str) { return insert( offset, str.getStr(), str.getLength() ); @@ -1406,6 +1436,15 @@ public: returned. If it does not occur as a substring starting at fromIndex or beyond, -1 is returned. */ +#if defined LIBO_INTERNAL_ONLY + sal_Int32 indexOf( std::u16string_view str, sal_Int32 fromIndex = 0 ) const + { + assert( fromIndex >= 0 && fromIndex <= pData->length ); + sal_Int32 ret = rtl_ustr_indexOfStr_WithLength( pData->buffer+fromIndex, pData->length-fromIndex, + str.data(), str.length() ); + return (ret < 0 ? ret : ret+fromIndex); + } +#endif sal_Int32 indexOf( const OUString & str, sal_Int32 fromIndex = 0 ) const { assert( fromIndex >= 0 && fromIndex <= pData->length ); @@ -1475,6 +1514,13 @@ public: the last such substring is returned. If it does not occur as a substring, -1 is returned. */ +#if defined LIBO_INTERNAL_ONLY + sal_Int32 lastIndexOf( std::u16string_view str ) const + { + return rtl_ustr_lastIndexOfStr_WithLength( pData->buffer, pData->length, + str.data(), str.length() ); + } +#endif sal_Int32 lastIndexOf( const OUString & str ) const { return rtl_ustr_lastIndexOfStr_WithLength( pData->buffer, pData->length, @@ -1607,6 +1653,47 @@ public: { return stripStart(c) + stripEnd(c); } + +#if defined LIBO_INTERNAL_ONLY + /** + Returns a std::u16string_view that is a view of a substring of this string. + + The substring begins at the specified beginIndex. If + beginIndex is negative or be greater than the length of + this string, behaviour is undefined. + + @param beginIndex the beginning index, inclusive. + @return the specified substring. + */ + SAL_WARN_UNUSED_RESULT std::u16string_view subView( sal_Int32 beginIndex ) const + { + assert(beginIndex >= 0); + assert(beginIndex <= getLength()); + return subView(beginIndex, getLength() - beginIndex); + } + + /** + Returns a std::u16string_view that is a view of a substring of this string. + + The substring begins at the specified beginIndex and contains count + characters. If either beginIndex or count are negative, + or beginIndex + count are greater than the length of this string + then behaviour is undefined. + + @param beginIndex the beginning index, inclusive. + @param count the number of characters. + @return the specified substring. + */ + SAL_WARN_UNUSED_RESULT std::u16string_view subView( sal_Int32 beginIndex, sal_Int32 count ) const + { + assert(beginIndex >= 0); + assert(count >= 0); + assert(beginIndex <= getLength()); + assert(count <= getLength() - beginIndex); + return std::u16string_view(pData->buffer, sal_uInt32(pData->length)).substr(beginIndex, count); + } +#endif + /** Returns a new string buffer that is a substring of this string. diff --git a/l10ntools/source/helper.cxx b/l10ntools/source/helper.cxx index 80b079e27151..2dce070b90fc 100644 --- a/l10ntools/source/helper.cxx +++ b/l10ntools/source/helper.cxx @@ -25,7 +25,7 @@ OString escapeAll( sal_Int32 nUnEscapedOne = rUnEscaped.indexOf(rText[nIndex]); if( nUnEscapedOne != -1 ) { - sReturn.append(rEscaped.copy(nUnEscapedOne*2,2)); + sReturn.append(rEscaped.subView(nUnEscapedOne*2,2)); } else sReturn.append(rText[nIndex]); diff --git a/l10ntools/source/localize.cxx b/l10ntools/source/localize.cxx index 3cb8c8df2657..3401a7429658 100644 --- a/l10ntools/source/localize.cxx +++ b/l10ntools/source/localize.cxx @@ -93,14 +93,14 @@ void handleCommand( { auto const env = getenv("SRC_ROOT"); assert(env != nullptr); - buf.append(OString(env)); + buf.append(env); buf.append("/solenv/bin/"); } else { auto const env = getenv("WORKDIR_FOR_BUILD"); assert(env != nullptr); - buf.append(OString(env)); + buf.append(env); buf.append("/LinkTarget/Executable/"); } buf.append(rExecutable.data()); diff --git a/l10ntools/source/po.cxx b/l10ntools/source/po.cxx index 7b8a1cacb3c1..8d47a7d39410 100644 --- a/l10ntools/source/po.cxx +++ b/l10ntools/source/po.cxx @@ -116,7 +116,7 @@ namespace } GenPoEntry::GenPoEntry() - : m_sExtractCom( OString() ) + : m_sExtractCom() , m_sReferences( std::vector<OString>() ) , m_sMsgCtxt( OString() ) , m_sMsgId( OString() ) @@ -181,7 +181,7 @@ void GenPoEntry::readFromFile(std::ifstream& rIFStream) { m_sExtractCom.append("\n"); } - m_sExtractCom.append(sLine.copy(3)); + m_sExtractCom.append(sLine.subView(3)); } else if (sLine.startsWith("#: ")) { diff --git a/linguistic/source/hyphdsp.cxx b/linguistic/source/hyphdsp.cxx index fe9906a260a6..4036d0c2d5b0 100644 --- a/linguistic/source/hyphdsp.cxx +++ b/linguistic/source/hyphdsp.cxx @@ -161,7 +161,7 @@ Reference<XHyphenatedWord> HyphenatorDispatcher::buildHyphWord( if (endhyphpat > -1) { OUStringBuffer aTmp2 ( aTmp.copy(0, std::max (nHyphenationPos + 1 - split, 0) ) ); - aTmp2.append( aText.copy( nOrigHyphPos + 1, endhyphpat - nOrigHyphPos - 1) ); + aTmp2.append( aText.subView( nOrigHyphPos + 1, endhyphpat - nOrigHyphPos - 1) ); nHyphenPos = aTmp2.getLength(); aTmp2.append( aTmp.copy( nHyphenationPos + 1 ) ); //! take care of #i22591# diff --git a/lotuswordpro/source/filter/lwptools.cxx b/lotuswordpro/source/filter/lwptools.cxx index 6c84aaab51eb..254d7fc7f6eb 100644 --- a/lotuswordpro/source/filter/lwptools.cxx +++ b/lotuswordpro/source/filter/lwptools.cxx @@ -154,7 +154,7 @@ void LwpTools::QuickReadUnicode(LwpObjectStream* pObjStrm, if(sublen) { unibuf[sublen] = '\0'; - strBuf.append( OUString(unibuf) ); + strBuf.append( unibuf ); sublen = 0; } } @@ -165,7 +165,7 @@ void LwpTools::QuickReadUnicode(LwpObjectStream* pObjStrm, if(sublen>=1023 || readLen==strlen) { unibuf[sublen] = '\0'; - strBuf.append( OUString(unibuf) ); + strBuf.append( unibuf ); sublen = 0; } } diff --git a/oox/source/dump/dumperbase.cxx b/oox/source/dump/dumperbase.cxx index c6d61bb21186..a60512e5a587 100644 --- a/oox/source/dump/dumperbase.cxx +++ b/oox/source/dump/dumperbase.cxx @@ -1966,7 +1966,7 @@ void OutputObjectBase::writeStringItem( const String& rName, const OUString& rDa mxOut->writeAscii( "(len=" ); mxOut->writeDec( rData.getLength() ); mxOut->writeAscii( ")," ); - OUStringBuffer aValue( rData.copy( 0, ::std::min( rData.getLength(), OOX_DUMP_MAXSTRLEN ) ) ); + OUStringBuffer aValue( rData.subView( 0, ::std::min( rData.getLength(), OOX_DUMP_MAXSTRLEN ) ) ); StringHelper::enclose( aValue, OOX_DUMP_STRQUOTE ); mxOut->writeString( aValue.makeStringAndClear() ); if( rData.getLength() > OOX_DUMP_MAXSTRLEN ) diff --git a/sal/qa/rtl/oustringbuffer/test_oustringbuffer_utf32.cxx b/sal/qa/rtl/oustringbuffer/test_oustringbuffer_utf32.cxx index 80643df2eba0..2a4f35e2e793 100644 --- a/sal/qa/rtl/oustringbuffer/test_oustringbuffer_utf32.cxx +++ b/sal/qa/rtl/oustringbuffer/test_oustringbuffer_utf32.cxx @@ -86,13 +86,13 @@ void test::oustringbuffer::Utf32::appendUtf32() { int const str3Len = 6; sal_Unicode const str3[str3Len] = { 'a', 'b', 'c', 'd', 0xD800, 0xDC00 }; OStringBuffer message; - OUStringBuffer buf1(OUString(str1, str1Len)); + OUStringBuffer buf1(std::u16string_view(str1, str1Len)); buf1.appendUtf32('d'); OUString res1(buf1.makeStringAndClear()); createMessage(message, res1, OUString(str2, str2Len)); CPPUNIT_ASSERT_EQUAL_MESSAGE( message.getStr(), OUString(str2, str2Len), res1); - OUStringBuffer buf2(OUString(str2, str2Len)); + OUStringBuffer buf2(std::u16string_view(str2, str2Len)); buf2.appendUtf32(0x10000); OUString res2(buf2.makeStringAndClear()); createMessage(message, res2, OUString(str3, str3Len)); @@ -108,13 +108,13 @@ void test::oustringbuffer::Utf32::insertUtf32() { int const str3Len = 6; sal_Unicode const str3[str3Len] = { 'a', 'b', 0xDBFF, 0xDFFF, 'd', 'c' }; OStringBuffer message; - OUStringBuffer buf1(OUString(str1, str1Len)); + OUStringBuffer buf1(std::u16string_view(str1, str1Len)); buf1.insertUtf32(2, 'd'); OUString res1(buf1.makeStringAndClear()); createMessage(message, res1, OUString(str2, str2Len)); CPPUNIT_ASSERT_EQUAL_MESSAGE( message.getStr(), OUString(str2, str2Len), res1); - OUStringBuffer buf2(OUString(str2, str2Len)); + OUStringBuffer buf2(std::u16string_view(str2, str2Len)); buf2.insertUtf32(2, 0x10FFFF); OUString res2(buf2.makeStringAndClear()); createMessage(message, res2, OUString(str3, str3Len)); diff --git a/sc/source/core/tool/address.cxx b/sc/source/core/tool/address.cxx index c7a16a8aeb49..f3ab5f917f9d 100644 --- a/sc/source/core/tool/address.cxx +++ b/sc/source/core/tool/address.cxx @@ -57,7 +57,7 @@ const sal_Unicode* parseQuotedNameWithBuffer( const sal_Unicode* pStart, const s // Push all the characters up to the current, but skip the very first // character which is the opening quote. - OUStringBuffer aBuf(OUString(pStart+1, p-pStart-1)); + OUStringBuffer aBuf(std::u16string_view(pStart+1, p-pStart-1)); ++p; // Skip the 2nd quote. sal_Unicode cPrev = 0; diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 32ff094ab348..24c594667231 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -1551,7 +1551,7 @@ struct ConventionXL_OOX : public ConventionXL_A1 { rBuffer.append('\''); ConventionXL_OOX::makeExternalDocStr( rBuffer, nFileId); - rBuffer.append( aQuotedTab.copy(1)); + rBuffer.append( aQuotedTab.subView(1)); } else { diff --git a/sc/source/core/tool/rangeutl.cxx b/sc/source/core/tool/rangeutl.cxx index dfcdb30875ee..401ad6ad5722 100644 --- a/sc/source/core/tool/rangeutl.cxx +++ b/sc/source/core/tool/rangeutl.cxx @@ -809,7 +809,7 @@ void ScRangeStringConverter::GetStringFromXMLRangeString( OUString& rString, con { // initialize buffer with table name... sal_Int32 nDotPos = IndexOf(aBeginCell, '.', 0); - OUStringBuffer aBuf = aBeginCell.copy(0, nDotPos); + OUStringBuffer aBuf(aBeginCell.subView(0, nDotPos)); if (nEndCellDotPos == 0) { diff --git a/sc/source/filter/dif/difimp.cxx b/sc/source/filter/dif/difimp.cxx index be95f26b06a4..2e68d4ba57ec 100644 --- a/sc/source/filter/dif/difimp.cxx +++ b/sc/source/filter/dif/difimp.cxx @@ -358,7 +358,7 @@ TOPIC DifParser::GetNextTopic() OSL_ENSURE( aLine.getLength() >= 2, "+GetNextTopic(): <String> is too short!" ); if( aLine.getLength() > 2 ) - m_aData.append(aLine.copy(1, aLine.getLength() - 2)); + m_aData.append(aLine.subView(1, aLine.getLength() - 2)); else m_aData.truncate(); eS = S_END; @@ -530,7 +530,7 @@ DATASET DifParser::GetNextDataset() // Single line string if( nLineLength >= 2 && pLine[nLineLength - 1] == '"' ) { - m_aData = aLine.copy( 1, nLineLength - 2 ); + m_aData = aLine.subView( 1, nLineLength - 2 ); lcl_DeEscapeQuotesDif(m_aData); eRet = D_STRING; } @@ -538,7 +538,7 @@ DATASET DifParser::GetNextDataset() else { // Multiline string - m_aData = aLine.copy( 1 ); + m_aData = aLine.subView( 1 ); bool bContinue = true; while ( bContinue ) { @@ -557,7 +557,7 @@ DATASET DifParser::GetNextDataset() } else if( pLine[nLineLength - 1] == '"' ) { - m_aData.append(aLine.copy(0, nLineLength -1)); + m_aData.append(aLine.subView(0, nLineLength -1)); lcl_DeEscapeQuotesDif(m_aData); eRet = D_STRING; } diff --git a/svl/source/numbers/zformat.cxx b/svl/source/numbers/zformat.cxx index df8569b13dc6..85a34f28e842 100644 --- a/svl/source/numbers/zformat.cxx +++ b/svl/source/numbers/zformat.cxx @@ -1966,7 +1966,7 @@ OUString SvNumberformat::StripNewCurrencyDelimiters( const OUString& rStr ) sal_Int32 nEnd; if ( (nEnd = GetQuoteEnd( rStr, nPos )) >= 0 ) { - aTmp.append(rStr.copy( nStartPos, ++nEnd - nStartPos )); + aTmp.append(rStr.subView( nStartPos, ++nEnd - nStartPos )); nStartPos = nEnd; } else @@ -2651,7 +2651,7 @@ bool SvNumberformat::ImpGetScientificOutput(double fNumber, ++nExpStart; break; } - ExpStr = sStr.toString().copy( nExpStart ); // part following the "E+" + ExpStr = sStr.subView( nExpStart ); // part following the "E+" sStr.truncate( nExPos ); if ( rInfo.nCntPre != 1 ) // rescale Exp diff --git a/svl/source/numbers/zforscan.cxx b/svl/source/numbers/zforscan.cxx index 5edbf931b927..c3f97d89c949 100644 --- a/svl/source/numbers/zforscan.cxx +++ b/svl/source/numbers/zforscan.cxx @@ -887,7 +887,7 @@ short ImpSvNumberformatScan::Next_Symbol( const OUString& rStr, { nLen = sKeyword[eType].getLength(); // Preserve a locale's keyword's case as entered. - sSymbolBuffer = rStr.copy( nPos-1, nLen); + sSymbolBuffer = rStr.subView( nPos-1, nLen); } if ((eType == NF_KEY_E || IsAmbiguousE(eType)) && nPos < rStr.getLength()) { diff --git a/sw/source/core/text/txtfrm.cxx b/sw/source/core/text/txtfrm.cxx index c06ea3ef2713..6a63cc26500b 100644 --- a/sw/source/core/text/txtfrm.cxx +++ b/sw/source/core/text/txtfrm.cxx @@ -918,7 +918,7 @@ static TextFrameIndex UpdateMergedParaForInsert(MergedPara & rMerged, if (it->nStart <= nIndex && nIndex <= it->nEnd) { // note: this can happen only once text.insert(nTFIndex + (nIndex - it->nStart), - rNode.GetText().copy(nIndex, nLen)); + rNode.GetText().subView(nIndex, nLen)); it->nEnd += nLen; nInserted = nLen; assert(!bInserted); @@ -945,7 +945,7 @@ static TextFrameIndex UpdateMergedParaForInsert(MergedPara & rMerged, if (nIndex < it->nStart) { text.insert(nTFIndex, - rNode.GetText().copy(nIndex, it->nStart - nIndex)); + rNode.GetText().subView(nIndex, it->nStart - nIndex)); nInserted += it->nStart - nIndex; it->nStart = nIndex; bInserted = true; @@ -963,7 +963,7 @@ static TextFrameIndex UpdateMergedParaForInsert(MergedPara & rMerged, if (pNext && pNext->nStart <= nIndex + nLen) { text.insert(nTFIndex, - rNode.GetText().copy(it->nEnd, pNext->nStart - it->nEnd)); + rNode.GetText().subView(it->nEnd, pNext->nStart - it->nEnd)); nTFIndex += pNext->nStart - it->nEnd; nInserted += pNext->nStart - it->nEnd; pNext->nStart = it->nStart; @@ -972,7 +972,7 @@ static TextFrameIndex UpdateMergedParaForInsert(MergedPara & rMerged, else { text.insert(nTFIndex, - rNode.GetText().copy(it->nEnd, nIndex + nLen - it->nEnd)); + rNode.GetText().subView(it->nEnd, nIndex + nLen - it->nEnd)); nTFIndex += nIndex + nLen - it->nEnd; nInserted += nIndex + nLen - it->nEnd; it->nEnd = nIndex + nLen; @@ -1000,7 +1000,7 @@ static TextFrameIndex UpdateMergedParaForInsert(MergedPara & rMerged, if (!bInserted) { // must be in a gap rMerged.extents.emplace(itInsert, const_cast<SwTextNode*>(&rNode), nIndex, nIndex + nLen); - text.insert(nTFIndex, rNode.GetText().copy(nIndex, nLen)); + text.insert(nTFIndex, rNode.GetText().subView(nIndex, nLen)); nInserted = nLen; if (rMerged.extents.size() == 1 // also if it was empty! || rMerged.pParaPropsNode->GetIndex() < rNode.GetIndex()) diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx index 57b30d59cb45..9575652feec1 100644 --- a/sw/source/core/txtnode/ndtxt.cxx +++ b/sw/source/core/txtnode/ndtxt.cxx @@ -3355,7 +3355,7 @@ OUString SwTextNode::GetExpandText(SwRootFrame const*const pLayout, const sal_Int32 nExpandBegin = aConversionMap.ConvertToViewPosition( nIdx ); sal_Int32 nEnd = nLen == -1 ? GetText().getLength() : nIdx + nLen; const sal_Int32 nExpandEnd = aConversionMap.ConvertToViewPosition( nEnd ); - OUStringBuffer aText(aExpandText.copy(nExpandBegin, nExpandEnd-nExpandBegin)); + OUStringBuffer aText(aExpandText.subView(nExpandBegin, nExpandEnd-nExpandBegin)); // remove dummy characters of Input Fields comphelper::string::remove(aText, CH_TXT_ATR_INPUTFIELDSTART); diff --git a/sw/source/filter/ascii/ascatr.cxx b/sw/source/filter/ascii/ascatr.cxx index da433d4272e0..4b5086983d1e 100644 --- a/sw/source/filter/ascii/ascatr.cxx +++ b/sw/source/filter/ascii/ascatr.cxx @@ -316,14 +316,14 @@ static Writer& OutASC_SwTextNode( Writer& rWrt, SwContentNode& rNode ) { if (nNextAttr <= curRedline.first) { - buf.append(aStr.copy(nStrPos, nNextAttr - nStrPos)); + buf.append(aStr.subView(nStrPos, nNextAttr - nStrPos)); break; } else if (nStrPos < curRedline.second) { if (nStrPos < curRedline.first) { - buf.append(aStr.copy(nStrPos, curRedline.first - nStrPos)); + buf.append(aStr.subView(nStrPos, curRedline.first - nStrPos)); } if (curRedline.second <= nNextAttr) { diff --git a/tools/source/inet/inetmime.cxx b/tools/source/inet/inetmime.cxx index 215bea673cb2..f7265523b6e2 100644 --- a/tools/source/inet/inetmime.cxx +++ b/tools/source/inet/inetmime.cxx @@ -1290,7 +1290,7 @@ OUString INetMIME::decodeHeaderFieldBody(const OString& rBody) bDone = true; break; } - sText.append(rBody.copy( + sText.append(rBody.subView( (pEncodedTextCopyBegin - pBegin), (q - 1 - pEncodedTextCopyBegin))); sText.append(char(nDigit1 << 4 | nDigit2)); @@ -1301,7 +1301,7 @@ OUString INetMIME::decodeHeaderFieldBody(const OString& rBody) case '?': if (q - pEncodedTextBegin > 1) - sText.append(rBody.copy( + sText.append(rBody.subView( (pEncodedTextCopyBegin - pBegin), (q - 1 - pEncodedTextCopyBegin))); else @@ -1310,7 +1310,7 @@ OUString INetMIME::decodeHeaderFieldBody(const OString& rBody) break; case '_': - sText.append(rBody.copy( + sText.append(rBody.subView( (pEncodedTextCopyBegin - pBegin), (q - 1 - pEncodedTextCopyBegin))); sText.append(' '); diff --git a/ucb/source/ucp/file/bc.cxx b/ucb/source/ucp/file/bc.cxx index 4d0a7b26fc3e..2f88d029e721 100644 --- a/ucb/source/ucp/file/bc.cxx +++ b/ucb/source/ucp/file/bc.cxx @@ -728,7 +728,7 @@ BaseContent::setPropertyValues( "Invalid URL!" ); OUStringBuffer aBuf( - m_aUncPath.copy( 0, nLastSlash + 1 ) ); + m_aUncPath.subView( 0, nLastSlash + 1 ) ); if ( !NewTitle.isEmpty() ) { diff --git a/ucb/source/ucp/webdav-neon/NeonPropFindRequest.cxx b/ucb/source/ucp/webdav-neon/NeonPropFindRequest.cxx index cf03274c5952..2b7eafb0210b 100644 --- a/ucb/source/ucp/webdav-neon/NeonPropFindRequest.cxx +++ b/ucb/source/ucp/webdav-neon/NeonPropFindRequest.cxx @@ -63,17 +63,17 @@ namespace inXML[ end - 1 ] == '/' ) { // copy from original buffer - preserve case. - buf.append( in.copy( start, end - start ) ); + buf.append( in.subView( start, end - start ) ); } else { // copy from original buffer - preserve case. - buf.append( in.copy( start, end - start + 4 ) ); + buf.append( in.subView( start, end - start + 4 ) ); } start = end + 4; end = inXML.indexOf( "dav:", start ); } - buf.append( inXML.copy( start ) ); + buf.append( inXML.subView( start ) ); return buf.makeStringAndClear(); } diff --git a/vcl/source/control/edit.cxx b/vcl/source/control/edit.cxx index 5699124a9cde..93fb2151d25f 100644 --- a/vcl/source/control/edit.cxx +++ b/vcl/source/control/edit.cxx @@ -2077,7 +2077,7 @@ void Edit::Command( const CommandEvent& rCEvt ) { // restore old characters const sal_Int32 nRestore = nOldIMETextLen - nNewIMETextLen; - maText.insert( mpIMEInfos->nPos + nNewIMETextLen, mpIMEInfos->aOldTextAfterStartPos.copy( nNewIMETextLen, nRestore ) ); + maText.insert( mpIMEInfos->nPos + nNewIMETextLen, mpIMEInfos->aOldTextAfterStartPos.subView( nNewIMETextLen, nRestore ) ); } else if ( ( nOldIMETextLen < nNewIMETextLen ) && ( nOldIMETextLen < mpIMEInfos->aOldTextAfterStartPos.getLength() ) ) diff --git a/vcl/source/control/longcurr.cxx b/vcl/source/control/longcurr.cxx index 5025c1d68ef0..e141ce610741 100644 --- a/vcl/source/control/longcurr.cxx +++ b/vcl/source/control/longcurr.cxx @@ -119,7 +119,7 @@ bool ImplCurrencyGetValue( const OUString& rStr, BigInt& rValue, if ( nDecPos != -1 ) { - aStr1 = aStr.copy( 0, nDecPos ); + aStr1 = aStr.subView( 0, nDecPos ); aStr2.append(std::u16string_view(aStr).substr(nDecPos+1)); } else diff --git a/vcl/source/treelist/treelistbox.cxx b/vcl/source/treelist/treelistbox.cxx index 5211bb56ecc1..4cc062295d1c 100644 --- a/vcl/source/treelist/treelistbox.cxx +++ b/vcl/source/treelist/treelistbox.cxx @@ -1302,7 +1302,7 @@ OUString SvTreeListBox::SearchEntryTextWithHeadTitle( SvTreeListEntry* pEntry ) } if (!sRet.isEmpty()) - sRet = sRet.copy(0, sRet.getLength() - 1); + sRet.remove(sRet.getLength() - 1, 1); return sRet.makeStringAndClear(); } diff --git a/xmloff/source/meta/xmlmetai.cxx b/xmloff/source/meta/xmlmetai.cxx index 14721440bf9b..6e2a485ca828 100644 --- a/xmloff/source/meta/xmlmetai.cxx +++ b/xmloff/source/meta/xmlmetai.cxx @@ -244,7 +244,7 @@ void SvXMLMetaDocumentContext::setBuildId(OUString const& i_rBuildId, const uno: if ( nEnd != -1 ) { OUStringBuffer sBuffer( - i_rBuildId.copy( nBegin+1, nEnd-nBegin-1 ) ); + i_rBuildId.subView( nBegin+1, nEnd-nBegin-1 ) ); const OUString sBuildCompare( "$Build-" ); nBegin = i_rBuildId.indexOf( sBuildCompare, nEnd ); diff --git a/xmloff/source/style/xmlnumfi.cxx b/xmloff/source/style/xmlnumfi.cxx index 1e54872ada83..652ff02b6a2b 100644 --- a/xmloff/source/style/xmlnumfi.cxx +++ b/xmloff/source/style/xmlnumfi.cxx @@ -1832,9 +1832,9 @@ void SvXMLNumFormatContext::AddCurrency( const OUString& rContent, LanguageType // remove both quotes from aFormatCode OUString aOld = aFormatCode.makeStringAndClear(); if ( nFirst > 0 ) - aFormatCode.append( aOld.copy( 0, nFirst ) ); + aFormatCode.append( aOld.subView( 0, nFirst ) ); if ( nLength > nFirst + 2 ) - aFormatCode.append( aOld.copy( nFirst + 1, nLength - nFirst - 2 ) ); + aFormatCode.append( aOld.subView( nFirst + 1, nLength - nFirst - 2 ) ); } } } |