1 // 2 // Copyright (c) 2012 Artyom Beilis (Tonkikh) 3 // 4 // Distributed under the Boost Software License, Version 1.0. (See 5 // accompanying file LICENSE or copy at 6 // http://www.boost.org/LICENSE_1_0.txt) 7 // 8 #ifndef BOOST_NOWIDE_UTF_CONVERT_HPP_INCLUDED 9 #define BOOST_NOWIDE_UTF_CONVERT_HPP_INCLUDED 10 11 #include <boost/nowide/replacement.hpp> 12 #include <boost/nowide/utf/utf.hpp> 13 #include <iterator> 14 #include <string> 15 16 namespace boost { 17 namespace nowide { 18 namespace utf { 19 /// 20 /// Convert a buffer of UTF sequences in the range [source_begin, source_end) 21 /// from \tparam CharIn to \tparam CharOut to the output \a buffer of size \a buffer_size. 22 /// 23 /// \return original buffer containing the NULL terminated string or NULL 24 /// 25 /// If there is not enough room in the buffer NULL is returned, and the content of the buffer is undefined. 26 /// Any illegal sequences are replaced with the replacement character, see #BOOST_NOWIDE_REPLACEMENT_CHARACTER 27 /// 28 template<typename CharOut, typename CharIn> 29 CharOut* convert_buffer(CharOut * buffer,size_t buffer_size,const CharIn * source_begin,const CharIn * source_end)30 convert_buffer(CharOut* buffer, size_t buffer_size, const CharIn* source_begin, const CharIn* source_end) 31 { 32 CharOut* rv = buffer; 33 if(buffer_size == 0) 34 return 0; 35 buffer_size--; 36 while(source_begin != source_end) 37 { 38 code_point c = utf_traits<CharIn>::template decode(source_begin, source_end); 39 if(c == illegal || c == incomplete) 40 { 41 c = BOOST_NOWIDE_REPLACEMENT_CHARACTER; 42 } 43 size_t width = utf_traits<CharOut>::width(c); 44 if(buffer_size < width) 45 { 46 rv = NULL; 47 break; 48 } 49 buffer = utf_traits<CharOut>::template encode(c, buffer); 50 buffer_size -= width; 51 } 52 *buffer++ = 0; 53 return rv; 54 } 55 56 /// 57 /// Convert the UTF sequences in range [begin, end) from \tparam CharIn to \tparam CharOut 58 /// and return it as a string 59 /// 60 /// Any illegal sequences are replaced with the replacement character, see #BOOST_NOWIDE_REPLACEMENT_CHARACTER 61 /// 62 template<typename CharOut, typename CharIn> convert_string(const CharIn * begin,const CharIn * end)63 std::basic_string<CharOut> convert_string(const CharIn* begin, const CharIn* end) 64 { 65 std::basic_string<CharOut> result; 66 result.reserve(end - begin); 67 typedef std::back_insert_iterator<std::basic_string<CharOut> > inserter_type; 68 inserter_type inserter(result); 69 code_point c; 70 while(begin != end) 71 { 72 c = utf_traits<CharIn>::template decode(begin, end); 73 if(c == illegal || c == incomplete) 74 { 75 c = BOOST_NOWIDE_REPLACEMENT_CHARACTER; 76 } 77 utf_traits<CharOut>::template encode(c, inserter); 78 } 79 return result; 80 } 81 82 /// Return the length of the given string in code units. 83 /// That is the number of elements of type Char until the first NULL character 84 /// Equivalent to `std::strlen(s)` but can handle wide-strings 85 template<typename Char> strlen(const Char * s)86 size_t strlen(const Char* s) 87 { 88 const Char* end = s; 89 while(*end) 90 end++; 91 return end - s; 92 } 93 94 } // namespace utf 95 } // namespace nowide 96 } // namespace boost 97 98 #endif 99