7 #ifndef BOOST_LOCALE_GENERIC_CODECVT_HPP 8 #define BOOST_LOCALE_GENERIC_CODECVT_HPP 10 #include <boost/locale/utf.hpp> 11 #include <boost/cstdint.hpp> 12 #include <boost/static_assert.hpp> 18 #ifndef BOOST_LOCALE_DOXYGEN 22 BOOST_STATIC_ASSERT(
sizeof(std::mbstate_t)>=2);
25 #if defined(_MSC_VER) && _MSC_VER < 1700 27 #define BOOST_LOCALE_DO_LENGTH_MBSTATE_CONST 138 template<
typename CharType,
typename CodecvtImpl,
int CharSize=sizeof(CharType)>
149 template<
typename CharType,
typename CodecvtImpl>
154 typedef CharType uchar;
157 std::codecvt<CharType,char,std::mbstate_t>(refs)
160 CodecvtImpl
const &implementation()
const 162 return *static_cast<CodecvtImpl const *>(
this);
168 std::codecvt_base::result do_unshift(std::mbstate_t &s,
char *from,
char * ,
char *&next)
const BOOST_OVERRIDE
170 boost::uint16_t &state = *reinterpret_cast<boost::uint16_t *>(&s);
172 std::cout <<
"Entering unshift " << std::hex << state << std::dec << std::endl;
175 return std::codecvt_base::error;
177 return std::codecvt_base::ok;
179 int do_encoding()
const BOOST_NOEXCEPT_OR_NOTHROW BOOST_OVERRIDE
183 int do_max_length()
const BOOST_NOEXCEPT_OR_NOTHROW BOOST_OVERRIDE
185 return implementation().max_encoding_length();
187 bool do_always_noconv()
const BOOST_NOEXCEPT_OR_NOTHROW BOOST_OVERRIDE
193 do_length( std::mbstate_t
194 #ifdef BOOST_LOCALE_DO_LENGTH_MBSTATE_CONST
199 char const *from_end,
200 size_t max)
const BOOST_OVERRIDE
202 #ifndef BOOST_LOCALE_DO_LENGTH_MBSTATE_CONST 203 char const *save_from = from;
204 boost::uint16_t &state = *reinterpret_cast<boost::uint16_t *>(&std_state);
206 size_t save_max = max;
207 boost::uint16_t state = *reinterpret_cast<boost::uint16_t const *>(&std_state);
211 while(max > 0 && from < from_end){
212 char const *prev_from = from;
213 boost::uint32_t ch=implementation().to_unicode(cvt_state,from,from_end);
229 #ifndef BOOST_LOCALE_DO_LENGTH_MBSTATE_CONST 230 return static_cast<int>(from - save_from);
232 return static_cast<int>(save_max - max);
237 std::codecvt_base::result
238 do_in( std::mbstate_t &std_state,
240 char const *from_end,
241 char const *&from_next,
244 uchar *&to_next)
const BOOST_OVERRIDE
246 std::codecvt_base::result r=std::codecvt_base::ok;
253 boost::uint16_t &state = *reinterpret_cast<boost::uint16_t *>(&std_state);
255 while(to < to_end && from < from_end)
258 std::cout <<
"Entering IN--------------\n";
259 std::cout <<
"State " << std::hex << state << std::endl;
260 std::cout <<
"Left in " << std::dec << from_end - from <<
" out " << to_end -to << std::endl;
262 char const *from_saved = from;
264 uint32_t ch=implementation().to_unicode(cvt_state,from,from_end);
268 r=std::codecvt_base::error;
273 r=std::codecvt_base::partial;
278 *to++ = static_cast<uchar>(ch);
291 boost::uint16_t w1 = static_cast<boost::uint16_t>(0xD800 | (ch >> 10));
292 boost::uint16_t w2 = static_cast<boost::uint16_t>(0xDC00 | (ch & 0x3FF));
306 if(r == std::codecvt_base::ok && (from!=from_end || state!=0))
307 r = std::codecvt_base::partial;
309 std::cout <<
"Returning ";
311 case std::codecvt_base::ok:
314 case std::codecvt_base::partial:
315 std::cout <<
"partial\n";
317 case std::codecvt_base::error:
318 std::cout <<
"error\n";
321 std::cout <<
"other\n";
324 std::cout <<
"State " << std::hex << state << std::endl;
325 std::cout <<
"Left in " << std::dec << from_end - from <<
" out " << to_end -to << std::endl;
330 std::codecvt_base::result
331 do_out( std::mbstate_t &std_state,
333 uchar
const *from_end,
334 uchar
const *&from_next,
337 char *&to_next)
const BOOST_OVERRIDE
339 std::codecvt_base::result r=std::codecvt_base::ok;
347 boost::uint16_t &state = *reinterpret_cast<boost::uint16_t *>(&std_state);
349 while(to < to_end && from < from_end)
352 std::cout <<
"Entering OUT --------------\n";
353 std::cout <<
"State " << std::hex << state << std::endl;
354 std::cout <<
"Left in " << std::dec << from_end - from <<
" out " << to_end -to << std::endl;
356 boost::uint32_t ch=0;
361 boost::uint16_t w1 = state;
362 boost::uint16_t w2 = *from;
365 if(0xDC00 <= w2 && w2<=0xDFFF) {
366 boost::uint16_t vh = w1 - 0xD800;
367 boost::uint16_t vl = w2 - 0xDC00;
368 ch=((uint32_t(vh) << 10) | vl) + 0x10000;
372 r=std::codecvt_base::error;
378 if(0xD800 <= ch && ch<=0xDBFF) {
383 state = static_cast<uint16_t>(ch);
387 else if(0xDC00 <= ch && ch<=0xDFFF) {
391 r=std::codecvt_base::error;
396 r=std::codecvt_base::error;
399 boost::uint32_t len = implementation().from_unicode(cvt_state,ch,to,to_end);
401 r=std::codecvt_base::partial;
405 r=std::codecvt_base::error;
415 if(r==std::codecvt_base::ok && from!=from_end)
416 r = std::codecvt_base::partial;
418 std::cout <<
"Returning ";
420 case std::codecvt_base::ok:
423 case std::codecvt_base::partial:
424 std::cout <<
"partial\n";
426 case std::codecvt_base::error:
427 std::cout <<
"error\n";
430 std::cout <<
"other\n";
433 std::cout <<
"State " << std::hex << state << std::endl;
434 std::cout <<
"Left in " << std::dec << from_end - from <<
" out " << to_end -to << std::endl;
447 template<
typename CharType,
typename CodecvtImpl>
451 typedef CharType uchar;
454 std::codecvt<CharType,char,std::mbstate_t>(refs)
458 CodecvtImpl
const &implementation()
const 460 return *static_cast<CodecvtImpl const *>(
this);
465 std::codecvt_base::result do_unshift(std::mbstate_t &,
char *from,
char * ,
char *&next)
const BOOST_OVERRIDE
468 return std::codecvt_base::ok;
470 int do_encoding()
const BOOST_NOEXCEPT_OR_NOTHROW BOOST_OVERRIDE
474 int do_max_length()
const BOOST_NOEXCEPT_OR_NOTHROW BOOST_OVERRIDE
476 return implementation().max_encoding_length();
478 bool do_always_noconv()
const BOOST_NOEXCEPT_OR_NOTHROW BOOST_OVERRIDE
484 do_length( std::mbstate_t
485 #ifdef BOOST_LOCALE_DO_LENGTH_MBSTATE_CONST
490 char const *from_end,
491 size_t max)
const BOOST_OVERRIDE
493 #ifndef BOOST_LOCALE_DO_LENGTH_MBSTATE_CONST 494 char const *start_from = from;
496 size_t save_max = max;
499 while(max > 0 && from < from_end){
500 char const *save_from = from;
501 boost::uint32_t ch=implementation().to_unicode(cvt_state,from,from_end);
508 #ifndef BOOST_LOCALE_DO_LENGTH_MBSTATE_CONST 509 return from - start_from;
511 return save_max - max;
516 std::codecvt_base::result
517 do_in( std::mbstate_t &,
519 char const *from_end,
520 char const *&from_next,
523 uchar *&to_next)
const BOOST_OVERRIDE
525 std::codecvt_base::result r=std::codecvt_base::ok;
532 typedef typename CodecvtImpl::state_type state_type;
534 while(to < to_end && from < from_end)
537 std::cout <<
"Entering IN--------------\n";
538 std::cout <<
"State " << std::hex << state << std::endl;
539 std::cout <<
"Left in " << std::dec << from_end - from <<
" out " << to_end -to << std::endl;
541 char const *from_saved = from;
543 uint32_t ch=implementation().to_unicode(cvt_state,from,from_end);
546 r=std::codecvt_base::error;
551 r=std::codecvt_base::partial;
559 if(r == std::codecvt_base::ok && from!=from_end)
560 r = std::codecvt_base::partial;
562 std::cout <<
"Returning ";
564 case std::codecvt_base::ok:
567 case std::codecvt_base::partial:
568 std::cout <<
"partial\n";
570 case std::codecvt_base::error:
571 std::cout <<
"error\n";
574 std::cout <<
"other\n";
577 std::cout <<
"State " << std::hex << state << std::endl;
578 std::cout <<
"Left in " << std::dec << from_end - from <<
" out " << to_end -to << std::endl;
583 std::codecvt_base::result
584 do_out( std::mbstate_t &,
586 uchar
const *from_end,
587 uchar
const *&from_next,
590 char *&to_next)
const BOOST_OVERRIDE
592 std::codecvt_base::result r=std::codecvt_base::ok;
593 typedef typename CodecvtImpl::state_type state_type;
595 while(to < to_end && from < from_end)
598 std::cout <<
"Entering OUT --------------\n";
599 std::cout <<
"State " << std::hex << state << std::endl;
600 std::cout <<
"Left in " << std::dec << from_end - from <<
" out " << to_end -to << std::endl;
602 boost::uint32_t ch=0;
605 r=std::codecvt_base::error;
608 boost::uint32_t len = implementation().from_unicode(cvt_state,ch,to,to_end);
610 r=std::codecvt_base::partial;
614 r=std::codecvt_base::error;
622 if(r==std::codecvt_base::ok && from!=from_end)
623 r = std::codecvt_base::partial;
625 std::cout <<
"Returning ";
627 case std::codecvt_base::ok:
630 case std::codecvt_base::partial:
631 std::cout <<
"partial\n";
633 case std::codecvt_base::error:
634 std::cout <<
"error\n";
637 std::cout <<
"other\n";
640 std::cout <<
"State " << std::hex << state << std::endl;
641 std::cout <<
"Left in " << std::dec << from_end - from <<
" out " << to_end -to << std::endl;
648 template<
typename CharType,
typename CodecvtImpl>
652 typedef CharType uchar;
654 CodecvtImpl
const &implementation()
const 656 return *static_cast<CodecvtImpl const *>(
this);
659 generic_codecvt(
size_t refs = 0) : std::codecvt<char,char,std::mbstate_t>(refs)
668 bool is_valid_codepoint(code_point v)
the function checks if v is a valid code point
Definition: utf.hpp:49
The state would be used by to_unicode functions.
Definition: generic_codecvt.hpp:39
static const code_point incomplete
Special constant that defines incomplete code point.
Definition: utf.hpp:44
initial_convertion_state
Definition: generic_codecvt.hpp:38
static const code_point illegal
Special constant that defines illegal code point.
Definition: utf.hpp:39
A base class that used to define constants for generic_codecvt.
Definition: generic_codecvt.hpp:33
Geneneric generic codecvt facet, various stateless encodings to UTF-16 and UTF-32 using wchar_t,...
Definition: generic_codecvt.hpp:139
The state would be used by from_unicode functions.
Definition: generic_codecvt.hpp:40