[Libreoffice-commits] core.git: include/rtl sal/rtl sal/util sax/source

Noel Grandin (via logerrit) logerrit at kemper.freedesktop.org
Sat Jul 17 07:12:58 UTC 2021


 include/rtl/string.h             |   45 +++++++++++++++++++++++++++++++++++++++
 sal/rtl/string.cxx               |   14 ++++++++++++
 sal/rtl/strtmpl.hxx              |   10 ++++++++
 sal/util/sal.map                 |    6 +++++
 sax/source/tools/fastattribs.cxx |    6 ++---
 5 files changed, 78 insertions(+), 3 deletions(-)

New commits:
commit b1df9c67349cf4cc5be4128d797aefb87f50e38f
Author:     Noel Grandin <noel.grandin at collabora.co.uk>
AuthorDate: Fri Jul 16 14:48:25 2021 +0200
Commit:     Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Sat Jul 17 09:12:26 2021 +0200

    [API CHANGE] reduce cost of numeric conversion
    
    on a hot path, since we already know the length of these strings.
    
    Which requires adding some new variants of our string conversion
    functions
    
    Change-Id: I1877f8f3c72934c07f14eec7e73bbe8d7b0f1808
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/119065
    Tested-by: Noel Grandin <noel.grandin at collabora.co.uk>
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/include/rtl/string.h b/include/rtl/string.h
index d29caf93a718..62fc7ecfb2d0 100644
--- a/include/rtl/string.h
+++ b/include/rtl/string.h
@@ -747,6 +747,31 @@ SAL_DLLPUBLIC sal_Bool SAL_CALL rtl_str_toBoolean(
 SAL_DLLPUBLIC sal_Int32 SAL_CALL rtl_str_toInt32(
         const char * str, sal_Int16 radix ) SAL_THROW_EXTERN_C();
 
+/** Interpret a string as a integer.
+
+    This function cannot be used for language-specific conversion.  The string
+    must be null-terminated.
+
+    @param str
+    a null-terminated string.
+
+    @param radix
+    the radix.  Must be between RTL_STR_MIN_RADIX (2) and RTL_STR_MAX_RADIX
+    (36), inclusive.
+
+    @param nStrLength
+    number of chars to process
+
+    @return
+    the integer value represented by the string, or 0 if the string does
+    not represent a integer.
+
+    @internal
+    @since LibreOffice 7.3
+*/
+SAL_DLLPUBLIC sal_Int32 SAL_CALL rtl_str_toInt32_WithLength(
+        const char * str, sal_Int16 radix, sal_Int32 nStrLength ) SAL_THROW_EXTERN_C();
+
 /** Interpret a string as an unsigned integer.
 
     This function cannot be used for language-specific conversion.  The string
@@ -863,6 +888,26 @@ SAL_DLLPUBLIC float SAL_CALL rtl_str_toFloat(
 SAL_DLLPUBLIC double SAL_CALL rtl_str_toDouble(
         const char * str ) SAL_THROW_EXTERN_C();
 
+/** Interpret a string as a double.
+
+    This function cannot be used for language-specific conversion.  The string
+    must be null-terminated.
+
+    @param str
+    a null-terminated string.
+
+    @param nStrLength
+    number of chars to process
+
+    @return
+    the double value represented by the string, or 0.0 if the string does not
+    represent a double.
+
+    @since LibreOffice 7.3
+ */
+SAL_DLLPUBLIC double SAL_CALL rtl_str_toDouble_WithLength(
+        const char * str, sal_Int32 nStrLength ) SAL_THROW_EXTERN_C();
+
 /* ======================================================================= */
 
 #ifdef _WIN32
diff --git a/sal/rtl/string.cxx b/sal/rtl/string.cxx
index 94be8029032a..6fc2df75698d 100644
--- a/sal/rtl/string.cxx
+++ b/sal/rtl/string.cxx
@@ -110,6 +110,14 @@ double SAL_CALL rtl_str_toDouble(char const * pStr) SAL_THROW_EXTERN_C()
                                    nullptr, nullptr);
 }
 
+double SAL_CALL rtl_str_toDouble_WithLength(const char* pStr,
+                                              sal_Int32 nStrLength) SAL_THROW_EXTERN_C()
+{
+    assert(pStr);
+    return rtl_math_stringToDouble(pStr, pStr + nStrLength, '.', 0,
+                                   nullptr, nullptr);
+}
+
 /* ======================================================================= */
 
 static int rtl_ImplGetFastUTF8ByteLen( const sal_Unicode* pStr, sal_Int32 nLen )
@@ -559,6 +567,12 @@ sal_Int32 SAL_CALL rtl_str_toInt32(const char* pStr, sal_Int16 nRadix) SAL_THROW
     return rtl::str::toInt32(pStr, nRadix);
 }
 
+sal_Int32 SAL_CALL rtl_str_toInt32_WithLength(const char* pStr, sal_Int16 nRadix,
+                                              sal_Int32 nStrLength) SAL_THROW_EXTERN_C()
+{
+    return rtl::str::toInt32_WithLength(pStr, nRadix, nStrLength);
+}
+
 sal_Int64 SAL_CALL rtl_str_toInt64(const char* pStr, sal_Int16 nRadix) SAL_THROW_EXTERN_C()
 {
     return rtl::str::toInt64(pStr, nRadix);
diff --git a/sal/rtl/strtmpl.hxx b/sal/rtl/strtmpl.hxx
index 094a1cc1f2ab..493184f92efa 100644
--- a/sal/rtl/strtmpl.hxx
+++ b/sal/rtl/strtmpl.hxx
@@ -913,6 +913,16 @@ sal_Int32 toInt32                             ( const IMPL_RTL_STRCODE* pStr,
     return toInt_WithLength<sal_Int32, sal_uInt32>(pStr, nRadix, getLength(pStr));
 }
 
+template <typename IMPL_RTL_STRCODE>
+sal_Int32 toInt32_WithLength                  ( const IMPL_RTL_STRCODE* pStr,
+                                                sal_Int16 nRadix,
+                                                sal_Int32 nStrLength)
+
+{
+    assert(pStr);
+    return toInt_WithLength<sal_Int32, sal_uInt32>(pStr, nRadix, nStrLength);
+}
+
 template <typename IMPL_RTL_STRCODE>
 sal_Int64 toInt64                             ( const IMPL_RTL_STRCODE* pStr,
                                                 sal_Int16 nRadix )
diff --git a/sal/util/sal.map b/sal/util/sal.map
index 49efb2a436cd..e2339bdc13ac 100644
--- a/sal/util/sal.map
+++ b/sal/util/sal.map
@@ -755,6 +755,12 @@ PRIVATE_1.7 { # LibreOffice 7.1
         rtl_uString_newReplaceAllFromIndexUtf16LUtf16L;
 } PRIVATE_1.5;
 
+PRIVATE_1.8 { # LibreOffice 7.3
+    global:
+        rtl_str_toInt32_WithLength;
+        rtl_str_toDouble_WithLength;
+} PRIVATE_1.7;
+
 PRIVATE_textenc.1 { # LibreOffice 3.6
     global:
         _ZN3sal6detail7textenc20convertCharToUnicode*;
diff --git a/sax/source/tools/fastattribs.cxx b/sax/source/tools/fastattribs.cxx
index 554232260aef..9cec32318108 100644
--- a/sax/source/tools/fastattribs.cxx
+++ b/sax/source/tools/fastattribs.cxx
@@ -196,7 +196,7 @@ bool FastAttributeList::getAsInteger( sal_Int32 nToken, sal_Int32 &rInt) const
     for (size_t i = 0; i < maAttributeTokens.size(); ++i)
         if (maAttributeTokens[i] == nToken)
         {
-            rInt = rtl_str_toInt32( getFastAttributeValue(i), 10 );
+            rInt = rtl_str_toInt32_WithLength( getFastAttributeValue(i), 10, AttributeValueLength(i) );
             return true;
         }
     return false;
@@ -204,7 +204,7 @@ bool FastAttributeList::getAsInteger( sal_Int32 nToken, sal_Int32 &rInt) const
 
 sal_Int32 FastAttributeList::getAsIntegerByIndex( sal_Int32 nTokenIndex ) const
 {
-    return rtl_str_toInt32( getFastAttributeValue(nTokenIndex), 10 );
+    return rtl_str_toInt32_WithLength( getFastAttributeValue(nTokenIndex), 10, AttributeValueLength(nTokenIndex) );
 }
 
 bool FastAttributeList::getAsDouble( sal_Int32 nToken, double &rDouble) const
@@ -213,7 +213,7 @@ bool FastAttributeList::getAsDouble( sal_Int32 nToken, double &rDouble) const
     for (size_t i = 0; i < maAttributeTokens.size(); ++i)
         if (maAttributeTokens[i] == nToken)
         {
-            rDouble = rtl_str_toDouble( getFastAttributeValue(i) );
+            rDouble = rtl_str_toDouble_WithLength( getFastAttributeValue(i),  AttributeValueLength(i) );
             return true;
         }
     return false;


More information about the Libreoffice-commits mailing list