391 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			391 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*=============================================================================
 | |
|     Copyright (c) 1998-2003 Joel de Guzman
 | |
|     Copyright (c) 2003 Martin Wille
 | |
|     http://spirit.sourceforge.net/
 | |
| 
 | |
|     Use, modification and distribution is subject to the Boost Software
 | |
|     License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
 | |
|     http://www.boost.org/LICENSE_1_0.txt)
 | |
| =============================================================================*/
 | |
| #if !defined(BOOST_SPIRIT_PRIMITIVES_IPP)
 | |
| #define BOOST_SPIRIT_PRIMITIVES_IPP
 | |
| 
 | |
| #include <cctype>
 | |
| #if !defined(BOOST_NO_CWCTYPE)
 | |
| #include <cwctype>
 | |
| #endif
 | |
| 
 | |
| #include <string> // char_traits
 | |
| 
 | |
| #if defined(BOOST_MSVC)
 | |
| #  pragma warning (push)
 | |
| #  pragma warning(disable:4800)
 | |
| #endif
 | |
| 
 | |
| namespace boost { namespace spirit {
 | |
| 
 | |
| BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
 | |
| 
 | |
|     template <typename DrivedT> struct char_parser;
 | |
| 
 | |
|     namespace impl
 | |
|     {
 | |
|         template <typename IteratorT>
 | |
|         inline IteratorT
 | |
|         get_last(IteratorT first)
 | |
|         {
 | |
|             while (*first)
 | |
|                 first++;
 | |
|             return first;
 | |
|         }
 | |
| 
 | |
|         template<
 | |
|             typename RT,
 | |
|             typename IteratorT,
 | |
|             typename ScannerT>
 | |
|         inline RT
 | |
|         string_parser_parse(
 | |
|             IteratorT str_first,
 | |
|             IteratorT str_last,
 | |
|             ScannerT& scan)
 | |
|         {
 | |
|             typedef typename ScannerT::iterator_t iterator_t;
 | |
|             iterator_t saved = scan.first;
 | |
|             std::size_t slen = str_last - str_first;
 | |
| 
 | |
|             while (str_first != str_last)
 | |
|             {
 | |
|                 if (scan.at_end() || (*str_first != *scan))
 | |
|                     return scan.no_match();
 | |
|                 ++str_first;
 | |
|                 ++scan;
 | |
|             }
 | |
| 
 | |
|             return scan.create_match(slen, nil_t(), saved, scan.first);
 | |
|         }
 | |
| 
 | |
|     ///////////////////////////////////////////////////////////////////////////
 | |
|     //
 | |
|     // Conversion from char_type to int_type
 | |
|     //
 | |
|     ///////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
|         //  Use char_traits for char and wchar_t only, as these are the only
 | |
|         //  specializations provided in the standard. Other types are on their
 | |
|         //  own.
 | |
|         //
 | |
|         //  For UDT, one may override:
 | |
|         //
 | |
|         //      isalnum
 | |
|         //      isalpha
 | |
|         //      iscntrl
 | |
|         //      isdigit
 | |
|         //      isgraph
 | |
|         //      islower
 | |
|         //      isprint
 | |
|         //      ispunct
 | |
|         //      isspace
 | |
|         //      isupper
 | |
|         //      isxdigit
 | |
|         //      isblank
 | |
|         //      isupper
 | |
|         //      tolower
 | |
|         //      toupper
 | |
|         //
 | |
|         //  in a namespace suitable for Argument Dependent lookup or in
 | |
|         //  namespace std (disallowed by the standard).
 | |
| 
 | |
|         template <typename CharT>
 | |
|         struct char_type_char_traits_helper
 | |
|         {
 | |
|             typedef CharT char_type;
 | |
|             typedef typename std::char_traits<CharT>::int_type int_type;
 | |
| 
 | |
|             static int_type to_int_type(CharT c)
 | |
|             {
 | |
|                 return std::char_traits<CharT>::to_int_type(c);
 | |
|             }
 | |
| 
 | |
|             static char_type to_char_type(int_type i)
 | |
|             {
 | |
|                 return std::char_traits<CharT>::to_char_type(i);
 | |
|             }
 | |
|         };
 | |
| 
 | |
|         template <typename CharT>
 | |
|         struct char_traits_helper
 | |
|         {
 | |
|             typedef CharT char_type;
 | |
|             typedef CharT int_type;
 | |
| 
 | |
|             static CharT & to_int_type(CharT & c)
 | |
|             {
 | |
|                 return c;
 | |
|             }
 | |
| 
 | |
|             static CharT & to_char_type(CharT & c)
 | |
|             {
 | |
|                 return c;
 | |
|             }
 | |
|         };
 | |
| 
 | |
|         template <>
 | |
|         struct char_traits_helper<char>
 | |
|             : char_type_char_traits_helper<char>
 | |
|         {
 | |
|         };
 | |
| 
 | |
| #if !defined(BOOST_NO_CWCTYPE)
 | |
| 
 | |
|         template <>
 | |
|         struct char_traits_helper<wchar_t>
 | |
|             : char_type_char_traits_helper<wchar_t>
 | |
|         {
 | |
|         };
 | |
| 
 | |
| #endif
 | |
| 
 | |
|         template <typename CharT>
 | |
|         inline typename char_traits_helper<CharT>::int_type
 | |
|         to_int_type(CharT c)
 | |
|         {
 | |
|             return char_traits_helper<CharT>::to_int_type(c);
 | |
|         }
 | |
| 
 | |
|         template <typename CharT>
 | |
|         inline CharT
 | |
|         to_char_type(typename char_traits_helper<CharT>::int_type c)
 | |
|         {
 | |
|             return char_traits_helper<CharT>::to_char_type(c);
 | |
|         }
 | |
| 
 | |
|         ///////////////////////////////////////////////////////////////////////
 | |
|         //
 | |
|         //  Convenience functions
 | |
|         //
 | |
|         ///////////////////////////////////////////////////////////////////////
 | |
| 
 | |
|         template <typename CharT>
 | |
|         inline bool
 | |
|         isalnum_(CharT c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return isalnum(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         template <typename CharT>
 | |
|         inline bool
 | |
|         isalpha_(CharT c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return isalpha(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         template <typename CharT>
 | |
|         inline bool
 | |
|         iscntrl_(CharT c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return iscntrl(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         template <typename CharT>
 | |
|         inline bool
 | |
|         isdigit_(CharT c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return isdigit(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         template <typename CharT>
 | |
|         inline bool
 | |
|         isgraph_(CharT c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return isgraph(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         template <typename CharT>
 | |
|         inline bool
 | |
|         islower_(CharT c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return islower(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         template <typename CharT>
 | |
|         inline bool
 | |
|         isprint_(CharT c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return isprint(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         template <typename CharT>
 | |
|         inline bool
 | |
|         ispunct_(CharT c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return ispunct(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         template <typename CharT>
 | |
|         inline bool
 | |
|         isspace_(CharT c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return isspace(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         template <typename CharT>
 | |
|         inline bool
 | |
|         isupper_(CharT c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return isupper(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         template <typename CharT>
 | |
|         inline bool
 | |
|         isxdigit_(CharT c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return isxdigit(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         template <typename CharT>
 | |
|         inline bool
 | |
|         isblank_(CharT c)
 | |
|         {
 | |
|             return (c == ' ' || c == '\t');
 | |
|         }
 | |
| 
 | |
|         template <typename CharT>
 | |
|         inline CharT
 | |
|         tolower_(CharT c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return to_char_type<CharT>(tolower(to_int_type(c)));
 | |
|         }
 | |
| 
 | |
|         template <typename CharT>
 | |
|         inline CharT
 | |
|         toupper_(CharT c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return to_char_type<CharT>(toupper(to_int_type(c)));
 | |
|         }
 | |
| 
 | |
| #if !defined(BOOST_NO_CWCTYPE)
 | |
| 
 | |
|         inline bool
 | |
|         isalnum_(wchar_t c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return iswalnum(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         inline bool
 | |
|         isalpha_(wchar_t c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return iswalpha(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         inline bool
 | |
|         iscntrl_(wchar_t c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return iswcntrl(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         inline bool
 | |
|         isdigit_(wchar_t c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return iswdigit(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         inline bool
 | |
|         isgraph_(wchar_t c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return iswgraph(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         inline bool
 | |
|         islower_(wchar_t c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return iswlower(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         inline bool
 | |
|         isprint_(wchar_t c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return iswprint(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         inline bool
 | |
|         ispunct_(wchar_t c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return iswpunct(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         inline bool
 | |
|         isspace_(wchar_t c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return iswspace(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         inline bool
 | |
|         isupper_(wchar_t c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return iswupper(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         inline bool
 | |
|         isxdigit_(wchar_t c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return iswxdigit(to_int_type(c)) ? true : false;
 | |
|         }
 | |
| 
 | |
|         inline bool
 | |
|         isblank_(wchar_t c)
 | |
|         {
 | |
|             return (c == L' ' || c == L'\t');
 | |
|         }
 | |
| 
 | |
|         inline wchar_t
 | |
|         tolower_(wchar_t c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return to_char_type<wchar_t>(towlower(to_int_type(c)));
 | |
|         }
 | |
| 
 | |
|         inline wchar_t
 | |
|         toupper_(wchar_t c)
 | |
|         {
 | |
|             using namespace std;
 | |
|             return to_char_type<wchar_t>(towupper(to_int_type(c)));
 | |
|         }
 | |
| 
 | |
| #endif // !defined(BOOST_NO_CWCTYPE)
 | |
| 
 | |
| }
 | |
| 
 | |
| BOOST_SPIRIT_CLASSIC_NAMESPACE_END
 | |
| 
 | |
| }} // namespace boost::spirit::impl
 | |
| 
 | |
| #ifdef BOOST_MSVC
 | |
| #pragma warning (pop)
 | |
| #endif
 | |
| 
 | |
| #endif
 | 
