summaryrefslogtreecommitdiff
path: root/sal
diff options
context:
space:
mode:
authorDavid Ostrovsky <david@ostrovsky.org>2013-02-04 11:14:53 +0100
committerLuboš Luňák <l.lunak@suse.cz>2013-02-04 11:54:11 +0000
commit55576105d3c9b0a116d7707a6c46b67f7b20a0ce (patch)
tree5f17795a5bcd6d4aec0c394f92f1a9fbc7f1a5c9 /sal
parent6ef465646855c73a774700fff35ba43eb36eb0d4 (diff)
add OUString::toUInt64()
Change-Id: I2051e161219d424d2c2b69faf6f939cfe21fa5f7 Reviewed-on: https://gerrit.libreoffice.org/1980 Reviewed-by: Luboš Luňák <l.lunak@suse.cz> Tested-by: Luboš Luňák <l.lunak@suse.cz>
Diffstat (limited to 'sal')
-rw-r--r--sal/inc/rtl/ustring.h19
-rw-r--r--sal/inc/rtl/ustring.hxx14
-rw-r--r--sal/rtl/source/strtmpl.cxx153
-rw-r--r--sal/util/sal.map1
4 files changed, 117 insertions, 70 deletions
diff --git a/sal/inc/rtl/ustring.h b/sal/inc/rtl/ustring.h
index ab2707d00eb2..35be5fed1e8a 100644
--- a/sal/inc/rtl/ustring.h
+++ b/sal/inc/rtl/ustring.h
@@ -1073,6 +1073,25 @@ SAL_DLLPUBLIC sal_Bool SAL_CALL rtl_ustr_toBoolean(
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 192ba2bee0e2..8190d208ae68 100644
--- a/sal/inc/rtl/ustring.hxx
+++ b/sal/inc/rtl/ustring.hxx
@@ -1843,6 +1843,20 @@ public:
}
/**
+ 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 619f64e4a6ed..f5cbddd8e6f7 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 @@ sal_Bool SAL_CALL IMPL_RTL_STRNAME( toBoolean )( const IMPL_RTL_STRCODE* pStr )
}
/* ----------------------------------------------------------------------- */
+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;
-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;
- 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 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;
- if ( *pStr == '-' )
- {
- bNeg = sal_True;
- pStr++;
- }
- else
- {
- if ( *pStr == '+' )
pStr++;
- bNeg = sal_False;
+ }
+
+ if ( bNeg )
+ return -n;
+ else
+ return n;
}
- while ( *pStr )
+
+ template <typename T> static inline T IMPL_RTL_STRNAME( toUInt )( const IMPL_RTL_STRCODE* pStr,
+ sal_Int16 nRadix )
{
- nDigit = rtl_ImplGetDigit( IMPL_RTL_USTRCODE( *pStr ), nRadix );
- if ( nDigit < 0 )
- break;
+ BOOST_STATIC_ASSERT(!std::numeric_limits<T>::is_signed);
+ sal_Int16 nDigit;
+ T n = 0;
- n *= nRadix;
- n += nDigit;
+ if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
+ nRadix = 10;
- pStr++;
- }
+ /* 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;
+ }
- if ( bNeg )
- return -n;
- else
return n;
+ }
}
-/* ----------------------------------------------------------------------- */
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( toInt32 )( const IMPL_RTL_STRCODE* pStr,
+ sal_Int16 nRadix )
+ SAL_THROW_EXTERN_C()
+{
+ 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;
-
- 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;
+ return IMPL_RTL_STRNAME( toInt )<sal_Int64>(pStr, nRadix);
+}
- 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 1bebb0aa0334..e21ff0a5a384 100644
--- a/sal/util/sal.map
+++ b/sal/util/sal.map
@@ -660,6 +660,7 @@ LIBO_UDK_4.1 { # symbols available in >= LibO 4.1
rtl_uString_alloc;
rtl_str_valueOfUInt64;
rtl_ustr_valueOfUInt64;
+ rtl_ustr_toUInt64;
} LIBO_UDK_4.0;
PRIVATE_1.0 {