Chris@16: /* Chris@16: * Chris@16: * Copyright (c) 2004 Chris@16: * John Maddock Chris@16: * Chris@16: * Use, modification and distribution are subject to the Chris@16: * Boost Software License, Version 1.0. (See accompanying file Chris@16: * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: * Chris@16: */ Chris@16: Chris@16: /* Chris@16: * LOCATION: see http://www.boost.org for most recent version. Chris@16: * FILE c_regex_traits.hpp Chris@16: * VERSION see Chris@16: * DESCRIPTION: Declares regular expression traits class that wraps the global C locale. Chris@16: */ Chris@16: Chris@16: #ifndef BOOST_C_REGEX_TRAITS_HPP_INCLUDED Chris@16: #define BOOST_C_REGEX_TRAITS_HPP_INCLUDED Chris@16: Chris@16: #ifndef BOOST_REGEX_CONFIG_HPP Chris@16: #include Chris@16: #endif Chris@16: #ifndef BOOST_REGEX_WORKAROUND_HPP Chris@16: #include Chris@16: #endif Chris@16: Chris@16: #include Chris@16: Chris@16: #ifdef BOOST_NO_STDC_NAMESPACE Chris@16: namespace std{ Chris@16: using ::strlen; using ::tolower; Chris@16: } Chris@16: #endif Chris@16: Chris@16: #ifdef BOOST_MSVC Chris@16: #pragma warning(push) Chris@16: #pragma warning(disable: 4103) Chris@16: #endif Chris@16: #ifdef BOOST_HAS_ABI_HEADERS Chris@16: # include BOOST_ABI_PREFIX Chris@16: #endif Chris@16: #ifdef BOOST_MSVC Chris@16: #pragma warning(pop) Chris@16: #endif Chris@16: Chris@16: namespace boost{ Chris@16: Chris@16: template Chris@16: struct c_regex_traits; Chris@16: Chris@16: template<> Chris@16: struct BOOST_REGEX_DECL c_regex_traits Chris@16: { Chris@16: c_regex_traits(){} Chris@16: typedef char char_type; Chris@16: typedef std::size_t size_type; Chris@16: typedef std::string string_type; Chris@16: struct locale_type{}; Chris@16: typedef boost::uint32_t char_class_type; Chris@16: Chris@16: static size_type length(const char_type* p) Chris@16: { Chris@16: return (std::strlen)(p); Chris@16: } Chris@16: Chris@16: char translate(char c) const Chris@16: { Chris@16: return c; Chris@16: } Chris@16: char translate_nocase(char c) const Chris@16: { Chris@16: return static_cast((std::tolower)(static_cast(c))); Chris@16: } Chris@16: Chris@16: static string_type BOOST_REGEX_CALL transform(const char* p1, const char* p2); Chris@16: static string_type BOOST_REGEX_CALL transform_primary(const char* p1, const char* p2); Chris@16: Chris@16: static char_class_type BOOST_REGEX_CALL lookup_classname(const char* p1, const char* p2); Chris@16: static string_type BOOST_REGEX_CALL lookup_collatename(const char* p1, const char* p2); Chris@16: Chris@16: static bool BOOST_REGEX_CALL isctype(char, char_class_type); Chris@16: static int BOOST_REGEX_CALL value(char, int); Chris@16: Chris@16: locale_type imbue(locale_type l) Chris@16: { return l; } Chris@16: locale_type getloc()const Chris@16: { return locale_type(); } Chris@16: Chris@16: private: Chris@16: // this type is not copyable: Chris@16: c_regex_traits(const c_regex_traits&); Chris@16: c_regex_traits& operator=(const c_regex_traits&); Chris@16: }; Chris@16: Chris@16: #ifndef BOOST_NO_WREGEX Chris@16: template<> Chris@16: struct BOOST_REGEX_DECL c_regex_traits Chris@16: { Chris@16: c_regex_traits(){} Chris@16: typedef wchar_t char_type; Chris@16: typedef std::size_t size_type; Chris@16: typedef std::wstring string_type; Chris@16: struct locale_type{}; Chris@16: typedef boost::uint32_t char_class_type; Chris@16: Chris@16: static size_type length(const char_type* p) Chris@16: { Chris@16: return (std::wcslen)(p); Chris@16: } Chris@16: Chris@16: wchar_t translate(wchar_t c) const Chris@16: { Chris@16: return c; Chris@16: } Chris@16: wchar_t translate_nocase(wchar_t c) const Chris@16: { Chris@16: return (std::towlower)(c); Chris@16: } Chris@16: Chris@16: static string_type BOOST_REGEX_CALL transform(const wchar_t* p1, const wchar_t* p2); Chris@16: static string_type BOOST_REGEX_CALL transform_primary(const wchar_t* p1, const wchar_t* p2); Chris@16: Chris@16: static char_class_type BOOST_REGEX_CALL lookup_classname(const wchar_t* p1, const wchar_t* p2); Chris@16: static string_type BOOST_REGEX_CALL lookup_collatename(const wchar_t* p1, const wchar_t* p2); Chris@16: Chris@16: static bool BOOST_REGEX_CALL isctype(wchar_t, char_class_type); Chris@16: static int BOOST_REGEX_CALL value(wchar_t, int); Chris@16: Chris@16: locale_type imbue(locale_type l) Chris@16: { return l; } Chris@16: locale_type getloc()const Chris@16: { return locale_type(); } Chris@16: Chris@16: private: Chris@16: // this type is not copyable: Chris@16: c_regex_traits(const c_regex_traits&); Chris@16: c_regex_traits& operator=(const c_regex_traits&); Chris@16: }; Chris@16: Chris@16: #ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T Chris@16: // Chris@16: // Provide an unsigned short version as well, so the user can link to this Chris@16: // no matter whether they build with /Zc:wchar_t or not (MSVC specific). Chris@16: // Chris@16: template<> Chris@16: struct BOOST_REGEX_DECL c_regex_traits Chris@16: { Chris@16: c_regex_traits(){} Chris@16: typedef unsigned short char_type; Chris@16: typedef std::size_t size_type; Chris@16: typedef std::basic_string string_type; Chris@16: struct locale_type{}; Chris@16: typedef boost::uint32_t char_class_type; Chris@16: Chris@16: static size_type length(const char_type* p) Chris@16: { Chris@16: return (std::wcslen)((const wchar_t*)p); Chris@16: } Chris@16: Chris@16: unsigned short translate(unsigned short c) const Chris@16: { Chris@16: return c; Chris@16: } Chris@16: unsigned short translate_nocase(unsigned short c) const Chris@16: { Chris@16: return (std::towlower)((wchar_t)c); Chris@16: } Chris@16: Chris@16: static string_type BOOST_REGEX_CALL transform(const unsigned short* p1, const unsigned short* p2); Chris@16: static string_type BOOST_REGEX_CALL transform_primary(const unsigned short* p1, const unsigned short* p2); Chris@16: Chris@16: static char_class_type BOOST_REGEX_CALL lookup_classname(const unsigned short* p1, const unsigned short* p2); Chris@16: static string_type BOOST_REGEX_CALL lookup_collatename(const unsigned short* p1, const unsigned short* p2); Chris@16: Chris@16: static bool BOOST_REGEX_CALL isctype(unsigned short, char_class_type); Chris@16: static int BOOST_REGEX_CALL value(unsigned short, int); Chris@16: Chris@16: locale_type imbue(locale_type l) Chris@16: { return l; } Chris@16: locale_type getloc()const Chris@16: { return locale_type(); } Chris@16: Chris@16: private: Chris@16: // this type is not copyable: Chris@16: c_regex_traits(const c_regex_traits&); Chris@16: c_regex_traits& operator=(const c_regex_traits&); Chris@16: }; Chris@16: Chris@16: #endif Chris@16: Chris@16: #endif // BOOST_NO_WREGEX Chris@16: Chris@16: } Chris@16: Chris@16: #ifdef BOOST_MSVC Chris@16: #pragma warning(push) Chris@16: #pragma warning(disable: 4103) Chris@16: #endif Chris@16: #ifdef BOOST_HAS_ABI_HEADERS Chris@16: # include BOOST_ABI_SUFFIX Chris@16: #endif Chris@16: #ifdef BOOST_MSVC Chris@16: #pragma warning(pop) Chris@16: #endif Chris@16: Chris@16: #endif Chris@16: Chris@16: Chris@16: