]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Added ability to manage ranges to CharacterSet
authorFrancesco Chemolli <kinkie@squid-cache.org>
Mon, 30 Dec 2013 07:05:21 +0000 (08:05 +0100)
committerFrancesco Chemolli <kinkie@squid-cache.org>
Mon, 30 Dec 2013 07:05:21 +0000 (08:05 +0100)
src/base/CharacterSet.cc
src/base/CharacterSet.h
src/base/testCharacterSet.cc
src/base/testCharacterSet.h

index 1c6df2f53811bb882a077afd87cc5a8384e9ee3c..31a45fb0367f2ca01617fe6640173dfeea3b3cc1 100644 (file)
@@ -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<uint8_t>(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<uint8_t>(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"),
index cbe0bbe326ae038d33a123ba4a25164a85f1f97c..003ea88eb8d2e39017ca583ad0ae148f77c0f799 100644 (file)
@@ -8,19 +8,29 @@ class CharacterSet
 {
 public:
     typedef std::vector<uint8_t> Storage;
+    typedef std::vector<std::pair<unsigned char, unsigned char> > 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<uint8_t>(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:
     // <space><tab>
     static const CharacterSet WSP;
 
-
 private:
     /** index of characters in this set
      *
index 6c4cf53017e211aee80d9af2962a9db0dc9aeae2..702d26317d8cd5f75dfa69f42442036ee7588463 100644 (file)
@@ -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']);
+}
index f2c2c3b017c1145957fd4fd9506194f1d2e0a7d2..dd4319e3ae450ee44819a94e8b0d6bbd32c859ef 100644 (file)
@@ -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 */