summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-06-27 12:24:24 -0700
committerKaz Kylheku <kaz@kylheku.com>2021-06-27 12:24:24 -0700
commit5d2ef0c1daf3d44db1acea0d201712a7b45875ea (patch)
treec853c1fb4a00bedf0b7aad097c6f5dab83e1f3e6
parent4649efb0b4eeb1515bc92711ecb65a2bce23d202 (diff)
downloadtxr-5d2ef0c1daf3d44db1acea0d201712a7b45875ea.tar.gz
txr-5d2ef0c1daf3d44db1acea0d201712a7b45875ea.tar.bz2
txr-5d2ef0c1daf3d44db1acea0d201712a7b45875ea.zip
regex-from-trie: correctly handle empty trie.
* filter.c (regex_from_trie): An empty trie matches nothing, so we must return the t regex syntax (match nothing), not nil (match empty string). A hash-based trie matches nothing if it is empty; but if it has user data, then it matches the empty string. * tests/015/trie.tl: Test cases added.
-rw-r--r--filter.c4
-rw-r--r--tests/015/trie.tl4
2 files changed, 6 insertions, 2 deletions
diff --git a/filter.c b/filter.c
index a8f0b787..348a697c 100644
--- a/filter.c
+++ b/filter.c
@@ -121,7 +121,7 @@ static val regex_from_trie(val trie)
{
switch (type(trie)) {
case NIL:
- return nil;
+ return t;
case CONS:
{
val a = car(trie);
@@ -145,7 +145,7 @@ static val regex_from_trie(val trie)
case COBJ:
if (trie->co.cls == hash_s) {
if (zerop(hash_count(trie))) {
- return nil;
+ return tnil(!get_hash_userdata(trie));
} else {
val out = nil;
val cell;
diff --git a/tests/015/trie.tl b/tests/015/trie.tl
index de88a797..c145c060 100644
--- a/tests/015/trie.tl
+++ b/tests/015/trie.tl
@@ -52,3 +52,7 @@
(mvtest
(build (each ((d dat)) (add [rx1 d]))) dat
(build (each ((n ndt)) (add [rx1 n]))) (repeat '(nil) (len dat)))
+
+(mtest
+ (regex-from-trie (make-trie)) t
+ (regex-from-trie (trie-compress (make-trie))) t)