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 |