Warning: session_start(): open(/var/lib/php/sessions/sess_1goo468brhprlrhs5ckp09r392, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
static bool flexMatchIC2_debug;
static bool flexMatchIC2(S pat, S s) {
ret flexMatchIC2(pat, s, null);
}
static bool flexMatchIC2(S pat, S s, Matches m) {
assertNotNull("Pattern is null", pat);
if (s == null) false;
ret flexMatchIC2(javaTok(pat), javaTok(s), m;
}
static bool flexMatchIC2(L tokpat, L tokfull, Matches m) {
tokpat = codeTokens(joinBrackets(tokpat));
for (int i = 0; i < l(tokpat); i++)
if (eq(tokpat.get(i), "*"))
tokpat.add(i++, "!*"); // insert single-token wildcard in front to avoid empty matches
tokfull = joinBrackets(tokfull);
L tok = codeTokens(tokfull);
new BitSet bla; // bla marks long matches
new BitSet bla2; // bla2 marks (a|b) matches and start of long matches
if (!flexMatchIC2_impl(tokpat, 0, tok, 0, bla, bla2)) ret false;
if (m != null) {
new L l;
for (int i = 1; i < l(tokfull); i += 2) {
if (bla.get(i/2)) {
int j = i;
while (j < l(tokfull) && bla.get(j/2) && !bla2.get(j/2)) j += 2;
l.add(join(subList(tokfull, i, j-1)));
i = j-2;
} else if (bla2.get(i/2))
l.add(tokfull.get(i));
}
m.m = toStringArray(l);
}
ret true;
}
static bool flexMatchIC2_impl(L pat, int ipat, L tok, int itok, BitSet bla, BitSet bla2) {
if (flexMatchIC2_debug)
print("flexMatchIC2 pat=" + structure(subList(pat, ipat)) + " tok=" + structure(subList(tok, itok)) + " " + structure(bla));
if (ipat >= l(pat))
ret itok >= l(tok);
S t = pat.get(ipat);
if (eq(t, "*")) { // the flex wildcard (0 or more tokens)
if (flexMatchIC2_debug) print("Trying zero tokens");
if (flexMatchIC2_impl(pat, ipat+1, tok, itok, bla, bla2)) {
if (flexMatchIC2_debug) print("Success!");
ret true;
}
bla.set(itok);
if (itok < l(tok)) {
if (flexMatchIC2_debug) print("Trying one or more tokens");
if (flexMatchIC2_impl(pat, ipat, tok, itok+1, bla, bla2)) {
if (flexMatchIC2_debug) print("Success!");
ret true; // success, leave mark
}
}
if (flexMatchIC2_debug) print("Failed * matching");
bla.clear(itok); // fail, undo marking
ret false;
}
if (itok >= l(tok)) {
if (flexMatchIC2_debug)
print("too much pattern");
ret false;
}
if (eq(t, "!*")) { // the single-token wildcard
bla.set(itok);
bla2.set(itok);
if (flexMatchIC2_impl(pat, ipat+1, tok, itok+1, bla, bla2))
ret true; // success, leave mark
bla.clear(itok); // fail, undo marking
bla2.clear(itok);
ret false;
}
S realt = tok.get(itok);
if (t.startsWith("(") && t.endsWith(")")) {
// quick pre-check
if (flexMatchIC2_debug)
print("flexMatchIC2 precheck " + t + " " + realt);
if (!containsIgnoreCase(t, realt)) false;
// real check
L list = splitAt(dropFirstAndLast(t), "|");
if (flexMatchIC2_debug)
print("flexMatchIC2 real check " + struct(list));
if (!containsIgnoreCase(list, realt)) false;
bla2.set(itok);
} else if (neqic(realt, t)) {
if (flexMatchIC2_debug)
print("mismatch");
ret false;
}
// it is a token match. consume and proceed
if (flexMatchIC2_impl(pat, ipat+1, tok, itok+1, bla, bla2))
true;
else {
bla2.clear(itok);
false;
}
}