=== modified file 'src/SBuf.cc' --- src/SBuf.cc 2014-05-19 06:06:36 +0000 +++ src/SBuf.cc 2014-06-02 08:37:21 +0000 @@ -549,54 +549,54 @@ ++stats.nulTerminate; return buf(); } SBuf& SBuf::chop(size_type pos, size_type n) { if (pos == npos || pos > length() || n == 0) { clear(); return *this; } if (n == npos || (pos+n) > length()) n = length()-pos; ++stats.chop; off_ += pos; len_ = n; return *this; } SBuf& -SBuf::trim(const SBuf &toRemove, bool atBeginning, bool atEnd) +SBuf::trim(const CharacterSet &toRemove, bool atBeginning, bool atEnd) { ++stats.trim; if (atEnd) { const char *p = bufEnd()-1; - while (!isEmpty() && memchr(toRemove.buf(), *p, toRemove.length()) != NULL) { + while (!isEmpty() && toRemove[*p]) { //current end-of-buf is in the searched set --len_; --p; } } if (atBeginning) { const char *p = buf(); - while (!isEmpty() && memchr(toRemove.buf(), *p, toRemove.length()) != NULL) { + while (!isEmpty() && toRemove[*p]) { --len_; ++off_; ++p; } } if (isEmpty()) clear(); return *this; } SBuf SBuf::substr(size_type pos, size_type n) const { SBuf rv(*this); rv.chop(pos, n); //stats handled by callee return rv; } SBuf::size_type SBuf::find(char c, size_type startPos) const === modified file 'src/SBuf.h' --- src/SBuf.h 2014-04-21 17:14:44 +0000 +++ src/SBuf.h 2014-06-02 08:36:19 +0000 @@ -447,41 +447,41 @@ * bytes starting from position 'pos', first byte is at pos 0. * It is an in-place-modifying version of substr. * \param pos start sub-stringing from this byte. If it is * npos or it is greater than the SBuf length, the SBuf is cleared and * an empty SBuf is returned. * \param n maximum number of bytes of the resulting SBuf. * npos means "to end of SBuf". * if it is 0, the SBuf is cleared and an empty SBuf is returned. * if it overflows the end of the SBuf, it is capped to the end of SBuf * \see substr, trim */ SBuf& chop(size_type pos, size_type n = npos); /** Remove characters in the toremove set at the beginning, end or both * * \param toremove characters to be removed. Stops chomping at the first * found char not in the set * \param atBeginning if true (default), strips at the beginning of the SBuf * \param atEnd if true (default), strips at the end of the SBuf */ - SBuf& trim(const SBuf &toRemove, bool atBeginning = true, bool atEnd = true); + SBuf& trim(const CharacterSet &toRemove, bool atBeginning = true, bool atEnd = true); /** Extract a part of the current SBuf. * * Return a fresh a fresh copy of a portion the current SBuf, which is * left untouched. The same parameter convetions apply as for chop. * \see trim, chop */ SBuf substr(size_type pos, size_type n = npos) const; /** Find first occurrence of character in SBuf * * Returns the index in the SBuf of the first occurrence of char c. * \return npos if the char was not found * \param startPos if specified, ignore any occurrences before that position * if startPos is npos or greater than length() npos is always returned * if startPos is less than zero, it is ignored */ size_type find(char c, size_type startPos = 0) const; /** Find first occurrence of SBuf in SBuf. === modified file 'src/tests/testSBuf.cc' --- src/tests/testSBuf.cc 2014-04-21 17:14:44 +0000 +++ src/tests/testSBuf.cc 2014-06-03 06:43:58 +0000 @@ -462,48 +462,49 @@ } { // null-chop SBuf b(a); b.chop(0,b.length()); SBuf ref(a); CPPUNIT_ASSERT_EQUAL(ref,b); } { // overflow chopped area SBuf b(a); b.chop(b.length()-3,b.length()); SBuf ref("xyz"); CPPUNIT_ASSERT_EQUAL(ref,b); } } void testSBuf::testChomp() { SBuf s1("complete string"); SBuf s2(s1); - s2.trim(SBuf(" ,")); + CharacterSet spc(NULL," ,"); + s2.trim(spc); CPPUNIT_ASSERT_EQUAL(s1,s2); s2.assign(" complete string ,"); - s2.trim(SBuf(" ,")); + s2.trim(spc); CPPUNIT_ASSERT_EQUAL(s1,s2); s1.assign(", complete string ,"); s2=s1; - s2.trim(SBuf(" ")); + s2.trim(CharacterSet::SP); CPPUNIT_ASSERT_EQUAL(s1,s2); } // inspired by SBufFindTest; to be expanded. class SBufSubstrAutoTest { SBuf fullString, sb; std::string fullReference, str; public: void performEqualityTest() { SBuf ref(str); CPPUNIT_ASSERT_EQUAL(ref,sb); } SBufSubstrAutoTest() : fullString(fox), fullReference(fox) { for (int offset=fullString.length()-1; offset >= 0; --offset ) { for (int length=fullString.length()-1-offset; length >= 0; --length) { sb=fullString.substr(offset,length); str=fullReference.substr(offset,length); performEqualityTest(); }