diff options
author | Caolán McNamara <caolanm@redhat.com> | 2011-11-09 22:07:24 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2011-11-10 09:28:39 +0000 |
commit | 8e482e60c52ba427199a29045711b3f9cc870ac0 (patch) | |
tree | c10d502127e9a097953955ca45c317f30ec1a813 | |
parent | 0a2286a7244ca80f8109765f0ff78a7c36e7cd68 (diff) |
an indexOfL would be useful
-rw-r--r-- | comphelper/inc/comphelper/string.hxx | 23 | ||||
-rw-r--r-- | comphelper/qa/string/test_string.cxx | 19 | ||||
-rw-r--r-- | svtools/inc/svtools/imap.hxx | 4 | ||||
-rw-r--r-- | svtools/source/misc/imap2.cxx | 27 |
4 files changed, 58 insertions, 15 deletions
diff --git a/comphelper/inc/comphelper/string.hxx b/comphelper/inc/comphelper/string.hxx index aeec120080c7..4545302b4086 100644 --- a/comphelper/inc/comphelper/string.hxx +++ b/comphelper/inc/comphelper/string.hxx @@ -251,6 +251,29 @@ COMPHELPER_DLLPUBLIC inline sal_Bool matchL(const rtl::OString& rStr, const char rStr.pData->length-fromIndex, pMatch, nMatchLen, nMatchLen ) == 0; } +/** + Returns the index within this string of the first occurrence of the + specified substring, starting at the specified index. + + If str doesn't include any character, always -1 is + returned. This is also the case, if both strings are empty. + + @param rStr The string that pSearch will be searched within. + @param pSearch the substring to search for. + @param nSearchLen the length of pSearch + @param fromIndex the index to start the search from. + @return If the string argument occurs one or more times as a substring + within this string at the starting index, then the index + of the first character of the first such substring is + returned. If it does not occur as a substring starting + at fromIndex or beyond, -1 is returned. +*/ +COMPHELPER_DLLPUBLIC inline sal_Int32 indexOfL(const rtl::OString& rStr, const char *pSearch, sal_Int32 nSearchLen, sal_Int32 fromIndex = 0) SAL_THROW(()) +{ + sal_Int32 ret = rtl_str_indexOfStr_WithLength(rStr.pData->buffer+fromIndex, + rStr.pData->length-fromIndex, pSearch, nSearchLen); + return (ret < 0 ? ret : ret+fromIndex); +} namespace detail { diff --git a/comphelper/qa/string/test_string.cxx b/comphelper/qa/string/test_string.cxx index db6d52ea1128..3e30ad22f440 100644 --- a/comphelper/qa/string/test_string.cxx +++ b/comphelper/qa/string/test_string.cxx @@ -53,6 +53,7 @@ public: void testIsdigitAsciiString(); void testIsalnumAsciiString(); void testIsupperAsciiString(); + void testIndexOfL(); CPPUNIT_TEST_SUITE(TestString); CPPUNIT_TEST(testSearchAndReplaceAsciiL); @@ -63,6 +64,7 @@ public: CPPUNIT_TEST(testIsdigitAsciiString); CPPUNIT_TEST(testIsalnumAsciiString); CPPUNIT_TEST(testIsupperAsciiString); + CPPUNIT_TEST(testIndexOfL); CPPUNIT_TEST_SUITE_END(); }; @@ -147,6 +149,23 @@ void TestString::testIsupperAsciiString() CPPUNIT_ASSERT_EQUAL(comphelper::string::isupperAsciiString(s3), true); } +void TestString::testIndexOfL() +{ + rtl::OString s1(RTL_CONSTASCII_STRINGPARAM("one two three")); + + CPPUNIT_ASSERT_EQUAL(comphelper::string::indexOfL(s1, + RTL_CONSTASCII_STRINGPARAM("one")), 0); + + CPPUNIT_ASSERT_EQUAL(comphelper::string::indexOfL(s1, + RTL_CONSTASCII_STRINGPARAM("two")), 4); + + CPPUNIT_ASSERT_EQUAL(comphelper::string::indexOfL(s1, + RTL_CONSTASCII_STRINGPARAM("four")), -1); + + CPPUNIT_ASSERT_EQUAL(comphelper::string::indexOfL(s1, + RTL_CONSTASCII_STRINGPARAM("two"), 5), -1); +} + using namespace ::com::sun::star; class testCollator : public cppu::WeakImplHelper1< i18n::XCollator > diff --git a/svtools/inc/svtools/imap.hxx b/svtools/inc/svtools/imap.hxx index 1d89ca30a49a..9418d987bfe4 100644 --- a/svtools/inc/svtools/imap.hxx +++ b/svtools/inc/svtools/imap.hxx @@ -67,12 +67,12 @@ protected: sal_uLong ImpReadCERN( SvStream& rOStm, const String& rBaseURL ); sal_uLong ImpReadNCSA( SvStream& rOStm, const String& rBaseURL ); - void ImpReadCERNLine( const ByteString& rLine, const String& rBaseURL ); + void ImpReadCERNLine( const rtl::OString& rLine, const String& rBaseURL ); Point ImpReadCERNCoords( const char** ppStr ); long ImpReadCERNRadius( const char** ppStr ); String ImpReadCERNURL( const char** ppStr, const String& rBaseURL ); - void ImpReadNCSALine( const ByteString& rLine, const String& rBaseURL ); + void ImpReadNCSALine( const rtl::OString& rLine, const String& rBaseURL ); String ImpReadNCSAURL( const char** ppStr, const String& rBaseURL ); Point ImpReadNCSACoords( const char** ppStr ); diff --git a/svtools/source/misc/imap2.cxx b/svtools/source/misc/imap2.cxx index 6ff6cad985e9..98b0ee3fa0fd 100644 --- a/svtools/source/misc/imap2.cxx +++ b/svtools/source/misc/imap2.cxx @@ -29,6 +29,7 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svtools.hxx" +#include <comphelper/string.hxx> #include <string.h> #include <rtl/strbuf.hxx> #include <vcl/svapp.hxx> @@ -250,18 +251,17 @@ sal_uLong ImageMap::Read( SvStream& rIStm, sal_uLong nFormat, const String& rBas sal_uLong ImageMap::ImpReadCERN( SvStream& rIStm, const String& rBaseURL ) { - ByteString aStr; - // alten Inhalt loeschen ClearImageMap(); + rtl::OString aStr; while ( rIStm.ReadLine( aStr ) ) ImpReadCERNLine( aStr, rBaseURL ); return IMAP_ERR_OK; } -void ImageMap::ImpReadCERNLine( const ByteString& rLine, const String& rBaseURL ) +void ImageMap::ImpReadCERNLine( const rtl::OString& rLine, const String& rBaseURL ) { ByteString aStr( rLine ); @@ -394,18 +394,17 @@ String ImageMap::ImpReadCERNURL( const char** ppStr, const String& rBaseURL ) sal_uLong ImageMap::ImpReadNCSA( SvStream& rIStm, const String& rBaseURL ) { - ByteString aStr; - // alten Inhalt loeschen ClearImageMap(); + rtl::OString aStr; while ( rIStm.ReadLine( aStr ) ) ImpReadNCSALine( aStr, rBaseURL ); return IMAP_ERR_OK; } -void ImageMap::ImpReadNCSALine( const ByteString& rLine, const String& rBaseURL ) +void ImageMap::ImpReadNCSALine( const rtl::OString& rLine, const String& rBaseURL ) { ByteString aStr( rLine ); @@ -532,20 +531,22 @@ sal_uLong ImageMap::ImpDetectFormat( SvStream& rIStm ) // untersuchen wir das Format if ( memcmp( cMagic, IMAPMAGIC, sizeof( cMagic ) ) ) { - ByteString aStr; long nCount = 128; rIStm.Seek( nPos ); + rtl::OString aStr; while ( rIStm.ReadLine( aStr ) && nCount-- ) { - aStr.ToLowerAscii(); + aStr = aStr.toAsciiLowerCase(); + + using comphelper::string::indexOfL; - if ( ( aStr.Search( "rect" ) != STRING_NOTFOUND ) || - ( aStr.Search( "circ" ) != STRING_NOTFOUND ) || - ( aStr.Search( "poly" ) != STRING_NOTFOUND ) ) + if ( (indexOfL(aStr, RTL_CONSTASCII_STRINGPARAM("rect")) != -1) || + (indexOfL(aStr, RTL_CONSTASCII_USTRINGPARAM("circ")) != -1) || + (indexOfL(aStr, RTL_CONSTASCII_USTRINGPARAM("poly")) != -1) ) { - if ( ( aStr.Search( '(' ) != STRING_NOTFOUND ) && - ( aStr.Search( ')' ) != STRING_NOTFOUND ) ) + if ( ( aStr.indexOf('(') != -1 ) && + ( aStr.indexOf(')') != -1 ) ) { nRet = IMAP_FORMAT_CERN; } |