sbool mmo2_match(MMOPattern pattern, S s) { ret mmo2_match(pattern, s, false, false); } sbool mmo2_match(MMOPattern pattern, S s, bool startOfLine, bool endOfLine) { ifdef mmo2_match_debug printFunctionCall mmo2_match_debug(pattern, s, startOfLine, endOfLine); endifdef if (pattern == null) false; S s2 = trim(s); if (pattern cast MMOPattern.StartOfLine) ret mmo2_match(pattern.p, s2, true, endOfLine); if (pattern cast MMOPattern.EndOfLine) ret mmo2_match(pattern.p, s2, startOfLine, true); if (pattern cast MMOPattern.Phrase) { S p = pattern.phrase; if (pattern.quoted) ret cicWithSmartWordBoundary(s2, p); if (startsWith(p, "#")) ret eqic(p, s2); ret match3_startOrEndOfLine(p, s2, startOfLine, endOfLine); } if (pattern cast MMOPattern.And) ret all(pattern.l, pat -> mmo2_match(pat, s2, startOfLine, endOfLine)); if (pattern cast MMOPattern.Or) ret any(pattern.l, pat -> mmo2_match(pat, s2, startOfLine, endOfLine)); if (pattern cast MMOPattern.Not) ret !mmo2_match(pattern.p, s2, startOfLine, endOfLine); fail("what. " + pattern); } sbool mmo2_match(S pattern, S s) { ret mmo2_match(mmo2_parsePattern(pattern), s); }