diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2022-03-03 08:19:30 +0300 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2022-03-03 17:36:42 +0100 |
commit | 09a06141c516991865627f78e39593be856f6457 (patch) | |
tree | 4f85b79fcb9be0fb20784cea55274fed4fa98cd0 /sal | |
parent | 0a774bae7d402a6880760b1226a6741604e23f5a (diff) |
Deduplicate some char replacement functions
Change-Id: Ie65224066941dbab89abb6fc91e6cbfbc45bf201
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130901
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Tested-by: Jenkins
Diffstat (limited to 'sal')
-rw-r--r-- | sal/rtl/string.cxx | 12 | ||||
-rw-r--r-- | sal/rtl/strtmpl.hxx | 148 | ||||
-rw-r--r-- | 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 <typename C> struct with_length auto end() const { return p + len; } }; +struct ToAsciiLower +{ + template <typename C> static bool Applicable(C c) + { + return rtl::isAsciiUpperCase(IMPL_RTL_USTRCODE(c)); + } + template <typename C> static C Replace(C c) + { + return rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(c)); + } +} constexpr toAsciiLower; + +struct ToAsciiUpper +{ + template <typename C> static bool Applicable(C c) + { + return rtl::isAsciiLowerCase(IMPL_RTL_USTRCODE(c)); + } + template <typename C> static C Replace(C c) + { + return rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(c)); + } +} constexpr toAsciiUpper; + +template <typename C> 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 <typename C> 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 <typename IMPL_RTL_STRCODE> -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 <typename IMPL_RTL_STRCODE> -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 <typename IMPL_RTL_STRCODE> void toAsciiLowerCase( IMPL_RTL_STRCODE* pStr ) -{ - assert(pStr); - while ( *pStr ) - { - *pStr = rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(*pStr)); - - pStr++; - } -} - -/* ----------------------------------------------------------------------- */ - -template <typename IMPL_RTL_STRCODE> -void toAsciiLowerCase_WithLength ( IMPL_RTL_STRCODE* pStr, - sal_Int32 nLen ) +template <class S, class Replacer> void replaceChars(S str, Replacer replacer) { - assert(nLen >= 0); - while ( nLen > 0 ) - { - *pStr = rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(*pStr)); - - pStr++; - nLen--; - } -} - -/* ----------------------------------------------------------------------- */ - -template <typename IMPL_RTL_STRCODE> void toAsciiUpperCase( IMPL_RTL_STRCODE* pStr ) -{ - assert(pStr); - while ( *pStr ) - { - *pStr = rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(*pStr)); - - pStr++; - } -} - -/* ----------------------------------------------------------------------- */ - -template <typename IMPL_RTL_STRCODE> -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 <typename C> static bool Applicable(C c) - { - return rtl::isAsciiUpperCase(IMPL_RTL_USTRCODE(c)); - } - template <typename C> static C Replace(C c) - { - return rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(c)); - } -}; - -struct ToAsciiUpper -{ - template <typename C> static bool Applicable(C c) - { - return rtl::isAsciiLowerCase(IMPL_RTL_USTRCODE(c)); - } - template <typename C> static C Replace(C c) - { - return rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(c)); - } -}; - template <class Traits, typename IMPL_RTL_STRINGDATA> 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() |