summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--epgsearchtools.h37
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