summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2022-03-03 08:19:30 +0300
committerMike Kaganski <mike.kaganski@collabora.com>2022-03-03 17:36:42 +0100
commit09a06141c516991865627f78e39593be856f6457 (patch)
tree4f85b79fcb9be0fb20784cea55274fed4fa98cd0
parent0a774bae7d402a6880760b1226a6741604e23f5a (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
-rw-r--r--sal/rtl/string.cxx12
-rw-r--r--sal/rtl/strtmpl.hxx148
-rw-r--r--sal/rtl/ustring.cxx12
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()