#ifndef _TRACKER_STRING_H
#define _TRACKER_STRING_H
#include <ctype.h>
#include <OS.h>
#include <String.h>
#include "RegExp.h"
namespace BPrivate {
enum TrackerStringExpressionType {
kNone = B_ERROR,
kStartsWith = 0,
kEndsWith,
kContains,
kGlobMatch,
kRegexpMatch
};
class TrackerString : public BString
{
public:
TrackerString();
TrackerString(const char*);
TrackerString(const TrackerString&);
TrackerString(const char*, int32 maxLength);
~TrackerString();
bool Matches(const char*, bool caseSensitivity = false,
TrackerStringExpressionType expressionType = kGlobMatch) const;
bool MatchesRegExp(const char*, bool caseSensitivity = true) const;
bool MatchesRegExp(const RegExp&) const;
bool MatchesRegExp(const RegExp*) const;
bool MatchesGlob(const char*, bool caseSensitivity = false) const;
bool EndsWith(const char*, bool caseSensitivity = false) const;
bool StartsWith(const char*, bool caseSensitivity = false) const;
bool Contains(const char*, bool caseSensitivity = false) const;
private:
bool IsGlyph(char) const;
bool IsInsideGlyph(char) const;
bool IsStartOfGlyph(char) const;
const char* MoveToEndOfGlyph(const char*) const;
bool MatchesBracketExpression(const char* string, const char* pattern,
bool caseSensitivity) const;
bool StringMatchesPattern(const char* string, const char* pattern,
bool caseSensitivity) const;
char ConditionalToLower(char c, bool toLower) const;
bool CharsAreEqual(char char1, char char2, bool toLower) const;
bool UTF8CharsAreEqual(const char* string1, const char* string2) const;
};
inline bool
TrackerString::MatchesRegExp(const RegExp* expression) const
{
if (expression == NULL || expression->InitCheck() != B_OK)
return false;
return expression->Matches(*this);
}
inline bool
TrackerString::MatchesRegExp(const RegExp &expression) const
{
if (expression.InitCheck() != B_OK)
return false;
return expression.Matches(*this);
}
inline char
TrackerString::ConditionalToLower(char c, bool caseSensitivity) const
{
return caseSensitivity ? c : (char)tolower(c);
}
inline bool
TrackerString::CharsAreEqual(char char1, char char2,
bool caseSensitivity) const
{
return ConditionalToLower(char1, caseSensitivity)
== ConditionalToLower(char2, caseSensitivity);
}
}
using namespace BPrivate;
#endif