/*============================================================================= Copyright (c) 2001-2011 Joel de Guzman Distributed under 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_UC_TYPES_NOVEMBER_23_2008_0840PM) #define BOOST_SPIRIT_UC_TYPES_NOVEMBER_23_2008_0840PM #if defined(_MSC_VER) #pragma once #endif #include #include #include #include #include namespace boost { namespace spirit { typedef ::boost::uint32_t ucs4_char; typedef char utf8_char; typedef std::basic_string ucs4_string; typedef std::basic_string utf8_string; template inline utf8_string to_utf8(Char value) { // always store as UTF8 utf8_string result; typedef std::back_insert_iterator insert_iter; insert_iter out_iter(result); utf8_output_iterator utf8_iter(out_iter); typedef typename make_unsigned::type UChar; *utf8_iter = (UChar)value; return result; } template inline utf8_string to_utf8(Char const* str) { // always store as UTF8 utf8_string result; typedef std::back_insert_iterator insert_iter; insert_iter out_iter(result); utf8_output_iterator utf8_iter(out_iter); typedef typename make_unsigned::type UChar; while (*str) *utf8_iter++ = (UChar)*str++; return result; } template inline utf8_string to_utf8(std::basic_string const& str) { // always store as UTF8 utf8_string result; typedef std::back_insert_iterator insert_iter; insert_iter out_iter(result); utf8_output_iterator utf8_iter(out_iter); typedef typename make_unsigned::type UChar; BOOST_FOREACH(Char ch, str) { *utf8_iter++ = (UChar)ch; } return result; } // Assume wchar_t content is UTF-16 on MSVC, or mingw/wineg++ with -fshort-wchar #if defined(_MSC_VER) || defined(__SIZEOF_WCHAR_T__) && __SIZEOF_WCHAR_T__ == 2 inline utf8_string to_utf8(wchar_t value) { utf8_string result; typedef std::back_insert_iterator insert_iter; insert_iter out_iter(result); utf8_output_iterator utf8_iter(out_iter); u16_to_u32_iterator ucs4_iter(&value); *utf8_iter++ = *ucs4_iter; return result; } inline utf8_string to_utf8(wchar_t const* str) { utf8_string result; typedef std::back_insert_iterator insert_iter; insert_iter out_iter(result); utf8_output_iterator utf8_iter(out_iter); u16_to_u32_iterator ucs4_iter(str); for (ucs4_char c; (c = *ucs4_iter) != ucs4_char(); ++ucs4_iter) { *utf8_iter++ = c; } return result; } template inline utf8_string to_utf8(std::basic_string const& str) { return to_utf8(str.c_str()); } #endif }} #endif