mirror of https://github.com/stella-emu/stella.git
Last commit for bspf.hxx; cleaned up the formatting.
git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@3305 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
parent
8dbd545433
commit
c0095ca59a
|
@ -29,16 +29,13 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
// Types for 8-bit signed and unsigned integers
|
// Types for 8/16/32/64-bit signed and unsigned integers
|
||||||
using Int8 = int8_t;
|
using Int8 = int8_t;
|
||||||
using uInt8 = uint8_t;
|
using uInt8 = uint8_t;
|
||||||
// Types for 16-bit signed and unsigned integers
|
|
||||||
using Int16 = int16_t;
|
using Int16 = int16_t;
|
||||||
using uInt16 = uint16_t;
|
using uInt16 = uint16_t;
|
||||||
// Types for 32-bit signed and unsigned integers
|
|
||||||
using Int32 = int32_t;
|
using Int32 = int32_t;
|
||||||
using uInt32 = uint32_t;
|
using uInt32 = uint32_t;
|
||||||
// Types for 64-bit signed and unsigned integers
|
|
||||||
using Int64 = int64_t;
|
using Int64 = int64_t;
|
||||||
using uInt64 = uint64_t;
|
using uInt64 = uint64_t;
|
||||||
|
|
||||||
|
@ -69,104 +66,106 @@ static const string EmptyString("");
|
||||||
|
|
||||||
namespace BSPF
|
namespace BSPF
|
||||||
{
|
{
|
||||||
// Defines to help with path handling
|
// Defines to help with path handling
|
||||||
#if defined(BSPF_UNIX) || defined(BSPF_MAC_OSX)
|
#if defined(BSPF_UNIX) || defined(BSPF_MAC_OSX)
|
||||||
static const string PATH_SEPARATOR = "/";
|
static const string PATH_SEPARATOR = "/";
|
||||||
#elif defined(BSPF_WINDOWS)
|
#elif defined(BSPF_WINDOWS)
|
||||||
static const string PATH_SEPARATOR = "\\";
|
static const string PATH_SEPARATOR = "\\";
|
||||||
#pragma warning(2:4264) // no override available for virtual member function from base 'class'; function is hidden
|
#pragma warning(2:4264) // no override available for virtual member function from base 'class'; function is hidden
|
||||||
#pragma warning(2:4265) // class has virtual functions, but destructor is not virtual
|
#pragma warning(2:4265) // class has virtual functions, but destructor is not virtual
|
||||||
#pragma warning(2:4266) // no override available for virtual member function from base 'type'; function is hidden
|
#pragma warning(2:4266) // no override available for virtual member function from base 'type'; function is hidden
|
||||||
#else
|
#else
|
||||||
#error Update src/common/bspf.hxx for path separator
|
#error Update src/common/bspf.hxx for path separator
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// CPU architecture type
|
// CPU architecture type
|
||||||
// This isn't complete yet, but takes care of all the major platforms
|
// This isn't complete yet, but takes care of all the major platforms
|
||||||
#if defined(__i386__) || defined(_M_IX86)
|
#if defined(__i386__) || defined(_M_IX86)
|
||||||
static const string ARCH = "i386";
|
static const string ARCH = "i386";
|
||||||
#elif defined(__x86_64__) || defined(_WIN64)
|
#elif defined(__x86_64__) || defined(_WIN64)
|
||||||
static const string ARCH = "x86_64";
|
static const string ARCH = "x86_64";
|
||||||
#elif defined(__powerpc__) || defined(__ppc__)
|
#elif defined(__powerpc__) || defined(__ppc__)
|
||||||
static const string ARCH = "ppc";
|
static const string ARCH = "ppc";
|
||||||
#else
|
#else
|
||||||
static const string ARCH = "NOARCH";
|
static const string ARCH = "NOARCH";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
// Combines 'max' and 'min', and clamps value to the upper/lower value
|
||||||
// Some convenience functions
|
// if it is outside the specified range
|
||||||
template<typename T> inline T clamp(T a, T l, T u) { return (a<l) ? l : (a>u) ? u : a; }
|
template<typename T> inline T clamp(T a, T l, T u)
|
||||||
|
|
||||||
// Compare two strings, ignoring case
|
|
||||||
inline int compareIgnoreCase(const string& s1, const string& s2)
|
|
||||||
{
|
|
||||||
#if defined BSPF_WINDOWS && !defined __GNUG__
|
|
||||||
return _stricmp(s1.c_str(), s2.c_str());
|
|
||||||
#else
|
|
||||||
return strcasecmp(s1.c_str(), s2.c_str());
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
inline int compareIgnoreCase(const char* s1, const char* s2)
|
|
||||||
{
|
|
||||||
#if defined BSPF_WINDOWS && !defined __GNUG__
|
|
||||||
return _stricmp(s1, s2);
|
|
||||||
#else
|
|
||||||
return strcasecmp(s1, s2);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test whether the first string starts with the second one (case insensitive)
|
|
||||||
inline bool startsWithIgnoreCase(const string& s1, const string& s2)
|
|
||||||
{
|
|
||||||
#if defined BSPF_WINDOWS && !defined __GNUG__
|
|
||||||
return _strnicmp(s1.c_str(), s2.c_str(), s2.length()) == 0;
|
|
||||||
#else
|
|
||||||
return strncasecmp(s1.c_str(), s2.c_str(), s2.length()) == 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
inline bool startsWithIgnoreCase(const char* s1, const char* s2)
|
|
||||||
{
|
|
||||||
#if defined BSPF_WINDOWS && !defined __GNUG__
|
|
||||||
return _strnicmp(s1, s2, strlen(s2)) == 0;
|
|
||||||
#else
|
|
||||||
return strncasecmp(s1, s2, strlen(s2)) == 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test whether two strings are equal (case insensitive)
|
|
||||||
inline bool equalsIgnoreCase(const string& s1, const string& s2)
|
|
||||||
{
|
|
||||||
return compareIgnoreCase(s1, s2) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find location (if any) of the second string within the first,
|
|
||||||
// starting from 'startpos' in the first string
|
|
||||||
inline size_t findIgnoreCase(const string& s1, const string& s2, int startpos = 0)
|
|
||||||
{
|
|
||||||
auto pos = std::search(s1.begin()+startpos, s1.end(),
|
|
||||||
s2.begin(), s2.end(), [](char ch1, char ch2) {
|
|
||||||
return toupper(uInt8(ch1)) == toupper(uInt8(ch2));
|
|
||||||
});
|
|
||||||
return pos == s1.end() ? string::npos : size_t(pos - (s1.begin()+startpos));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test whether the first string ends with the second one (case insensitive)
|
|
||||||
inline bool endsWithIgnoreCase(const string& s1, const string& s2)
|
|
||||||
{
|
|
||||||
if(s1.length() >= s2.length())
|
|
||||||
{
|
{
|
||||||
const char* end = s1.c_str() + s1.length() - s2.length();
|
return (a<l) ? l : (a>u) ? u : a;
|
||||||
return compareIgnoreCase(end, s2.c_str()) == 0;
|
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test whether the first string contains the second one (case insensitive)
|
// Compare two strings, ignoring case
|
||||||
inline bool containsIgnoreCase(const string& s1, const string& s2)
|
inline int compareIgnoreCase(const string& s1, const string& s2)
|
||||||
{
|
{
|
||||||
return findIgnoreCase(s1, s2) != string::npos;
|
#if defined BSPF_WINDOWS && !defined __GNUG__
|
||||||
}
|
return _stricmp(s1.c_str(), s2.c_str());
|
||||||
|
#else
|
||||||
|
return strcasecmp(s1.c_str(), s2.c_str());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
inline int compareIgnoreCase(const char* s1, const char* s2)
|
||||||
|
{
|
||||||
|
#if defined BSPF_WINDOWS && !defined __GNUG__
|
||||||
|
return _stricmp(s1, s2);
|
||||||
|
#else
|
||||||
|
return strcasecmp(s1, s2);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test whether the first string starts with the second one (case insensitive)
|
||||||
|
inline bool startsWithIgnoreCase(const string& s1, const string& s2)
|
||||||
|
{
|
||||||
|
#if defined BSPF_WINDOWS && !defined __GNUG__
|
||||||
|
return _strnicmp(s1.c_str(), s2.c_str(), s2.length()) == 0;
|
||||||
|
#else
|
||||||
|
return strncasecmp(s1.c_str(), s2.c_str(), s2.length()) == 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
inline bool startsWithIgnoreCase(const char* s1, const char* s2)
|
||||||
|
{
|
||||||
|
#if defined BSPF_WINDOWS && !defined __GNUG__
|
||||||
|
return _strnicmp(s1, s2, strlen(s2)) == 0;
|
||||||
|
#else
|
||||||
|
return strncasecmp(s1, s2, strlen(s2)) == 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test whether two strings are equal (case insensitive)
|
||||||
|
inline bool equalsIgnoreCase(const string& s1, const string& s2)
|
||||||
|
{
|
||||||
|
return compareIgnoreCase(s1, s2) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find location (if any) of the second string within the first,
|
||||||
|
// starting from 'startpos' in the first string
|
||||||
|
inline size_t findIgnoreCase(const string& s1, const string& s2, int startpos = 0)
|
||||||
|
{
|
||||||
|
auto pos = std::search(s1.begin()+startpos, s1.end(),
|
||||||
|
s2.begin(), s2.end(), [](char ch1, char ch2) {
|
||||||
|
return toupper(uInt8(ch1)) == toupper(uInt8(ch2));
|
||||||
|
});
|
||||||
|
return pos == s1.end() ? string::npos : size_t(pos - (s1.begin()+startpos));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test whether the first string ends with the second one (case insensitive)
|
||||||
|
inline bool endsWithIgnoreCase(const string& s1, const string& s2)
|
||||||
|
{
|
||||||
|
if(s1.length() >= s2.length())
|
||||||
|
{
|
||||||
|
const char* end = s1.c_str() + s1.length() - s2.length();
|
||||||
|
return compareIgnoreCase(end, s2.c_str()) == 0;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test whether the first string contains the second one (case insensitive)
|
||||||
|
inline bool containsIgnoreCase(const string& s1, const string& s2)
|
||||||
|
{
|
||||||
|
return findIgnoreCase(s1, s2) != string::npos;
|
||||||
|
}
|
||||||
} // namespace BSPF
|
} // namespace BSPF
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue