removing the NoCategory enum value caused all category flags to change.
not an issue for qchar where they were used properly, but an issue for qregexp
where the hardcoded values were used instead.
the `all_cats` could be set to `FLAG(QChar::Symbol_Other + 1) - 1` which is shorter,
but I don't want hardcode the values in order to avoid similar issues in he future

Change-Id: Ie3ae2fca1b01d5911b834f439a0a6216766b8a20
Merge-request: 21
Reviewed-by: Olivier Goffart <olivier.goffart@nokia.com>
Reviewed-on: http://codereview.qt.nokia.com/1696
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
This commit is contained in:
Ritt Konstantin 2011-07-15 11:37:10 +02:00 committed by Qt by Nokia
parent 639943ddea
commit 92a1a3cc4f

View File

@ -1011,6 +1011,8 @@ Q_DECLARE_TYPEINFO(QRegExpAnchorAlternation, Q_PRIMITIVE_TYPE);
#endif
#ifndef QT_NO_REGEXP_CCLASS
#define FLAG(x) (1 << (x))
/*
The class QRegExpCharClass represents a set of characters, such as can
be found in regular expressions (e.g., [a-z] denotes the set
@ -1027,7 +1029,7 @@ public:
void clear();
bool negative() const { return n; }
void setNegative(bool negative);
void addCategories(int cats);
void addCategories(uint cats);
void addRange(ushort from, ushort to);
void addSingleton(ushort ch) { addRange(ch, ch); }
@ -1041,7 +1043,7 @@ public:
#endif
private:
int c; // character classes
uint c; // character classes
QVector<QRegExpCharClassRange> r; // character ranges
bool n; // negative?
#ifndef QT_NO_REGEXP_OPTIM
@ -2351,9 +2353,39 @@ void QRegExpCharClass::setNegative(bool negative)
#endif
}
void QRegExpCharClass::addCategories(int cats)
void QRegExpCharClass::addCategories(uint cats)
{
c |= cats;
static const int all_cats = FLAG(QChar::Mark_NonSpacing) |
FLAG(QChar::Mark_SpacingCombining) |
FLAG(QChar::Mark_Enclosing) |
FLAG(QChar::Number_DecimalDigit) |
FLAG(QChar::Number_Letter) |
FLAG(QChar::Number_Other) |
FLAG(QChar::Separator_Space) |
FLAG(QChar::Separator_Line) |
FLAG(QChar::Separator_Paragraph) |
FLAG(QChar::Other_Control) |
FLAG(QChar::Other_Format) |
FLAG(QChar::Other_Surrogate) |
FLAG(QChar::Other_PrivateUse) |
FLAG(QChar::Other_NotAssigned) |
FLAG(QChar::Letter_Uppercase) |
FLAG(QChar::Letter_Lowercase) |
FLAG(QChar::Letter_Titlecase) |
FLAG(QChar::Letter_Modifier) |
FLAG(QChar::Letter_Other) |
FLAG(QChar::Punctuation_Connector) |
FLAG(QChar::Punctuation_Dash) |
FLAG(QChar::Punctuation_Open) |
FLAG(QChar::Punctuation_Close) |
FLAG(QChar::Punctuation_InitialQuote) |
FLAG(QChar::Punctuation_FinalQuote) |
FLAG(QChar::Punctuation_Other) |
FLAG(QChar::Symbol_Math) |
FLAG(QChar::Symbol_Currency) |
FLAG(QChar::Symbol_Modifier) |
FLAG(QChar::Symbol_Other);
c |= (all_cats & cats);
#ifndef QT_NO_REGEXP_OPTIM
occ1.fill(0, NumBadChars);
#endif
@ -2394,7 +2426,7 @@ bool QRegExpCharClass::in(QChar ch) const
return n;
#endif
if (c != 0 && (c & (1 << (int)ch.category())) != 0)
if (c != 0 && (c & FLAG(ch.category())) != 0)
return !n;
const int uc = ch.unicode();
@ -2900,18 +2932,32 @@ int QRegExpEngine::getEscape()
#ifndef QT_NO_REGEXP_CCLASS
case 'D':
// see QChar::isDigit()
yyCharClass->addCategories(0x7fffffef);
yyCharClass->addCategories(uint(-1) ^ FLAG(QChar::Number_DecimalDigit));
return Tok_CharClass;
case 'S':
// see QChar::isSpace()
yyCharClass->addCategories(0x7ffff87f);
yyCharClass->addCategories(uint(-1) ^ (FLAG(QChar::Separator_Space) |
FLAG(QChar::Separator_Line) |
FLAG(QChar::Separator_Paragraph) |
FLAG(QChar::Other_Control)));
yyCharClass->addRange(0x0000, 0x0008);
yyCharClass->addRange(0x000e, 0x001f);
yyCharClass->addRange(0x007f, 0x009f);
return Tok_CharClass;
case 'W':
// see QChar::isLetterOrNumber() and QChar::isMark()
yyCharClass->addCategories(0x7fe07f81);
yyCharClass->addCategories(uint(-1) ^ (FLAG(QChar::Mark_NonSpacing) |
FLAG(QChar::Mark_SpacingCombining) |
FLAG(QChar::Mark_Enclosing) |
FLAG(QChar::Number_DecimalDigit) |
FLAG(QChar::Number_Letter) |
FLAG(QChar::Number_Other) |
FLAG(QChar::Letter_Uppercase) |
FLAG(QChar::Letter_Lowercase) |
FLAG(QChar::Letter_Titlecase) |
FLAG(QChar::Letter_Modifier) |
FLAG(QChar::Letter_Other) |
FLAG(QChar::Punctuation_Connector)));
yyCharClass->addRange(0x203f, 0x2040);
yyCharClass->addSingleton(0x2040);
yyCharClass->addSingleton(0x2054);
@ -2929,16 +2975,28 @@ int QRegExpEngine::getEscape()
#ifndef QT_NO_REGEXP_CCLASS
case 'd':
// see QChar::isDigit()
yyCharClass->addCategories(0x00000010);
yyCharClass->addCategories(FLAG(QChar::Number_DecimalDigit));
return Tok_CharClass;
case 's':
// see QChar::isSpace()
yyCharClass->addCategories(0x00000380);
yyCharClass->addCategories(FLAG(QChar::Separator_Space) |
FLAG(QChar::Separator_Line) |
FLAG(QChar::Separator_Paragraph));
yyCharClass->addRange(0x0009, 0x000d);
return Tok_CharClass;
case 'w':
// see QChar::isLetterOrNumber() and QChar::isMark()
yyCharClass->addCategories(0x000f807e);
yyCharClass->addCategories(FLAG(QChar::Mark_NonSpacing) |
FLAG(QChar::Mark_SpacingCombining) |
FLAG(QChar::Mark_Enclosing) |
FLAG(QChar::Number_DecimalDigit) |
FLAG(QChar::Number_Letter) |
FLAG(QChar::Number_Other) |
FLAG(QChar::Letter_Uppercase) |
FLAG(QChar::Letter_Lowercase) |
FLAG(QChar::Letter_Titlecase) |
FLAG(QChar::Letter_Modifier) |
FLAG(QChar::Letter_Other));
yyCharClass->addSingleton(0x005f); // '_'
return Tok_CharClass;
case 'I':
@ -2948,7 +3006,17 @@ int QRegExpEngine::getEscape()
}
case 'i':
if (xmlSchemaExtensions) {
yyCharClass->addCategories(0x000f807e);
yyCharClass->addCategories(FLAG(QChar::Mark_NonSpacing) |
FLAG(QChar::Mark_SpacingCombining) |
FLAG(QChar::Mark_Enclosing) |
FLAG(QChar::Number_DecimalDigit) |
FLAG(QChar::Number_Letter) |
FLAG(QChar::Number_Other) |
FLAG(QChar::Letter_Uppercase) |
FLAG(QChar::Letter_Lowercase) |
FLAG(QChar::Letter_Titlecase) |
FLAG(QChar::Letter_Modifier) |
FLAG(QChar::Letter_Other));
yyCharClass->addSingleton(0x003a); // ':'
yyCharClass->addSingleton(0x005f); // '_'
yyCharClass->addRange(0x0041, 0x005a); // [A-Z]
@ -2974,7 +3042,17 @@ int QRegExpEngine::getEscape()
}
case 'c':
if (xmlSchemaExtensions) {
yyCharClass->addCategories(0x000f807e);
yyCharClass->addCategories(FLAG(QChar::Mark_NonSpacing) |
FLAG(QChar::Mark_SpacingCombining) |
FLAG(QChar::Mark_Enclosing) |
FLAG(QChar::Number_DecimalDigit) |
FLAG(QChar::Number_Letter) |
FLAG(QChar::Number_Other) |
FLAG(QChar::Letter_Uppercase) |
FLAG(QChar::Letter_Lowercase) |
FLAG(QChar::Letter_Titlecase) |
FLAG(QChar::Letter_Modifier) |
FLAG(QChar::Letter_Other));
yyCharClass->addSingleton(0x002d); // '-'
yyCharClass->addSingleton(0x002e); // '.'
yyCharClass->addSingleton(0x003a); // ':'
@ -3024,79 +3102,102 @@ int QRegExpEngine::getEscape()
yyCh = getChar(); // skip closing '}'
if (category == "M") {
yyCharClass->addCategories(0x0000000e);
yyCharClass->addCategories(FLAG(QChar::Mark_NonSpacing) |
FLAG(QChar::Mark_SpacingCombining) |
FLAG(QChar::Mark_Enclosing));
} else if (category == "Mn") {
yyCharClass->addCategories(0x00000002);
yyCharClass->addCategories(FLAG(QChar::Mark_NonSpacing));
} else if (category == "Mc") {
yyCharClass->addCategories(0x00000004);
yyCharClass->addCategories(FLAG(QChar::Mark_SpacingCombining));
} else if (category == "Me") {
yyCharClass->addCategories(0x00000008);
yyCharClass->addCategories(FLAG(QChar::Mark_Enclosing));
} else if (category == "N") {
yyCharClass->addCategories(0x00000070);
yyCharClass->addCategories(FLAG(QChar::Number_DecimalDigit) |
FLAG(QChar::Number_Letter) |
FLAG(QChar::Number_Other));
} else if (category == "Nd") {
yyCharClass->addCategories(0x00000010);
yyCharClass->addCategories(FLAG(QChar::Number_DecimalDigit));
} else if (category == "Nl") {
yyCharClass->addCategories(0x00000020);
yyCharClass->addCategories(FLAG(QChar::Number_Letter));
} else if (category == "No") {
yyCharClass->addCategories(0x00000040);
yyCharClass->addCategories(FLAG(QChar::Number_Other));
} else if (category == "Z") {
yyCharClass->addCategories(0x00000380);
yyCharClass->addCategories(FLAG(QChar::Separator_Space) |
FLAG(QChar::Separator_Line) |
FLAG(QChar::Separator_Paragraph));
} else if (category == "Zs") {
yyCharClass->addCategories(0x00000080);
yyCharClass->addCategories(FLAG(QChar::Separator_Space));
} else if (category == "Zl") {
yyCharClass->addCategories(0x00000100);
yyCharClass->addCategories(FLAG(QChar::Separator_Line));
} else if (category == "Zp") {
yyCharClass->addCategories(0x00000200);
yyCharClass->addCategories(FLAG(QChar::Separator_Paragraph));
} else if (category == "C") {
yyCharClass->addCategories(0x00006c00);
yyCharClass->addCategories(FLAG(QChar::Other_Control) |
FLAG(QChar::Other_Format) |
FLAG(QChar::Other_Surrogate) |
FLAG(QChar::Other_PrivateUse) |
FLAG(QChar::Other_NotAssigned));
} else if (category == "Cc") {
yyCharClass->addCategories(0x00000400);
yyCharClass->addCategories(FLAG(QChar::Other_Control));
} else if (category == "Cf") {
yyCharClass->addCategories(0x00000800);
yyCharClass->addCategories(FLAG(QChar::Other_Format));
} else if (category == "Cs") {
yyCharClass->addCategories(0x00001000);
yyCharClass->addCategories(FLAG(QChar::Other_Surrogate));
} else if (category == "Co") {
yyCharClass->addCategories(0x00002000);
yyCharClass->addCategories(FLAG(QChar::Other_PrivateUse));
} else if (category == "Cn") {
yyCharClass->addCategories(0x00004000);
yyCharClass->addCategories(FLAG(QChar::Other_NotAssigned));
} else if (category == "L") {
yyCharClass->addCategories(0x000f8000);
yyCharClass->addCategories(FLAG(QChar::Letter_Uppercase) |
FLAG(QChar::Letter_Lowercase) |
FLAG(QChar::Letter_Titlecase) |
FLAG(QChar::Letter_Modifier) |
FLAG(QChar::Letter_Other));
} else if (category == "Lu") {
yyCharClass->addCategories(0x00008000);
yyCharClass->addCategories(FLAG(QChar::Letter_Uppercase));
} else if (category == "Ll") {
yyCharClass->addCategories(0x00010000);
yyCharClass->addCategories(FLAG(QChar::Letter_Lowercase));
} else if (category == "Lt") {
yyCharClass->addCategories(0x00020000);
yyCharClass->addCategories(FLAG(QChar::Letter_Titlecase));
} else if (category == "Lm") {
yyCharClass->addCategories(0x00040000);
yyCharClass->addCategories(FLAG(QChar::Letter_Modifier));
} else if (category == "Lo") {
yyCharClass->addCategories(0x00080000);
yyCharClass->addCategories(FLAG(QChar::Letter_Other));
} else if (category == "P") {
yyCharClass->addCategories(0x4f580780);
yyCharClass->addCategories(FLAG(QChar::Punctuation_Connector) |
FLAG(QChar::Punctuation_Dash) |
FLAG(QChar::Punctuation_Open) |
FLAG(QChar::Punctuation_Close) |
FLAG(QChar::Punctuation_InitialQuote) |
FLAG(QChar::Punctuation_FinalQuote) |
FLAG(QChar::Punctuation_Other));
} else if (category == "Pc") {
yyCharClass->addCategories(0x00100000);
yyCharClass->addCategories(FLAG(QChar::Punctuation_Connector));
} else if (category == "Pd") {
yyCharClass->addCategories(0x00200000);
yyCharClass->addCategories(FLAG(QChar::Punctuation_Dash));
} else if (category == "Ps") {
yyCharClass->addCategories(0x00400000);
yyCharClass->addCategories(FLAG(QChar::Punctuation_Open));
} else if (category == "Pe") {
yyCharClass->addCategories(0x00800000);
yyCharClass->addCategories(FLAG(QChar::Punctuation_Close));
} else if (category == "Pi") {
yyCharClass->addCategories(0x01000000);
yyCharClass->addCategories(FLAG(QChar::Punctuation_InitialQuote));
} else if (category == "Pf") {
yyCharClass->addCategories(0x02000000);
yyCharClass->addCategories(FLAG(QChar::Punctuation_FinalQuote));
} else if (category == "Po") {
yyCharClass->addCategories(0x04000000);
yyCharClass->addCategories(FLAG(QChar::Punctuation_Other));
} else if (category == "S") {
yyCharClass->addCategories(0x78000000);
yyCharClass->addCategories(FLAG(QChar::Symbol_Math) |
FLAG(QChar::Symbol_Currency) |
FLAG(QChar::Symbol_Modifier) |
FLAG(QChar::Symbol_Other));
} else if (category == "Sm") {
yyCharClass->addCategories(0x08000000);
yyCharClass->addCategories(FLAG(QChar::Symbol_Math));
} else if (category == "Sc") {
yyCharClass->addCategories(0x10000000);
yyCharClass->addCategories(FLAG(QChar::Symbol_Currency));
} else if (category == "Sk") {
yyCharClass->addCategories(0x20000000);
yyCharClass->addCategories(FLAG(QChar::Symbol_Modifier));
} else if (category == "So") {
yyCharClass->addCategories(0x40000000);
yyCharClass->addCategories(FLAG(QChar::Symbol_Other));
} else if (category.startsWith("Is")) {
if (categoriesRangeMap.isEmpty())
setupCategoriesRangeMap();