#ifndef __STRING_NOCASE_H__ #define __STRING_NOCASE_H__ #include #include #include // case insensitive character traits // inherited copy (preserves case), // case insensitive comparison, search struct traits_nocase : std::char_traits { static bool eq( const char& c1, const char& c2 ) { return toupper(c1) == toupper(c2) ; } static bool lt( const char& c1, const char& c2 ) { return toupper(c1) < toupper(c2) ; } static int compare( const char* s1, const char* s2, size_t N ) { return strncasecmp( s1, s2, N ) ; // posix // mirosoft C++ - use _strnicmp instead } static const char* find( const char* s, size_t N, const char& a ) { for( size_t i=0 ; i string_nocase ; // make string_nocase work like a std::string // with streams using std::char_traits // std::basic_istream< char, std::char_traits > (std::istream) and // std::basic_ostream< char, std::char_traits > (std::ostream) inline std::ostream& operator<< ( std::ostream& stm, const string_nocase& str ) { return stm << reinterpret_cast(str) ; } inline std::istream& operator>> ( std::istream& stm, string_nocase& str ) { std::string s ; stm >> s ; if(stm) str.assign(s.begin(),s.end()) ; return stm ; } inline std::istream& getline( std::istream& stm, string_nocase& str ) { std::string s ; std::getline(stm,s) ; if(stm) str.assign(s.begin(),s.end()) ; return stm ; } #endif // __STRING_NOCASE_H__