private static void initNamedCategory(String name) { BlockSet bs = new BlockSet(); bs.setCategory(name); registerClass(name, bs, unicodeCategories); }
final void add(BlockSet bs) { add(bs, false); }
final void add(BlockSet bs, boolean inverse) { weight += addImpl(this, bs, !bs.positive ^ inverse); }
final void setDigit(boolean unicode) { if (unicode) { setCategory("Nd"); } else { setRange('0', '9'); } }
final void setWordChar(boolean unicode) { if (unicode) { if (!isLarge) enableLargeMode(); weight += Block.add(this.blocks, Category.Word.blocks, 0, BLOCK_COUNT - 1, false); /* setCategory("Lu"); setCategory("Ll"); setCategory("Lt"); setCategory("Lo"); setCategory("Nd"); setChar('_');*/ } else { setRange('a', 'z'); setRange('A', 'Z'); setRange('0', '9'); setChar('_'); } }
if (isFirst) break; //treat as normal char if (inRange) { bs.setChar('-'); bs.setChar(Category.caseFold(c1)); } else bs.setChar(c1); if (prev >= 0) bs.setChar((char) prev); if (bs1 == null) bs1 = new BlockSet(); else bs1.reset(); i = parseClass(data, i, out, bs1, icase, skipspaces, unicode, xml); bs.subtract(bs1); inRange = false; prev = -1; bs.setPositive(false); setFirst = true; continue; bs.setDigit(unicode); continue; bs.setSpace(unicode); continue; bs.setWordChar(unicode); continue; bs.setHorizontalSpace(unicode);
static void parseGroup(char[] data, int i, int out, Term term, boolean icase, boolean skipspaces, boolean unicode, boolean xml) throws PatternSyntaxException { BlockSet sum = new BlockSet(); BlockSet bs = new BlockSet(); int mode = ADD; char c; continue; case '[': bs.reset(); i = parseClass(data, i, out, bs, icase, skipspaces, unicode, xml); switch (mode) { case ADD: sum.add(bs); break; case SUBTRACT: sum.subtract(bs); break; case INTERSECT: sum.intersect(bs); break; BlockSet.unify(sum, term);
private static void initPosixClasses() { BlockSet lower = new BlockSet(); lower.setRange('a', 'z'); registerClass("Lower", lower, posixClasses); BlockSet upper = new BlockSet(); upper.setRange('A', 'Z'); registerClass("Upper", upper, posixClasses); BlockSet ascii = new BlockSet(); ascii.setRange((char) 0, (char) 0x7f); registerClass("ASCII", ascii, posixClasses); BlockSet alpha = new BlockSet(); alpha.add(lower); alpha.add(upper); registerClass("Alpha", alpha, posixClasses); BlockSet digit = new BlockSet(); digit.setRange('0', '9'); registerClass("Digit", digit, posixClasses); BlockSet alnum = new BlockSet(); alnum.add(alpha); alnum.add(digit); registerClass("Alnum", alnum, posixClasses); BlockSet punct = new BlockSet(); punct.setChars("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"); registerClass("Punct", punct, posixClasses); BlockSet graph = new BlockSet(); graph.add(alnum); graph.add(punct); registerClass("Graph", graph, posixClasses); registerClass("Print", graph, posixClasses); BlockSet blank = new BlockSet();
initNamedCategory("So"); BlockSet bs = new BlockSet(); bs.setCategory("Cn"); registerClass("UNASSIGNED", bs, unicodeCategories); bs = new BlockSet(); bs.setCategory("Cn"); bs.setPositive(false); registerClass("ASSIGNED", bs, unicodeCategories);
private static void initNamedBlock(String name, int first, int last) { if (first < Character.MIN_VALUE || first > Character.MAX_VALUE) throw new IllegalArgumentException("wrong start code (" + first + ") in block " + name); if (last < Character.MIN_VALUE || last > Character.MAX_VALUE) throw new IllegalArgumentException("wrong end code (" + last + ") in block " + name); if (last < first) throw new IllegalArgumentException("end code < start code in block " + name); BlockSet bs = namedClasses.get(name); if (bs == null) { bs = new BlockSet(); registerClass(name, bs, unicodeBlocks); } bs.setRange((char) first, (char) last); }
private static int addImpl(BlockSet bs1, BlockSet bs2, boolean inv) { int s = 0; if (!bs1.isLarge && !bs2.isLarge && !inv) { if (bs2.block0 != null) { IntBitSet bits = bs1.block0; if (bits == null) bs1.block0 = bits = new IntBitSet(BLOCK_SIZE); s += add(bits, bs2.block0, 0, BLOCK_SIZE - 1, false); } } else { if (!bs1.isLarge) bs1.enableLargeMode(); if (!bs2.isLarge) bs2.enableLargeMode(); s += Block.add(bs1.blocks, bs2.blocks, 0, BLOCK_COUNT - 1, inv); } return s; }
private static int subtractImpl(BlockSet bs1, BlockSet bs2, boolean inv) { int s = 0; if (!bs1.isLarge && !bs2.isLarge && !inv) { IntBitSet bits1, bits2; if ((bits2 = bs2.block0) != null) { bits1 = bs1.block0; if (bits1 == null) return 0; s += subtract(bits1, bits2, false); } } else { if (!bs1.isLarge) bs1.enableLargeMode(); if (!bs2.isLarge) bs2.enableLargeMode(); s += Block.subtract(bs1.blocks, bs2.blocks, 0, BLOCK_COUNT - 1, inv); } return s; }
final void setRange(char c1, char c2) { //System.out.println("["+this+"].setRange("+c1+","+c2+"):"); //if(c1>31 && c1<=126 && c2>31 && c2<=126) System.out.println("setRange('"+c1+"','"+c2+"'):"); //else System.out.println("setRange(["+Integer.toHexString(c1)+"],["+Integer.toHexString(c2)+"]):"); if (c2 >= 256 || isLarge) { int s = 0; if (!isLarge) { enableLargeMode(); } Block[] blocks = this.blocks; for (int c = c1; c <= c2; c++) { int i2 = (c >> 8) & 0xff; int i = c & 0xff; Block block = blocks[i2]; if (block == null) { blocks[i2] = block = new Block(); } if (block.set(i)) s++; } weight += s; } else { IntBitSet block0 = this.block0; if (block0 == null) { this.block0 = block0 = new IntBitSet(); } weight += set(block0, c1, c2); } }
public String toString() { StringBuilder sb = new StringBuilder(); if (!positive) sb.append('^'); if (isLarge) sb.append(CharacterClass.stringValue2(Block.toBitset2(blocks))); else if (block0 != null) sb.append(CharacterClass.stringValue0(block0)); sb.append('('); sb.append(getWeight()); sb.append(')'); return sb.toString(); }
final void setCategory(String c) { if (!isLarge) enableLargeMode(); Block[] catBits = Category.categories.get(c).blocks; weight += Block.add(this.blocks, catBits, 0, BLOCK_COUNT - 1, false); //System.out.println("["+this+"].setCategory("+c+"): weight="+weight); }
final void setChars(String chars) { for (int i = chars.length() - 1; i >= 0; i--) setChar(chars.charAt(i)); }
final void intersect(BlockSet bs) { intersect(bs, false); }
if (isFirst) break; //treat as normal char if (inRange) { bs.setChar('-'); bs.setChar(Category.caseFold(c1)); } else bs.setChar(c1); if (prev >= 0) bs.setChar((char) prev); if (bs1 == null) bs1 = new BlockSet(); else bs1.reset(); i = parseClass(data, i, out, bs1, icase, skipspaces, unicode, xml); bs.subtract(bs1); inRange = false; prev = -1; bs.setPositive(false); setFirst = true; continue; bs.setDigit(unicode); continue; bs.setSpace(unicode); continue; bs.setWordChar(unicode); continue; bs.setHorizontalSpace(unicode);