From a3b2e3a154e8260b147374c5c2fe1d6187b72f5f Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Wed, 16 Oct 2019 01:10:08 +0200 Subject: [PATCH] Bugfix for glob pattern with empty alternative. --- src/tl/tl/tlGlobPattern.cc | 34 +++++++++++++++++++++++++ src/tl/unit_tests/tlGlobPatternTests.cc | 23 +++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/src/tl/tl/tlGlobPattern.cc b/src/tl/tl/tlGlobPattern.cc index cf27d70cb..9e52c3f7d 100644 --- a/src/tl/tl/tlGlobPattern.cc +++ b/src/tl/tl/tlGlobPattern.cc @@ -238,6 +238,38 @@ private: GlobPatternString &operator= (const GlobPatternString &); }; +class GlobPatternEmpty + : public GlobPatternOp +{ +public: + GlobPatternEmpty () + : GlobPatternOp () + { + // .. nothing yet .. + } + + virtual GlobPatternOp *clone () const + { + GlobPatternEmpty *op = new GlobPatternEmpty (); + init_clone (op); + return op; + } + + virtual bool is_const () const + { + return next () == 0; + } + + virtual bool match (const char *s, std::vector *e) const + { + return GlobPatternOp::match (s, e); + } + +private: + GlobPatternEmpty (const GlobPatternEmpty &); + GlobPatternEmpty &operator= (const GlobPatternString &); +}; + class GlobPatternPass : public GlobPatternOp { @@ -602,6 +634,8 @@ compile_emit_alt (GlobPatternOp *&op_head, GlobPatternOp *&op, const char *&p, b GlobPatternOp *alt = compile (p, false, cs, false, true); if (alt) { alt_op->add_choice (alt); + } else { + alt_op->add_choice (new GlobPatternEmpty ()); } if (*p == ',') { ++p; diff --git a/src/tl/unit_tests/tlGlobPatternTests.cc b/src/tl/unit_tests/tlGlobPatternTests.cc index d53ef95e8..80dacc9a7 100644 --- a/src/tl/unit_tests/tlGlobPatternTests.cc +++ b/src/tl/unit_tests/tlGlobPatternTests.cc @@ -163,6 +163,7 @@ TEST(6) EXPECT_EQ (a.match ("abcg"), true); EXPECT_EQ (a.match ("adg"), true); + EXPECT_EQ (a.match ("ad"), false); EXPECT_EQ (a.match ("ag"), false); EXPECT_EQ (a.match ("abch"), false); EXPECT_EQ (a.match ("adh"), false); @@ -173,11 +174,33 @@ TEST(6) EXPECT_EQ (aa.match ("abcg"), true); EXPECT_EQ (aa.match ("adg"), true); + EXPECT_EQ (aa.match ("ad"), false); EXPECT_EQ (aa.match ("ag"), false); EXPECT_EQ (aa.match ("abch"), false); EXPECT_EQ (aa.match ("adh"), false); EXPECT_EQ (aa.match ("ah"), false); + a = tl::GlobPattern ("a{,d}g"); + + EXPECT_EQ (a.match ("abcg"), false); + EXPECT_EQ (a.match ("ad"), false); + EXPECT_EQ (a.match ("adg"), true); + EXPECT_EQ (a.match ("ag"), true); + EXPECT_EQ (a.match ("a"), false); + EXPECT_EQ (a.match ("abch"), false); + EXPECT_EQ (a.match ("adh"), false); + EXPECT_EQ (a.match ("ah"), false); + + a = tl::GlobPattern ("a{,d}"); + + EXPECT_EQ (a.match ("abcg"), false); + EXPECT_EQ (a.match ("ad"), true); + EXPECT_EQ (a.match ("adg"), false); + EXPECT_EQ (a.match ("ag"), false); + EXPECT_EQ (a.match ("a"), true); + EXPECT_EQ (a.match ("abch"), false); + EXPECT_EQ (a.match ("adh"), false); + EXPECT_EQ (a.match ("ah"), false); } TEST(7)