Add cmHasLiteralSuffix API.

This commit is contained in:
Stephen Kelly 2013-12-30 16:09:46 +01:00
parent dc08199848
commit 802a28fc5e
3 changed files with 30 additions and 12 deletions

View File

@ -1151,8 +1151,8 @@ void cmFindPackageCommand::AddPrefixesSystemEnvironment()
std::string const& d = *i; std::string const& d = *i;
// If the path is a PREFIX/bin case then add its parent instead. // If the path is a PREFIX/bin case then add its parent instead.
if((d.size() >= 4 && strcmp(d.c_str()+d.size()-4, "/bin") == 0) || if((cmHasLiteralSuffix(d, "/bin")) ||
(d.size() >= 5 && strcmp(d.c_str()+d.size()-5, "/sbin") == 0)) (cmHasLiteralSuffix(d, "/sbin")))
{ {
this->AddPathInternal(cmSystemTools::GetFilenamePath(d), EnvPath); this->AddPathInternal(cmSystemTools::GetFilenamePath(d), EnvPath);
} }

View File

@ -391,6 +391,22 @@ inline bool cmHasLiteralPrefixImpl(const char* str1,
return strncmp(str1, str2, N) == 0; return strncmp(str1, str2, N) == 0;
} }
inline bool cmHasLiteralSuffixImpl(const std::string &str1,
const char *str2,
size_t N)
{
size_t len = str1.size();
return len >= N && strcmp(str1.c_str() + len - N, str2) == 0;
}
inline bool cmHasLiteralSuffixImpl(const char* str1,
const char* str2,
size_t N)
{
size_t len = strlen(str1);
return len >= N && strcmp(str1 + len - N, str2) == 0;
}
#if defined(_MSC_VER) && _MSC_VER < 1300 \ #if defined(_MSC_VER) && _MSC_VER < 1300 \
|| defined(__GNUC__) && __GNUC__ < 3 \ || defined(__GNUC__) && __GNUC__ < 3 \
|| defined(__BORLANDC__) || defined(__BORLANDC__)
@ -402,6 +418,9 @@ inline bool cmHasLiteralPrefixImpl(const char* str1,
#define cmHasLiteralPrefix(STR1, STR2) \ #define cmHasLiteralPrefix(STR1, STR2) \
cmHasLiteralPrefixImpl(STR1, "" STR2 "", sizeof(STR2) - 1) cmHasLiteralPrefixImpl(STR1, "" STR2 "", sizeof(STR2) - 1)
#define cmHasLiteralSuffix(STR1, STR2) \
cmHasLiteralSuffixImpl(STR1, "" STR2 "", sizeof(STR2) - 1)
#else #else
template<typename T, size_t N> template<typename T, size_t N>
@ -417,6 +436,12 @@ bool cmHasLiteralPrefix(T str1, const char (&str2)[N])
return cmHasLiteralPrefixImpl(str1, str2, N - 1); return cmHasLiteralPrefixImpl(str1, str2, N - 1);
} }
template<typename T, size_t N>
bool cmHasLiteralSuffix(T str1, const char (&str2)[N])
{
return cmHasLiteralSuffixImpl(str1, str2, N - 1);
}
#endif #endif
struct cmStrCmp { struct cmStrCmp {

View File

@ -359,18 +359,11 @@ bool cmSystemTools::IsOn(const char* val)
bool cmSystemTools::IsNOTFOUND(const char* val) bool cmSystemTools::IsNOTFOUND(const char* val)
{ {
size_t len = strlen(val); if(strcmp(val, "NOTFOUND") == 0)
const char* notfound = "-NOTFOUND";
const size_t lenNotFound = 9;
if(len < lenNotFound-1)
{ {
return false; return true;
} }
if(len == lenNotFound-1) return cmHasLiteralSuffix(val, "-NOTFOUND");
{
return ( strcmp(val, "NOTFOUND") == 0);
}
return ((strncmp((val + (len - lenNotFound)), notfound, lenNotFound) == 0));
} }