diff --git a/src/Nibbler.cpp b/src/Nibbler.cpp index 7e6cd934a..bee56d3ea 100644 --- a/src/Nibbler.cpp +++ b/src/Nibbler.cpp @@ -99,11 +99,11 @@ bool Nibbler::getUntil (char c, std::string& result) } //////////////////////////////////////////////////////////////////////////////// -bool Nibbler::getUntilOneOf (const std::string& chars, std::string& result) +bool Nibbler::getUntil (const std::string& terminator, std::string& result) { if (mCursor < mInput.length ()) { - std::string::size_type i = mInput.find_first_of (chars, mCursor); + std::string::size_type i = mInput.find (terminator, mCursor); if (i != std::string::npos) { result = mInput.substr (mCursor, i - mCursor); @@ -122,17 +122,23 @@ bool Nibbler::getUntilOneOf (const std::string& chars, std::string& result) } //////////////////////////////////////////////////////////////////////////////// -bool Nibbler::getUntil (const std::string& terminator, std::string& result) +bool Nibbler::getUntilOneOf (const std::string& chars, std::string& result) { if (mCursor < mInput.length ()) { - std::string::size_type i = mInput.find (terminator, mCursor); + std::string::size_type i = mInput.find_first_of (chars, mCursor); if (i != std::string::npos) { result = mInput.substr (mCursor, i - mCursor); mCursor = i; - return true; } + else + { + result = mInput.substr (mCursor, std::string::npos); + mCursor = mInput.length (); + } + + return true; } return false; diff --git a/src/tests/nibbler.t.cpp b/src/tests/nibbler.t.cpp index 66f7a99c3..93bbf3cef 100644 --- a/src/tests/nibbler.t.cpp +++ b/src/tests/nibbler.t.cpp @@ -30,7 +30,7 @@ //////////////////////////////////////////////////////////////////////////////// int main (int argc, char** argv) { - UnitTest t (52); + UnitTest t (81); Nibbler n; std::string s; @@ -57,165 +57,132 @@ int main (int argc, char** argv) // bool getUntil (char, std::string&); t.diag ("Nibbler::getUntil"); n = Nibbler ("one two"); - t.ok (n.getUntil (' ', s), "'one two' : getUntil (' ') -> true"); - t.is (s, "one", "'one two' : getUntil (' ') -> 'one'"); - t.ok (n.getUntil (' ', s), " ' two' : getUntil (' ') -> true"); - t.is (s, "", " ' two' : getUntil (' ') -> ''"); - t.ok (n.skip (' '), " ' two' : skip (' ') -> true"); - t.ok (n.getUntil (' ', s), " 'two' : getUntil (' ') -> 'two'"); - t.ok (n.getUntil (' ', s), " '' : getUntil (' ') -> false"); - t.ok (n.depleted (), " '' : depleted () -> true"); + t.ok (n.getUntil (' ', s), " 'one two' : getUntil (' ') -> true"); + t.is (s, "one", " 'one two' : getUntil (' ') -> 'one'"); + t.ok (n.getUntil (' ', s), " ' two' : getUntil (' ') -> true"); + t.is (s, "", " ' two' : getUntil (' ') -> ''"); + t.ok (n.skip (' '), " ' two' : skip (' ') -> true"); + t.ok (n.getUntil (' ', s), " 'two' : getUntil (' ') -> 'two'"); + t.notok (n.getUntil (' ', s), " '' : getUntil (' ') -> false"); + t.ok (n.depleted (), " '' : depleted () -> true"); // bool getUntilOneOf (const std::string&, std::string&); t.diag ("Nibbler::getUntilOneOf"); n = Nibbler ("ab.cd"); - t.ok (n.getUntilOneOf (".:", s), " 'ab.cd' : getUntilOneOf ('.:') -> true"); - t.is (s, "ab", " 'ab.cd' : getUntilOneOf ('.:') -> 'ab'"); - t.ok (n.skipN (), " '.cd' : skipN () -> true"); - t.ok (n.getUntilOneOf (".:", s), " 'cd' : getUntilOneOf ('.:') -> true"); -// - t.ok (n.getUntilOneOf (".:", s), " '' : getUntilOneOf ('.:') -> false"); - t.ok (n.depleted (), " '' : depleted () -> true"); + t.ok (n.getUntilOneOf (".:", s), " 'ab.cd' : getUntilOneOf ('.:') -> true"); + t.is (s, "ab", " 'ab.cd' : getUntilOneOf ('.:') -> 'ab'"); + t.ok (n.skipN (), " '.cd' : skipN () -> true"); + t.ok (n.getUntilOneOf (".:", s), " 'cd' : getUntilOneOf ('.:') -> true"); + t.notok (n.getUntilOneOf (".:", s), " '' : getUntilOneOf ('.:') -> false"); + t.ok (n.depleted (), " '' : depleted () -> true"); // bool getUntil (const std::string&, std::string&); t.diag ("Nibbler::getUntil"); n = Nibbler ("ab\r\ncd"); + t.ok (n.getUntil ("\r\n", s), "'ab\\r\\ncd' : getUntil ('\\r\\n') -> true"); + t.ok (n.skipN (2), " '\\r\\ncd' : skipN (2) -> true"); + t.ok (n.getUntil ("\r\n", s), " 'cd' : getUntil ('\\r\\n') -> true"); + t.ok (n.depleted (), " '' : depleted () -> true"); // bool skipN (const int quantity = 1); t.diag ("Nibbler::skipN"); n = Nibbler ("abcde"); - t.ok (n.skipN (), " 'abcde' : skipN () -> true"); - t.ok (n.skipN (2), " 'bcde' : skipN (2 -> true"); - t.notok (n.skipN (3), " 'de' : skipN (3 -> false"); - t.notok (n.depleted (), " 'de' : depleted () -> true"); + t.ok (n.skipN (), " 'abcde' : skipN () -> true"); + t.ok (n.skipN (2), " 'bcde' : skipN (2 -> true"); + t.notok (n.skipN (3), " 'de' : skipN (3 -> false"); + t.notok (n.depleted (), " 'de' : depleted () -> true"); // bool skip (char); t.diag ("Nibbler::skip"); n = Nibbler (" a"); - t.ok (n.skip (' '), " ' a' : skip (' ') -> true"); - t.ok (n.skip (' '), " ' a' : skip (' ') -> true"); - t.notok (n.skip (' '), " 'a' : skip (' ') -> false"); - t.notok (n.depleted (), " 'a' : depleted () -> false"); -// - t.notok (n.skip ('a'), " '' : skip ('a') -> true"); - t.ok (n.depleted (), " '' : depleted () -> true"); + t.ok (n.skip (' '), " ' a' : skip (' ') -> true"); + t.ok (n.skip (' '), " ' a' : skip (' ') -> true"); + t.notok (n.skip (' '), " 'a' : skip (' ') -> false"); + t.notok (n.depleted (), " 'a' : depleted () -> false"); + t.ok (n.skip ('a'), " 'a' : skip ('a') -> true"); + t.ok (n.depleted (), " '' : depleted () -> true"); // bool skipAll (char); t.diag ("Nibbler::skipAll"); n = Nibbler ("aaaabb"); - t.ok (n.skipAll ('a'), " 'aaaabb' : skipAll ('a') -> true"); - t.notok (n.skipAll ('a'), " 'bb' : skipAll ('a') -> false"); - t.ok (n.skipAll ('b'), " 'bb' : skipAll ('b') -> true"); - t.notok (n.skipAll ('b'), " '' : skipAll ('b') -> false"); - t.ok (n.depleted (), " '' : depleted () -> true"); + t.ok (n.skipAll ('a'), " 'aaaabb' : skipAll ('a') -> true"); + t.notok (n.skipAll ('a'), " 'bb' : skipAll ('a') -> false"); + t.ok (n.skipAll ('b'), " 'bb' : skipAll ('b') -> true"); + t.notok (n.skipAll ('b'), " '' : skipAll ('b') -> false"); + t.ok (n.depleted (), " '' : depleted () -> true"); // bool skipAllOneOf (const std::string&); t.diag ("Nibbler::skipAllOneOf"); + n = Nibbler ("abababcc"); + t.ok (n.skipAllOneOf ("ab"), "'abababcc' : skipAllOneOf ('ab') -> true"); + t.notok (n.skipAllOneOf ("ab"), " 'cc' : skipAllOneOf ('ab') -> false"); + t.ok (n.skipAllOneOf ("c"), " 'cc' : skipAllOneOf ('ab') -> false"); + t.ok (n.depleted (), " '' : depleted () -> true"); // bool getQuoted (char, std::string&); t.diag ("Nibbler::getQuoted"); + n = Nibbler ("''"); + t.ok (n.getQuoted ('\'', s), " '''' : getQuoted (''') -> true"); + t.is (s, "", " '''' : getQuoted (''') -> ''"); + + n = Nibbler ("'\"'"); + t.ok (n.getQuoted ('\'', s), " ''\"'' : getQuoted (''') -> true"); + t.is (s, "\"", " ''\"'' : getQuoted (''') -> '\"'"); + + n = Nibbler ("'x'"); + t.ok (n.getQuoted ('\'', s), " ''x'' : getQuoted (''') -> true"); + t.is (s, "x", " ''x'' : getQuoted (''') -> ''"); + + n = Nibbler ("'x"); + t.notok (n.getQuoted ('\'', s), " ''x' : getQuoted (''') -> false"); + + n = Nibbler ("x"); + t.notok (n.getQuoted ('\'', s), " 'x' : getQuoted (''') -> false"); // bool getInt (int&); t.diag ("Nibbler::getInt"); + n = Nibbler ("123 -4"); + t.ok (n.getInt (i), " '123 -4' : getInt () -> true"); + t.is (i, 123, " '123 -4' : getInt () -> '123'"); + t.ok (n.skip (' '), " ' -4' : skip (' ') -> true"); + t.ok (n.getInt (i), " '-4' : getInt () -> true"); + t.is (i, -4, " '-4' : getInt () -> '-4'"); + t.ok (n.depleted (), " '' : depleted () -> true"); // bool getUnsignedInt (int&i); t.diag ("Nibbler::getUnsignedInt"); + n = Nibbler ("123 4"); + t.ok (n.getUnsignedInt (i), " '123 4' : getUnsignedInt () -> true"); + t.is (i, 123, " '123 4' : getUnsignedInt () -> '123'"); + t.ok (n.skip (' '), " ' 4' : skip (' ') -> true"); + t.ok (n.getUnsignedInt (i), " '4' : getUnsignedInt () -> true"); + t.is (i, 4, " '4' : getUnsignedInt () -> '4'"); + t.ok (n.depleted (), " '' : depleted () -> true"); // bool getUntilEOL (std::string&); t.diag ("Nibbler::getUntilEOL"); + n = Nibbler ("one\ntwo"); + t.ok (n.getUntilEOL (s), "'one\\ntwo' : getUntilEOL () -> true"); + t.is (s, "one", "'one\\ntwo' : getUntilEOL () -> 'one'"); + t.ok (n.skip ('\n'), " '\\ntwo' : skip ('\\n') -> true"); + t.ok (n.getUntilEOL (s), " 'two' : getUntilEOL () -> true"); + t.is (s, "two", " 'two' : getUntilEOL () -> 'two'"); + t.ok (n.depleted (), " '' : depleted () -> true"); // bool getUntilEOS (std::string&); t.diag ("Nibbler::getUntilEOS"); + n = Nibbler ("one two"); + t.ok (n.getUntilEOS (s), " 'one two' : getUntilEOS () -> 'one two'"); + t.ok (n.depleted (), " '' : depleted () -> true"); // bool depleted (); t.diag ("Nibbler::depleted"); n = Nibbler (" "); - t.notok (n.depleted (), " ' ' : depleted () -> false"); - t.ok (n.skipN (), " '' : skip () -> true"); - t.ok (n.depleted (), " '' : depleted () -> true"); + t.notok (n.depleted (), " ' ' : depleted () -> false"); + t.ok (n.skipN (), " '' : skip () -> true"); + t.ok (n.depleted (), " '' : depleted () -> true"); return 0; - -/* - n = Nibbler ("this is 'a test' of 123the,nibbler"); - t.ok (n.getUntilChar (' ', s), "nibble word"); - t.is (s, "this", "found 'this'"); - t.ok (n.skip (' '), "skip ws"); - t.ok (n.getUntilChar (' ', s), "nibble word"); - t.is (s, "is", "found 'is'"); - t.ok (n.skip (' '), "skip ws"); - t.ok (n.getQuoted ('\'', s), "nibble quoted"); - t.is (s, "a test", "found 'a test'"); - t.ok (n.skip (' '), "skip ws"); - t.ok (n.getUntilChar (' ', s), "nibble word"); - t.is (s, "of", "found 'of'"); - t.ok (n.skip (' '), "skip ws"); - t.ok (n.getInt (i), "nibble integer"); - t.is (i, 123, "found '123'"); - t.ok (n.getUntilChar (',', s), "nibble word"); - t.ok (n.skip (','), "skip ,"); - t.is (s, "the", "found 'the'"); - t.ok (n.getUntilEOS (s), "nibble remainder"); - t.is (s, "nibbler", "found 'nibbler'"); - - // Test EOS handling. - n = Nibbler ("xx"); - t.ok (n.skip ('x'), "skip x"); - t.ok (n.skip ('x'), "skip x"); - t.notok (n.skip ('x'), "skip x"); - - n = Nibbler ("aaaaaX"); - t.ok (n.skip (5), "aaaaaX -> skip 5 pass"); - t.notok (n.skip(2), "X -> skip 2 fail"); - t.ok (n.skip (), "X -> skip pass"); - - n = Nibbler ("aaaaaa"); - t.ok (n.skipAll ('a'), "aaaaaa -> skipAll 'a' pass"); - - n = Nibbler ("aabbabab"); - t.ok (n.skipAllChars ("ab"), "aabbabab -> skipAllChars 'ab' pass"); - - n = Nibbler ("abcX"); - t.ok (n.skipAllChars ("abc"), "abcX -> skipChars abc pass"); - t.notok (n.skipAllChars ("abc"), "X -> skipChars abc fail"); - - n = Nibbler ("-123+456 789"); - t.ok (n.getInt (i), "-123+456 789 -> getInt pass"); - t.is (i, -123, "-123+456 789 -> -123 pass"); - t.notok (n.getUnsignedInt (i), "+456 789 -> getUnsignedInt fail"); - t.ok (n.getInt (i), "+456 789 -> getInt pass"); - t.is (i, 456, "+456 789 -> getInt pass"); - t.ok (n.skip (' '), "\\s789 -> skip ' ' pass"); - t.ok (n.getUnsignedInt (i), "789 -> getUnsignedInt pass"); - t.is (i, 789, "789 -> getInt pass"); - - n = Nibbler ("123"); - t.ok (n.getInt (i), "123 -> getInt pass"); - t.is (i, 123, "123 -> getInt 123 pass"); - - n = Nibbler ("abc\nd"); - t.ok (n.getUntilEOL (s), "abc\\nd -> getUntilEOL pass"); - t.is (s, "abc", "abc\\nd -> getUntilEOL abc pass"); - - n = Nibbler ("abcba'foo"); - t.ok (n.getQuoted ('a', s), "abcba'foo -> getQuoted 'a' pass"); - t.is (s, "bcb", "abcba'foo -> getQuoted 'a' bcb pass"); - t.notok (n.getQuoted ('\'', s), "'foo -> getQuoted '\\'' fail"); - - n = Nibbler ("abcde"); - t.ok (n.getUntilChars ("ed", s), "abcde -> getUntilChars 'ed' pass"); - t.is (s, "abc", "abcde -> getUntilChars 'ed abc pass"); - - n = Nibbler ("abcde"); - t.ok (n.getUntilString ("de", s), "abcde -> getUntilString 'de' pass"); - t.is (s, "abc", "abcde -> getUntilString 'de abc pass"); - - n = Nibbler ("aa"); - t.notok (n.depleted (), "'aa' -> not depleted pass"); - t.ok (n.skip ('a'), "aa -> skip 'a' pass"); - t.ok (n.skip ('a'), "aa -> skip 'a' pass"); - t.ok (n.depleted (), "'' -> depleted pass"); -*/ } ////////////////////////////////////////////////////////////////////////////////