OpenMW
|
00001 #ifndef MISC_STRINGOPS_H 00002 #define MISC_STRINGOPS_H 00003 00004 #include <cctype> 00005 #include <string> 00006 #include <algorithm> 00007 00008 namespace Misc 00009 { 00010 class StringUtils 00011 { 00012 struct ci 00013 { 00014 bool operator()(int x, int y) const { 00015 return std::tolower(x) < std::tolower(y); 00016 } 00017 }; 00018 00019 public: 00020 static bool ciLess(const std::string &x, const std::string &y) { 00021 return std::lexicographical_compare(x.begin(), x.end(), y.begin(), y.end(), ci()); 00022 } 00023 00024 static bool ciEqual(const std::string &x, const std::string &y) { 00025 if (x.size() != y.size()) { 00026 return false; 00027 } 00028 std::string::const_iterator xit = x.begin(); 00029 std::string::const_iterator yit = y.begin(); 00030 for (; xit != x.end(); ++xit, ++yit) { 00031 if (std::tolower(*xit) != std::tolower(*yit)) { 00032 return false; 00033 } 00034 } 00035 return true; 00036 } 00037 00038 static int ciCompareLen(const std::string &x, const std::string &y, size_t len) 00039 { 00040 std::string::const_iterator xit = x.begin(); 00041 std::string::const_iterator yit = y.begin(); 00042 for(;xit != x.end() && yit != y.end() && len > 0;++xit,++yit,--len) 00043 { 00044 int res = *xit - *yit; 00045 if(res != 0 && std::tolower(*xit) != std::tolower(*yit)) 00046 return (res > 0) ? 1 : -1; 00047 } 00048 if(len > 0) 00049 { 00050 if(xit != x.end()) 00051 return 1; 00052 if(yit != y.end()) 00053 return -1; 00054 } 00055 return 0; 00056 } 00057 00059 static std::string &toLower(std::string &inout) { 00060 std::transform( 00061 inout.begin(), 00062 inout.end(), 00063 inout.begin(), 00064 (int (*)(int)) std::tolower 00065 ); 00066 return inout; 00067 } 00068 00070 static std::string lowerCase(const std::string &in) 00071 { 00072 std::string out = in; 00073 return toLower(out); 00074 } 00075 }; 00076 00077 00079 bool begins(const char* str1, const char* str2); 00080 00082 bool ends(const char* str1, const char* str2); 00083 00085 bool ibegins(const char* str1, const char* str2); 00086 00088 bool iends(const char* str1, const char* str2); 00089 00090 } 00091 00092 #endif