]> granicus.if.org Git - re2c/commitdiff
Construct non-NULL regexps from NULL ranges (for variable-length encodings).
authorUlya Trofimovich <skvadrik@gmail.com>
Mon, 15 Jun 2015 14:39:29 +0000 (15:39 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Mon, 15 Jun 2015 14:39:29 +0000 (15:39 +0100)
NULL range represents empty range: range union and difference functions
return NULL for empty ranges. Thus NULL can be passed to functions
that construct regexp from range ('MatchOp', 'UTF8Range' and 'UTF16Range').
All these functions must behave return non-NULL for NULL ranges, since
further code relies on this.

re2c/src/ir/regexp/encoding/range_suffix.cc
re2c/src/ir/regexp/encoding/range_suffix.h
re2c/src/ir/regexp/encoding/utf16/utf16_regexp.cc
re2c/src/ir/regexp/encoding/utf8/utf8_regexp.cc

index 96615927697114c56964420dcbe0eb9fbbb7c0c6..878984913b3256c5092c49c226d18d0bf79998e6 100644 (file)
@@ -4,8 +4,17 @@
 
 namespace re2c {
 
+static RegExp * emit (RangeSuffix * p, RegExp * re);
+
 free_list<RangeSuffix *> RangeSuffix::freeList;
 
+RegExp * to_regexp (RangeSuffix * p)
+{
+       return p
+               ? emit (p, NULL)
+               : new MatchOp (NULL);
+}
+
 /*
  * Build regexp from suffix tree.
  */
index 9300897788e6d791da3ce9cdd2efa5866143c561..f4c0e96b511a1c6521648ab49fc9a4b12349c829 100644 (file)
@@ -33,7 +33,7 @@ public:
        FORBID_COPY (RangeSuffix);
 };
 
-RegExp * emit(RangeSuffix * p, RegExp * re);
+RegExp * to_regexp (RangeSuffix * p);
 
 } // namespace re2c
 
index 8b7e2bd5aefa301c14d02bbe56637d6c8c979a63..49522657d302e6a0105ef21af7b45baccc73b566 100644 (file)
@@ -29,7 +29,7 @@ RegExp * UTF16Range(const Range * r)
        RangeSuffix * root = NULL;
        for (; r != NULL; r = r->next ())
                UTF16splitByRuneLength(root, r->lower (), r->upper () - 1);
-       return emit(root, NULL);
+       return to_regexp (root);
 }
 
 } // namespace re2c
index 1372211fdd64a8d03d6237babd341f0f8ece16c8..084755fa25ac2f900636706483f1538776389ae6 100644 (file)
@@ -27,7 +27,7 @@ RegExp * UTF8Range(const Range * r)
        RangeSuffix * root = NULL;
        for (; r != NULL; r = r->next ())
                UTF8splitByRuneLength(root, r->lower (), r->upper () - 1);
-       return emit(root, NULL);
+       return to_regexp (root);
 }
 
 } // namespace re2c