From 09a06141c516991865627f78e39593be856f6457 Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Thu, 3 Mar 2022 08:19:30 +0300 Subject: Deduplicate some char replacement functions Change-Id: Ie65224066941dbab89abb6fc91e6cbfbc45bf201 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130901 Reviewed-by: Noel Grandin Reviewed-by: Mike Kaganski Tested-by: Jenkins --- sal/rtl/string.cxx | 12 ++--- sal/rtl/strtmpl.hxx | 148 +++++++++++++--------------------------------------- sal/rtl/ustring.cxx | 12 ++--- 3 files changed, 47 insertions(+), 125 deletions(-) diff --git a/sal/rtl/string.cxx b/sal/rtl/string.cxx index 9927451c8f9e..7112017826f1 100644 --- a/sal/rtl/string.cxx +++ b/sal/rtl/string.cxx @@ -441,33 +441,33 @@ sal_Int32 SAL_CALL rtl_str_lastIndexOfStr_WithLength(const char* pStr, sal_Int32 void SAL_CALL rtl_str_replaceChar(char* pStr, char cOld, char cNew) SAL_THROW_EXTERN_C() { - return rtl::str::replaceChar(pStr, cOld, cNew); + return rtl::str::replaceChars(rtl::str::null_terminated(pStr), rtl::str::FromTo(cOld, cNew)); } void SAL_CALL rtl_str_replaceChar_WithLength(char* pStr, sal_Int32 nLen, char cOld, char cNew) SAL_THROW_EXTERN_C() { - return rtl::str::replaceChar_WithLength(pStr, nLen, cOld, cNew); + return rtl::str::replaceChars(rtl::str::with_length(pStr, nLen), rtl::str::FromTo(cOld, cNew)); } void SAL_CALL rtl_str_toAsciiLowerCase(char* pStr) SAL_THROW_EXTERN_C() { - return rtl::str::toAsciiLowerCase(pStr); + return rtl::str::replaceChars(rtl::str::null_terminated(pStr), rtl::str::toAsciiLower); } void SAL_CALL rtl_str_toAsciiLowerCase_WithLength(char* pStr, sal_Int32 nLen) SAL_THROW_EXTERN_C() { - return rtl::str::toAsciiLowerCase_WithLength(pStr, nLen); + return rtl::str::replaceChars(rtl::str::with_length(pStr, nLen), rtl::str::toAsciiLower); } void SAL_CALL rtl_str_toAsciiUpperCase(char* pStr) SAL_THROW_EXTERN_C() { - return rtl::str::toAsciiUpperCase(pStr); + return rtl::str::replaceChars(rtl::str::null_terminated(pStr), rtl::str::toAsciiUpper); } void SAL_CALL rtl_str_toAsciiUpperCase_WithLength(char* pStr, sal_Int32 nLen) SAL_THROW_EXTERN_C() { - return rtl::str::toAsciiUpperCase_WithLength(pStr, nLen); + return rtl::str::replaceChars(rtl::str::with_length(pStr, nLen), rtl::str::toAsciiUpper); } sal_Int32 SAL_CALL rtl_str_trim(char* pStr) SAL_THROW_EXTERN_C() { return rtl::str::trim(pStr); } diff --git a/sal/rtl/strtmpl.hxx b/sal/rtl/strtmpl.hxx index 7234afd39ec1..6fa400c0164f 100644 --- a/sal/rtl/strtmpl.hxx +++ b/sal/rtl/strtmpl.hxx @@ -80,6 +80,38 @@ template struct with_length auto end() const { return p + len; } }; +struct ToAsciiLower +{ + template static bool Applicable(C c) + { + return rtl::isAsciiUpperCase(IMPL_RTL_USTRCODE(c)); + } + template static C Replace(C c) + { + return rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(c)); + } +} constexpr toAsciiLower; + +struct ToAsciiUpper +{ + template static bool Applicable(C c) + { + return rtl::isAsciiLowerCase(IMPL_RTL_USTRCODE(c)); + } + template static C Replace(C c) + { + return rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(c)); + } +} constexpr toAsciiUpper; + +template struct FromTo +{ + C from; + C to; + FromTo(C cFrom, C cTo) : from(cFrom), to(cTo) {} + C Replace(C c) const { return c == from ? to : c; } +}; + template void Copy(C* _pDest, const C* _pSrc, sal_Int32 _nCount) { // take advantage of builtin optimisations @@ -450,96 +482,10 @@ sal_Int32 lastIndexOfStr_WithLength ( const IMPL_RTL /* ----------------------------------------------------------------------- */ -template -void replaceChar ( IMPL_RTL_STRCODE* pStr, - IMPL_RTL_STRCODE cOld, - IMPL_RTL_STRCODE cNew ) -{ - assert(pStr); - while ( *pStr ) - { - if ( *pStr == cOld ) - *pStr = cNew; - - pStr++; - } -} - -/* ----------------------------------------------------------------------- */ - -template -void replaceChar_WithLength ( IMPL_RTL_STRCODE* pStr, - sal_Int32 nLen, - IMPL_RTL_STRCODE cOld, - IMPL_RTL_STRCODE cNew ) -{ - assert(nLen >= 0); - while ( nLen > 0 ) - { - if ( *pStr == cOld ) - *pStr = cNew; - - pStr++; - nLen--; - } -} - -/* ----------------------------------------------------------------------- */ - -template void toAsciiLowerCase( IMPL_RTL_STRCODE* pStr ) -{ - assert(pStr); - while ( *pStr ) - { - *pStr = rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(*pStr)); - - pStr++; - } -} - -/* ----------------------------------------------------------------------- */ - -template -void toAsciiLowerCase_WithLength ( IMPL_RTL_STRCODE* pStr, - sal_Int32 nLen ) +template void replaceChars(S str, Replacer replacer) { - assert(nLen >= 0); - while ( nLen > 0 ) - { - *pStr = rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(*pStr)); - - pStr++; - nLen--; - } -} - -/* ----------------------------------------------------------------------- */ - -template void toAsciiUpperCase( IMPL_RTL_STRCODE* pStr ) -{ - assert(pStr); - while ( *pStr ) - { - *pStr = rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(*pStr)); - - pStr++; - } -} - -/* ----------------------------------------------------------------------- */ - -template -void toAsciiUpperCase_WithLength ( IMPL_RTL_STRCODE* pStr, - sal_Int32 nLen ) -{ - assert(nLen >= 0); - while ( nLen > 0 ) - { - *pStr = rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(*pStr)); - - pStr++; - nLen--; - } + for (auto& rChar : str) + rChar = replacer.Replace(rChar); } /* ----------------------------------------------------------------------- */ @@ -1240,30 +1186,6 @@ void newReplace ( IMPL_RTL_STRINGDATA** ppThis, /* ----------------------------------------------------------------------- */ -struct ToAsciiLower -{ - template static bool Applicable(C c) - { - return rtl::isAsciiUpperCase(IMPL_RTL_USTRCODE(c)); - } - template static C Replace(C c) - { - return rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(c)); - } -}; - -struct ToAsciiUpper -{ - template static bool Applicable(C c) - { - return rtl::isAsciiLowerCase(IMPL_RTL_USTRCODE(c)); - } - template static C Replace(C c) - { - return rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(c)); - } -}; - template void newReplaceChars(IMPL_RTL_STRINGDATA** ppThis, IMPL_RTL_STRINGDATA* pStr) { diff --git a/sal/rtl/ustring.cxx b/sal/rtl/ustring.cxx index 99f4575b1240..658c04cb88ef 100644 --- a/sal/rtl/ustring.cxx +++ b/sal/rtl/ustring.cxx @@ -1110,35 +1110,35 @@ sal_Int32 SAL_CALL rtl_ustr_lastIndexOfStr_WithLength(const sal_Unicode* pStr, s void SAL_CALL rtl_ustr_replaceChar(sal_Unicode* pStr, sal_Unicode cOld, sal_Unicode cNew) SAL_THROW_EXTERN_C() { - return rtl::str::replaceChar(pStr, cOld, cNew); + return rtl::str::replaceChars(rtl::str::null_terminated(pStr), rtl::str::FromTo(cOld, cNew)); } void SAL_CALL rtl_ustr_replaceChar_WithLength(sal_Unicode* pStr, sal_Int32 nLen, sal_Unicode cOld, sal_Unicode cNew) SAL_THROW_EXTERN_C() { - return rtl::str::replaceChar_WithLength(pStr, nLen, cOld, cNew); + return rtl::str::replaceChars(rtl::str::with_length(pStr, nLen), rtl::str::FromTo(cOld, cNew)); } void SAL_CALL rtl_ustr_toAsciiLowerCase(sal_Unicode* pStr) SAL_THROW_EXTERN_C() { - return rtl::str::toAsciiLowerCase(pStr); + return rtl::str::replaceChars(rtl::str::null_terminated(pStr), rtl::str::toAsciiLower); } void SAL_CALL rtl_ustr_toAsciiLowerCase_WithLength(sal_Unicode* pStr, sal_Int32 nLen) SAL_THROW_EXTERN_C() { - return rtl::str::toAsciiLowerCase_WithLength(pStr, nLen); + return rtl::str::replaceChars(rtl::str::with_length(pStr, nLen), rtl::str::toAsciiLower); } void SAL_CALL rtl_ustr_toAsciiUpperCase(sal_Unicode* pStr) SAL_THROW_EXTERN_C() { - return rtl::str::toAsciiUpperCase(pStr); + return rtl::str::replaceChars(rtl::str::null_terminated(pStr), rtl::str::toAsciiUpper); } void SAL_CALL rtl_ustr_toAsciiUpperCase_WithLength(sal_Unicode* pStr, sal_Int32 nLen) SAL_THROW_EXTERN_C() { - return rtl::str::toAsciiUpperCase_WithLength(pStr, nLen); + return rtl::str::replaceChars(rtl::str::with_length(pStr, nLen), rtl::str::toAsciiUpper); } sal_Int32 SAL_CALL rtl_ustr_trim(sal_Unicode* pStr) SAL_THROW_EXTERN_C() -- cgit