From: Francesco Chemolli Date: Mon, 30 Dec 2013 07:05:21 +0000 (+0100) Subject: Added ability to manage ranges to CharacterSet X-Git-Tag: SQUID_3_5_0_1~439^2~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8664ceb454261f42f30e68c8985d4d3c14c68936;p=thirdparty%2Fsquid.git Added ability to manage ranges to CharacterSet --- diff --git a/src/base/CharacterSet.cc b/src/base/CharacterSet.cc index 1c6df2f538..31a45fb036 100644 --- a/src/base/CharacterSet.cc +++ b/src/base/CharacterSet.cc @@ -32,13 +32,16 @@ CharacterSet::add(const unsigned char c) } CharacterSet & -CharacterSet::addRange(const unsigned char low, const unsigned char high) +CharacterSet::addRange(const RangeSpec & v) { - assert(low <= high); - unsigned char c = low; - while (c <= high) { - chars_[static_cast(c)] = 1; - ++c; + for (RangeSpec::const_iterator i = v.begin(); i != v.end(); ++i) { + assert(i->first <= i->second); + unsigned char c = i->first; + unsigned char high = i->second; + while (c <= high) { + chars_[static_cast(c)] = 1; + ++c; + } } return *this; } @@ -51,9 +54,16 @@ CharacterSet::CharacterSet(const char *label, const char * const c) add(c[i]); } +CharacterSet::CharacterSet(const char *label, const RangeSpec & ranges) +: CharacterSet(label,"") +{ + addRange(ranges); +} + const CharacterSet -CharacterSet::ALPHA("ALPHA","ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"), +CharacterSet::ALPHA("ALPHA", {{ 'a', 'z' }, { 'A', 'Z'} }), CharacterSet::BIT("BIT","01"), +CharacterSet::CHAR("CHAR",{{ 1, 127}}), CharacterSet::CRLF("CRLF","\r\n"), CharacterSet::DIGIT("DIGIT","0123456789"), CharacterSet::HEXDIG("HEXDIG","0123456789aAbBcCdDeEfF"), diff --git a/src/base/CharacterSet.h b/src/base/CharacterSet.h index cbe0bbe326..003ea88eb8 100644 --- a/src/base/CharacterSet.h +++ b/src/base/CharacterSet.h @@ -8,19 +8,29 @@ class CharacterSet { public: typedef std::vector Storage; + typedef std::vector > RangeSpec; /// define a character set with the given label ("anonymous" if NULL) /// with specified initial contents CharacterSet(const char *label, const char * const initial); + /// define a character set with the given label ("anonymous" if NULL) + /// containing characters defined in the supplied ranges + /// \see addRange + CharacterSet(const char *label, const RangeSpec &); + /// whether a given character exists in the set bool operator[](unsigned char c) const {return chars_[static_cast(c)] != 0;} /// add a given character to the character set CharacterSet & add(const unsigned char c); - /// add a character range to the set from low to high included - CharacterSet & addRange(const unsigned char low, const unsigned char high); + /** add a list of character ranges, expressed as pairs [low,high] + * + * Both ends of the specified ranges are included in the added set + * e.g. addRange(RangeSpec( { { '0','9'}, { 'a', 'z' } ) ) + */ + CharacterSet & addRange(const RangeSpec &); /// add all characters from the given CharacterSet to this one CharacterSet &operator +=(const CharacterSet &src); @@ -35,6 +45,8 @@ public: static const CharacterSet ALPHA; // 0-1 static const CharacterSet BIT; + // any 7-bit US-ASCII character, except for NUL + static const CharacterSet CHAR; // CRLF static const CharacterSet CRLF; // 0-9 @@ -44,7 +56,6 @@ public: // static const CharacterSet WSP; - private: /** index of characters in this set * diff --git a/src/base/testCharacterSet.cc b/src/base/testCharacterSet.cc index 6c4cf53017..702d26317d 100644 --- a/src/base/testCharacterSet.cc +++ b/src/base/testCharacterSet.cc @@ -46,9 +46,19 @@ void testCharacterSet::CharacterSetAddRange() { CharacterSet t("test",""); - t.addRange('0','9'); + t.addRange(CharacterSet::RangeSpec( { { '0','9'} } ) ); CPPUNIT_ASSERT_EQUAL(true,t['0']); CPPUNIT_ASSERT_EQUAL(true,t['5']); CPPUNIT_ASSERT_EQUAL(true,t['9']); CPPUNIT_ASSERT_EQUAL(false,t['a']); } + +void +testCharacterSet::CharacterSetConstants() +{ + CPPUNIT_ASSERT_EQUAL(true,CharacterSet::ALPHA['a']); + CPPUNIT_ASSERT_EQUAL(true,CharacterSet::ALPHA['z']); + CPPUNIT_ASSERT_EQUAL(true,CharacterSet::ALPHA['A']); + CPPUNIT_ASSERT_EQUAL(true,CharacterSet::ALPHA['Z']); + CPPUNIT_ASSERT_EQUAL(false,CharacterSet::ALPHA['5']); +} diff --git a/src/base/testCharacterSet.h b/src/base/testCharacterSet.h index f2c2c3b017..dd4319e3ae 100644 --- a/src/base/testCharacterSet.h +++ b/src/base/testCharacterSet.h @@ -11,12 +11,14 @@ class testCharacterSet : public CPPUNIT_NS::TestFixture CPPUNIT_TEST( CharacterSetConstruction ); CPPUNIT_TEST( CharacterSetAdd ); CPPUNIT_TEST( CharacterSetAddRange ); + CPPUNIT_TEST( CharacterSetConstants ); CPPUNIT_TEST_SUITE_END(); protected: void CharacterSetConstruction(); void CharacterSetAdd(); void CharacterSetAddRange(); + void CharacterSetConstants(); }; #endif /* SQUID_BASE_TESTCHARACTERSET_H */