diff options
author | cyberbotx <cyberbotx@5417fbe8-f217-4b02-8779-1006273d7864> | 2009-07-24 01:11:49 +0000 |
---|---|---|
committer | cyberbotx <cyberbotx@5417fbe8-f217-4b02-8779-1006273d7864> | 2009-07-24 01:11:49 +0000 |
commit | 99fe46de552058cc5aff49ab3cded4ba35bd1510 (patch) | |
tree | 1db200298992e169ae50f2964cd4b23858817a26 /src/hashcomp.cpp | |
parent | 6a975740b30c562e75e02f813e2c9882f0d043df (diff) |
Implement case-insensitive versions of std::string, irc::string for RFC-style case-insensitivity and ci::string for ASCII-style case-insensitivity, code from InspIRCd. Not yet used, but adding it in to use with the help system initially.
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@2390 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src/hashcomp.cpp')
-rw-r--r-- | src/hashcomp.cpp | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/hashcomp.cpp b/src/hashcomp.cpp index f6cea75b3..63b758924 100644 --- a/src/hashcomp.cpp +++ b/src/hashcomp.cpp @@ -14,6 +14,99 @@ #include "services.h" #include "hashcomp.h" +/****************************************************** + * + * This is the implementation of our special irc::string + * class which is a case-insensitive equivalent to + * std::string which is not only case-insensitive but + * can also do scandanavian comparisons, e.g. { = [, etc. + * + * This class depends on the const array 'national_case_insensitive_map'. + * + ******************************************************/ + +bool irc::irc_char_traits::eq(char c1st, char c2nd) +{ + return rfc_case_insensitive_map[static_cast<unsigned char>(c1st)] == rfc_case_insensitive_map[static_cast<unsigned char>(c2nd)]; +} + +bool irc::irc_char_traits::ne(char c1st, char c2nd) +{ + return rfc_case_insensitive_map[static_cast<unsigned char>(c1st)] != rfc_case_insensitive_map[static_cast<unsigned char>(c2nd)]; +} + +bool irc::irc_char_traits::lt(char c1st, char c2nd) +{ + return rfc_case_insensitive_map[static_cast<unsigned char>(c1st)] < rfc_case_insensitive_map[static_cast<unsigned char>(c2nd)]; +} + +int irc::irc_char_traits::compare(const char *str1, const char *str2, size_t n) +{ + for (unsigned i = 0; i < n; ++i) + { + if (rfc_case_insensitive_map[static_cast<unsigned char>(*str1)] > rfc_case_insensitive_map[static_cast<unsigned char>(*str2)]) + return 1; + + if (rfc_case_insensitive_map[static_cast<unsigned char>(*str1)] < rfc_case_insensitive_map[static_cast<unsigned char>(*str2)]) + return -1; + + if (!*str1 || !*str2) + return 0; + + ++str1; + ++str2; + } + return 0; +} + +const char *irc::irc_char_traits::find(const char *s1, int n, char c) +{ + while (n-- > 0 && rfc_case_insensitive_map[static_cast<unsigned char>(*s1)] != rfc_case_insensitive_map[static_cast<unsigned char>(c)]) + ++s1; + return n >= 0 ? s1 : NULL; +} + +bool ci::ci_char_traits::eq(char c1st, char c2nd) +{ + return ascii_case_insensitive_map[static_cast<unsigned char>(c1st)] == ascii_case_insensitive_map[static_cast<unsigned char>(c2nd)]; +} + +bool ci::ci_char_traits::ne(char c1st, char c2nd) +{ + return ascii_case_insensitive_map[static_cast<unsigned char>(c1st)] != ascii_case_insensitive_map[static_cast<unsigned char>(c2nd)]; +} + +bool ci::ci_char_traits::lt(char c1st, char c2nd) +{ + return ascii_case_insensitive_map[static_cast<unsigned char>(c1st)] < ascii_case_insensitive_map[static_cast<unsigned char>(c2nd)]; +} + +int ci::ci_char_traits::compare(const char *str1, const char *str2, size_t n) +{ + for (unsigned i = 0; i < n; ++i) + { + if (ascii_case_insensitive_map[static_cast<unsigned char>(*str1)] > ascii_case_insensitive_map[static_cast<unsigned char>(*str2)]) + return 1; + + if (ascii_case_insensitive_map[static_cast<unsigned char>(*str1)] < ascii_case_insensitive_map[static_cast<unsigned char>(*str2)]) + return -1; + + if (!*str1 || !*str2) + return 0; + + ++str1; + ++str2; + } + return 0; +} + +const char *ci::ci_char_traits::find(const char *s1, int n, char c) +{ + while (n-- > 0 && ascii_case_insensitive_map[static_cast<unsigned char>(*s1)] != ascii_case_insensitive_map[static_cast<unsigned char>(c)]) + ++s1; + return n >= 0 ? s1 : NULL; +} + sepstream::sepstream(const std::string &source, char seperator) : tokens(source), sep(seperator) { last_starting_position = n = tokens.begin(); |