[PATCH] add OUString::toUInt64()
David Ostrovsky (via Code Review)
gerrit at gerrit.libreoffice.org
Mon Feb 4 02:21:03 PST 2013
Hi,
I have submitted a patch for review:
https://gerrit.libreoffice.org/1980
To pull it, you can do:
git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/80/1980/1
add OUString::toUInt64()
Change-Id: I2051e161219d424d2c2b69faf6f939cfe21fa5f7
---
M sal/inc/rtl/ustring.h
M sal/inc/rtl/ustring.hxx
M sal/rtl/source/strtmpl.cxx
M sal/util/sal.map
4 files changed, 125 insertions(+), 78 deletions(-)
diff --git a/sal/inc/rtl/ustring.h b/sal/inc/rtl/ustring.h
index ab2707d..35be5fe 100644
--- a/sal/inc/rtl/ustring.h
+++ b/sal/inc/rtl/ustring.h
@@ -1073,6 +1073,25 @@
SAL_DLLPUBLIC sal_Int32 SAL_CALL rtl_ustr_toInt32(
const sal_Unicode * str, sal_Int16 radix ) SAL_THROW_EXTERN_C();
+/** Interpret a string as an unsigned long 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_USTR_MIN_RADIX (2) and RTL_USTR_MAX_RADIX
+ (36), inclusive.
+
+ @return
+ the long integer value represented by the string, or 0 if the string does
+ not represent a long integer.
+ */
+SAL_DLLPUBLIC sal_uInt64 SAL_CALL rtl_ustr_toUInt64(
+ const sal_Unicode * str, sal_Int16 radix ) SAL_THROW_EXTERN_C();
+
/** Interpret a string as a long integer.
This function cannot be used for language-specific conversion. The string
diff --git a/sal/inc/rtl/ustring.hxx b/sal/inc/rtl/ustring.hxx
index 192ba2b..8190d20 100644
--- a/sal/inc/rtl/ustring.hxx
+++ b/sal/inc/rtl/ustring.hxx
@@ -1843,6 +1843,20 @@
}
/**
+ Returns the uint64 value from this string.
+
+ This function can't be used for language specific conversion.
+
+ @param radix the radix (between 2 and 36)
+ @return the uint64 represented from this string.
+ 0 if this string represents no number.
+ */
+ sal_uInt64 toUInt64( sal_Int16 radix = 10 ) const SAL_THROW(())
+ {
+ return rtl_ustr_toUInt64( pData->buffer, radix );
+ }
+
+ /**
Returns the float value from this string.
This function can't be used for language specific conversion.
diff --git a/sal/rtl/source/strtmpl.cxx b/sal/rtl/source/strtmpl.cxx
index 619f64e..f5cbddd 100644
--- a/sal/rtl/source/strtmpl.cxx
+++ b/sal/rtl/source/strtmpl.cxx
@@ -24,6 +24,8 @@
#include <string.h>
#include <sal/log.hxx>
+#include <limits>
+#include <boost/static_assert.hpp>
/*
inline void rtl_str_ImplCopy( IMPL_RTL_STRCODE* pDest,
@@ -914,97 +916,108 @@
}
/* ----------------------------------------------------------------------- */
+namespace {
+ template <typename T> static inline T IMPL_RTL_STRNAME( toInt )( const IMPL_RTL_STRCODE* pStr,
+ sal_Int16 nRadix )
+ {
+ BOOST_STATIC_ASSERT(std::numeric_limits<T>::is_signed);
+ sal_Bool bNeg;
+ sal_Int16 nDigit;
+ T n = 0;
+
+ if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
+ nRadix = 10;
+
+ /* Skip whitespaces */
+ while ( *pStr && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE( *pStr ) ) )
+ pStr++;
+
+ if ( *pStr == '-' )
+ {
+ bNeg = sal_True;
+ pStr++;
+ }
+ else
+ {
+ if ( *pStr == '+' )
+ pStr++;
+ bNeg = sal_False;
+ }
+
+ while ( *pStr )
+ {
+ nDigit = rtl_ImplGetDigit( IMPL_RTL_USTRCODE( *pStr ), nRadix );
+ if ( nDigit < 0 )
+ break;
+
+ n *= nRadix;
+ n += nDigit;
+
+ pStr++;
+ }
+
+ if ( bNeg )
+ return -n;
+ else
+ return n;
+ }
+
+
+ template <typename T> static inline T IMPL_RTL_STRNAME( toUInt )( const IMPL_RTL_STRCODE* pStr,
+ sal_Int16 nRadix )
+ {
+ BOOST_STATIC_ASSERT(!std::numeric_limits<T>::is_signed);
+ sal_Int16 nDigit;
+ T n = 0;
+
+ if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
+ nRadix = 10;
+
+ /* Skip whitespaces */
+ while ( *pStr && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE( *pStr ) ) )
+ ++pStr;
+
+ // skip optional explicit sign
+ if ( *pStr == '+' )
+ ++pStr;
+
+ while ( *pStr )
+ {
+ nDigit = rtl_ImplGetDigit( IMPL_RTL_USTRCODE( *pStr ), nRadix );
+ if ( nDigit < 0 )
+ break;
+
+ n *= nRadix;
+ n += nDigit;
+
+ ++pStr;
+ }
+
+ return n;
+ }
+}
sal_Int32 SAL_CALL IMPL_RTL_STRNAME( toInt32 )( const IMPL_RTL_STRCODE* pStr,
sal_Int16 nRadix )
SAL_THROW_EXTERN_C()
{
- sal_Bool bNeg;
- sal_Int16 nDigit;
- sal_Int32 n = 0;
-
- if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
- nRadix = 10;
-
- /* Skip whitespaces */
- while ( *pStr && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE( *pStr ) ) )
- pStr++;
-
- if ( *pStr == '-' )
- {
- bNeg = sal_True;
- pStr++;
- }
- else
- {
- if ( *pStr == '+' )
- pStr++;
- bNeg = sal_False;
- }
-
- while ( *pStr )
- {
- nDigit = rtl_ImplGetDigit( IMPL_RTL_USTRCODE( *pStr ), nRadix );
- if ( nDigit < 0 )
- break;
-
- n *= nRadix;
- n += nDigit;
-
- pStr++;
- }
-
- if ( bNeg )
- return -n;
- else
- return n;
+ return IMPL_RTL_STRNAME( toInt )<sal_Int32>(pStr, nRadix);
}
-
-/* ----------------------------------------------------------------------- */
sal_Int64 SAL_CALL IMPL_RTL_STRNAME( toInt64 )( const IMPL_RTL_STRCODE* pStr,
sal_Int16 nRadix )
SAL_THROW_EXTERN_C()
{
- sal_Bool bNeg;
- sal_Int16 nDigit;
- sal_Int64 n = 0;
+ return IMPL_RTL_STRNAME( toInt )<sal_Int64>(pStr, nRadix);
+}
- if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
- nRadix = 10;
+/* ----------------------------------------------------------------------- */
- /* Skip whitespaces */
- while ( *pStr && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE( *pStr ) ) )
- pStr++;
-
- if ( *pStr == '-' )
- {
- bNeg = sal_True;
- pStr++;
- }
- else
- {
- if ( *pStr == '+' )
- pStr++;
- bNeg = sal_False;
- }
-
- while ( *pStr )
- {
- nDigit = rtl_ImplGetDigit( IMPL_RTL_USTRCODE( *pStr ), nRadix );
- if ( nDigit < 0 )
- break;
-
- n *= nRadix;
- n += nDigit;
-
- pStr++;
- }
-
- if ( bNeg )
- return -n;
- else
- return n;
+sal_uInt64 SAL_CALL IMPL_RTL_STRNAME( toUInt64 )( const IMPL_RTL_STRCODE* pStr,
+ sal_Int16 nRadix )
+ SAL_THROW_EXTERN_C()
+{
+ return IMPL_RTL_STRNAME( toUInt )<sal_uInt64>(pStr, nRadix);
}
/* ======================================================================= */
diff --git a/sal/util/sal.map b/sal/util/sal.map
index 1bebb0a..e21ff0a 100644
--- a/sal/util/sal.map
+++ b/sal/util/sal.map
@@ -660,6 +660,7 @@
rtl_uString_alloc;
rtl_str_valueOfUInt64;
rtl_ustr_valueOfUInt64;
+ rtl_ustr_toUInt64;
} LIBO_UDK_4.0;
PRIVATE_1.0 {
--
To view, visit https://gerrit.libreoffice.org/1980
To unsubscribe, visit https://gerrit.libreoffice.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I2051e161219d424d2c2b69faf6f939cfe21fa5f7
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: master
Gerrit-Owner: David Ostrovsky <David.Ostrovsky at gmx.de>
More information about the LibreOffice
mailing list