]> granicus.if.org Git - re2c/commitdiff
Now range internals are only visible to union/difference functions.
authorUlya Trofimovich <skvadrik@gmail.com>
Mon, 15 Jun 2015 13:31:26 +0000 (14:31 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Mon, 15 Jun 2015 13:31:26 +0000 (14:31 +0100)
Ranges must be constructed so that linked ranges don't overlap and
are monotonous. This is always true for one-link ranges created by
range constructor, and we construct larger ranges from them using
union and difference functions (that maintain the invariant).

re2c/src/ir/bytecode/calc_size.cc
re2c/src/ir/bytecode/compile.cc
re2c/src/ir/bytecode/split.cc
re2c/src/ir/regexp/encoding/utf16/utf16_regexp.cc
re2c/src/ir/regexp/encoding/utf8/utf8_regexp.cc
re2c/src/util/range.cc
re2c/src/util/range.h

index fc90e7e89abfc54105f6574397bf9966365b12ff..4daeb7054ac2842d171d1a24b007e55e57b66c90 100644 (file)
@@ -45,9 +45,9 @@ void CloseVOp::calcSize (Char * rep)
 void MatchOp::calcSize (Char * rep)
 {
        size = 1;
-       for (Range * r = match; r; r = r->next)
+       for (Range * r = match; r; r = r->next ())
        {
-               for (uint32_t c = r->lb; c < r->ub; ++c)
+               for (uint32_t c = r->lower (); c < r->upper (); ++c)
                {
                        if (rep[c] == c)
                        {
index 2f4609bff42843051ca64d988f187ba50b69a062..f7f6aa93f9b82725cf05714bb2b7cf059083d563 100644 (file)
@@ -176,9 +176,9 @@ uint32_t MatchOp::compile (Char * rep, Ins * i)
                i->i.link = &i[size];
                Ins *j = &i[1];
                uint32_t bump = size;
-               for (Range *r = match; r; r = r->next)
+               for (Range *r = match; r; r = r->next ())
                {
-                       for (uint32_t c = r->lb; c < r->ub; ++c)
+                       for (uint32_t c = r->lower (); c < r->upper (); ++c)
                        {
                                if (rep[c] == c)
                                {
index 7e0bc6d1d6768cc5e217a615f309f2a6f1a55d51..5300d45de1446b88701a665cf105ece6d451872b 100644 (file)
@@ -32,9 +32,9 @@ void CloseVOp::split (CharSet & s)
 
 void MatchOp::split (CharSet & s)
 {
-       for (Range *r = match; r; r = r->next)
+       for (Range *r = match; r; r = r->next ())
        {
-               for (uint32_t c = r->lb; c < r->ub; ++c)
+               for (uint32_t c = r->lower (); c < r->upper (); ++c)
                {
                        CharPtn * x = s.rep[c];
                        CharPtn * a = x->nxt;
index 2e7f69df8bcadb53b2350196ec15c50d26b26c17..8b7e2bd5aefa301c14d02bbe56637d6c8c979a63 100644 (file)
@@ -27,8 +27,8 @@ RegExp * UTF16Symbol(utf16::rune r)
 RegExp * UTF16Range(const Range * r)
 {
        RangeSuffix * root = NULL;
-       for (; r != NULL; r = r->next)
-               UTF16splitByRuneLength(root, r->lb, r->ub - 1);
+       for (; r != NULL; r = r->next ())
+               UTF16splitByRuneLength(root, r->lower (), r->upper () - 1);
        return emit(root, NULL);
 }
 
index 0e6001d3787046a94d10d8e36adb1820e2429856..1372211fdd64a8d03d6237babd341f0f8ece16c8 100644 (file)
@@ -25,8 +25,8 @@ RegExp * UTF8Symbol(utf8::rune r)
 RegExp * UTF8Range(const Range * r)
 {
        RangeSuffix * root = NULL;
-       for (; r != NULL; r = r->next)
-               UTF8splitByRuneLength(root, r->lb, r->ub - 1);
+       for (; r != NULL; r = r->next ())
+               UTF8splitByRuneLength(root, r->lower (), r->upper () - 1);
        return emit(root, NULL);
 }
 
index bc3af9736efd5897aa47444189708565c54486b0..92a5bead8755b7d5b43c03c63a549fca577fc5af 100644 (file)
@@ -28,7 +28,7 @@ Range * range_union (Range * r1, Range * r2)
                uint32_t ub = r1->ub;
                if (r2->lb < r1->ub)
                {
-                       for (; r2 && r2->lb < r1->ub; r2 = r2->next)
+                       for (; r2 && r2->lb < r1->ub; r2 = r2->nx)
                        {
                                if (r1->ub < r2->ub)
                                {
@@ -37,8 +37,8 @@ Range * range_union (Range * r1, Range * r2)
                        }
                }
                * p = new Range (r1->lb, ub);
-               p = &(* p)->next;
-               r1 = r1->next;
+               p = &(* p)->nx;
+               r1 = r1->nx;
        }
        return r;
 }
@@ -47,23 +47,23 @@ Range * range_diff (Range * r1, Range * r2)
 {
        Range * r = NULL;
        Range ** p = &r;
-       for (; r1; r1 = r1->next)
+       for (; r1; r1 = r1->nx)
        {
-               for (; r2 && r2->ub <= r1->lb; r2 = r2->next);
+               for (; r2 && r2->ub <= r1->lb; r2 = r2->nx);
                uint32_t lb = r1->lb;
-               for (; r2 && r2->lb < r1->ub; r2 = r2->next)
+               for (; r2 && r2->lb < r1->ub; r2 = r2->nx)
                {
                        if (lb < r2->lb)
                        {
                                * p = new Range(lb, r2->lb);
-                               p = &(* p)->next;
+                               p = &(* p)->nx;
                        }
                        lb = r2->ub;
                }
                if (lb < r1->ub)
                {
                        * p = new Range(lb, r1->ub);
-                       p = &(* p)->next;
+                       p = &(* p)->nx;
                }
        }
        return r;
index 639d7f068512452fcca62dfd4dae8f962d02950d..b768cf23e9d08627901b5e6506be7238b391b36b 100644 (file)
 namespace re2c
 {
 
-struct Range
+class Range
 {
+public:
        static free_list<Range*> vFreeList;
 
-       Range * next;
+private:
+       Range * nx;
        // [lb,ub)
        uint32_t lb;
        uint32_t ub;
 
+public:
        Range (uint32_t l, uint32_t u)
-               : next (NULL)
+               : nx (NULL)
                , lb (l)
                , ub (u)
        {
@@ -30,13 +33,15 @@ struct Range
        {
                vFreeList.erase (this);
        }
+       Range * next () const { return nx; }
+       uint32_t lower () const { return lb; }
+       uint32_t upper () const { return ub; }
+       friend Range * range_union (Range * r1, Range * r2);
+       friend Range * range_diff (Range * r1, Range * r2);
 
        FORBID_COPY (Range);
 };
 
-Range * range_union (Range * r1, Range * r2);
-Range * range_diff (Range * r1, Range * r2);
-
 } // end namespace re2c
 
 #endif // _RE2C_UTIL_RANGE_