private static BlockSet getNamedClass(String name) { if (!namesInitialized) initNames(); return namedClasses.get(name); } /*
static void makeWordEnd(Term term, boolean unicode) { makeWordChar(term, true, unicode); term.type = unicode ? UDIRECTION : DIRECTION; }
return CharacterClass.parseClass(data, i, out, term, (flags & IGNORE_CASE) > 0, (flags & IGNORE_SPACES) > 0, (flags & UNICODE) > 0, (flags & XML_SCHEMA) > 0); c = (char) ((CharacterClass.toHexDigit(data[i++]) << 12) + (CharacterClass.toHexDigit(data[i++]) << 8) + (CharacterClass.toHexDigit(data[i++]) << 4) + CharacterClass.toHexDigit(data[i++])); else { c = '\0'; if ((d = data[i++]) == '{') { while (i < out && (d = data[i++]) != '}') { hex = (hex << 4) + CharacterClass.toHexDigit(d); if (hex > 0xffff || i == out) throw new PatternSyntaxException("\\x{<out of range or incomplete>}"); hex = (CharacterClass.toHexDigit(d) << 4) + CharacterClass.toHexDigit(data[i++]); CharacterClass.makeDigit(term, inv, (flags & UNICODE) > 0); return i; CharacterClass.makeSpace(term, inv, (flags & UNICODE) > 0); return i; CharacterClass.makeWordChar(term, inv, (flags & UNICODE) > 0); return i; inv = true; case 'h':
if (bs1 == null) bs1 = new BlockSet(); else bs1.reset(); i = parseClass(data, i, out, bs1, icase, skipspaces, unicode, xml); bs.subtract(bs1); inRange = false; c = (char) ((toHexDigit(data[i++]) << 12) + (toHexDigit(data[i++]) << 8) + (toHexDigit(data[i++]) << 4) + toHexDigit(data[i++])); break handle_special; if ((d = data[i++]) == '{') { while (i < out && (d = data[i++]) != '}') { hex = (hex << 4) + toHexDigit(d); } else { if(i >= out - 2) throw new PatternSyntaxException("incomplete escape sequence \\xHH"); hex = (toHexDigit(d) << 4) + toHexDigit(data[i++]); if (sb == null) sb = new StringBuilder(); else sb.setLength(0); i = parseName(data, i, out, sb, skipspaces); BlockSet nc = getNamedClass(sb.toString()); if (nc == null) throw new PatternSyntaxException("unknown named class: {" + sb + "}"); bs.add(nc, inv);
private static void initNames() { initNamedCategory("C"); initNamedCategory("Cn"); initNamedCategory("Cc"); initNamedCategory("Cf"); initNamedCategory("Co"); initNamedCategory("Cs"); initNamedCategory("L"); initNamedCategory("Lu"); initNamedCategory("Ll"); initNamedCategory("Lt"); initNamedCategory("Lm"); initNamedCategory("Lo"); initNamedCategory("M"); initNamedCategory("Mn"); initNamedCategory("Me"); initNamedCategory("Mc"); initNamedCategory("N"); initNamedCategory("Nd"); initNamedCategory("Nl"); initNamedCategory("No"); initNamedCategory("Z"); initNamedCategory("Zs"); initNamedCategory("Zl"); initNamedCategory("Zp"); initNamedCategory("Zh");
static int parseName(char[] data, int i, int out, Term term, boolean inverse, boolean skipspaces) throws PatternSyntaxException { StringBuilder sb = new StringBuilder(); i = parseName(data, i, out, sb, skipspaces); BlockSet bs = getNamedClass(sb.toString()); if (bs == null) throw new PatternSyntaxException("unknown class: {" + sb + "}"); BlockSet.unify(bs, term); term.inverse = inverse; return i; }
return CharacterClass.parseClass(data, i, out, term, (flags & IGNORE_CASE) > 0, (flags & IGNORE_SPACES) > 0, (flags & UNICODE) > 0, (flags & XML_SCHEMA) > 0); c = (char) ((CharacterClass.toHexDigit(data[i++]) << 12) + (CharacterClass.toHexDigit(data[i++]) << 8) + (CharacterClass.toHexDigit(data[i++]) << 4) + CharacterClass.toHexDigit(data[i++])); else { c = '\0'; if ((d = data[i++]) == '{') { while (i < out && (d = data[i++]) != '}') { hex = (hex << 4) + CharacterClass.toHexDigit(d); if (hex > 0xffff || i == out) throw new PatternSyntaxException("\\x{<out of range or incomplete>}"); hex = (CharacterClass.toHexDigit(d) << 4) + CharacterClass.toHexDigit(data[i++]); CharacterClass.makeDigit(term, inv, (flags & UNICODE) > 0); return i; CharacterClass.makeSpace(term, inv, (flags & UNICODE) > 0); return i; CharacterClass.makeWordChar(term, inv, (flags & UNICODE) > 0); return i; inv = true; case 'h':
if (bs1 == null) bs1 = new BlockSet(); else bs1.reset(); i = parseClass(data, i, out, bs1, icase, skipspaces, unicode, xml); bs.subtract(bs1); inRange = false; c = (char) ((toHexDigit(data[i++]) << 12) + (toHexDigit(data[i++]) << 8) + (toHexDigit(data[i++]) << 4) + toHexDigit(data[i++])); break handle_special; if ((d = data[i++]) == '{') { while (i < out && (d = data[i++]) != '}') { hex = (hex << 4) + toHexDigit(d); } else { if(i >= out - 2) throw new PatternSyntaxException("incomplete escape sequence \\xHH"); hex = (toHexDigit(d) << 4) + toHexDigit(data[i++]); if (sb == null) sb = new StringBuilder(); else sb.setLength(0); i = parseName(data, i, out, sb, skipspaces); BlockSet nc = getNamedClass(sb.toString()); if (nc == null) throw new PatternSyntaxException("unknown named class: {" + sb + "}"); bs.add(nc, inv);
private static void initNames() { initNamedCategory("C"); initNamedCategory("Cn"); initNamedCategory("Cc"); initNamedCategory("Cf"); initNamedCategory("Co"); initNamedCategory("Cs"); initNamedCategory("L"); initNamedCategory("Lu"); initNamedCategory("Ll"); initNamedCategory("Lt"); initNamedCategory("Lm"); initNamedCategory("Lo"); initNamedCategory("M"); initNamedCategory("Mn"); initNamedCategory("Me"); initNamedCategory("Mc"); initNamedCategory("N"); initNamedCategory("Nd"); initNamedCategory("Nl"); initNamedCategory("No"); initNamedCategory("Z"); initNamedCategory("Zs"); initNamedCategory("Zl"); initNamedCategory("Zp");
static int parseName(char[] data, int i, int out, Term term, boolean inverse, boolean skipspaces) throws PatternSyntaxException { StringBuilder sb = new StringBuilder(); i = parseName(data, i, out, sb, skipspaces); BlockSet bs = getNamedClass(sb.toString()); if (bs == null) throw new PatternSyntaxException("unknown class: {" + sb + "}"); BlockSet.unify(bs, term); term.inverse = inverse; return i; }
static void makeWordBoundary(Term term, boolean inverse, boolean unicode) { makeWordChar(term, inverse, unicode); term.type = unicode ? UBOUNDARY : BOUNDARY; }
private static BlockSet getNamedClass(String name) { if (!namesInitialized) initNames(); return namedClasses.get(name); } /*
static void makeWordStart(Term term, boolean unicode) { makeWordChar(term, false, unicode); term.type = unicode ? UDIRECTION : DIRECTION; }
static void makeWordEnd(Term term, boolean unicode) { makeWordChar(term, true, unicode); term.type = unicode ? UDIRECTION : DIRECTION; }
static void makeWordStart(Term term, boolean unicode) { makeWordChar(term, false, unicode); term.type = unicode ? UDIRECTION : DIRECTION; }
static void makeWordBoundary(Term term, boolean inverse, boolean unicode) { makeWordChar(term, inverse, unicode); term.type = unicode ? UBOUNDARY : BOUNDARY; }