pick up vc9 fixes from panda

This commit is contained in:
David Rose 2010-09-30 16:27:11 +00:00
parent 8f827fa336
commit d9102227c7
3 changed files with 154 additions and 8 deletions

View File

@ -20,6 +20,7 @@
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE GlobPattern:: INLINE GlobPattern::
GlobPattern(const string &pattern) : _pattern(pattern) { GlobPattern(const string &pattern) : _pattern(pattern) {
_case_sensitive = true;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -28,7 +29,10 @@ GlobPattern(const string &pattern) : _pattern(pattern) {
// Description: // Description:
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE GlobPattern:: INLINE GlobPattern::
GlobPattern(const GlobPattern &copy) : _pattern(copy._pattern) { GlobPattern(const GlobPattern &copy) :
_pattern(copy._pattern),
_case_sensitive(copy._case_sensitive)
{
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -39,6 +43,40 @@ GlobPattern(const GlobPattern &copy) : _pattern(copy._pattern) {
INLINE void GlobPattern:: INLINE void GlobPattern::
operator = (const GlobPattern &copy) { operator = (const GlobPattern &copy) {
_pattern = copy._pattern; _pattern = copy._pattern;
_case_sensitive = copy._case_sensitive;
}
////////////////////////////////////////////////////////////////////
// Function: GlobPattern::operator ==
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
INLINE bool GlobPattern::
operator == (const GlobPattern &other) const {
return (_pattern == other._pattern && _case_sensitive == other._case_sensitive);
}
////////////////////////////////////////////////////////////////////
// Function: GlobPattern::operator !=
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
INLINE bool GlobPattern::
operator != (const GlobPattern &other) const {
return !operator == (other);
}
////////////////////////////////////////////////////////////////////
// Function: GlobPattern::operator <
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
INLINE bool GlobPattern::
operator < (const GlobPattern &other) const {
if (_case_sensitive != other._case_sensitive) {
return (int)_case_sensitive < (int)other._case_sensitive;
}
return _pattern < other._pattern;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -63,6 +101,52 @@ get_pattern() const {
return _pattern; return _pattern;
} }
////////////////////////////////////////////////////////////////////
// Function: GlobPattern::set_case_sensitive
// Access: Public
// Description: Sets whether the match is case sensitive (true) or
// case insensitive (false). The default is case
// sensitive.
////////////////////////////////////////////////////////////////////
INLINE void GlobPattern::
set_case_sensitive(bool case_sensitive) {
_case_sensitive = case_sensitive;
}
////////////////////////////////////////////////////////////////////
// Function: GlobPattern::get_case_sensitive
// Access: Public
// Description: Returns whether the match is case sensitive (true) or
// case insensitive (false). The default is case
// sensitive.
////////////////////////////////////////////////////////////////////
INLINE bool GlobPattern::
get_case_sensitive() const {
return _case_sensitive;
}
////////////////////////////////////////////////////////////////////
// Function: GlobPattern::set_nomatch_chars
// Access: Public
// Description: Specifies a set of characters that are not matched by
// * or ?.
////////////////////////////////////////////////////////////////////
INLINE void GlobPattern::
set_nomatch_chars(const string &nomatch_chars) {
_nomatch_chars = nomatch_chars;
}
////////////////////////////////////////////////////////////////////
// Function: GlobPattern::get_nomatch_chars
// Access: Public
// Description: Returns the set of characters that are not matched by
// * or ?.
////////////////////////////////////////////////////////////////////
INLINE const string &GlobPattern::
get_nomatch_chars() const {
return _nomatch_chars;
}
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: GlobPattern::matches // Function: GlobPattern::matches
// Access: Public // Access: Public

View File

@ -13,6 +13,7 @@
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
#include "globPattern.h" #include "globPattern.h"
#include <ctype.h>
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: GlobPattern::has_glob_characters // Function: GlobPattern::has_glob_characters
@ -43,6 +44,39 @@ has_glob_characters() const {
return false; return false;
} }
////////////////////////////////////////////////////////////////////
// Function: GlobPattern::get_const_prefix
// Access: Public
// Description: Returns the initial part of the pattern before the
// first glob character. Since many glob patterns begin
// with a sequence of static characters and end with one
// or more glob characters, this can be used to
// optimized searches through sorted indices.
////////////////////////////////////////////////////////////////////
string GlobPattern::
get_const_prefix() const {
string prefix;
size_t p = 0; // current point
size_t q = 0; // starting point
while (p < _pattern.size()) {
switch (_pattern[p]) {
case '*':
case '?':
case '[':
return prefix + _pattern.substr(q, p - q);
case '\\':
// Skip over the backslash.
prefix += _pattern.substr(q, p - q);
++p;
q = p;
}
++p;
}
return prefix += _pattern.substr(q, p - q);
}
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: GlobPattern::match_files // Function: GlobPattern::match_files
// Access: Public // Access: Public
@ -179,7 +213,7 @@ matches_substr(string::const_iterator pi, string::const_iterator pend,
// A special exception: we allow ci to reach the end before pi, // A special exception: we allow ci to reach the end before pi,
// only if pi is one character before the end and that last // only if pi is one character before the end and that last
// character is '*'. // character is '*'.
if ((ci == cend) && (pi + 1 == pend) && (*pi) == '*') { if ((ci == cend) && (std::distance(pi, pend) == 1) && (*pi) == '*') {
return true; return true;
} }
return (pi == pend && ci == cend); return (pi == pend && ci == cend);
@ -193,9 +227,15 @@ matches_substr(string::const_iterator pi, string::const_iterator pend,
// to recurse twice: either consume one character of the candidate // to recurse twice: either consume one character of the candidate
// string and continue to try matching the *, or stop trying to // string and continue to try matching the *, or stop trying to
// match the * here. // match the * here.
return if (_nomatch_chars.find(*ci) == string::npos) {
matches_substr(pi, pend, ci + 1, cend) || return
matches_substr(pi + 1, pend, ci, cend); matches_substr(pi, pend, ci + 1, cend) ||
matches_substr(pi + 1, pend, ci, cend);
} else {
// On the other hand, if this is one of the nomatch chars, we
// can only stop here.
return matches_substr(pi + 1, pend, ci, cend);
}
case '?': case '?':
// A '?' in the pattern string means to match exactly one // A '?' in the pattern string means to match exactly one
@ -231,8 +271,14 @@ matches_substr(string::const_iterator pi, string::const_iterator pend,
default: default:
// Anything else means to match exactly that. // Anything else means to match exactly that.
if ((*pi) != (*ci)) { if (_case_sensitive) {
return false; if ((*pi) != (*ci)) {
return false;
}
} else {
if (tolower(*pi) != tolower(*ci)) {
return false;
}
} }
return matches_substr(pi + 1, pend, ci + 1, cend); return matches_substr(pi + 1, pend, ci + 1, cend);
} }
@ -286,7 +332,10 @@ matches_set(string::const_iterator &pi, string::const_iterator pend,
char end = (*pi); char end = (*pi);
++pi; ++pi;
if (ch >= start && ch <= end) { if (ch >= start && ch <= end ||
(!_case_sensitive &&
((tolower(ch) >= start && tolower(ch) <= end) ||
(toupper(ch) >= start && toupper(ch) <= end)))) {
matched = true; matched = true;
} }
} else { } else {

View File

@ -40,14 +40,25 @@ public:
INLINE GlobPattern(const GlobPattern &copy); INLINE GlobPattern(const GlobPattern &copy);
INLINE void operator = (const GlobPattern &copy); INLINE void operator = (const GlobPattern &copy);
INLINE bool operator == (const GlobPattern &other) const;
INLINE bool operator != (const GlobPattern &other) const;
INLINE bool operator < (const GlobPattern &other) const;
INLINE void set_pattern(const string &pattern); INLINE void set_pattern(const string &pattern);
INLINE const string &get_pattern() const; INLINE const string &get_pattern() const;
INLINE void set_case_sensitive(bool case_sensitive);
INLINE bool get_case_sensitive() const;
INLINE void set_nomatch_chars(const string &nomatch_chars);
INLINE const string &get_nomatch_chars() const;
INLINE bool matches(const string &candidate) const; INLINE bool matches(const string &candidate) const;
INLINE void output(ostream &out) const; INLINE void output(ostream &out) const;
bool has_glob_characters() const; bool has_glob_characters() const;
string get_const_prefix() const;
int match_files(vector_string &results, const Filename &cwd = Filename()); int match_files(vector_string &results, const Filename &cwd = Filename());
private: private:
@ -64,6 +75,8 @@ private:
vector_string &results, const Filename &cwd); vector_string &results, const Filename &cwd);
string _pattern; string _pattern;
bool _case_sensitive;
string _nomatch_chars;
}; };
INLINE ostream &operator << (ostream &out, const GlobPattern &glob) { INLINE ostream &operator << (ostream &out, const GlobPattern &glob) {