blob: ad9d2755aca21fbad9e4b7cbad969ef943622da1 [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Nikolay A. Kuznetsov
*/
package java.util.regex;
import java.util.BitSet;
import java.util.ListResourceBundle;
/**
* This class represents character classes, i.e.
* sets of character either predefined or user defined.
*
* Note, this class represent token, not node, so being
* constructed by lexer.
*
* @author Nikolay A. Kuznetsov
*/
abstract class AbstractCharClass extends SpecialToken {
protected boolean alt;
protected boolean altSurrogates;
//Character.MAX_SURROGATE - Character.MIN_SURROGATE + 1
static int SURROGATE_CARDINALITY = 2048;
BitSet lowHighSurrogates = new BitSet(SURROGATE_CARDINALITY);
AbstractCharClass charClassWithoutSurrogates = null;
AbstractCharClass charClassWithSurrogates = null;
static PredefinedCharacterClasses charClasses = new PredefinedCharacterClasses();
/*
* Indicates if this class may contain supplementary Unicode codepoints.
* If this flag is specified it doesn't mean that this class contains
* supplementary characters but may contain.
*/
protected boolean mayContainSupplCodepoints = false;
/**
* Returns true if this char class contains character specified;
*
* @param ch
* character to check;
*/
abstract public boolean contains(int ch);
/**
* Returns BitSet representing this character class or <code>null</code>
* if this character class does not have character representation;
*
* @return bitset
*/
protected BitSet getBits() {
return null;
}
protected BitSet getLowHighSurrogates() {
return lowHighSurrogates;
}
public boolean hasLowHighSurrogates() {
return altSurrogates
? lowHighSurrogates.nextClearBit(0) < SURROGATE_CARDINALITY
: lowHighSurrogates.nextSetBit(0) < SURROGATE_CARDINALITY;
}
public boolean mayContainSupplCodepoints() {
return mayContainSupplCodepoints;
}
public int getType() {
return SpecialToken.TOK_CHARCLASS;
}
public AbstractCharClass getInstance() {
return this;
}
public AbstractCharClass getSurrogates() {
if (charClassWithSurrogates == null) {
final BitSet lHS = getLowHighSurrogates();
charClassWithSurrogates = new AbstractCharClass() {
public boolean contains(int ch) {
int index = ch - Character.MIN_SURROGATE;
return ((index >= 0)
&& (index < AbstractCharClass.SURROGATE_CARDINALITY))
? this.altSurrogates ^ lHS.get(index)
: false;
}
};
charClassWithSurrogates.setNegative(this.altSurrogates);
}
return charClassWithSurrogates;
}
public AbstractCharClass getWithoutSurrogates() {
if (charClassWithoutSurrogates == null) {
final BitSet lHS = getLowHighSurrogates();
final AbstractCharClass thisClass = this;
charClassWithoutSurrogates = new AbstractCharClass() {
public boolean contains(int ch) {
int index = ch - Character.MIN_SURROGATE;
boolean containslHS = ((index >= 0)
&& (index < AbstractCharClass.SURROGATE_CARDINALITY))
? this.altSurrogates ^ lHS.get(index)
: false;
return thisClass.contains(ch)
&& !containslHS;
}
};
charClassWithoutSurrogates.setNegative(isNegative());
charClassWithoutSurrogates.mayContainSupplCodepoints
= mayContainSupplCodepoints;
}
return charClassWithoutSurrogates;
}
public boolean hasUCI() {
return false;
}
/**
* Sets this CharClass to negative form, i.e. if they will add some
* characters and after that set this class to negative it will accept all
* the characters except previously set ones.
*
* Although this method will not alternate all the already set characters,
* just overall meaning of the class.
*
* @see #contains(int)
* @see #intersect(CharClass)
* @see #union(CharClass)
*/
public AbstractCharClass setNegative(boolean value) {
if (alt ^ value) {
alt = !alt;
altSurrogates = !altSurrogates;
}
if (!mayContainSupplCodepoints) {
mayContainSupplCodepoints = true;
}
return this;
}
public boolean isNegative() {
return alt;
}
// -----------------------------------------------------------------
// Static methods and predefined classes
// -----------------------------------------------------------------
public static boolean intersects(int ch1, int ch2) {
return ch1 == ch2;
}
public static boolean intersects(AbstractCharClass cc, int ch) {
return cc.contains(ch);
}
public static boolean intersects(AbstractCharClass cc1,
AbstractCharClass cc2) {
if (cc1.getBits() == null || cc2.getBits() == null)
return true;
return cc1.getBits().intersects(cc2.getBits());
}
public static AbstractCharClass getPredefinedClass(String name,
boolean negative) {
return ((LazyCharClass) charClasses.getObject(name)).getValue(negative);
}
abstract static class LazyCharClass {
AbstractCharClass posValue = null;
AbstractCharClass negValue = null;
public AbstractCharClass getValue(boolean negative) {
if (!negative && posValue == null) {
posValue = computeValue();
} else if (negative && negValue == null) {
negValue = computeValue().setNegative(true);
}
if (!negative)
return posValue;
return negValue;
}
protected abstract AbstractCharClass computeValue();
}
static class LazyDigit extends LazyCharClass {
protected AbstractCharClass computeValue() {
return new CharClass().add('0', '9');
}
}
static class LazyNonDigit extends LazyDigit {
protected AbstractCharClass computeValue() {
AbstractCharClass chCl = super.computeValue().setNegative(true);
chCl.mayContainSupplCodepoints = true;
return chCl;
}
}
static class LazySpace extends LazyCharClass {
protected AbstractCharClass computeValue() {
/* 9-13 - \t\n\x0B\f\r; 32 - ' ' */
return new CharClass().add(9, 13).add(32);
}
}
static class LazyNonSpace extends LazySpace {
protected AbstractCharClass computeValue() {
AbstractCharClass chCl = super.computeValue().setNegative(true);
chCl.mayContainSupplCodepoints = true;
return chCl;
}
}
static class LazyWord extends LazyCharClass {
protected AbstractCharClass computeValue() {
return new CharClass().add('a', 'z').add('A', 'Z').add('0', '9')
.add('_');
}
}
static class LazyNonWord extends LazyWord {
protected AbstractCharClass computeValue() {
AbstractCharClass chCl = super.computeValue().setNegative(true);
chCl.mayContainSupplCodepoints = true;
return chCl;
}
}
static class LazyLower extends LazyCharClass {
protected AbstractCharClass computeValue() {
return new CharClass().add('a', 'z');
}
}
static class LazyUpper extends LazyCharClass {
protected AbstractCharClass computeValue() {
return new CharClass().add('A', 'Z');
}
}
static class LazyASCII extends LazyCharClass {
protected AbstractCharClass computeValue() {
return new CharClass().add(0x00, 0x7F);
}
}
static class LazyAlpha extends LazyCharClass {
protected AbstractCharClass computeValue() {
return new CharClass().add('a', 'z').add('A', 'Z');
}
}
static class LazyAlnum extends LazyAlpha {
protected AbstractCharClass computeValue() {
return ((CharClass) super.computeValue()).add('0', '9');
}
}
static class LazyPunct extends LazyCharClass {
protected AbstractCharClass computeValue() {
/* Punctuation !"#$%&'()*+,-./:;<=>?@ [\]^_` {|}~ */
return new CharClass().add(0x21, 0x40).add(0x5B, 0x60).add(0x7B,
0x7E);
}
}
static class LazyGraph extends LazyAlnum {
protected AbstractCharClass computeValue() {
/* plus punctuation */
return ((CharClass) super.computeValue()).add(0x21, 0x40).add(0x5B,
0x60).add(0x7B, 0x7E);
}
}
static class LazyPrint extends LazyGraph {
protected AbstractCharClass computeValue() {
return ((CharClass) super.computeValue()).add(0x20);
}
}
static class LazyBlank extends LazyCharClass {
protected AbstractCharClass computeValue() {
return new CharClass().add(' ').add('\t');
}
}
static class LazyCntrl extends LazyCharClass {
protected AbstractCharClass computeValue() {
return new CharClass().add(0x00, 0x1F).add(0x7F);
}
}
static class LazyXDigit extends LazyCharClass {
protected AbstractCharClass computeValue() {
return new CharClass().add('0', '9').add('a', 'f').add('A', 'F');
}
}
static class LazyRange extends LazyCharClass {
int start, end;
public LazyRange(int start, int end) {
this.start = start;
this.end = end;
}
public AbstractCharClass computeValue() {
AbstractCharClass chCl = new CharClass().add(start, end);
return chCl;
}
}
static class LazySpecialsBlock extends LazyCharClass {
public AbstractCharClass computeValue() {
return new CharClass().add(0xFEFF, 0xFEFF).add(0xFFF0, 0xFFFD);
}
}
static class LazyCategoryScope extends LazyCharClass {
int category;
boolean mayContainSupplCodepoints;
boolean containsAllSurrogates;
public LazyCategoryScope(int cat, boolean mayContainSupplCodepoints) {
this.mayContainSupplCodepoints = mayContainSupplCodepoints;
this.category = cat;
}
public LazyCategoryScope(int cat, boolean mayContainSupplCodepoints,
boolean containsAllSurrogates) {
this.containsAllSurrogates = containsAllSurrogates;
this.mayContainSupplCodepoints = mayContainSupplCodepoints;
this.category = cat;
}
protected AbstractCharClass computeValue() {
AbstractCharClass chCl = new UnicodeCategoryScope(category);
if (containsAllSurrogates) {
chCl.lowHighSurrogates.set(0, SURROGATE_CARDINALITY);
}
chCl.mayContainSupplCodepoints = mayContainSupplCodepoints;
return chCl;
}
}
static class LazyCategory extends LazyCharClass {
int category;
boolean mayContainSupplCodepoints;
boolean containsAllSurrogates;
public LazyCategory(int cat, boolean mayContainSupplCodepoints) {
this.mayContainSupplCodepoints = mayContainSupplCodepoints;
this.category = cat;
}
public LazyCategory(int cat, boolean mayContainSupplCodepoints,
boolean containsAllSurrogates) {
this.containsAllSurrogates = containsAllSurrogates;
this.mayContainSupplCodepoints = mayContainSupplCodepoints;
this.category = cat;
}
protected AbstractCharClass computeValue() {
AbstractCharClass chCl = new UnicodeCategory(category);
if (containsAllSurrogates) {
chCl.lowHighSurrogates.set(0, SURROGATE_CARDINALITY);
}
chCl.mayContainSupplCodepoints = mayContainSupplCodepoints;;
return chCl;
}
}
static class LazyJavaLowerCase extends LazyCharClass {
protected AbstractCharClass computeValue() {
AbstractCharClass chCl = new AbstractCharClass() {
public boolean contains(int ch) {
return Character.isLowerCase(ch);
}
};
chCl.mayContainSupplCodepoints = true;
return chCl;
}
}
static class LazyJavaUpperCase extends LazyCharClass {
protected AbstractCharClass computeValue() {
AbstractCharClass chCl = new AbstractCharClass() {
public boolean contains(int ch) {
return Character.isUpperCase(ch);
}
};
chCl.mayContainSupplCodepoints = true;
return chCl;
}
}
static class LazyJavaWhitespace extends LazyCharClass {
protected AbstractCharClass computeValue() {
return new AbstractCharClass() {
public boolean contains(int ch) {
return Character.isWhitespace(ch);
}
};
}
}
static class LazyJavaMirrored extends LazyCharClass {
protected AbstractCharClass computeValue() {
return new AbstractCharClass() {
public boolean contains(int ch) {
return Character.isMirrored(ch);
}
};
}
}
static class LazyJavaDefined extends LazyCharClass {
protected AbstractCharClass computeValue() {
AbstractCharClass chCl = new AbstractCharClass() {
public boolean contains(int ch) {
return Character.isDefined(ch);
}
};
chCl.lowHighSurrogates.set(0, SURROGATE_CARDINALITY);
chCl.mayContainSupplCodepoints = true;
return chCl;
}
}
static class LazyJavaDigit extends LazyCharClass {
protected AbstractCharClass computeValue() {
AbstractCharClass chCl = new AbstractCharClass() {
public boolean contains(int ch) {
return Character.isDigit(ch);
}
};
chCl.mayContainSupplCodepoints = true;
return chCl;
}
}
static class LazyJavaIdentifierIgnorable extends LazyCharClass {
protected AbstractCharClass computeValue() {
AbstractCharClass chCl = new AbstractCharClass() {
public boolean contains(int ch) {
return Character.isIdentifierIgnorable(ch);
}
};
chCl.mayContainSupplCodepoints = true;
return chCl;
}
}
static class LazyJavaISOControl extends LazyCharClass {
protected AbstractCharClass computeValue() {
return new AbstractCharClass() {
public boolean contains(int ch) {
return Character.isISOControl(ch);
}
};
}
}
static class LazyJavaJavaIdentifierPart extends LazyCharClass {
protected AbstractCharClass computeValue() {
AbstractCharClass chCl = new AbstractCharClass() {
public boolean contains(int ch) {
return Character.isJavaIdentifierPart(ch);
}
};
chCl.mayContainSupplCodepoints = true;
return chCl;
}
}
static class LazyJavaJavaIdentifierStart extends LazyCharClass {
protected AbstractCharClass computeValue() {
AbstractCharClass chCl = new AbstractCharClass() {
public boolean contains(int ch) {
return Character.isJavaIdentifierStart(ch);
}
};
chCl.mayContainSupplCodepoints = true;
return chCl;
}
}
static class LazyJavaLetter extends LazyCharClass {
protected AbstractCharClass computeValue() {
AbstractCharClass chCl = new AbstractCharClass() {
public boolean contains(int ch) {
return Character.isLetter(ch);
}
};
chCl.mayContainSupplCodepoints = true;
return chCl;
}
}
static class LazyJavaLetterOrDigit extends LazyCharClass {
protected AbstractCharClass computeValue() {
AbstractCharClass chCl = new AbstractCharClass() {
public boolean contains(int ch) {
return Character.isLetterOrDigit(ch);
}
};
chCl.mayContainSupplCodepoints = true;
return chCl;
}
}
static class LazyJavaSpaceChar extends LazyCharClass {
protected AbstractCharClass computeValue() {
return new AbstractCharClass() {
public boolean contains(int ch) {
return Character.isSpaceChar(ch);
}
};
}
}
static class LazyJavaTitleCase extends LazyCharClass {
protected AbstractCharClass computeValue() {
return new AbstractCharClass() {
public boolean contains(int ch) {
return Character.isTitleCase(ch);
}
};
}
}
static class LazyJavaUnicodeIdentifierPart extends LazyCharClass {
protected AbstractCharClass computeValue() {
AbstractCharClass chCl = new AbstractCharClass() {
public boolean contains(int ch) {
return Character.isUnicodeIdentifierPart(ch);
}
};
chCl.mayContainSupplCodepoints = true;
return chCl;
}
}
static class LazyJavaUnicodeIdentifierStart extends LazyCharClass {
protected AbstractCharClass computeValue() {
AbstractCharClass chCl = new AbstractCharClass() {
public boolean contains(int ch) {
return Character.isUnicodeIdentifierStart(ch);
}
};
chCl.mayContainSupplCodepoints = true;
return chCl;
}
}
/**
* character classes generated from
* http://www.unicode.org/reports/tr18/
* http://www.unicode.org/Public/4.1.0/ucd/Blocks.txt
*/
static final class PredefinedCharacterClasses extends ListResourceBundle {
static LazyCharClass space = new LazySpace();
static LazyCharClass digit = new LazyDigit();
static final Object[][] contents = {
{ "Lower", new LazyLower() }, //$NON-NLS-1$
{ "Upper", new LazyUpper() }, //$NON-NLS-1$
{ "ASCII", new LazyASCII() }, //$NON-NLS-1$
{ "Alpha", new LazyAlpha() }, //$NON-NLS-1$
{ "Digit", digit }, //$NON-NLS-1$
{ "Alnum", new LazyAlnum() }, //$NON-NLS-1$
{ "Punct", new LazyPunct() }, //$NON-NLS-1$
{ "Graph", new LazyGraph() }, //$NON-NLS-1$
{ "Print", new LazyPrint() }, //$NON-NLS-1$
{ "Blank", new LazyBlank() }, //$NON-NLS-1$
{ "Cntrl", new LazyCntrl() }, //$NON-NLS-1$
{ "XDigit", new LazyXDigit() }, //$NON-NLS-1$
{ "javaLowerCase", new LazyJavaLowerCase() }, //$NON-NLS-1$
{ "javaUpperCase", new LazyJavaUpperCase() }, //$NON-NLS-1$
{ "javaWhitespace", new LazyJavaWhitespace() }, //$NON-NLS-1$
{ "javaMirrored", new LazyJavaMirrored() }, //$NON-NLS-1$
{ "javaDefined", new LazyJavaDefined() }, //$NON-NLS-1$
{ "javaDigit", new LazyJavaDigit() }, //$NON-NLS-1$
{ "javaIdentifierIgnorable", new LazyJavaIdentifierIgnorable() }, //$NON-NLS-1$
{ "javaISOControl", new LazyJavaISOControl() }, //$NON-NLS-1$
{ "javaJavaIdentifierPart", new LazyJavaJavaIdentifierPart() }, //$NON-NLS-1$
{ "javaJavaIdentifierStart", new LazyJavaJavaIdentifierStart() }, //$NON-NLS-1$
{ "javaLetter", new LazyJavaLetter() }, //$NON-NLS-1$
{ "javaLetterOrDigit", new LazyJavaLetterOrDigit() }, //$NON-NLS-1$
{ "javaSpaceChar", new LazyJavaSpaceChar() }, //$NON-NLS-1$
{ "javaTitleCase", new LazyJavaTitleCase() }, //$NON-NLS-1$
{ "javaUnicodeIdentifierPart", new LazyJavaUnicodeIdentifierPart() }, //$NON-NLS-1$
{ "javaUnicodeIdentifierStart", new LazyJavaUnicodeIdentifierStart() }, //$NON-NLS-1$
{ "Space", space }, //$NON-NLS-1$
{ "w", new LazyWord() }, //$NON-NLS-1$
{ "W", new LazyNonWord() }, //$NON-NLS-1$
{ "s", space }, //$NON-NLS-1$
{ "S", new LazyNonSpace() }, //$NON-NLS-1$
{ "d", digit }, //$NON-NLS-1$
{ "D", new LazyNonDigit() }, //$NON-NLS-1$
{ "BasicLatin", new LazyRange(0x0000, 0x007F) }, //$NON-NLS-1$
{ "Latin-1Supplement", new LazyRange(0x0080, 0x00FF) }, //$NON-NLS-1$
{ "LatinExtended-A", new LazyRange(0x0100, 0x017F) }, //$NON-NLS-1$
{ "LatinExtended-B", new LazyRange(0x0180, 0x024F) }, //$NON-NLS-1$
{ "IPAExtensions", new LazyRange(0x0250, 0x02AF) }, //$NON-NLS-1$
{ "SpacingModifierLetters", new LazyRange(0x02B0, 0x02FF) }, //$NON-NLS-1$
{ "CombiningDiacriticalMarks", new LazyRange(0x0300, 0x036F) }, //$NON-NLS-1$
{ "Greek", new LazyRange(0x0370, 0x03FF) }, //$NON-NLS-1$
{ "Cyrillic", new LazyRange(0x0400, 0x04FF) }, //$NON-NLS-1$
{ "CyrillicSupplement", new LazyRange(0x0500, 0x052F) }, //$NON-NLS-1$
{ "Armenian", new LazyRange(0x0530, 0x058F) }, //$NON-NLS-1$
{ "Hebrew", new LazyRange(0x0590, 0x05FF) }, //$NON-NLS-1$
{ "Arabic", new LazyRange(0x0600, 0x06FF) }, //$NON-NLS-1$
{ "Syriac", new LazyRange(0x0700, 0x074F) }, //$NON-NLS-1$
{ "ArabicSupplement", new LazyRange(0x0750, 0x077F) }, //$NON-NLS-1$
{ "Thaana", new LazyRange(0x0780, 0x07BF) }, //$NON-NLS-1$
{ "Devanagari", new LazyRange(0x0900, 0x097F) }, //$NON-NLS-1$
{ "Bengali", new LazyRange(0x0980, 0x09FF) }, //$NON-NLS-1$
{ "Gurmukhi", new LazyRange(0x0A00, 0x0A7F) }, //$NON-NLS-1$
{ "Gujarati", new LazyRange(0x0A80, 0x0AFF) }, //$NON-NLS-1$
{ "Oriya", new LazyRange(0x0B00, 0x0B7F) }, //$NON-NLS-1$
{ "Tamil", new LazyRange(0x0B80, 0x0BFF) }, //$NON-NLS-1$
{ "Telugu", new LazyRange(0x0C00, 0x0C7F) }, //$NON-NLS-1$
{ "Kannada", new LazyRange(0x0C80, 0x0CFF) }, //$NON-NLS-1$
{ "Malayalam", new LazyRange(0x0D00, 0x0D7F) }, //$NON-NLS-1$
{ "Sinhala", new LazyRange(0x0D80, 0x0DFF) }, //$NON-NLS-1$
{ "Thai", new LazyRange(0x0E00, 0x0E7F) }, //$NON-NLS-1$
{ "Lao", new LazyRange(0x0E80, 0x0EFF) }, //$NON-NLS-1$
{ "Tibetan", new LazyRange(0x0F00, 0x0FFF) }, //$NON-NLS-1$
{ "Myanmar", new LazyRange(0x1000, 0x109F) }, //$NON-NLS-1$
{ "Georgian", new LazyRange(0x10A0, 0x10FF) }, //$NON-NLS-1$
{ "HangulJamo", new LazyRange(0x1100, 0x11FF) }, //$NON-NLS-1$
{ "Ethiopic", new LazyRange(0x1200, 0x137F) }, //$NON-NLS-1$
{ "EthiopicSupplement", new LazyRange(0x1380, 0x139F) }, //$NON-NLS-1$
{ "Cherokee", new LazyRange(0x13A0, 0x13FF) }, //$NON-NLS-1$
{ "UnifiedCanadianAboriginalSyllabics", //$NON-NLS-1$
new LazyRange(0x1400, 0x167F) },
{ "Ogham", new LazyRange(0x1680, 0x169F) }, //$NON-NLS-1$
{ "Runic", new LazyRange(0x16A0, 0x16FF) }, //$NON-NLS-1$
{ "Tagalog", new LazyRange(0x1700, 0x171F) }, //$NON-NLS-1$
{ "Hanunoo", new LazyRange(0x1720, 0x173F) }, //$NON-NLS-1$
{ "Buhid", new LazyRange(0x1740, 0x175F) }, //$NON-NLS-1$
{ "Tagbanwa", new LazyRange(0x1760, 0x177F) }, //$NON-NLS-1$
{ "Khmer", new LazyRange(0x1780, 0x17FF) }, //$NON-NLS-1$
{ "Mongolian", new LazyRange(0x1800, 0x18AF) }, //$NON-NLS-1$
{ "Limbu", new LazyRange(0x1900, 0x194F) }, //$NON-NLS-1$
{ "TaiLe", new LazyRange(0x1950, 0x197F) }, //$NON-NLS-1$
{ "NewTaiLue", new LazyRange(0x1980, 0x19DF) }, //$NON-NLS-1$
{ "KhmerSymbols", new LazyRange(0x19E0, 0x19FF) }, //$NON-NLS-1$
{ "Buginese", new LazyRange(0x1A00, 0x1A1F) }, //$NON-NLS-1$
{ "PhoneticExtensions", new LazyRange(0x1D00, 0x1D7F) }, //$NON-NLS-1$
{ "PhoneticExtensionsSupplement", new LazyRange(0x1D80, 0x1DBF) }, //$NON-NLS-1$
{ "CombiningDiacriticalMarksSupplement", //$NON-NLS-1$
new LazyRange(0x1DC0, 0x1DFF) },
{ "LatinExtendedAdditional", new LazyRange(0x1E00, 0x1EFF) }, //$NON-NLS-1$
{ "GreekExtended", new LazyRange(0x1F00, 0x1FFF) }, //$NON-NLS-1$
{ "GeneralPunctuation", new LazyRange(0x2000, 0x206F) }, //$NON-NLS-1$
{ "SuperscriptsandSubscripts", new LazyRange(0x2070, 0x209F) }, //$NON-NLS-1$
{ "CurrencySymbols", new LazyRange(0x20A0, 0x20CF) }, //$NON-NLS-1$
{ "CombiningMarksforSymbols", new LazyRange(0x20D0, 0x20FF) }, //$NON-NLS-1$
{ "LetterlikeSymbols", new LazyRange(0x2100, 0x214F) }, //$NON-NLS-1$
{ "NumberForms", new LazyRange(0x2150, 0x218F) }, //$NON-NLS-1$
{ "Arrows", new LazyRange(0x2190, 0x21FF) }, //$NON-NLS-1$
{ "MathematicalOperators", new LazyRange(0x2200, 0x22FF) }, //$NON-NLS-1$
{ "MiscellaneousTechnical", new LazyRange(0x2300, 0x23FF) }, //$NON-NLS-1$
{ "ControlPictures", new LazyRange(0x2400, 0x243F) }, //$NON-NLS-1$
{ "OpticalCharacterRecognition", new LazyRange(0x2440, 0x245F) }, //$NON-NLS-1$
{ "EnclosedAlphanumerics", new LazyRange(0x2460, 0x24FF) }, //$NON-NLS-1$
{ "BoxDrawing", new LazyRange(0x2500, 0x257F) }, //$NON-NLS-1$
{ "BlockElements", new LazyRange(0x2580, 0x259F) }, //$NON-NLS-1$
{ "GeometricShapes", new LazyRange(0x25A0, 0x25FF) }, //$NON-NLS-1$
{ "MiscellaneousSymbols", new LazyRange(0x2600, 0x26FF) }, //$NON-NLS-1$
{ "Dingbats", new LazyRange(0x2700, 0x27BF) }, //$NON-NLS-1$
{ "MiscellaneousMathematicalSymbols-A", //$NON-NLS-1$
new LazyRange(0x27C0, 0x27EF) },
{ "SupplementalArrows-A", new LazyRange(0x27F0, 0x27FF) }, //$NON-NLS-1$
{ "BraillePatterns", new LazyRange(0x2800, 0x28FF) }, //$NON-NLS-1$
{ "SupplementalArrows-B", new LazyRange(0x2900, 0x297F) }, //$NON-NLS-1$
{ "MiscellaneousMathematicalSymbols-B", //$NON-NLS-1$
new LazyRange(0x2980, 0x29FF) },
{ "SupplementalMathematicalOperators", //$NON-NLS-1$
new LazyRange(0x2A00, 0x2AFF) },
{ "MiscellaneousSymbolsandArrows", //$NON-NLS-1$
new LazyRange(0x2B00, 0x2BFF) },
{ "Glagolitic", new LazyRange(0x2C00, 0x2C5F) }, //$NON-NLS-1$
{ "Coptic", new LazyRange(0x2C80, 0x2CFF) }, //$NON-NLS-1$
{ "GeorgianSupplement", new LazyRange(0x2D00, 0x2D2F) }, //$NON-NLS-1$
{ "Tifinagh", new LazyRange(0x2D30, 0x2D7F) }, //$NON-NLS-1$
{ "EthiopicExtended", new LazyRange(0x2D80, 0x2DDF) }, //$NON-NLS-1$
{ "SupplementalPunctuation", new LazyRange(0x2E00, 0x2E7F) }, //$NON-NLS-1$
{ "CJKRadicalsSupplement", new LazyRange(0x2E80, 0x2EFF) }, //$NON-NLS-1$
{ "KangxiRadicals", new LazyRange(0x2F00, 0x2FDF) }, //$NON-NLS-1$
{ "IdeographicDescriptionCharacters", //$NON-NLS-1$
new LazyRange(0x2FF0, 0x2FFF) },
{ "CJKSymbolsandPunctuation", new LazyRange(0x3000, 0x303F) }, //$NON-NLS-1$
{ "Hiragana", new LazyRange(0x3040, 0x309F) }, //$NON-NLS-1$
{ "Katakana", new LazyRange(0x30A0, 0x30FF) }, //$NON-NLS-1$
{ "Bopomofo", new LazyRange(0x3100, 0x312F) }, //$NON-NLS-1$
{ "HangulCompatibilityJamo", new LazyRange(0x3130, 0x318F) }, //$NON-NLS-1$
{ "Kanbun", new LazyRange(0x3190, 0x319F) }, //$NON-NLS-1$
{ "BopomofoExtended", new LazyRange(0x31A0, 0x31BF) }, //$NON-NLS-1$
{ "CJKStrokes", new LazyRange(0x31C0, 0x31EF) }, //$NON-NLS-1$
{ "KatakanaPhoneticExtensions", new LazyRange(0x31F0, 0x31FF) }, //$NON-NLS-1$
{ "EnclosedCJKLettersandMonths", new LazyRange(0x3200, 0x32FF) }, //$NON-NLS-1$
{ "CJKCompatibility", new LazyRange(0x3300, 0x33FF) }, //$NON-NLS-1$
{ "CJKUnifiedIdeographsExtensionA", //$NON-NLS-1$
new LazyRange(0x3400, 0x4DB5) },
{ "YijingHexagramSymbols", new LazyRange(0x4DC0, 0x4DFF) }, //$NON-NLS-1$
{ "CJKUnifiedIdeographs", new LazyRange(0x4E00, 0x9FFF) }, //$NON-NLS-1$
{ "YiSyllables", new LazyRange(0xA000, 0xA48F) }, //$NON-NLS-1$
{ "YiRadicals", new LazyRange(0xA490, 0xA4CF) }, //$NON-NLS-1$
{ "ModifierToneLetters", new LazyRange(0xA700, 0xA71F) }, //$NON-NLS-1$
{ "SylotiNagri", new LazyRange(0xA800, 0xA82F) }, //$NON-NLS-1$
{ "HangulSyllables", new LazyRange(0xAC00, 0xD7A3) }, //$NON-NLS-1$
{ "HighSurrogates", new LazyRange(0xD800, 0xDB7F) }, //$NON-NLS-1$
{ "HighPrivateUseSurrogates", new LazyRange(0xDB80, 0xDBFF) }, //$NON-NLS-1$
{ "LowSurrogates", new LazyRange(0xDC00, 0xDFFF) }, //$NON-NLS-1$
{ "PrivateUseArea", new LazyRange(0xE000, 0xF8FF) }, //$NON-NLS-1$
{ "CJKCompatibilityIdeographs", new LazyRange(0xF900, 0xFAFF) }, //$NON-NLS-1$
{ "AlphabeticPresentationForms", new LazyRange(0xFB00, 0xFB4F) }, //$NON-NLS-1$
{ "ArabicPresentationForms-A", new LazyRange(0xFB50, 0xFDFF) }, //$NON-NLS-1$
{ "VariationSelectors", new LazyRange(0xFE00, 0xFE0F) }, //$NON-NLS-1$
{ "VerticalForms", new LazyRange(0xFE10, 0xFE1F) }, //$NON-NLS-1$
{ "CombiningHalfMarks", new LazyRange(0xFE20, 0xFE2F) }, //$NON-NLS-1$
{ "CJKCompatibilityForms", new LazyRange(0xFE30, 0xFE4F) }, //$NON-NLS-1$
{ "SmallFormVariants", new LazyRange(0xFE50, 0xFE6F) }, //$NON-NLS-1$
{ "ArabicPresentationForms-B", new LazyRange(0xFE70, 0xFEFF) }, //$NON-NLS-1$
{ "HalfwidthandFullwidthForms", new LazyRange(0xFF00, 0xFFEF) }, //$NON-NLS-1$
{ "all", new LazyRange(0x00, 0x10FFFF) }, //$NON-NLS-1$
{ "Specials", new LazySpecialsBlock() }, //$NON-NLS-1$
{ "Cn", new LazyCategory(Character.UNASSIGNED, true) },
{ "IsL", new LazyCategoryScope(0x3E, true) },
{ "Lu", new LazyCategory(Character.UPPERCASE_LETTER, true) },
{ "Ll", new LazyCategory(Character.LOWERCASE_LETTER, true) },
{ "Lt", new LazyCategory(Character.TITLECASE_LETTER, false) },
{ "Lm", new LazyCategory(Character.MODIFIER_LETTER, false) },
{ "Lo", new LazyCategory(Character.OTHER_LETTER, true) },
{ "IsM", new LazyCategoryScope(0x1C0, true) },
{ "Mn", new LazyCategory(Character.NON_SPACING_MARK, true) },
{ "Me", new LazyCategory(Character.ENCLOSING_MARK, false) },
{ "Mc", new LazyCategory(Character.COMBINING_SPACING_MARK, true) },
{ "N", new LazyCategoryScope(0xE00, true) },
{ "Nd", new LazyCategory(Character.DECIMAL_DIGIT_NUMBER, true) },
{ "Nl", new LazyCategory(Character.LETTER_NUMBER, true) },
{ "No", new LazyCategory(Character.OTHER_NUMBER, true) },
{ "IsZ", new LazyCategoryScope(0x7000, false) },
{ "Zs", new LazyCategory(Character.SPACE_SEPARATOR, false) },
{ "Zl", new LazyCategory(Character.LINE_SEPARATOR, false) },
{ "Zp", new LazyCategory(Character.PARAGRAPH_SEPARATOR, false) },
{ "IsC", new LazyCategoryScope(0xF0000, true, true) },
{ "Cc", new LazyCategory(Character.CONTROL, false) },
{ "Cf", new LazyCategory(Character.FORMAT, true) },
{ "Co", new LazyCategory(Character.PRIVATE_USE, true) },
{ "Cs", new LazyCategory(Character.SURROGATE, false, true) },
{"IsP", new LazyCategoryScope((1 << Character.DASH_PUNCTUATION) |
(1 << Character.START_PUNCTUATION) |
(1 << Character.END_PUNCTUATION) |
(1 << Character.CONNECTOR_PUNCTUATION) |
(1 << Character.OTHER_PUNCTUATION) |
(1 << Character.INITIAL_QUOTE_PUNCTUATION) |
(1 << Character.FINAL_QUOTE_PUNCTUATION), true)},
{ "Pd", new LazyCategory(Character.DASH_PUNCTUATION, false) },
{ "Ps", new LazyCategory(Character.START_PUNCTUATION, false) },
{ "Pe", new LazyCategory(Character.END_PUNCTUATION, false) },
{ "Pc", new LazyCategory(Character.CONNECTOR_PUNCTUATION, false) },
{ "Po", new LazyCategory(Character.OTHER_PUNCTUATION, true) },
{ "IsS", new LazyCategoryScope(0x7E000000, true) },
{ "Sm", new LazyCategory(Character.MATH_SYMBOL, true) },
{ "Sc", new LazyCategory(Character.CURRENCY_SYMBOL, false) },
{ "Sk", new LazyCategory(Character.MODIFIER_SYMBOL, false) },
{ "So", new LazyCategory(Character.OTHER_SYMBOL, true) },
{ "Pi", new LazyCategory(Character.INITIAL_QUOTE_PUNCTUATION, false) },
{ "Pf", new LazyCategory(Character.FINAL_QUOTE_PUNCTUATION, false) } };
public Object[][] getContents() {
return contents;
}
}
}