Bugfix for glob pattern with empty alternative.

This commit is contained in:
Matthias Koefferlein 2019-10-16 01:10:08 +02:00
parent 991778f718
commit a3b2e3a154
2 changed files with 57 additions and 0 deletions

View File

@ -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<std::string> *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;

View File

@ -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)