static RegexCharClass() {
_definedCategories = new Hashtable(31);
char[] groups = new char[9];
StringBuilder word = new StringBuilder(11);
word.Append(GroupChar);
groups[0] = GroupChar;
// We need the UnicodeCategory enum values as a char so we can put them in a string
// in the hashtable. In order to get there, we first must cast to an int,
// then cast to a char
// Also need to distinguish between positive and negative values. UnicodeCategory is zero
// based, so we add one to each value and subtract it off later
// Others
groups[1] = (char) ((int) UnicodeCategory.Control + 1);
_definedCategories["Cc"] = groups[1].ToString(); // Control
groups[2] = (char) ((int) UnicodeCategory.Format + 1);
_definedCategories["Cf"] = groups[2].ToString(); // Format
groups[3] = (char) ((int) UnicodeCategory.OtherNotAssigned + 1);
_definedCategories["Cn"] = groups[3].ToString(); // Not assigned
groups[4] = (char) ((int) UnicodeCategory.PrivateUse + 1);
_definedCategories["Co"] = groups[4].ToString(); // Private use
groups[5] = (char) ((int) UnicodeCategory.Surrogate + 1);
_definedCategories["Cs"] = groups[5].ToString(); // Surrogate
groups[6] = GroupChar;
_definedCategories["C"] = new String(groups, 0, 7);
// Letters
groups[1] = (char) ((int) UnicodeCategory.LowercaseLetter + 1);
_definedCategories["Ll"] = groups[1].ToString(); // Lowercase
groups[2] = (char) ((int) UnicodeCategory.ModifierLetter + 1);
_definedCategories["Lm"] = groups[2].ToString(); // Modifier
groups[3] = (char) ((int) UnicodeCategory.OtherLetter + 1);
_definedCategories["Lo"] = groups[3].ToString(); // Other
groups[4] = (char) ((int) UnicodeCategory.TitlecaseLetter + 1);
_definedCategories["Lt"] = groups[4].ToString(); // Titlecase
groups[5] = (char) ((int) UnicodeCategory.UppercaseLetter + 1);
_definedCategories["Lu"] = groups[5].ToString(); // Uppercase
//groups[6] = GroupChar;
_definedCategories["L"] = new String(groups, 0, 7);
word.Append(new String(groups, 1, 5));
// Marks
groups[1] = (char) ((int) UnicodeCategory.SpacingCombiningMark + 1);
_definedCategories["Mc"] = groups[1].ToString(); // Spacing combining
groups[2] = (char) ((int) UnicodeCategory.EnclosingMark + 1);
_definedCategories["Me"] = groups[2].ToString(); // Enclosing
groups[3] = (char) ((int) UnicodeCategory.NonSpacingMark + 1);
_definedCategories["Mn"] = groups[3].ToString(); // Non-spacing
groups[4] = GroupChar;
_definedCategories["M"] = new String(groups, 0, 5);
//word.Append(groups[1]);
//word.Append(groups[3]);
// Numbers
groups[1] = (char) ((int) UnicodeCategory.DecimalDigitNumber + 1);
_definedCategories["Nd"] = groups[1].ToString(); // Decimal digit
groups[2] = (char) ((int) UnicodeCategory.LetterNumber + 1);
_definedCategories["Nl"] = groups[2].ToString(); // Letter
groups[3] = (char) ((int) UnicodeCategory.OtherNumber + 1);
_definedCategories["No"] = groups[3].ToString(); // Other
//groups[4] = GroupChar;
_definedCategories["N"] = new String(groups, 0, 5);
word.Append(groups[1]);
//word.Append(new String(groups, 1, 3));
// Punctuation
groups[1] = (char) ((int) UnicodeCategory.ConnectorPunctuation + 1);
_definedCategories["Pc"] = groups[1].ToString(); // Connector
groups[2] = (char) ((int) UnicodeCategory.DashPunctuation + 1);
_definedCategories["Pd"] = groups[2].ToString(); // Dash
groups[3] = (char) ((int) UnicodeCategory.ClosePunctuation + 1);
_definedCategories["Pe"] = groups[3].ToString(); // Close
groups[4] = (char) ((int) UnicodeCategory.OtherPunctuation + 1);
_definedCategories["Po"] = groups[4].ToString(); // Other
groups[5] = (char) ((int) UnicodeCategory.OpenPunctuation + 1);
_definedCategories["Ps"] = groups[5].ToString(); // Open
groups[6] = (char) ((int) UnicodeCategory.FinalQuotePunctuation + 1);
_definedCategories["Pf"] = groups[6].ToString(); // Inital quote
groups[7] = (char) ((int) UnicodeCategory.InitialQuotePunctuation + 1);
_definedCategories["Pi"] = groups[7].ToString(); // Final quote
groups[8] = GroupChar;
_definedCategories["P"] = new String(groups, 0, 9);
word.Append(groups[1]);
// Symbols
groups[1] = (char) ((int) UnicodeCategory.CurrencySymbol + 1);
_definedCategories["Sc"] = groups[1].ToString(); // Currency
groups[2] = (char) ((int) UnicodeCategory.ModifierSymbol + 1);
_definedCategories["Sk"] = groups[2].ToString(); // Modifier
groups[3] = (char) ((int) UnicodeCategory.MathSymbol + 1);
_definedCategories["Sm"] = groups[3].ToString(); // Math
groups[4] = (char) ((int) UnicodeCategory.OtherSymbol + 1);
_definedCategories["So"] = groups[4].ToString(); // Other
groups[5] = GroupChar;
_definedCategories["S"] = new String(groups, 0, 6);
// Separators
groups[1] = (char) ((int) UnicodeCategory.LineSeparator + 1);
_definedCategories["Zl"] = groups[1].ToString(); // Line
groups[2] = (char) ((int) UnicodeCategory.ParagraphSeparator + 1);
_definedCategories["Zp"] = groups[2].ToString(); // Paragraph
groups[3] = (char) ((int) UnicodeCategory.SpaceSeparator + 1);
_definedCategories["Zs"] = groups[3].ToString(); // Space
groups[4] = GroupChar;
_definedCategories["Z"] = new String(groups, 0, 5);
word.Append(GroupChar);
Word = word.ToString();
NotWord = NegateCategory(Word);
SpaceClass = "\x00\x00\x01" + Space;
NotSpaceClass = "\x01\x00\x01" + Space;
WordClass = "\x00\x00" + (char) Word.Length + Word;
NotWordClass = "\x01\x00" + (char) Word.Length + Word;;
DigitClass = "\x00\x00\x01" + (char) ((int) UnicodeCategory.DecimalDigitNumber + 1);
NotDigitClass = "\x00\x00\x01" + unchecked ((char) (- ((int) UnicodeCategory.DecimalDigitNumber + 1)) );
#if DBG
// make sure the _propTable is correctly ordered
int len = _propTable.GetLength(0);
for (int i=0; i<len-1; i++)
Debug.Assert(String.Compare(_propTable[i,0], _propTable[i+1,0], StringComparison.Ordinal) < 0, "RegexCharClass _propTable is out of order at (" + _propTable[i,0] +", " + _propTable[i+1,0] + ")");
#endif
}