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
 |