|
|
@@ -391,6 +391,22 @@ inline bool cmHasLiteralPrefixImpl(const char* str1,
|
|
|
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 \
|
|
|
|| defined(__GNUC__) && __GNUC__ < 3 \
|
|
|
|| defined(__BORLANDC__)
|
|
|
@@ -402,6 +418,9 @@ inline bool cmHasLiteralPrefixImpl(const char* str1,
|
|
|
#define cmHasLiteralPrefix(STR1, STR2) \
|
|
|
cmHasLiteralPrefixImpl(STR1, "" STR2 "", sizeof(STR2) - 1)
|
|
|
|
|
|
+#define cmHasLiteralSuffix(STR1, STR2) \
|
|
|
+ cmHasLiteralSuffixImpl(STR1, "" STR2 "", sizeof(STR2) - 1)
|
|
|
+
|
|
|
#else
|
|
|
|
|
|
template<typename T, size_t N>
|
|
|
@@ -417,6 +436,12 @@ bool cmHasLiteralPrefix(T str1, const char (&str2)[N])
|
|
|
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
|
|
|
|
|
|
struct cmStrCmp {
|