diff options
-rw-r--r-- | epgsearchtools.h | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/epgsearchtools.h b/epgsearchtools.h index 325b25c..3ca85c4 100644 --- a/epgsearchtools.h +++ b/epgsearchtools.h @@ -151,4 +151,41 @@ public: } }; +// --- icstring ------------------------------------------ +// a case-insensitive string class + +struct ignorecase_traits : public std::char_traits<char> { + // return whether c1 and c2 are equal + static bool eq(const char& c1, const char& c2) { + return (c1==c2 || std::toupper(c1)==std::toupper(c2)); + } + // return whether c1 is less than c2 + static bool lt(const char& c1, const char& c2) { + return std::toupper(c1)<std::toupper(c2); + } + // compare up to n characters of s1 and s2 + static int compare(const char* s1, const char* s2, + std::size_t n) { + for (std::size_t i=0; i<n; ++i) { + if (!eq(s1[i],s2[i])) { + return lt(s1[i],s2[i])?-1:1; + } + } + return 0; + } + // search c in s + static const char* find(const char* s, std::size_t n, + const char& c) { + for (std::size_t i=0; i<n; ++i) { + if (eq(s[i],c)) { + return &(s[i]); + } + } + return 0; + } +}; + +// define a special type for such strings +typedef std::basic_string<char,ignorecase_traits> icstring; + #endif |