diff --git a/headers/private/shared/RegExp.h b/headers/private/shared/RegExp.h index eea611a00e..0214977848 100644 --- a/headers/private/shared/RegExp.h +++ b/headers/private/shared/RegExp.h @@ -22,7 +22,8 @@ public: RegExp(); RegExp(const char* pattern, PatternType patternType - = PATTERN_TYPE_REGULAR_EXPRESSION); + = PATTERN_TYPE_REGULAR_EXPRESSION, + bool caseSensitive = true); RegExp(const RegExp& other); ~RegExp(); @@ -31,7 +32,8 @@ public: bool SetPattern(const char* pattern, PatternType patternType - = PATTERN_TYPE_REGULAR_EXPRESSION); + = PATTERN_TYPE_REGULAR_EXPRESSION, + bool caseSensitive = true); MatchResult Match(const char* string) const; diff --git a/src/kits/shared/RegExp.cpp b/src/kits/shared/RegExp.cpp index 73d2c13e2b..a305aa4a02 100644 --- a/src/kits/shared/RegExp.cpp +++ b/src/kits/shared/RegExp.cpp @@ -20,7 +20,7 @@ struct RegExp::Data : public BReferenceable { - Data(const char* pattern, PatternType patternType) + Data(const char* pattern, PatternType patternType, bool caseSensitive) : BReferenceable() { @@ -115,7 +115,11 @@ struct RegExp::Data : public BReferenceable { pattern = patternString.String(); } - fError = regcomp(&fCompiledExpression, pattern, REG_EXTENDED); + int flags = REG_EXTENDED; + if (!caseSensitive) + flags |= REG_ICASE; + + fError = regcomp(&fCompiledExpression, pattern, flags); } ~Data() @@ -218,11 +222,12 @@ RegExp::RegExp() } -RegExp::RegExp(const char* pattern, PatternType patternType) +RegExp::RegExp(const char* pattern, PatternType patternType, + bool caseSensitive) : fData(NULL) { - SetPattern(pattern, patternType); + SetPattern(pattern, patternType, caseSensitive); } @@ -243,20 +248,23 @@ RegExp::~RegExp() bool -RegExp::SetPattern(const char* pattern, PatternType patternType) +RegExp::SetPattern(const char* pattern, PatternType patternType, + bool caseSensitive) { if (fData != NULL) { fData->ReleaseReference(); fData = NULL; } - fData = new Data(pattern, patternType); - if (!fData->IsValid()) { - delete fData; - fData = NULL; + Data* newData = new(std::nothrow) Data(pattern, patternType, caseSensitive); + if (newData == NULL) return false; - } + BReference dataReference(newData, true); + if (!newData->IsValid()) + return false; + + fData = dataReference.Detach(); return true; }