[haiku-commits] haiku: hrev50971 - src/tests/kits/support/bstring docs/user/support src/kits/support headers/os/support

  • From: jscipione@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 22 Feb 2017 04:27:03 +0100 (CET)

hrev50971 adds 6 changesets to branch 'master'
old head: 85566e032db4a30a5838dc54d6d7b285a4e2c3ff
new head: e4e6315ff4341c77efbf575dac1502b349aeecb1
overview: 
http://cgit.haiku-os.org/haiku/log/?qt=range&q=e4e6315ff434+%5E85566e032db4

----------------------------------------------------------------------------

388ac82baa14: BString: Add IStartsWith() and IEndsWith() methods
  
  Case-insensitive version of StartsWith() and EndsWith()

1eed6ef172aa: BString docs: document IStartsWith() and IEndsWith()

17a413473334: StringSearchTest: automatic whitespace cleanup

dc0b0016ada1: StringSearchTest: Add unit tests for new methods

cc04d41c8718: BString: Use safestr() to prevent strlen(NULL)
  
  on StartsWith(), IStartsWith(), EndsWith(), and IEndsWith()

e4e6315ff434: PackageInstaller: Use newly created BString::IEndsWith()
  
  ...to find files with .pdb extension
  
  Code was subtly wrong in 2 cases:
  1) File that ended in pdb but not an extension e.g. filepdb
     erroneously included
  2) File that ended in .PDB or other case erroneously skipped

                                     [ John Scipione <jscipione@xxxxxxxxx> ]

----------------------------------------------------------------------------

5 files changed, 307 insertions(+), 30 deletions(-)
docs/user/support/String.dox                     |  86 +++++++++
headers/os/support/String.h                      |   8 +
src/apps/packageinstaller/UninstallView.cpp      |   4 +-
src/kits/support/String.cpp                      |  53 +++++-
.../kits/support/bstring/StringSearchTest.cpp    | 186 ++++++++++++++++---

############################################################################

Commit:      388ac82baa14bc8ba76cc306c935daaf10f82050
URL:         http://cgit.haiku-os.org/haiku/commit/?id=388ac82baa14
Author:      John Scipione <jscipione@xxxxxxxxx>
Date:        Fri Jan  6 01:20:08 2017 UTC

BString: Add IStartsWith() and IEndsWith() methods

Case-insensitive version of StartsWith() and EndsWith()

----------------------------------------------------------------------------

diff --git a/headers/os/support/String.h b/headers/os/support/String.h
index 4d45a86..73a5372 100644
--- a/headers/os/support/String.h
+++ b/headers/os/support/String.h
@@ -243,10 +243,18 @@ public:
                        bool                    StartsWith(const char* string) 
const;
                        bool                    StartsWith(const char* string, 
int32 length) const;
 
+                       bool                    IStartsWith(const BString& 
string) const;
+                       bool                    IStartsWith(const char* string) 
const;
+                       bool                    IStartsWith(const char* string, 
int32 length) const;
+
                        bool                    EndsWith(const BString& string) 
const;
                        bool                    EndsWith(const char* string) 
const;
                        bool                    EndsWith(const char* string, 
int32 length) const;
 
+                       bool                    IEndsWith(const BString& 
string) const;
+                       bool                    IEndsWith(const char* string) 
const;
+                       bool                    IEndsWith(const char* string, 
int32 length) const;
+
                        // Replacing
                        BString&                ReplaceFirst(char replaceThis, 
char withThis);
                        BString&                ReplaceLast(char replaceThis, 
char withThis);
diff --git a/src/kits/support/String.cpp b/src/kits/support/String.cpp
index 12c09f8..611acec 100644
--- a/src/kits/support/String.cpp
+++ b/src/kits/support/String.cpp
@@ -1413,6 +1413,30 @@ BString::StartsWith(const char* string, int32 length) 
const
 
 
 bool
+BString::IStartsWith(const BString& string) const
+{
+       return IStartsWith(string.String(), string.Length());
+}
+
+
+bool
+BString::IStartsWith(const char* string) const
+{
+       return IStartsWith(string, strlen(string));
+}
+
+
+bool
+BString::IStartsWith(const char* string, int32 length) const
+{
+       if (length > Length() || length > (int32)strlen(string))
+               return false;
+
+       return _IFindAfter(string, 0, length) == 0;
+}
+
+
+bool
 BString::EndsWith(const BString& string) const
 {
        return EndsWith(string.String(), string.Length());
@@ -1437,6 +1461,31 @@ BString::EndsWith(const char* string, int32 length) const
 }
 
 
+bool
+BString::IEndsWith(const BString& string) const
+{
+       return IEndsWith(string.String(), string.Length());
+}
+
+
+bool
+BString::IEndsWith(const char* string) const
+{
+       return IEndsWith(string, strlen(string));
+}
+
+
+bool
+BString::IEndsWith(const char* string, int32 length) const
+{
+       int32 offset = Length() - length;
+       if (offset < 0)
+               return false;
+
+       return _IFindBefore(string, Length(), length) == offset;
+}
+
+
 //     #pragma mark - Replacing
 
 

############################################################################

Commit:      1eed6ef172aad9f9dac97671b167d79643097f98
URL:         http://cgit.haiku-os.org/haiku/commit/?id=1eed6ef172aa
Author:      John Scipione <jscipione@xxxxxxxxx>
Date:        Fri Jan  6 01:21:57 2017 UTC

BString docs: document IStartsWith() and IEndsWith()

----------------------------------------------------------------------------

diff --git a/docs/user/support/String.dox b/docs/user/support/String.dox
index d948f78..5ddba92 100644
--- a/docs/user/support/String.dox
+++ b/docs/user/support/String.dox
@@ -2034,6 +2034,49 @@
 
 
 /*!
+       \fn bool BString::IStartsWith(const BString& string) const
+       \brief Returns whether or not the BString starts with \a string
+              case-insensitively.
+
+       \param string The \a string to search for.
+
+       \return \c true if the BString started with \a string 
case-insensitively,
+               \c false otherwise.
+
+       \since Haiku R1
+*/
+
+
+/*!
+       \fn bool BString::IStartsWith(const char* string) const
+       \brief Returns whether or not the BString starts with \a string
+              case-insensitively.
+
+       \param string The \a string to search for.
+
+       \return \c true if the BString started with \a string 
case-insensitively,
+               \c false otherwise.
+
+       \since Haiku R1
+*/
+
+
+/*!
+       \fn bool BString::IStartsWith(const char* string, int32 length) const
+       \brief Returns whether or not the BString starts with \a length 
characters
+              of \a string case-insensitively.
+
+       \param string The \a string to search for.
+       \param length The number of characters (bytes) of \a string to search 
for.
+
+       \return \c true if the BString started with \a length characters of
+               \a string case-insensitively, \c false otherwise.
+
+       \since Haiku R1
+*/
+
+
+/*!
        \fn bool BString::EndsWith(const BString& string) const
        \brief Returns whether or not the BString ends with \a string.
 
@@ -2072,6 +2115,49 @@
 */
 
 
+/*!
+       \fn bool BString::IEndsWith(const BString& string) const
+       \brief Returns whether or not the BString ends with \a string
+              case-insensitively.
+
+       \param string The \a string to search for.
+
+       \return \c true if the BString ended with \a string case-insensitively,
+               \c false otherwise.
+
+       \since Haiku R1
+*/
+
+
+/*!
+       \fn bool BString::IEndsWith(const char* string) const
+       \brief Returns whether or not the BString ends with \a string
+              case-insensitively.
+
+       \param string The \a string to search for.
+
+       \return \c true if the BString ended with \a string case-insensitively,
+               \c false otherwise.
+
+       \since Haiku R1
+*/
+
+
+/*!
+       \fn bool BString::IEndsWith(const char* string, int32 length) const
+       \brief Returns whether or not the BString ends with \a length characters
+              of \a string case-insensitively.
+
+       \param string The \a string to search for.
+       \param length The number of characters (bytes) of \a string to search 
for.
+
+       \return \c true if the BString ended with \a length characters of
+               \a string case-insensitively, \c false otherwise.
+
+       \since Haiku R1
+*/
+
+
 //! @}
 
 

############################################################################

Commit:      17a413473334270ed99122edb485a4aa2d0eb230
URL:         http://cgit.haiku-os.org/haiku/commit/?id=17a413473334
Author:      John Scipione <jscipione@xxxxxxxxx>
Date:        Thu Jan  5 23:53:03 2017 UTC

StringSearchTest: automatic whitespace cleanup

----------------------------------------------------------------------------

diff --git a/src/tests/kits/support/bstring/StringSearchTest.cpp 
b/src/tests/kits/support/bstring/StringSearchTest.cpp
index 52876af..e4185c3 100644
--- a/src/tests/kits/support/bstring/StringSearchTest.cpp
+++ b/src/tests/kits/support/bstring/StringSearchTest.cpp
@@ -8,14 +8,14 @@ StringSearchTest::StringSearchTest(std::string name) :
 {
 }
 

+
 
 StringSearchTest::~StringSearchTest()
 {
 }
 
 
-void 
+void
 StringSearchTest::PerformTest(void)
 {
        BString *string1, *string2;
@@ -44,13 +44,13 @@ StringSearchTest::PerformTest(void)
        i = string1->FindFirst("st");
        CPPUNIT_ASSERT(i == 2);
        delete string1;
-       
+
        NextSubTest();
        string1 = new BString;
        i = string1->FindFirst("some text");
        CPPUNIT_ASSERT(i == B_ERROR);
        delete string1;
-       
+
 #ifndef TEST_R5
 //     Commented, since crashes R5
        NextSubTest();
@@ -103,7 +103,7 @@ StringSearchTest::PerformTest(void)
        i = string1->FindFirst("abc", -10);
        CPPUNIT_ASSERT(i == B_ERROR);
        delete string1;
-       
+
 #ifndef TEST_R5
        //Commented since crashes R5
        NextSubTest();
@@ -168,7 +168,7 @@ StringSearchTest::PerformTest(void)
        i = string1->FindLast("st");
        CPPUNIT_ASSERT(i == 16);
        delete string1;
-       
+
        NextSubTest();
        string1 = new BString;
        i = string1->FindLast("some text");
@@ -275,7 +275,7 @@ StringSearchTest::PerformTest(void)
        CPPUNIT_ASSERT(i == 2);
        delete string1;
        delete string2;
-       
+
        NextSubTest();
        string1 = new BString("last but not least");
        string2 = new BString("ST");
@@ -291,7 +291,7 @@ StringSearchTest::PerformTest(void)
        CPPUNIT_ASSERT(i == B_ERROR);
        delete string1;
        delete string2;
-       
+
        NextSubTest();
        string1 = new BString("string");
        string2 = new BString;
@@ -299,26 +299,26 @@ StringSearchTest::PerformTest(void)
        CPPUNIT_ASSERT(i == 0);
        delete string1;
        delete string2;
-       
+
        //IFindFirst(const char*)
        NextSubTest();
        string1 = new BString("last but not least");
        i = string1->IFindFirst("st");
        CPPUNIT_ASSERT(i == 2);
        delete string1;
-       
+
        NextSubTest();
        string1 = new BString("LAST BUT NOT least");
        i = string1->IFindFirst("st");
        CPPUNIT_ASSERT(i == 2);
        delete string1;
-       
+
        NextSubTest();
        string1 = new BString;
        i = string1->IFindFirst("some text");
        CPPUNIT_ASSERT(i == B_ERROR);
        delete string1;
-       
+
 #ifndef TEST_R5
        //Commented, since crashes R5
        NextSubTest();
@@ -336,7 +336,7 @@ StringSearchTest::PerformTest(void)
        CPPUNIT_ASSERT(i == 8);
        delete string1;
        delete string2;
-       
+
        NextSubTest();
        string1 = new BString("abc abc abc");
        string2 = new BString("AbC");
@@ -373,7 +373,7 @@ StringSearchTest::PerformTest(void)
        i = string1->IFindFirst("abc", 2);
        CPPUNIT_ASSERT(i == 4);
        delete string1;
-       
+
        NextSubTest();
        string1 = new BString("abc abc abc");
        i = string1->IFindFirst("abc", 200);
@@ -385,7 +385,7 @@ StringSearchTest::PerformTest(void)
        i = string1->IFindFirst("abc", -10);
        CPPUNIT_ASSERT(i == B_ERROR);
        delete string1;
-       
+
 #ifndef TEST_R5
        //IFindLast(BString&)
        NextSubTest();
@@ -395,7 +395,7 @@ StringSearchTest::PerformTest(void)
        CPPUNIT_ASSERT(i == 16);
        delete string1;
        delete string2;
-       
+
        NextSubTest();
        string1 = new BString("laSt but NOT leaSt");
        string2 = new BString("sT");
@@ -420,20 +420,20 @@ StringSearchTest::PerformTest(void)
        CPPUNIT_ASSERT(i == 16);
        delete string1;
 
-#ifndef TEST_R5        
+#ifndef TEST_R5
        NextSubTest();
        string1 = new BString("laSt but NOT leaSt");
        i = string1->IFindLast("ST");
        CPPUNIT_ASSERT(i == 16);
        delete string1;
 #endif
-       
+
        NextSubTest();
        string1 = new BString;
        i = string1->IFindLast("some text");
        CPPUNIT_ASSERT(i == B_ERROR);
        delete string1;
-       
+
 #ifndef TEST_R5
        //Commented since crashes R5
        NextSubTest();
@@ -451,7 +451,7 @@ StringSearchTest::PerformTest(void)
        CPPUNIT_ASSERT(i == 3);
        delete string1;
        delete string2;
-       
+
        NextSubTest();
        string1 = new BString("abcabcabc");
        string2 = new BString("AbC");
@@ -459,7 +459,7 @@ StringSearchTest::PerformTest(void)
        CPPUNIT_ASSERT(i == 3);
        delete string1;
        delete string2;
-       
+
        NextSubTest();
        string1 = new BString("abc abc abc");
        string2 = new BString("abc");
@@ -476,19 +476,19 @@ StringSearchTest::PerformTest(void)
        CPPUNIT_ASSERT(i == 4);
        delete string1;
 //#endif
-#ifndef TEST_R5        
+#ifndef TEST_R5
        NextSubTest();
        string1 = new BString("ABc abC aBC");
        i = string1->IFindLast("aBc", 9);
        CPPUNIT_ASSERT(i == 4);
        delete string1;
-#endif 
+#endif
        NextSubTest();
        string1 = new BString("abc abc abc");
        i = string1->IFindLast("abc", -10);
        CPPUNIT_ASSERT(i == B_ERROR);
        delete string1;
-       
+
        NextSubTest();
        string1 = new BString("abc def ghi");
        i = string1->IFindLast("abc",4);
@@ -498,9 +498,9 @@ StringSearchTest::PerformTest(void)
 
 
 CppUnit::Test *StringSearchTest::suite(void)
-{      
+{
        typedef CppUnit::TestCaller<StringSearchTest>
                StringSearchTestCaller;
-               
+
        return(new StringSearchTestCaller("BString::Search Test", 
&StringSearchTest::PerformTest));
 }

############################################################################

Commit:      dc0b0016ada1350a02525e483915333bb4fc7363
URL:         http://cgit.haiku-os.org/haiku/commit/?id=dc0b0016ada1
Author:      John Scipione <jscipione@xxxxxxxxx>
Date:        Fri Jan  6 01:22:43 2017 UTC

StringSearchTest: Add unit tests for new methods

----------------------------------------------------------------------------

diff --git a/src/tests/kits/support/bstring/StringSearchTest.cpp 
b/src/tests/kits/support/bstring/StringSearchTest.cpp
index e4185c3..91509c2 100644
--- a/src/tests/kits/support/bstring/StringSearchTest.cpp
+++ b/src/tests/kits/support/bstring/StringSearchTest.cpp
@@ -145,6 +145,31 @@ StringSearchTest::PerformTest(void)
        CPPUNIT_ASSERT(i == B_ERROR);
        delete string1;
 
+#ifndef TEST_R5
+       //StartsWith(BString&)
+       NextSubTest();
+       string1 = new BString("last but not least");
+       string2 = new BString("last");
+       i = (int32)string1->StartsWith(*string2);
+       CPPUNIT_ASSERT(i != 0);
+       delete string1;
+       delete string2;
+
+       //StartsWith(const char*)
+       NextSubTest();
+       string1 = new BString("last but not least");
+       i = (int32)string1->StartsWith("last");
+       CPPUNIT_ASSERT(i != 0);
+       delete string1;
+
+       //StartsWith(const char*, int32)
+       NextSubTest();
+       string1 = new BString("last but not least");
+       i = (int32)string1->StartsWith("last", 4);
+       CPPUNIT_ASSERT(i != 0);
+       delete string1;
+#endif
+
        //FindLast(BString&)
        NextSubTest();
        string1 = new BString("last but not least");
@@ -387,6 +412,29 @@ StringSearchTest::PerformTest(void)
        delete string1;
 
 #ifndef TEST_R5
+       //IStartsWith(BString&)
+       NextSubTest();
+       string1 = new BString("last but not least");
+       string2 = new BString("lAsT");
+       i = (int32)string1->StartsWith(*string2);
+       CPPUNIT_ASSERT(i != 0);
+       delete string1;
+       delete string2;
+
+       //IStartsWith(const char*)
+       NextSubTest();
+       string1 = new BString("last but not least");
+       i = (int32)string1->StartsWith("lAsT");
+       CPPUNIT_ASSERT(i != 0);
+       delete string1;
+
+       //IStartsWith(const char*, int32)
+       NextSubTest();
+       string1 = new BString("last but not least");
+       i = (int32)string1->StartsWith("lAsT", 4);
+       CPPUNIT_ASSERT(i != 0);
+       delete string1;
+
        //IFindLast(BString&)
        NextSubTest();
        string1 = new BString("last but not least");
@@ -403,6 +451,92 @@ StringSearchTest::PerformTest(void)
        CPPUNIT_ASSERT(i == 16);
        delete string1;
        delete string2;
+
+       //EndsWith(BString&)
+       NextSubTest();
+       string1 = new BString("last but not least");
+       string2 = new BString("st");
+       i = (int32)string1->EndsWith(*string2);
+       CPPUNIT_ASSERT(i != 0);
+       delete string1;
+       delete string2;
+
+       NextSubTest();
+       string1 = new BString("laSt but NOT leaSt");
+       string2 = new BString("sT");
+       i = (int32)string1->EndsWith(*string2);
+       CPPUNIT_ASSERT(i == 0);
+       delete string1;
+       delete string2;
+
+       //EndsWith(const char*)
+       NextSubTest();
+       string1 = new BString("last but not least");
+       i = (int32)string1->EndsWith("least");
+       CPPUNIT_ASSERT(i != 0);
+       delete string1;
+
+       NextSubTest();
+       string1 = new BString("laSt but NOT leaSt");
+       i = (int32)string1->EndsWith("least");
+       CPPUNIT_ASSERT(i == 0);
+       delete string1;
+
+       //EndsWith(const char*, int32)
+       NextSubTest();
+       string1 = new BString("last but not least");
+       i = (int32)string1->EndsWith("sT", 2);
+       CPPUNIT_ASSERT(i != 0);
+       delete string1;
+
+       NextSubTest();
+       string1 = new BString("laSt but NOT leaSt");
+       i = (int32)string1->EndsWith("sT", 2);
+       CPPUNIT_ASSERT(i == 0);
+       delete string1;
+
+       //IEndsWith(BString&)
+       NextSubTest();
+       string1 = new BString("last but not least");
+       string2 = new BString("st");
+       i = (int32)string1->IEndsWith(*string2);
+       CPPUNIT_ASSERT(i != 0);
+       delete string1;
+       delete string2;
+
+       NextSubTest();
+       string1 = new BString("laSt but NOT leaSt");
+       string2 = new BString("sT");
+       i = (int32)string1->IEndsWith(*string2);
+       CPPUNIT_ASSERT(i != 0);
+       delete string1;
+       delete string2;
+
+       //IEndsWith(const char*)
+       NextSubTest();
+       string1 = new BString("last but not least");
+       i = (int32)string1->IEndsWith("st");
+       CPPUNIT_ASSERT(i != 0);
+       delete string1;
+
+       NextSubTest();
+       string1 = new BString("laSt but NOT leaSt");
+       i = (int32)string1->IEndsWith("sT");
+       CPPUNIT_ASSERT(i != 0);
+       delete string1;
+
+       //IEndsWith(const char*, int32)
+       NextSubTest();
+       string1 = new BString("last but not least");
+       i = (int32)string1->IEndsWith("st", 2);
+       CPPUNIT_ASSERT(i != 0);
+       delete string1;
+
+       NextSubTest();
+       string1 = new BString("laSt but NOT leaSt");
+       i = (int32)string1->IEndsWith("sT", 2);
+       CPPUNIT_ASSERT(i != 0);
+       delete string1;
 #endif
 
        NextSubTest();

############################################################################

Commit:      cc04d41c87185185701f12f02c01c17a3af775d2
URL:         http://cgit.haiku-os.org/haiku/commit/?id=cc04d41c8718
Author:      John Scipione <jscipione@xxxxxxxxx>
Date:        Wed Feb 22 02:46:50 2017 UTC

BString: Use safestr() to prevent strlen(NULL)

on StartsWith(), IStartsWith(), EndsWith(), and IEndsWith()

----------------------------------------------------------------------------

diff --git a/src/kits/support/String.cpp b/src/kits/support/String.cpp
index 611acec..3145c63 100644
--- a/src/kits/support/String.cpp
+++ b/src/kits/support/String.cpp
@@ -1398,7 +1398,7 @@ BString::StartsWith(const BString& string) const
 bool
 BString::StartsWith(const char* string) const
 {
-       return StartsWith(string, strlen(string));
+       return StartsWith(string, strlen(safestr(string)));
 }
 
 
@@ -1422,14 +1422,14 @@ BString::IStartsWith(const BString& string) const
 bool
 BString::IStartsWith(const char* string) const
 {
-       return IStartsWith(string, strlen(string));
+       return IStartsWith(string, strlen(safestr(string)));
 }
 
 
 bool
 BString::IStartsWith(const char* string, int32 length) const
 {
-       if (length > Length() || length > (int32)strlen(string))
+       if (length > Length() || length > (int32)strlen(safestr(string)))
                return false;
 
        return _IFindAfter(string, 0, length) == 0;
@@ -1446,7 +1446,7 @@ BString::EndsWith(const BString& string) const
 bool
 BString::EndsWith(const char* string) const
 {
-       return EndsWith(string, strlen(string));
+       return EndsWith(string, strlen(safestr(string)));
 }
 
 
@@ -1471,7 +1471,7 @@ BString::IEndsWith(const BString& string) const
 bool
 BString::IEndsWith(const char* string) const
 {
-       return IEndsWith(string, strlen(string));
+       return IEndsWith(string, strlen(safestr(string)));
 }
 
 

############################################################################

Revision:    hrev50971
Commit:      e4e6315ff4341c77efbf575dac1502b349aeecb1
URL:         http://cgit.haiku-os.org/haiku/commit/?id=e4e6315ff434
Author:      John Scipione <jscipione@xxxxxxxxx>
Date:        Wed Feb 22 03:10:16 2017 UTC

PackageInstaller: Use newly created BString::IEndsWith()

...to find files with .pdb extension

Code was subtly wrong in 2 cases:
1) File that ended in pdb but not an extension e.g. filepdb
   erroneously included
2) File that ended in .PDB or other case erroneously skipped

----------------------------------------------------------------------------

diff --git a/src/apps/packageinstaller/UninstallView.cpp 
b/src/apps/packageinstaller/UninstallView.cpp
index e3fc522..35c0217 100644
--- a/src/apps/packageinstaller/UninstallView.cpp
+++ b/src/apps/packageinstaller/UninstallView.cpp
@@ -361,8 +361,8 @@ UninstallView::_ReloadAppList()
                if (iter.GetNodeRef(&ref) != B_OK)
                        continue;
 
-               size_t len = strnlen(filename, B_FILE_NAME_LENGTH);
-               if (len < 3 || strncmp(filename + (len - 3), "pdb", 3) != 0) {
+               BString filenameString(filename);
+               if (!filenameString.IEndsWith(".pdb")) {
                        printf("Ignoring non-package '%s'\n", filename);
                        continue;
                }


Other related posts:

  • » [haiku-commits] haiku: hrev50971 - src/tests/kits/support/bstring docs/user/support src/kits/support headers/os/support - jscipione